chiark / gitweb /
wip server ipif
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 21 Aug 2021 20:55:02 +0000 (21:55 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 21 Aug 2021 20:55:02 +0000 (21:55 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
server/server.rs
server/slocal.rs
server/suser.rs

index 5da413c501157e38a3158f46c359da087798fd95..b8cedaf9e8cf457597deb5ac2cfe934a22970a68 100644 (file)
@@ -26,6 +26,7 @@ pub const INTERNAL_QUEUE: usize = 15; // xxx: config
 #[derive(Debug)]
 pub struct Global {
   config: config::InstanceConfigGlobal,
+  local_rx: mpsc::Sender<RoutedPacket>,
   all_clients: HashMap<ClientName, User>,
 }
 
@@ -72,7 +73,7 @@ async fn main() {
     String,
   )> = vec![];
 
-  let (global, ipif) = config::startup(
+  let global = config::startup(
     "hippotatd", LinkEnd::Server,
     &opts.config, &opts.log, |ics|
   {
@@ -105,8 +106,13 @@ async fn main() {
        })
     }).collect();
 
+    let (local_rx_send, local_tx_recv) = mpsc::channel(
+      50 // xxx configurable?
+    );
+
     let global = Arc::new(Global {
       config: global_config,
+      local_rx: local_rx_send,
       all_clients,
     });
 
@@ -148,8 +154,15 @@ async fn main() {
       });
       tasks.push((task, format!("http server {}", addr)));
     }
-    
-    Ok((global, ipif))
+
+    let global_ = global.clone();
+    let ipif = tokio::task::spawn(async move {
+      slocal::run(global_, local_tx_recv, ipif).await
+        .void_unwrap_err()
+    });
+    tasks.push((ipif, format!("ipif")));
+
+    Ok(global)
   });
 
   let died = future::select_all(
@@ -157,7 +170,5 @@ async fn main() {
   ).await;
   error!("xxx {:?}", &died);
 
-  ipif.quitting(None).await;
-
   dbg!(global);
 }
index 919c33882cb8a123bcb64d09aa091e8faeb9e86f..374849bc3d38ee9f222980f2472840ecc2cf4271 100644 (file)
@@ -5,8 +5,21 @@
 use super::*;
 
 #[allow(dead_code)] // xxx
-#[throws(PacketError)]
-pub async fn run(_global: &Global,
-                 _rx: mpsc::Receiver<RoutedPacket>) {
-  
+#[allow(unused_variables)] // xxx
+pub async fn run(global: Arc<Global>,
+                 rx: mpsc::Receiver<RoutedPacket>,
+                 mut ipif: Ipif) -> Result<Void,AE> {
+  let r = async {
+    loop {
+      select!{
+        data = ipif.tx.next_segment() =>
+        {
+          let data = data.context("read from ipif")?;
+        }
+      }
+    }
+  }.await;
+
+  ipif.quitting(None).await;
+  r
 }
index acae5dcd35ab8676b8371c96de0283a626566303..dc4358b3371918b27cb946468528a513346d0e57 100644 (file)
@@ -59,6 +59,8 @@ pub async fn run(global: Arc<Global>,
     }
 
     select!{
+      biased;
+
       req = web.recv() =>
       {
         let WebRequest {