diff options
-rw-r--r-- | vnet/vnet/interface.h | 4 | ||||
-rw-r--r-- | vnet/vnet/l2/l2_output.c | 16 |
2 files changed, 17 insertions, 3 deletions
diff --git a/vnet/vnet/interface.h b/vnet/vnet/interface.h index f441f9e1027..1ddd259a0b4 100644 --- a/vnet/vnet/interface.h +++ b/vnet/vnet/interface.h @@ -263,6 +263,10 @@ typedef struct vnet_hw_interface_t { VNET_HW_INTERFACE_FLAG_SPEED_40G | \ VNET_HW_INTERFACE_FLAG_SPEED_100G) + /* l2output node flags */ +#define VNET_HW_INTERFACE_FLAG_L2OUTPUT_SHIFT 9 +#define VNET_HW_INTERFACE_FLAG_L2OUTPUT_MAPPED (1 << 9) + /* Hardware address as vector. Zero (e.g. zero-length vector) if no address for this class (e.g. PPP). */ u8 * hw_address; diff --git a/vnet/vnet/l2/l2_output.c b/vnet/vnet/l2/l2_output.c index a5424866db1..02862138928 100644 --- a/vnet/vnet/l2/l2_output.c +++ b/vnet/vnet/l2/l2_output.c @@ -477,17 +477,27 @@ u32 l2output_create_output_node_mapping ( #if DPDK > 0 uword cpu_number; + hw0 = vnet_get_sup_hw_interface (vnet_main, sw_if_index); + cpu_number = os_get_cpu_number(); if (cpu_number) { + u32 oldflags; + vlib_node_t *error_drop_node; + + error_drop_node = vlib_get_node_by_name (vlib_main, (u8 *) "error-drop"); + oldflags = __sync_fetch_and_or(&hw0->flags, + VNET_HW_INTERFACE_FLAG_L2OUTPUT_MAPPED); + + if ((oldflags & VNET_HW_INTERFACE_FLAG_L2OUTPUT_MAPPED) ) + return error_drop_node->index; + output_node_mapping_send_rpc (node_index, sw_if_index); - return 0; + return error_drop_node->index; } #endif - hw0 = vnet_get_sup_hw_interface (vnet_main, sw_if_index); - // dynamically create graph node arc next = vlib_node_add_next (vlib_main, node_index, |