L2 BVI/FIB: Update L2 FIB table when BVI's MAC changes
[vpp.git] / src / vnet / ethernet / arp.c
index 09f5661..275d606 100644 (file)
@@ -26,6 +26,7 @@
 #include <vnet/adj/adj_nbr.h>
 #include <vnet/adj/adj_mcast.h>
 #include <vnet/mpls/mpls.h>
+#include <vnet/l2/feat_bitmap.h>
 
 /**
  * @file
@@ -492,6 +493,15 @@ arp_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai)
          arp_nbr_probe (adj);
        }
       break;
+    case IP_LOOKUP_NEXT_BCAST:
+      adj_nbr_update_rewrite (ai,
+                             ADJ_NBR_REWRITE_FLAG_COMPLETE,
+                             ethernet_build_rewrite
+                             (vnm,
+                              sw_if_index,
+                              VNET_LINK_IP4,
+                              VNET_REWRITE_FOR_SW_INTERFACE_ADDRESS_BROADCAST));
+      break;
     case IP_LOOKUP_NEXT_MCAST:
       {
        /*
@@ -955,12 +965,13 @@ arp_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
          vnet_hw_interface_t *hw_if0;
          ethernet_arp_header_t *arp0;
          ethernet_header_t *eth_rx, *eth_tx;
-         ip4_address_t *if_addr0, proxy_src;
+         const ip4_address_t *if_addr0;
+         ip4_address_t proxy_src;
          u32 pi0, error0, next0, sw_if_index0, conn_sw_if_index0, fib_index0;
          u8 is_request0, dst_is_local0, is_unnum0, is_vrrp_reply0;
          ethernet_proxy_arp_t *pa;
          fib_node_index_t dst_fei, src_fei;
-         fib_prefix_t pfx0;
+         const fib_prefix_t *pfx0;
          fib_entry_flag_t src_flags, dst_flags;
          u8 *rewrite0, rewrite0_len;
 
@@ -1032,9 +1043,9 @@ arp_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
             * to reach us, they only affect how we reach the sender.
             */
            fib_entry_t *src_fib_entry;
+           const fib_prefix_t *pfx;
            fib_entry_src_t *src;
            fib_source_t source;
-           fib_prefix_t pfx;
            int attached;
            int mask;
 
@@ -1097,8 +1108,8 @@ arp_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
                /*
                 * shorter mask lookup for the next iteration.
                 */
-               fib_entry_get_prefix (src_fei, &pfx);
-               mask = pfx.fp_len - 1;
+               pfx = fib_entry_get_prefix (src_fei);
+               mask = pfx->fp_len - 1;
 
                /*
                 * continue until we hit the default route or we find
@@ -1156,8 +1167,8 @@ arp_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
            }
 
          dst_is_local0 = (FIB_ENTRY_FLAG_LOCAL & dst_flags);
-         fib_entry_get_prefix (dst_fei, &pfx0);
-         if_addr0 = &pfx0.fp_addr.ip4;
+         pfx0 = fib_entry_get_prefix (dst_fei);
+         if_addr0 = &pfx0->fp_addr.ip4;
 
          is_vrrp_reply0 =
            ((arp0->opcode ==