From: Ian Jackson Date: Sat, 31 Jul 2021 12:48:50 +0000 (+0100) Subject: wip mimeswap X-Git-Tag: hippotat/1.0.0~417 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=f991bb6a7ff2b68784f5ad11142f24bb111a7447;p=hippotat.git wip mimeswap Signed-off-by: Ian Jackson --- diff --git a/src/bin/client.rs b/src/bin/client.rs index 393ddf0..9ba9b80 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -130,7 +130,7 @@ async fn run_client( let mut packet = packet.context("read from ipif")? .ok_or_else(|| io::Error::from(io::ErrorKind::UnexpectedEof))?; - if let Ok(()) = slip::check_checkmtu_mimeify(&mut packet, &ic) { + if let Ok(()) = slip::check_checkmtu_mimeswap(&ic, SLIP_ESC, &mut packet) { let new_upbound_total = packet.len() + upbound_total + 1; if new_upbound_total > ic.max_batch_up.sat() { tx_defer = Some(packet); diff --git a/src/prelude.rs b/src/prelude.rs index 8407c02..c51cdba 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -53,5 +53,6 @@ pub const SLIP_END: u8 = 0o300; pub const SLIP_ESC: u8 = 0o333; pub const SLIP_ESC_END: u8 = 0o334; pub const SLIP_ESC_ESC: u8 = 0o335; +pub const SLIP_SWAP_ESC: u8 = b'-'; pub fn default() -> T { Default::default() } diff --git a/src/slip.rs b/src/slip.rs index 269c8fe..7fe3542 100644 --- a/src/slip.rs +++ b/src/slip.rs @@ -7,6 +7,31 @@ use crate::prelude::*; pub static SLIP_END_SLICE: &[u8] = &[SLIP_END]; #[throws(AE)] -pub fn check_checkmtu_mimeify(_data: &mut [u8], _ic: &InstanceConfig) { - // xxx +pub fn check_checkmtu_mimeswap(ic: &InstanceConfig, input_esc: u8, + mut data: &mut [u8]) { + let mut sofar = 0; + let checkmtu = |_| Ok::<_,AE>(()); // xxx + while let Some((i, &c)) = data.iter().enumerate().find( + |(_,&c)| c == SLIP_ESC || c == SLIP_SWAP_ESC + ) { + let ni; let nc; + if c == input_esc { + match data.get(i+1) { + Some(&SLIP_ESC_END) | + Some(&SLIP_ESC_ESC) => Ok(()), + _ => Err(anyhow!("SLIP escape not followed by ESC_END or ESC_ESC")), + }?; + ni = i+2; + sofar += ni; + nc = if input_esc == SLIP_ESC { SLIP_SWAP_ESC } else { SLIP_ESC }; + } else { + ni = i+1; + sofar += ni; + checkmtu(sofar)?; + nc = input_esc; + }; + data[i] = nc; + data = &mut data[ni ..]; + } + checkmtu(data.len())?; }