Fix detection of packet output via BVI into a BD and SHG adjustment 98/3098/3
authorJohn Lo <loj@cisco.com>
Thu, 22 Sep 2016 22:24:13 +0000 (18:24 -0400)
committerDamjan Marion <dmarion.lists@gmail.com>
Fri, 23 Sep 2016 07:52:44 +0000 (07:52 +0000)
In BVI output node, set a signature value in packet buffer field
sw_if_index[VLIB_TX] so l2-input node can reliably check that
packet came into a BD through BVI so it can set the SHG of the
packet to 0 for a unicast packet.

Change-Id: I301aa2896677e11d0c964ca476dddcb5a8804fc2
Signed-off-by: John Lo <loj@cisco.com>
vnet/vnet/ethernet/interface.c
vnet/vnet/l2/l2_input.c
vnet/vnet/l2/l2_input.h

index f2e2ca0..78d89f7 100644 (file)
@@ -347,7 +347,10 @@ simulated_ethernet_interface_tx (vlib_main_t * vm,
          // and update l2_len in packet as required for l2 forwarding path
          vnet_buffer (b)->sw_if_index[VLIB_RX] = sw_if_index;
          if (bvi_flag)
-           vnet_update_l2_len (b);
+           {
+             vnet_update_l2_len (b);
+             vnet_buffer (b)->sw_if_index[VLIB_TX] = L2INPUT_BVI;
+           }
          else
            vnet_buffer (b)->sw_if_index[VLIB_TX] = (u32) ~ 0;
 
index dca13e3..171ba73 100644 (file)
@@ -247,16 +247,14 @@ classify_and_dispatch (vlib_main_t * vm,
     }
   else
     {
-
       /*
-       * Check for from-BVI processing, TX is non-~0 if from BVI loopback
-       * Set SHG for BVI packets to 0 so it is not dropped for VXLAN tunnels
+       * Check for from-BVI processing - set SHG of unicast packets from BVI
+       * to 0 so it is not dropped for VXLAN tunnels or other ports with the
+       * same SHG as that of the BVI.
        */
-      if (PREDICT_FALSE (vnet_buffer (b0)->sw_if_index[VLIB_TX] != ~0))
-       {
-         vnet_buffer (b0)->sw_if_index[VLIB_TX] = ~0;
-         vnet_buffer (b0)->l2.shg = 0;
-       }
+      if (PREDICT_FALSE (vnet_buffer (b0)->sw_if_index[VLIB_TX] == L2INPUT_BVI
+                        && !mcast_dmac))
+       vnet_buffer (b0)->l2.shg = 0;
 
       /* Do bridge-domain processing */
       bd_index0 = config->bd_index;
index c1c9eb1..b4e90af 100644 (file)
@@ -86,6 +86,9 @@ l2input_bd_config_from_index (l2input_main_t * l2im, u32 bd_index)
   return bd_is_valid (bd_config) ? bd_config : NULL;
 }
 
+/* L2 input indication packet is from BVI, using -2 */
+#define L2INPUT_BVI ((u32) (~0-1))
+
 /* L2 input features */
 
 /* Mappings from feature ID to graph node name */