let addr = ip_packet_addr::<true>(header)?;
if addr != ic.link.client.0 { throw!(PE::Dst(addr)) }
Ok(())
- }, |o| rx_queue.push(o),
+ }, |o| Ok({ rx_queue.push(o) }),
|e| error!("{} #{}: rx discarding: {}", &ic, req_num, e))
{
Ok(()) => reporter.lock().success(),
mut out: OUT,
mut error_handler: EH
) where AC: Fn(&[u8]) -> Result<(), PacketError> + Copy,
- OUT: FnMut(Box<[u8]>),
+ OUT: FnMut(Box<[u8]>) -> Result<(), PacketError>,
EH: FnMut(PacketError),
{
// eprintln!("before: {:?}", DumpHex(data));
let mut ok = false;
let mut err = false;
for packet in data.split(|&c| c == SLIP_END) {
- match check1(mime, mtu, packet, addr_chk) {
- Err(PacketError::Empty) => { }
+ match (||{
+ let packet = check1(mime, mtu, packet, addr_chk);
+ if matches!(packet, Err(PacketError::Empty)) { return Ok::<_,PE>(()) }
+ out(packet?)?;
+ ok = true;
+ Ok::<_,PE>(())
+ })() {
+ Ok(()) => { },
Err(e) => { err=true; error_handler(e); },
- Ok(packet) => { ok=true; out(packet); },
}
}
// eprintln!(" after: {:?}", DumpHex(data));