Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
if addr != ic.link.client.0 { throw!(PE::Dst(addr)) }
Ok(())
},
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<Void>>( {
error!("{} #{}: rx discarding: {}", &ic, req_num, e);
|e| Ok::<_,SlipFramesError<Void>>( {
error!("{} #{}: rx discarding: {}", &ic, req_num, e);
{
Ok(()) => reporter.lock().success(),
Err(SlipFramesError::ErrorOnlyBad) => {
{
Ok(()) => reporter.lock().success(),
Err(SlipFramesError::ErrorOnlyBad) => {
type WebResponseData = Vec<u8>;
#[throws(PacketError)]
type WebResponseData = Vec<u8>;
#[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={}",
{
let c = &global.config;
let trace = |how| trace!("{} {} route {} daddr={:?} len={}",
&global, &conn, &ic.link.client, daddr,packet
),
|e| Ok::<_,SlipFramesError<_>>({ warnings.add(&e)?; })
&global, &conn, &ic.link.client, daddr,packet
),
|e| Ok::<_,SlipFramesError<_>>({ warnings.add(&e)?; })
}
let oi = OutstandingInner {
}
let oi = OutstandingInner {
}
#[throws(SlipFramesError<EHE>)]
}
#[throws(SlipFramesError<EHE>)]
-pub fn checkn<AC, EH, EHE, OUT, ACR, M: SlipMime+Copy>(
+pub async fn checkn<AC, EH, EHE, OUT, FOUT, ACR, M: SlipMime+Copy>(
mime: M,
mtu: u32,
data: &[u8],
addr_chk: AC,
mut out: OUT,
mut error_handler: EH
mime: M,
mtu: u32,
data: &[u8],
addr_chk: AC,
mut out: OUT,
mut error_handler: EH
-) where AC: Fn(&[u8]) -> Result<ACR, PacketError> + Copy,
- OUT: FnMut((Box<[u8]>, ACR)) -> Result<(), PacketError>,
- EH: FnMut(PacketError) -> Result<(), SlipFramesError<EHE>>,
- EHE: std::error::Error + 'static,
+) where AC: Fn(&[u8]) -> Result<ACR, PacketError> + Copy + Send,
+ OUT: FnMut((Box<[u8]>, ACR)) -> FOUT + Send,
+ FOUT: Future<Output=Result<(), PacketError>> + Send,
+ EH: FnMut(PacketError) -> Result<(), SlipFramesError<EHE>> + 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) {
{
// 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) {
let checked = check1(mime, mtu, packet, addr_chk);
if matches!(checked, Err(PacketError::Empty)) { return Ok::<_,PE>(()) }
let checked = check1(mime, mtu, packet, addr_chk);
if matches!(checked, Err(PacketError::Empty)) { return Ok::<_,PE>(()) }
ok = true;
Ok::<_,PE>(())
ok = true;
Ok::<_,PE>(())
Ok(()) => { },
Err(e) => { err=true; error_handler(e)?; },
}
Ok(()) => { },
Err(e) => { err=true; error_handler(e)?; },
}