chiark / gitweb /
forward
[hippotat.git] / server / slocal.rs
index 09e6aba82cbdf0813a202d5b1c86c499c8eff3ff..eaa7adaa4ef5819a8e0ce39061cdb333ca372cb3 100644 (file)
@@ -7,7 +7,7 @@ use super::*;
 #[allow(dead_code)] // xxx
 #[allow(unused_variables)] // xxx
 pub async fn run(global: Arc<Global>,
-                 rx: mpsc::Receiver<RoutedPacket>,
+                 mut rx: mpsc::Receiver<RoutedPacket>,
                  mut ipif: Ipif) -> Result<Void,AE> {
   let r = async {
     let mut goodness: i32 = 0;
@@ -18,7 +18,15 @@ pub async fn run(global: Arc<Global>,
       select!{
         biased;
 
-        // xxx something something rx something
+        data = rx.recv() =>
+        {
+          let data = data.ok_or_else(|| anyhow!("rx stream end!"))?;
+          let mut data = &*data.data;
+          let mut slip_end = &[SLIP_END][..];
+          let mut buf = Buf::chain(&mut data, &mut slip_end);
+          ipif.rx.write_all_buf(&mut buf).await
+            .context("write to ipif")?;
+        },
 
         data = Ipif::next_frame(&mut ipif.tx) =>
         {
@@ -30,20 +38,29 @@ pub async fn run(global: Arc<Global>,
           match checkn(SlipNoConv, global.config.mtu, &data, |header|{
             let saddr = ip_packet_addr::<false>(header)?;
             let daddr = ip_packet_addr::<true>(header)?;
-            if ! global.config.vnetwork.iter().any(|n| n.contains(&saddr)) {
-              throw!(PE::Src(saddr))
+            Ok((saddr,daddr))
+          }, |(data, (saddr, daddr))| {
+            let global = &global;
+            let may_route = &may_route;
+            async move {
+              if ! global.config.vnetwork.iter().any(|n| n.contains(&saddr)) {
+                // pretent as if this came from route
+                trace!(
+                  target: "hippotatd",
+ "discard to={:?} via=ipif user=local from-outside-vnets-={:?}",
+                  daddr, saddr);
+                return Ok(())
+              }
+
+              route_packet(
+                &global, "ipif", None,
+                data, daddr, may_route.clone()
+              ).await;
+
+              Ok(())
             }
-            Ok(daddr)
-          }, |(data, daddr)| route_packet(
-            &global, "ipif", None,
-            data, daddr, may_route.clone()
-          ).map(Ok), |pe| Ok(match pe {
+          }, |pe| Ok(match pe {
             PE::Empty => { },
-            PE::Src(saddr) => trace!(
-              target: "hippotatd",
-              "ipif local discard outside-vnets saddr={:?}",
-              saddr
-            ),
             other => throw!(other),
           })).await {
             Ok(()) => goodness += 1,
@@ -56,7 +73,7 @@ pub async fn run(global: Arc<Global>,
               }
             },
           }
-        }
+        },
       }
     }
   }.await;