ip-neighbor: Allow to replace dynamic entry

Before this patch it was not allowed to replace
a dynamic ARP entry with a static one with the
same mac-address.

Type: fix

Signed-off-by: Vladimir Isaev <visaev@netgate.com>
Change-Id: I6cfc0e510ffdf141c61874288f11a60395182374
diff --git a/src/vnet/ip-neighbor/ip_neighbor.c b/src/vnet/ip-neighbor/ip_neighbor.c
index 09b5605..4111b02 100644
--- a/src/vnet/ip-neighbor/ip_neighbor.c
+++ b/src/vnet/ip-neighbor/ip_neighbor.c
@@ -141,6 +141,8 @@
       elt = pool_elt_at_index (ip_neighbor_elt_pool, ipn->ipn_elt);
 
       clib_llist_remove (ip_neighbor_elt_pool, ipne_anchor, elt);
+
+      ipn->ipn_elt = ~0;
     }
 }
 
@@ -492,6 +494,17 @@
 	  return -2;
 	}
 
+      /* A dynamic entry can become static, but not vice-versa.
+       * i.e. since if it was programmed by the CP then it must
+       * be removed by the CP */
+      if ((flags & IP_NEIGHBOR_FLAG_STATIC) &&
+	  !(ipn->ipn_flags & IP_NEIGHBOR_FLAG_STATIC))
+	{
+	  ip_neighbor_list_remove (ipn);
+	  ipn->ipn_flags |= IP_NEIGHBOR_FLAG_STATIC;
+	  ipn->ipn_flags &= ~IP_NEIGHBOR_FLAG_DYNAMIC;
+	}
+
       /*
        * prevent a DoS attack from the data-plane that
        * spams us with no-op updates to the MAC address
@@ -503,17 +516,6 @@
 	}
 
       mac_address_copy (&ipn->ipn_mac, mac);
-
-      /* A dynamic entry can become static, but not vice-versa.
-       * i.e. since if it was programmed by the CP then it must
-       * be removed by the CP */
-      if ((flags & IP_NEIGHBOR_FLAG_STATIC) &&
-	  !(ipn->ipn_flags & IP_NEIGHBOR_FLAG_STATIC))
-	{
-	  ip_neighbor_list_remove (ipn);
-	  ipn->ipn_flags |= IP_NEIGHBOR_FLAG_STATIC;
-	  ipn->ipn_flags &= ~IP_NEIGHBOR_FLAG_DYNAMIC;
-	}
     }
   else
     {