// 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;
}
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;
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 */