VPP-1506: dump local punts and registered punt sockets
[vpp.git] / src / vnet / l2 / l2_fwd.c
index 7744fcd..dfc1a74 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;
 }
 
@@ -211,7 +215,9 @@ l2fwd_process (vlib_main_t * vm,
        * lookup miss, so flood which is typically the next feature
        * unless some other feature is inserted before uu_flood
        */
-      if (vnet_buffer (b0)->l2.feature_bitmap & L2INPUT_FEAT_UU_FLOOD)
+      if (vnet_buffer (b0)->l2.feature_bitmap &
+         (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);
@@ -223,7 +229,6 @@ l2fwd_process (vlib_main_t * vm,
          *next0 = L2FWD_NEXT_DROP;
        }
     }
-
 }
 
 
@@ -257,7 +262,6 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
       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. */
       {
@@ -283,42 +287,6 @@ 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]);
 
-      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
@@ -334,10 +302,6 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
                       &key1,   /* not used */
                       &key2,   /* not used */
                       &key3,   /* not used */
-                      &bucket0,        /* not used */
-                      &bucket1,        /* not used */
-                      &bucket2,        /* not used */
-                      &bucket3,        /* not used */
                       &result0,
                       &result1,
                       &result2,
@@ -353,6 +317,46 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
 
       /* 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;
@@ -364,30 +368,30 @@ l2fwd_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
       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;
@@ -515,9 +519,9 @@ done:
  * manage interfaces. It is enabled by default.
  *
  * @cliexpar
- * Example of how to enable fowarding:
+ * Example of how to enable forwarding:
  * @cliexcmd{set interface l2 forward GigabitEthernet0/8/0}
- * Example of how to disable fowarding:
+ * Example of how to disable forwarding:
  * @cliexcmd{set interface l2 forward GigabitEthernet0/8/0 disable}
 ?*/
 /* *INDENT-OFF* */