L2-fwd trace show the lookup result 91/15491/2
authorNeale Ranns <nranns@cisco.com>
Wed, 24 Oct 2018 09:25:06 +0000 (02:25 -0700)
committerDave Barach <openvpp@barachs.net>
Wed, 24 Oct 2018 11:16:45 +0000 (11:16 +0000)
Change-Id: I09cf6ee7b4874d71f293f8f1a426d3a5e9651749
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/l2/l2_fib.c
src/vnet/l2/l2_fib.h
src/vnet/l2/l2_fwd.c

index 46c041e..48be42e 100644 (file)
 
 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)
 {
index 626fbe5..d8b37d2 100644 (file)
@@ -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
  */
index c647e3d..f1d215a 100644 (file)
@@ -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;