ARP/ND use path_remove to complement path_add
[vpp.git] / src / vnet / ethernet / arp.c
index f44cb59..624c48c 100644 (file)
@@ -582,11 +582,11 @@ vnet_arp_set_ip4_over_ethernet_internal (vnet_main_t * vnm,
          fib_index =
            ip4_fib_table_get_index_for_sw_if_index (e->sw_if_index);
          e->fib_entry_index =
-           fib_table_entry_update_one_path (fib_index, &pfx, FIB_SOURCE_ADJ,
-                                            FIB_ENTRY_FLAG_ATTACHED,
-                                            FIB_PROTOCOL_IP4, &pfx.fp_addr,
-                                            e->sw_if_index, ~0, 1, NULL,
-                                            FIB_ROUTE_PATH_FLAG_NONE);
+           fib_table_entry_path_add (fib_index, &pfx, FIB_SOURCE_ADJ,
+                                     FIB_ENTRY_FLAG_ATTACHED,
+                                     FIB_PROTOCOL_IP4, &pfx.fp_addr,
+                                     e->sw_if_index, ~0, 1, NULL,
+                                     FIB_ROUTE_PATH_FLAG_NONE);
        }
       else
        {
@@ -1673,7 +1673,23 @@ arp_entry_free (ethernet_arp_interface_t * eai, ethernet_arp_ip4_entry_t * e)
   ethernet_arp_main_t *am = &ethernet_arp_main;
 
   if (FIB_NODE_INDEX_INVALID != e->fib_entry_index)
-    fib_table_entry_delete_index (e->fib_entry_index, FIB_SOURCE_ADJ);
+    {
+      fib_prefix_t pfx = {
+       .fp_len = 32,
+       .fp_proto = FIB_PROTOCOL_IP4,
+       .fp_addr.ip4 = e->ip4_address,
+      };
+      u32 fib_index;
+
+      fib_index = ip4_fib_table_get_index_for_sw_if_index (e->sw_if_index);
+
+      fib_table_entry_path_remove (fib_index, &pfx,
+                                  FIB_SOURCE_ADJ,
+                                  FIB_PROTOCOL_IP4,
+                                  &pfx.fp_addr,
+                                  e->sw_if_index, ~0, 1,
+                                  FIB_ROUTE_PATH_FLAG_NONE);
+    }
   hash_unset (eai->arp_entries, e->ip4_address.as_u32);
   pool_put (am->ip4_entry_pool, e);
 }