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