chiark / gitweb /
server: route wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 17 Aug 2021 00:31:42 +0000 (01:31 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 17 Aug 2021 00:31:42 +0000 (01:31 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/server.rs

index 57f9bc75caa6b813365234c4f9c8e79f85a53c80..ec55bda7267d2911dd509958da5eb8fdbd9620cf 100644 (file)
@@ -14,6 +14,7 @@ pub struct Opts {
 }
 
 const METADATA_MAX_LEN: usize = MAX_OVERHEAD;
+const INTERNAL_QUEUE: usize = 15; // xxx: config
 
 #[derive(Debug)]
 pub struct Global {
@@ -25,6 +26,7 @@ pub struct Global {
 pub struct Client {
   ic: Arc<InstanceConfig>,
   web: mpsc::Sender<WebRequest>,
+  route: mpsc::Sender<RoutedPacket>,
 }
 
 pub type RoutedPacket = Box<[u8]>; // not MIME data
@@ -274,7 +276,8 @@ async fn handle(
 #[allow(unused_mut)] // xxx
 async fn run_client(global: Arc<Global>,
                     ic: Arc<InstanceConfig>,
-                    mut web: mpsc::Receiver<WebRequest>)
+                    mut web: mpsc::Receiver<WebRequest>,
+                    mut routed: mpsc::Receiver<RoutedPacket>)
                     -> Result<Void, AE>
 {
   struct Outstanding {
@@ -441,19 +444,26 @@ async fn main() {
 
     let ics = ics.into_iter().map(Arc::new).collect_vec();
     let (client_handles_send, client_handles_recv) = ics.iter()
-      .map(|_ic| mpsc::channel(
-        5 // xxx should me max_requests_outstanding but that's
-        // marked client-only so needs rework
-      )).unzip::<_,_,Vec<_>,Vec<_>>();
+      .map(|_ic| {
+        let (web_send, web_recv) = mpsc::channel(
+          5 // xxx should me max_requests_outstanding but that's
+          // marked client-only so needs rework
+        );
+        let (route_send, route_recv) = mpsc::channel(
+          INTERNAL_QUEUE
+        );
+        ((web_send, route_send), (web_recv, route_recv))
+      }).unzip::<_,_,Vec<_>,Vec<_>>();
 
     let all_clients = izip!(
       &ics,
       client_handles_send,
-    ).map(|(ic, web_send)| {
+    ).map(|(ic, (web_send, route_send))| {
       (ic.link.client,
        Client {
          ic: ic.clone(),
          web: web_send,
+         route: route_send,
        })
     }).collect();
 
@@ -462,14 +472,15 @@ async fn main() {
       all_clients,
     });
 
-    for (ic, web_recv) in izip!(
+    for (ic, (web_recv, route_recv)) in izip!(
       ics,
       client_handles_recv,
     ) {
       let global_ = global.clone();
       let ic_ = ic.clone();
       tasks.push((tokio::spawn(async move {
-        run_client(global_, ic_, web_recv).await.void_unwrap_err()
+        run_client(global_, ic_, web_recv, route_recv)
+          .await.void_unwrap_err()
       }), format!("client {}", &ic)));
     }