From 24e486876175dfa0b8bb7a57d3178721a19e59e4 Mon Sep 17 00:00:00 2001 From: Thales Fragoso Date: Mon, 10 Aug 2020 22:06:06 -0300 Subject: [PATCH 1/2] Allow for ARP retry during egress --- src/iface/ethernet.rs | 2 +- src/socket/meta.rs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) 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 } From 548a0199916700e4687aff32d15e1cedf3111415 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 11 Aug 2020 16:26:53 +0000 Subject: [PATCH 2/2] Update src/socket/meta.rs --- src/socket/meta.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket/meta.rs b/src/socket/meta.rs index e57ec30..9738be1 100644 --- a/src/socket/meta.rs +++ b/src/socket/meta.rs @@ -71,7 +71,7 @@ impl Meta { self.neighbor_state = NeighborState::Active; true } else if timestamp > silent_until { - net_trace!("{}: Retrying egress for neighbor {}", self.handle, neighbor); + net_trace!("{}: neighbor {} silence timer expired, rediscovering", self.handle, neighbor); true } else { false