u8 dst[6];
u32 sw_if_index;
u16 bd_index;
+ l2fib_entry_result_t result;
} l2fwd_trace_t;
/* packet trace format function */
CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
l2fwd_trace_t *t = va_arg (*args, l2fwd_trace_t *);
- s = format (s, "l2-fwd: sw_if_index %d dst %U src %U bd_index %d",
- t->sw_if_index,
- format_ethernet_address, t->dst,
- format_ethernet_address, t->src, t->bd_index);
+ 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->result.fields.sw_if_index, format_l2fib_entry_result_flags,
+ t->result.fields.flags);
return s;
}
* 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_UU_FLOOD |
+ L2INPUT_FEAT_UU_FWD | L2INPUT_FEAT_GBP_FWD))
{
*next0 = vnet_l2_feature_next (b0, msm->feat_next_node_index,
L2INPUT_FEAT_FWD);
const ethernet_header_t *h0, *h1, *h2, *h3;
l2fib_entry_key_t key0, key1, key2, key3;
l2fib_entry_result_t result0, result1, result2, result3;
- u32 bucket0, bucket1, bucket2, bucket3;
/* Prefetch next iteration. */
{
h2 = vlib_buffer_get_current (b[2]);
h3 = vlib_buffer_get_current (b[3]);
- if (do_trace)
- {
- if (b[0]->flags & VLIB_BUFFER_IS_TRACED)
- {
- 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 (t->src, h0->src_address, 6);
- clib_memcpy (t->dst, h0->dst_address, 6);
- }
- if (b[1]->flags & VLIB_BUFFER_IS_TRACED)
- {
- 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 (t->src, h1->src_address, 6);
- clib_memcpy (t->dst, h1->dst_address, 6);
- }
- if (b[2]->flags & VLIB_BUFFER_IS_TRACED)
- {
- 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 (t->src, h2->src_address, 6);
- clib_memcpy (t->dst, h2->dst_address, 6);
- }
- if (b[3]->flags & VLIB_BUFFER_IS_TRACED)
- {
- 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 (t->src, h3->src_address, 6);
- clib_memcpy (t->dst, h3->dst_address, 6);
- }
- }
-
#ifdef COUNTERS
em->counters[node_counter_base_index + L2FWD_ERROR_L2FWD] += 4;
#endif
&key1, /* not used */
&key2, /* not used */
&key3, /* not used */
- &bucket0, /* not used */
- &bucket1, /* not used */
- &bucket2, /* not used */
- &bucket3, /* not used */
&result0,
&result1,
&result2,
/* verify speculative enqueues, maybe switch current next frame */
/* if next0==next1==next_index then nothing special needs to be done */
+ if (do_trace)
+ {
+ if (b[0]->flags & VLIB_BUFFER_IS_TRACED)
+ {
+ 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->src, h0->src_address, 6);
+ clib_memcpy_fast (t->dst, h0->dst_address, 6);
+ t->result = result0;
+ }
+ if (b[1]->flags & VLIB_BUFFER_IS_TRACED)
+ {
+ 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->src, h1->src_address, 6);
+ clib_memcpy_fast (t->dst, h1->dst_address, 6);
+ t->result = result1;
+ }
+ if (b[2]->flags & VLIB_BUFFER_IS_TRACED)
+ {
+ 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->src, h2->src_address, 6);
+ clib_memcpy_fast (t->dst, h2->dst_address, 6);
+ t->result = result2;
+ }
+ if (b[3]->flags & VLIB_BUFFER_IS_TRACED)
+ {
+ 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->src, h3->src_address, 6);
+ clib_memcpy_fast (t->dst, h3->dst_address, 6);
+ t->result = result3;
+ }
+ }
+
next += 4;
b += 4;
n_left -= 4;
ethernet_header_t *h0;
l2fib_entry_key_t key0;
l2fib_entry_result_t result0;
- u32 bucket0;
sw_if_index0 = vnet_buffer (b[0])->sw_if_index[VLIB_RX];
h0 = vlib_buffer_get_current (b[0]);
+ /* process 1 pkt */
+#ifdef COUNTERS
+ em->counters[node_counter_base_index + L2FWD_ERROR_L2FWD] += 1;
+#endif
+ l2fib_lookup_1 (msm->mac_table, &cached_key, &cached_result,
+ h0->dst_address, vnet_buffer (b[0])->l2.bd_index, &key0,
+ /* not used */ &result0);
+ l2fwd_process (vm, node, msm, em, b[0], sw_if_index0, &result0, next);
+
if (do_trace && PREDICT_FALSE (b[0]->flags & VLIB_BUFFER_IS_TRACED))
{
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 (t->src, h0->src_address, 6);
- clib_memcpy (t->dst, h0->dst_address, 6);
+ clib_memcpy_fast (t->src, h0->src_address, 6);
+ clib_memcpy_fast (t->dst, h0->dst_address, 6);
+ t->result = result0;
}
- /* process 1 pkt */
-#ifdef COUNTERS
- em->counters[node_counter_base_index + L2FWD_ERROR_L2FWD] += 1;
-#endif
- l2fib_lookup_1 (msm->mac_table, &cached_key, &cached_result, h0->dst_address, vnet_buffer (b[0])->l2.bd_index, &key0, /* not used */
- &bucket0, /* not used */
- &result0);
- l2fwd_process (vm, node, msm, em, b[0], sw_if_index0, &result0, next);
-
/* verify speculative enqueue, maybe switch current next frame */
next += 1;
b += 1;