diff --git a/src/iface/ethernet.rs b/src/iface/ethernet.rs index f879efe..a2865ff 100644 --- a/src/iface/ethernet.rs +++ b/src/iface/ethernet.rs @@ -578,7 +578,7 @@ impl<'b, 'c, 'e, DeviceT> Interface<'b, 'c, 'e, DeviceT> let mut emitted_any = false; for mut socket in sockets.iter_mut() { - if !socket.meta_mut().egress_permitted(|ip_addr| + if !socket.meta_mut().egress_permitted(timestamp, |ip_addr| self.inner.has_neighbor(&ip_addr, timestamp)) { continue } diff --git a/src/socket/meta.rs b/src/socket/meta.rs index 5ec9d74..e57ec30 100644 --- a/src/socket/meta.rs +++ b/src/socket/meta.rs @@ -58,18 +58,21 @@ impl Meta { } } - pub(crate) fn egress_permitted(&mut self, has_neighbor: F) -> bool + pub(crate) fn egress_permitted(&mut self, timestamp: Instant, has_neighbor: F) -> bool where F: Fn(IpAddress) -> bool { match self.neighbor_state { NeighborState::Active => true, - NeighborState::Waiting { neighbor, .. } => { + NeighborState::Waiting { neighbor, silent_until } => { if has_neighbor(neighbor) { net_trace!("{}: neighbor {} discovered, unsilencing", self.handle, neighbor); self.neighbor_state = NeighborState::Active; true + } else if timestamp > silent_until { + net_trace!("{}: Retrying egress for neighbor {}", self.handle, neighbor); + true } else { false }