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

index ec55bda7267d2911dd509958da5eb8fdbd9620cf..df34045d7b61d44f5cc0a0f33f5fb212aff48974 100644 (file)
@@ -64,17 +64,30 @@ pub async fn route_packet(global: &Global,
                           packet: RoutedPacket, daddr: IpAddr)
 {
   let c = &global.config;
-  let trace = |how| trace!("{} {} route {} daddr={:?} len={}",
-                           conn, link, how, daddr, packet.len());
-
-  if daddr == c.vaddr || ! c.vnetwork.iter().any(|n| n.contains(&daddr)) {
-    trace("ipif inbound xxx discarding");
-  } else if daddr == c.vrelay {
-    trace("discard (relay)");
-  } else if let Some(_client) = global.all_clients.get(&ClientName(daddr)) {
-    trace("ipif route xxx discarding");
-  } else {
-    trace("discard (no client)");
+  let len = packet.len();
+  let trace = |how: &str, why: &str| {
+    trace!("{} {} {} {} {:?} len={}",
+           conn, link, how, why, daddr, len);
+  };
+
+  let (dest, why) =
+    if daddr == c.vaddr || ! c.vnetwork.iter().any(|n| n.contains(&daddr)) {
+      (None, "ipif-inbound-xxx")
+    } else if daddr == c.vrelay {
+      (None, "vrelay")
+    } else if let Some(client) = global.all_clients.get(&ClientName(daddr)) {
+      (Some(&client.route), "client")
+    } else {
+      (None, "no-client")
+    };
+
+  let dest = if let Some(d) = dest { d } else {
+    trace("discard", why); return;
+  };
+
+  match dest.send(packet).await {
+    Ok(()) => trace("forward", why),
+    Err(_) => trace("task-crashed!", why),
   }
 }