diff options
Diffstat (limited to 'src/vnet/l2')
-rw-r--r-- | src/vnet/l2/l2_fib.c | 21 | ||||
-rw-r--r-- | src/vnet/l2/l2_fib.h | 2 | ||||
-rw-r--r-- | src/vnet/l2/l2_fwd.c | 106 |
3 files changed, 81 insertions, 48 deletions
diff --git a/src/vnet/l2/l2_fib.c b/src/vnet/l2/l2_fib.c index 46c041e72a0..48be42e8ce9 100644 --- a/src/vnet/l2/l2_fib.c +++ b/src/vnet/l2/l2_fib.c @@ -54,6 +54,27 @@ l2fib_main_t l2fib_main; +u8 * +format_l2fib_entry_result_flags (u8 * s, va_list * args) +{ + l2fib_entry_result_flags_t flags = va_arg (*args, int); + + if (L2FIB_ENTRY_RESULT_FLAG_NONE == flags) + { + s = format (s, "none"); + } + else + { +#define _(a,v,t) { \ + if (flags & L2FIB_ENTRY_RESULT_FLAG_##a) \ + s = format (s, "%s ", t); \ + } + foreach_l2fib_entry_result_attr +#undef _ + } + return (s); +} + static void incr_mac_address (u8 * mac) { diff --git a/src/vnet/l2/l2_fib.h b/src/vnet/l2/l2_fib.h index 626fbe51a33..d8b37d2a586 100644 --- a/src/vnet/l2/l2_fib.h +++ b/src/vnet/l2/l2_fib.h @@ -129,6 +129,8 @@ typedef enum l2fib_entry_result_flags_t_ STATIC_ASSERT_SIZEOF (l2fib_entry_result_flags_t, 1); +extern u8 *format_l2fib_entry_result_flags (u8 * s, va_list * args); + /* * The l2fib entry results */ diff --git a/src/vnet/l2/l2_fwd.c b/src/vnet/l2/l2_fwd.c index c647e3dbd06..f1d215a87f4 100644 --- a/src/vnet/l2/l2_fwd.c +++ b/src/vnet/l2/l2_fwd.c @@ -65,6 +65,7 @@ typedef struct u8 dst[6]; u32 sw_if_index; u16 bd_index; + l2fib_entry_result_t result; } l2fwd_trace_t; /* packet trace format function */ @@ -75,10 +76,13 @@ format_l2fwd_trace (u8 * s, va_list * args) 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; } @@ -212,7 +216,8 @@ 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_UU_FLOOD | + L2INPUT_FEAT_UU_FWD | L2INPUT_FEAT_GBP_FWD)) { *next0 = vnet_l2_feature_next (b0, msm->feat_next_node_index, L2INPUT_FEAT_FWD); @@ -283,6 +288,40 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, h2 = vlib_buffer_get_current (b[2]); h3 = vlib_buffer_get_current (b[3]); +#ifdef COUNTERS + em->counters[node_counter_base_index + L2FWD_ERROR_L2FWD] += 4; +#endif + /* *INDENT-OFF* */ + l2fib_lookup_4 (msm->mac_table, &cached_key, &cached_result, + h0->dst_address, h1->dst_address, + h2->dst_address, h3->dst_address, + vnet_buffer (b[0])->l2.bd_index, + vnet_buffer (b[1])->l2.bd_index, + vnet_buffer (b[2])->l2.bd_index, + vnet_buffer (b[3])->l2.bd_index, + &key0, /* not used */ + &key1, /* not used */ + &key2, /* not used */ + &key3, /* not used */ + &bucket0, /* not used */ + &bucket1, /* not used */ + &bucket2, /* not used */ + &bucket3, /* not used */ + &result0, + &result1, + &result2, + &result3); + /* *INDENT-ON* */ + l2fwd_process (vm, node, msm, em, b[0], sw_if_index0, &result0, next); + l2fwd_process (vm, node, msm, em, b[1], sw_if_index1, &result1, + next + 1); + l2fwd_process (vm, node, msm, em, b[2], sw_if_index2, &result2, + next + 2); + l2fwd_process (vm, node, msm, em, b[3], sw_if_index3, &result3, + next + 3); + + /* 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) @@ -292,6 +331,7 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, 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); + t->result = result0; } if (b[1]->flags & VLIB_BUFFER_IS_TRACED) { @@ -300,6 +340,7 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, 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); + t->result = result1; } if (b[2]->flags & VLIB_BUFFER_IS_TRACED) { @@ -308,6 +349,7 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, 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); + t->result = result2; } if (b[3]->flags & VLIB_BUFFER_IS_TRACED) { @@ -316,43 +358,10 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, 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); + t->result = result3; } } -#ifdef COUNTERS - em->counters[node_counter_base_index + L2FWD_ERROR_L2FWD] += 4; -#endif - /* *INDENT-OFF* */ - l2fib_lookup_4 (msm->mac_table, &cached_key, &cached_result, - h0->dst_address, h1->dst_address, - h2->dst_address, h3->dst_address, - vnet_buffer (b[0])->l2.bd_index, - vnet_buffer (b[1])->l2.bd_index, - vnet_buffer (b[2])->l2.bd_index, - vnet_buffer (b[3])->l2.bd_index, - &key0, /* not used */ - &key1, /* not used */ - &key2, /* not used */ - &key3, /* not used */ - &bucket0, /* not used */ - &bucket1, /* not used */ - &bucket2, /* not used */ - &bucket3, /* not used */ - &result0, - &result1, - &result2, - &result3); - /* *INDENT-ON* */ - l2fwd_process (vm, node, msm, em, b[0], sw_if_index0, &result0, next); - l2fwd_process (vm, node, msm, em, b[1], sw_if_index1, &result1, - next + 1); - l2fwd_process (vm, node, msm, em, b[2], sw_if_index2, &result2, - next + 2); - l2fwd_process (vm, node, msm, em, b[3], sw_if_index3, &result3, - next + 3); - - /* verify speculative enqueues, maybe switch current next frame */ - /* if next0==next1==next_index then nothing special needs to be done */ next += 4; b += 4; n_left -= 4; @@ -370,15 +379,6 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, h0 = vlib_buffer_get_current (b[0]); - 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); - } - /* process 1 pkt */ #ifdef COUNTERS em->counters[node_counter_base_index + L2FWD_ERROR_L2FWD] += 1; @@ -388,6 +388,16 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, &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); + t->result = result0; + } + /* verify speculative enqueue, maybe switch current next frame */ next += 1; b += 1; |