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);
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>() -> T { Default::default() }
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())?;
}