ARP resilience in the absence of IP config on input and output interfaces 77/5677/2
authorNeale Ranns <nranns@cisco.com>
Wed, 8 Mar 2017 09:12:54 +0000 (01:12 -0800)
committerFlorin Coras <florin.coras@gmail.com>
Wed, 8 Mar 2017 21:21:59 +0000 (21:21 +0000)
Change-Id: Ia9c6790436f8f6337b5351e3017ef5e441a8a4e9
Signed-off-by: Neale Ranns <nranns@cisco.com>
(cherry picked from commit 5e323329ed6ded6f6944c56069329207ad9069c0)

src/vnet/ethernet/arp.c
src/vnet/ip/lookup.c

index 8898d33..222415b 100644 (file)
@@ -792,6 +792,7 @@ typedef enum
   _ (missing_interface_address, "ARP missing interface address") \
   _ (gratuitous_arp, "ARP probe or announcement dropped") \
   _ (interface_no_table, "Interface is not mapped to an IP table") \
+  _ (interface_not_ip_enabled, "Interface is not IP enabled") \
 
 typedef enum
 {
@@ -1048,6 +1049,11 @@ arp_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
 
          sw_if_index0 = vnet_buffer (p0)->sw_if_index[VLIB_RX];
 
+         /* not playing the ARP game if the interface is not IPv4 enabled */
+         error0 =
+           (im4->ip_enabled_by_sw_if_index[sw_if_index0] == 0 ?
+            ETHERNET_ARP_ERROR_interface_not_ip_enabled : error0);
+
          if (error0)
            goto drop2;
 
index 8607fa5..9ae269c 100644 (file)
@@ -170,6 +170,21 @@ ip_interface_address_add_del (ip_lookup_main_t * lm,
   return /* no error */ 0;
 }
 
+static clib_error_t *
+ip_sw_interface_add_del (vnet_main_t * vnm, u32 sw_if_index, u32 is_add)
+{
+  vec_validate_init_empty (ip4_main.
+                          lookup_main.if_address_pool_index_by_sw_if_index,
+                          sw_if_index, ~0);
+  vec_validate_init_empty (ip6_main.
+                          lookup_main.if_address_pool_index_by_sw_if_index,
+                          sw_if_index, ~0);
+
+  return (NULL);
+}
+
+VNET_SW_INTERFACE_ADD_DEL_FUNCTION (ip_sw_interface_add_del);
+
 void
 ip_lookup_init (ip_lookup_main_t * lm, u32 is_ip6)
 {