X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fl2%2Fl2_fwd.c;h=1ee3a534cd7f70ffcbd9d9db3354f39e5815cedb;hb=3be9164f8;hp=f440778417f2847670178d1a18f83c277dcf47db;hpb=ba6deb96e923f71aa9387c06000412c3fb1362fa;p=vpp.git diff --git a/src/vnet/l2/l2_fwd.c b/src/vnet/l2/l2_fwd.c index f440778417f..1ee3a534cd7 100644 --- a/src/vnet/l2/l2_fwd.c +++ b/src/vnet/l2/l2_fwd.c @@ -61,8 +61,7 @@ typedef struct typedef struct { /* per-pkt trace data */ - u8 dst[6]; - u8 src[6]; + u8 dst_and_src[12]; u32 sw_if_index; u16 bd_index; l2fib_entry_result_t result; @@ -79,8 +78,9 @@ format_l2fwd_trace (u8 * s, va_list * args) s = format (s, "l2-fwd: sw_if_index %d dst %U src %U bd_index %d result [0x%llx, %d] %U", - t->sw_if_index, format_ethernet_address, t->dst, - format_ethernet_address, t->src, t->bd_index, t->result.raw, + t->sw_if_index, format_ethernet_address, t->dst_and_src, + format_ethernet_address, t->dst_and_src + 6, + t->bd_index, t->result.raw, t->result.fields.sw_if_index, format_l2fib_entry_result_flags, t->result.fields.flags); return s; @@ -156,13 +156,12 @@ l2fwd_process (vlib_main_t * vm, /* check l2fib seq num for stale entries */ if (!l2fib_entry_result_is_set_AGE_NOT (result0)) { - l2fib_seq_num_t in_sn = {.as_u16 = vnet_buffer (b0)->l2.l2fib_sn }; - l2fib_seq_num_t expected_sn = { - .bd = in_sn.bd, - .swif = *l2fib_swif_seq_num (result0->fields.sw_if_index), - }; - l2fib_seq_num_valid = - expected_sn.as_u16 == result0->fields.sn.as_u16; + l2fib_seq_num_t in_sn = vnet_buffer (b0)->l2.l2fib_sn; + l2fib_seq_num_t expected_sn = l2_fib_update_seq_num (in_sn, + l2_input_seq_num + (result0->fields.sw_if_index)); + + l2fib_seq_num_valid = expected_sn == result0->fields.sn; } if (PREDICT_FALSE (!l2fib_seq_num_valid)) @@ -216,8 +215,7 @@ l2fwd_process (vlib_main_t * vm, * unless some other feature is inserted before uu_flood */ if (vnet_buffer (b0)->l2.feature_bitmap & - (L2INPUT_FEAT_UU_FLOOD | - L2INPUT_FEAT_UU_FWD | L2INPUT_FEAT_GBP_FWD)) + (L2INPUT_FEAT_UU_FLOOD | L2INPUT_FEAT_UU_FWD)) { *next0 = vnet_l2_feature_next (b0, msm->feat_next_node_index, L2INPUT_FEAT_FWD); @@ -270,10 +268,10 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_prefetch_buffer_header (b[6], LOAD); vlib_prefetch_buffer_header (b[7], LOAD); - CLIB_PREFETCH (b[4]->data, CLIB_CACHE_LINE_BYTES, LOAD); - CLIB_PREFETCH (b[5]->data, CLIB_CACHE_LINE_BYTES, LOAD); - CLIB_PREFETCH (b[6]->data, CLIB_CACHE_LINE_BYTES, LOAD); - CLIB_PREFETCH (b[7]->data, CLIB_CACHE_LINE_BYTES, LOAD); + clib_prefetch_load (b[4]->data); + clib_prefetch_load (b[5]->data); + clib_prefetch_load (b[6]->data); + clib_prefetch_load (b[7]->data); } /* RX interface handles */ @@ -324,7 +322,7 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, l2fwd_trace_t *t = vlib_add_trace (vm, node, b[0], sizeof (*t)); t->sw_if_index = sw_if_index0; t->bd_index = vnet_buffer (b[0])->l2.bd_index; - clib_memcpy_fast (t->dst, h0->dst_address, + clib_memcpy_fast (t->dst_and_src, h0->dst_address, sizeof (h0->dst_address) + sizeof (h0->src_address)); t->result = result0; @@ -334,7 +332,7 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, l2fwd_trace_t *t = vlib_add_trace (vm, node, b[1], sizeof (*t)); t->sw_if_index = sw_if_index1; t->bd_index = vnet_buffer (b[1])->l2.bd_index; - clib_memcpy_fast (t->dst, h1->dst_address, + clib_memcpy_fast (t->dst_and_src, h1->dst_address, sizeof (h1->dst_address) + sizeof (h1->src_address)); t->result = result1; @@ -344,7 +342,7 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, l2fwd_trace_t *t = vlib_add_trace (vm, node, b[2], sizeof (*t)); t->sw_if_index = sw_if_index2; t->bd_index = vnet_buffer (b[2])->l2.bd_index; - clib_memcpy_fast (t->dst, h2->dst_address, + clib_memcpy_fast (t->dst_and_src, h2->dst_address, sizeof (h2->dst_address) + sizeof (h2->src_address)); t->result = result2; @@ -354,7 +352,7 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, l2fwd_trace_t *t = vlib_add_trace (vm, node, b[3], sizeof (*t)); t->sw_if_index = sw_if_index3; t->bd_index = vnet_buffer (b[3])->l2.bd_index; - clib_memcpy_fast (t->dst, h3->dst_address, + clib_memcpy_fast (t->dst_and_src, h3->dst_address, sizeof (h3->dst_address) + sizeof (h3->src_address)); t->result = result3; @@ -391,7 +389,7 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, l2fwd_trace_t *t = vlib_add_trace (vm, node, b[0], sizeof (*t)); t->sw_if_index = sw_if_index0; t->bd_index = vnet_buffer (b[0])->l2.bd_index; - clib_memcpy_fast (t->dst, h0->dst_address, + clib_memcpy_fast (t->dst_and_src, h0->dst_address, sizeof (h0->dst_address) + sizeof (h0->src_address)); t->result = result0; @@ -505,7 +503,7 @@ int_fwd (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) } /* set the interface flag */ - if (l2input_intf_config (sw_if_index)->xconnect) + if (l2input_intf_config (sw_if_index)) { l2input_intf_bitmap_enable (sw_if_index, L2INPUT_FEAT_XCONNECT, enable); }