#[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;
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) =>
{
goodness -= goodness >> GOODNESS_SHIFT;
- match checkn(SlipNoConv, global.config.mtu, &data, |header|{
- // don't really check the addresses: trusting our local knrel
- ip_packet_addr::<true>(header)
- }, |(data, daddr)| route_packet(
- &global, "ipif", None,
- data, daddr, may_route.clone()
- ).map(Ok), |pe| match pe {
- PE::Empty => Ok(()),
- other => throw!(other),
- }).await {
- Ok(()) => goodness += 1,
- Err(e) => {
+ match process1(SlipNoConv, global.config.mtu, &data, |header|{
+ let saddr = ip_packet_addr::<false>(header)?;
+ let daddr = ip_packet_addr::<true>(header)?;
+ Ok((saddr,daddr))
+ }) {
+ Err(PE::Empty) => { },
+
+ Err(pe) => {
goodness -= 1;
error!("[good={}] invalid data from local tx ipif {}",
- goodness, e);
+ goodness, pe);
if goodness < GOODNESS_MIN {
throw!(anyhow!("too many bad packets, too few good ones!"))
}
},
+
+ Ok((ref data, (ref saddr, ref daddr)))
+ if ! global.config.vnetwork.iter().any(|n| n.contains(saddr)) => {
+ // pretent as if this came from route
+ trace!(
+ target: "hippotatd",
+ "discard to={:?} came=ipif user=local len={} outside-vnets: from={:?}",
+ daddr, saddr, data.len());
+ },
+
+ Ok((data, (saddr, daddr))) => {
+ goodness += 1;
+ route_packet(
+ &global, "ipif", None,
+ data, daddr, may_route.clone()
+ ).await;
+ }
}
- }
+ },
}
}
}.await;