if let Some(got) = got {
//eprintln!("got={:?}", DumpHex(&got));
- match checkn(SlipNoConv,ic.mtu, &got, &mut rx_queue, |header| {
+ match checkn(SlipNoConv,ic.mtu, &got, |header| {
let addr = ip_packet_addr::<true>(header)?;
if addr != ic.link.client.0 { throw!(PE::Dst(addr)) }
Ok(())
- }, |e| error!("{} #{}: rx discarding: {}", &ic, req_num, e)) {
+ }, |o| rx_queue.push(o),
+ |e| error!("{} #{}: rx discarding: {}", &ic, req_num, e))
+ {
Ok(()) => reporter.lock().success(),
Err(ErrorOnlyBad) => {
reqs.push(Box::pin(async {
mime: M,
mtu: u32,
data: &[u8],
- out: &mut OUT,
addr_chk: AC,
+ mut out: OUT,
mut error_handler: EH
-) where OUT: Extend<Box<[u8]>>,
- AC: Fn(&[u8]) -> Result<(), PacketError> + Copy,
+) where AC: Fn(&[u8]) -> Result<(), PacketError> + Copy,
+ OUT: FnMut(Box<[u8]>),
EH: FnMut(PacketError),
{
// eprintln!("before: {:?}", DumpHex(data));
match check1(mime, mtu, packet, addr_chk) {
Err(PacketError::Empty) => { }
Err(e) => { err=true; error_handler(e); },
- Ok(packet) => { ok=true; out.extend(iter::once(packet)); },
+ Ok(packet) => { ok=true; out(packet); },
}
}
// eprintln!(" after: {:?}", DumpHex(data));