From 49263a58797ac3844855b9b8db267bf50cda19c2 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 17 Aug 2021 01:22:42 +0100 Subject: [PATCH] make route_packet async Signed-off-by: Ian Jackson --- src/bin/client.rs | 4 ++-- src/bin/server.rs | 8 ++++---- src/slip.rs | 17 +++++++++-------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index cfb632e..8597cfd 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -283,10 +283,10 @@ async fn run_client( if addr != ic.link.client.0 { throw!(PE::Dst(addr)) } Ok(()) }, - |(o,())| Ok({ rx_queue.push(o); }), + |(o,())| future::ready(Ok({ rx_queue.push(o); })), |e| Ok::<_,SlipFramesError>( { error!("{} #{}: rx discarding: {}", &ic, req_num, e); - })) + })).await { Ok(()) => reporter.lock().success(), Err(SlipFramesError::ErrorOnlyBad) => { diff --git a/src/bin/server.rs b/src/bin/server.rs index a45bec6..57f9bc7 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -57,9 +57,9 @@ struct WebResponse { type WebResponseData = Vec; #[throws(PacketError)] -pub fn route_packet(global: &Global, - conn: &str, link: &dyn Display, - packet: RoutedPacket, daddr: IpAddr) +pub async fn route_packet(global: &Global, + conn: &str, link: &(dyn Display + Sync), + packet: RoutedPacket, daddr: IpAddr) { let c = &global.config; let trace = |how| trace!("{} {} route {} daddr={:?} len={}", @@ -401,7 +401,7 @@ async fn run_client(global: Arc, &global, &conn, &ic.link.client, daddr,packet ), |e| Ok::<_,SlipFramesError<_>>({ warnings.add(&e)?; }) - )?; + ).await?; } let oi = OutstandingInner { diff --git a/src/slip.rs b/src/slip.rs index 6bb508b..f5980cc 100644 --- a/src/slip.rs +++ b/src/slip.rs @@ -31,30 +31,31 @@ pub enum SlipFramesError where E: std::error::Error + 'static { } #[throws(SlipFramesError)] -pub fn checkn( +pub async fn checkn( mime: M, mtu: u32, data: &[u8], addr_chk: AC, mut out: OUT, mut error_handler: EH -) where AC: Fn(&[u8]) -> Result + Copy, - OUT: FnMut((Box<[u8]>, ACR)) -> Result<(), PacketError>, - EH: FnMut(PacketError) -> Result<(), SlipFramesError>, - EHE: std::error::Error + 'static, +) where AC: Fn(&[u8]) -> Result + Copy + Send, + OUT: FnMut((Box<[u8]>, ACR)) -> FOUT + Send, + FOUT: Future> + Send, + EH: FnMut(PacketError) -> Result<(), SlipFramesError> + Send, + EHE: std::error::Error + Send + 'static, { // eprintln!("before: {:?}", DumpHex(data)); if data.is_empty() { return } let mut ok = false; let mut err = false; for packet in data.split(|&c| c == SLIP_END) { - match (||{ + match async { let checked = check1(mime, mtu, packet, addr_chk); if matches!(checked, Err(PacketError::Empty)) { return Ok::<_,PE>(()) } - out(checked?)?; + out(checked?).await?; ok = true; Ok::<_,PE>(()) - })() { + }.await { Ok(()) => { }, Err(e) => { err=true; error_handler(e)?; }, } -- 2.30.2