Improve L2FIB delete entry handling and "show l2fib" CLI options
[vpp.git] / src / vnet / l2 / l2_input.c
index 5d16b1d..6e3851e 100644 (file)
@@ -176,7 +176,8 @@ classify_and_dispatch (l2input_main_t * msm, vlib_buffer_t * b0, u32 * next0)
       u8 protocol = ((ip6_header_t *) l3h0)->protocol;
 
       /* Disable bridge forwarding (flooding will execute instead if not xconnect) */
-      feat_mask &= ~(L2INPUT_FEAT_FWD | L2INPUT_FEAT_UU_FLOOD);
+      feat_mask &= ~(L2INPUT_FEAT_FWD |
+                    L2INPUT_FEAT_UU_FLOOD | L2INPUT_FEAT_GBP_FWD);
 
       /* Disable ARP-term for non-ARP and non-ICMP6 packet */
       if (ethertype != ETHERNET_TYPE_ARP &&
@@ -564,6 +565,7 @@ set_int_l2_mode (vlib_main_t * vm, vnet_main_t * vnet_main, /*           */
   l2_bridge_domain_t *bd_config;
   i32 l2_if_adjust = 0;
   u32 slot;
+  vnet_device_class_t *dev_class;
 
   hi = vnet_get_sup_hw_interface (vnet_main, sw_if_index);
   config = l2input_intf_config (sw_if_index);
@@ -579,11 +581,13 @@ set_int_l2_mode (vlib_main_t * vm, vnet_main_t * vnet_main,       /*           */
       /* undo any BVI-related config */
       if (bd_config->bvi_sw_if_index == sw_if_index)
        {
+         vnet_sw_interface_t *si;
+
          bd_config->bvi_sw_if_index = ~0;
          config->bvi = 0;
 
          /* delete the l2fib entry for the bvi interface */
-         l2fib_del_entry (hi->hw_address, config->bd_index);
+         l2fib_del_entry (hi->hw_address, config->bd_index, sw_if_index);
 
          /* Make loop output node send packet back to ethernet-input node */
          slot =
@@ -591,6 +595,10 @@ set_int_l2_mode (vlib_main_t * vm, vnet_main_t * vnet_main,        /*           */
                                                "ethernet-input",
                                                VNET_SIMULATED_ETHERNET_TX_NEXT_ETHERNET_INPUT);
          ASSERT (slot == VNET_SIMULATED_ETHERNET_TX_NEXT_ETHERNET_INPUT);
+
+         /* since this is a no longer BVI interface do not to flood to it */
+         si = vnet_get_sw_interface (vnm, sw_if_index);
+         si->flood_class = VNET_FLOOD_CLASS_NO_FLOOD;
        }
 
       /* Clear MACs learned on the interface */
@@ -673,6 +681,8 @@ set_int_l2_mode (vlib_main_t * vm, vnet_main_t * vnet_main, /*           */
          /* Do BVI interface initializations */
          if (bvi)
            {
+             vnet_sw_interface_t *si;
+
              /* ensure BD has no bvi interface (or replace that one with this??) */
              if (bd_config->bvi_sw_if_index != ~0)
                {
@@ -693,6 +703,10 @@ set_int_l2_mode (vlib_main_t * vm, vnet_main_t * vnet_main,        /*           */
                                                    "l2-input",
                                                    VNET_SIMULATED_ETHERNET_TX_NEXT_ETHERNET_INPUT);
              ASSERT (slot == VNET_SIMULATED_ETHERNET_TX_NEXT_ETHERNET_INPUT);
+
+             /* since this is a BVI interface we want to flood to it */
+             si = vnet_get_sw_interface (vnm, sw_if_index);
+             si->flood_class = VNET_FLOOD_CLASS_BVI;
            }
 
          /* Add interface to bridge-domain flood vector */
@@ -786,6 +800,12 @@ set_int_l2_mode (vlib_main_t * vm, vnet_main_t * vnet_main,        /*           */
   /* Set up the L2/L3 flag in the interface parsing tables */
   ethernet_sw_interface_set_l2_mode (vnm, sw_if_index, (mode != MODE_L3));
 
+  dev_class = vnet_get_device_class (vnet_main, hi->dev_class_index);
+  if (dev_class->set_l2_mode_function)
+    {
+      dev_class->set_l2_mode_function (vnet_main, hi, l2_if_adjust);
+    }
+
   return 0;
 }