Allow providers to override glean behaviour
[vpp.git] / src / vnet / ethernet / arp.c
index 52b13e0..4e5f867 100644 (file)
@@ -203,7 +203,7 @@ format_ethernet_arp_header (u8 * s, va_list * va)
 {
   ethernet_arp_header_t *a = va_arg (*va, ethernet_arp_header_t *);
   u32 max_header_bytes = va_arg (*va, u32);
-  uword indent;
+  u32 indent;
   u16 l2_type, l3_type;
 
   if (max_header_bytes != 0 && sizeof (a[0]) > max_header_bytes)
@@ -455,8 +455,10 @@ arp_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai)
 
   switch (adj->lookup_next_index)
     {
-    case IP_LOOKUP_NEXT_ARP:
     case IP_LOOKUP_NEXT_GLEAN:
+      adj_glean_update_rewrite (ai);
+      break;
+    case IP_LOOKUP_NEXT_ARP:
       if (NULL != e)
        {
          adj_nbr_walk_nh4 (sw_if_index,
@@ -1123,6 +1125,12 @@ arp_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
                                  &arp0->ip4_over_ethernet[0]);
              goto drop1;
            }
+         else if (arp0->opcode ==
+                  clib_host_to_net_u16 (ETHERNET_ARP_OPCODE_request) &&
+                  (dst_is_local0 == 0))
+           {
+             goto drop1;
+           }
 
        send_reply:
          /* Send a reply.
@@ -2474,6 +2482,7 @@ ethernet_arp_change_mac (u32 sw_if_index)
 {
   ethernet_arp_main_t *am = &ethernet_arp_main;
   ethernet_arp_ip4_entry_t *e;
+  adj_index_t ai;
 
   /* *INDENT-OFF* */
   pool_foreach (e, am->ip4_entry_pool,
@@ -2481,6 +2490,11 @@ ethernet_arp_change_mac (u32 sw_if_index)
     change_arp_mac (sw_if_index, e);
   }));
   /* *INDENT-ON* */
+
+  ai = adj_glean_get (FIB_PROTOCOL_IP4, sw_if_index);
+
+  if (ADJ_INDEX_INVALID != ai)
+    adj_glean_update_rewrite (ai);
 }
 
 void