let mut packet =
packet.context("read from ipif")?
.ok_or_else(|| io::Error::from(io::ErrorKind::UnexpectedEof))?;
- if let Ok(()) = slip::check_checkmtu_mimeswap(&ic, SLIP_ESC, &mut packet) {
+ if let Ok(()) = slip::check_checkmtu_mimeswap
+ ::<true>(&ic, &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 const SLIP_MIME_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_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) {
+pub fn check_checkmtu_mimeswap<const TO_MIME: bool>
+ (ic: &InstanceConfig, data: &mut [u8])
+{
+ for mut packet in data.split_mut(|&c| c == SLIP_END) {
+ if packet.len() > ic.mtu.sat() {
+ throw!(anyhow!("mtu exceeded ({} > {})", packet.len(), ic.mtu));
+ }
+
+ while let Some((i, _)) = packet.iter().enumerate().find(
+ |(_,&c)| c == if TO_MIME { SLIP_ESC } else { SLIP_MIME_ESC }
+ ) {
+ packet[i] = if TO_MIME { SLIP_MIME_ESC } else { SLIP_ESC };
+ match packet.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 ..];
+ packet = &mut packet[i+2 ..];
+ }
}
- checkmtu(data.len())?;
}