- 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),