From: Ian Jackson Date: Tue, 17 Aug 2021 00:43:37 +0000 (+0100) Subject: server: route wip, do sending X-Git-Tag: hippotat/1.0.0~132 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=hippotat.git;a=commitdiff_plain;h=e439539c903586b7396281ac8dbee86bcac2c476 server: route wip, do sending Signed-off-by: Ian Jackson --- diff --git a/src/bin/server.rs b/src/bin/server.rs index ec55bda..df34045 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -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), } }