VPP-182: IPv4 static ARP entries should not be deleted on interface down 59/1859/3
authorJohn Lo <loj@cisco.com>
Tue, 5 Jul 2016 22:34:40 +0000 (18:34 -0400)
committerDave Barach <openvpp@barachs.net>
Wed, 6 Jul 2016 14:02:21 +0000 (14:02 +0000)
IPv4 static ARP entries should remain when interface is set admin-down
and be reapplied on interface admin-up.

Change-Id: Ic0051865154230c2561d6e6421b05d842f147ca7
Signed-off-by: John Lo <loj@cisco.com>
vnet/vnet/ethernet/arp.c

index fa13d52..68642d1 100644 (file)
@@ -263,31 +263,36 @@ ethernet_arp_sw_interface_up_down (vnet_main_t * vnm,
 {
   ethernet_arp_main_t * am = &ethernet_arp_main;
   ethernet_arp_ip4_entry_t * e;
+  u32 i;
+  u32 * to_add_del = 0;
 
-  if (! (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP))
-    {
-      u32 i, * to_delete = 0;
-
-      pool_foreach (e, am->ip4_entry_pool, ({
-       if (e->key.sw_if_index == sw_if_index)
-         vec_add1 (to_delete, e - am->ip4_entry_pool);
-      }));
+  pool_foreach (e, am->ip4_entry_pool, ({
+    if (e->key.sw_if_index == sw_if_index)
+       vec_add1 (to_add_del, e - am->ip4_entry_pool);
+  }));
 
-      for (i = 0; i < vec_len (to_delete); i++)
-       {
-          ethernet_arp_ip4_over_ethernet_address_t delme;
-         e = pool_elt_at_index (am->ip4_entry_pool, to_delete[i]);
+  for (i = 0; i < vec_len (to_add_del); i++)
+    {
+      ethernet_arp_ip4_over_ethernet_address_t arp_add;
+      e = pool_elt_at_index (am->ip4_entry_pool, to_add_del[i]);
 
-          clib_memcpy (&delme.ethernet, e->ethernet_address, 6);
-          delme.ip4.as_u32 = e->key.ip4_address.as_u32;
+      clib_memcpy (&arp_add.ethernet, e->ethernet_address, 6);
+      arp_add.ip4.as_u32 = e->key.ip4_address.as_u32;
 
-          vnet_arp_unset_ip4_over_ethernet (vnm, e->key.sw_if_index,
-                                            e->key.fib_index, &delme);
-       }
-
-      vec_free (to_delete);
+      if (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
+        {
+         vnet_arp_set_ip4_over_ethernet (vnm,
+             e->key.sw_if_index, e->key.fib_index, &arp_add, 
+             e->flags & ETHERNET_ARP_IP4_ENTRY_FLAG_STATIC);
+        }
+      else if ((e->flags & ETHERNET_ARP_IP4_ENTRY_FLAG_STATIC) == 0)
+        {
+         vnet_arp_unset_ip4_over_ethernet (vnm,
+             e->key.sw_if_index, e->key.fib_index, &arp_add);
+        }
     }
 
+  vec_free (to_add_del);
   return 0;
 }