From: Ian Jackson Date: Sat, 21 Aug 2021 22:54:41 +0000 (+0100) Subject: wip server X-Git-Tag: hippotat/1.0.0~116 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=hippotat.git;a=commitdiff_plain;h=6c3132c445313c332d8c60250a25ed56196c13ab wip server Signed-off-by: Ian Jackson --- diff --git a/server/slocal.rs b/server/slocal.rs index 3c1f533..56dd853 100644 --- a/server/slocal.rs +++ b/server/slocal.rs @@ -10,15 +10,43 @@ pub async fn run(global: Arc, rx: mpsc::Receiver, mut ipif: Ipif) -> Result { let r = async { + let mut goodness: i32 = 0; + const GOODNESS_SHIFT: u8 = 8; + const GOODNESS_MIN: i32 = -16; + loop { select!{ biased; // xxx something something rx something - data = ipif.tx.next_segment() => + data = Ipif::next_frame(&mut ipif.tx) => { - let data = data.context("read from ipif")?; + let data = data?; + let may_route = MayRoute::came_from_outside_hippotatd(); + + 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::(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) => { + goodness -= 1; + error!("[good={}] invalid data from local tx ipif {}", + goodness, e); + if goodness < GOODNESS_MIN { + throw!(anyhow!("too many bad packets, too few good ones!")) + } + }, + } } } }