chiark / gitweb /
wip mimeswap
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 31 Jul 2021 12:48:50 +0000 (13:48 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 31 Jul 2021 12:48:50 +0000 (13:48 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/client.rs
src/prelude.rs
src/slip.rs

index 393ddf01102af3b6efa0fdab7c0ada555a435f27..9ba9b80f1f7ecbafc037342a1af8b87d1d36f19e 100644 (file)
@@ -130,7 +130,7 @@ async fn run_client<C:HCC>(
             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);
index 8407c02e6856c8c365d48d5592cc850aa9f33b83..c51cdbadd7a17c2fd83809415338ff547a66b081 100644 (file)
@@ -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>() -> T { Default::default() }
index 269c8fe401423b6737d22076fa3cc018314cd0c7..7fe354284b5ae2d5029553067b18f9bd9096f700 100644 (file)
@@ -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())?;
 }