From 8e21ba311cb9fa2e9c700897b429c04e0f80749c Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 16 Aug 2021 01:07:22 +0100 Subject: [PATCH] sort out error handling for server rx slip frames Signed-off-by: Ian Jackson --- src/bin/client.rs | 10 +++++++--- src/bin/server.rs | 2 +- src/slip.rs | 22 ++++++++++++---------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index 10b2076..cfb632e 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -282,16 +282,20 @@ async fn run_client( let addr = ip_packet_addr::(header)?; if addr != ic.link.client.0 { throw!(PE::Dst(addr)) } Ok(()) - }, |(o,())| Ok({ rx_queue.push(o); }), - |e| error!("{} #{}: rx discarding: {}", &ic, req_num, e)) + }, + |(o,())| Ok({ rx_queue.push(o); }), + |e| Ok::<_,SlipFramesError>( { + error!("{} #{}: rx discarding: {}", &ic, req_num, e); + })) { Ok(()) => reporter.lock().success(), - Err(ErrorOnlyBad) => { + Err(SlipFramesError::ErrorOnlyBad) => { reqs.push(Box::pin(async { tokio::time::sleep(ic.http_retry).await; None })); }, + Err(SlipFramesError::Other(v)) => unreachable!(v), } } }, diff --git a/src/bin/server.rs b/src/bin/server.rs index 4a80704..73f2de5 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -349,7 +349,7 @@ async fn run_client(ic: Arc, let daddr = ip_packet_addr::(header)?; Ok(daddr) }, |(daddr,packet)| route_packet(daddr,packet), - |e| { let _xxx = warnings.add(&e); } + |e| Ok::<_,SlipFramesError<_>>({ warnings.add(&e)?; }) )?; } diff --git a/src/slip.rs b/src/slip.rs index 955c36f..6bb508b 100644 --- a/src/slip.rs +++ b/src/slip.rs @@ -24,13 +24,14 @@ impl SlipMime for Slip2Mime { const CONV_TO: Option = Some(true); } impl SlipMime for Mime2Slip { const CONV_TO: Option = Some(false); } impl SlipMime for SlipNoConv { const CONV_TO: Option = None; } -#[derive(Debug)] -#[derive(Error)] -#[error("only bad IP datagrams")] -pub struct ErrorOnlyBad; - -#[throws(ErrorOnlyBad)] -pub fn checkn( +#[derive(Debug,Error)] +pub enum SlipFramesError where E: std::error::Error + 'static { + #[error("only bad IP datagrams")] ErrorOnlyBad, + #[error("{0}")] Other(#[from] E), +} + +#[throws(SlipFramesError)] +pub fn checkn( mime: M, mtu: u32, data: &[u8], @@ -39,7 +40,8 @@ pub fn checkn( mut error_handler: EH ) where AC: Fn(&[u8]) -> Result + Copy, OUT: FnMut((Box<[u8]>, ACR)) -> Result<(), PacketError>, - EH: FnMut(PacketError), + EH: FnMut(PacketError) -> Result<(), SlipFramesError>, + EHE: std::error::Error + 'static, { // eprintln!("before: {:?}", DumpHex(data)); if data.is_empty() { return } @@ -54,11 +56,11 @@ pub fn checkn( Ok::<_,PE>(()) })() { Ok(()) => { }, - Err(e) => { err=true; error_handler(e); }, + Err(e) => { err=true; error_handler(e)?; }, } } // eprintln!(" after: {:?}", DumpHex(data)); - if err && !ok { throw!(ErrorOnlyBad) } + if err && !ok { throw!(SlipFramesError::ErrorOnlyBad) } } #[throws(PacketError)] -- 2.30.2