瀏覽代碼

Allow for ARP retry during egress

Thales Fragoso 4 年之前
父節點
當前提交
09f14c9df9
共有 2 個文件被更改,包括 6 次插入3 次删除
  1. 1 1
      src/iface/ethernet.rs
  2. 5 2
      src/socket/meta.rs

+ 1 - 1
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
             }

+ 5 - 2
src/socket/meta.rs

@@ -58,18 +58,21 @@ impl Meta {
         }
     }
 
-    pub(crate) fn egress_permitted<F>(&mut self, has_neighbor: F) -> bool
+    pub(crate) fn egress_permitted<F>(&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
                 }