ipsec: IPSec protection for multi-point tunnel interfaces
[vpp.git] / src / vnet / mpls / mpls_features.c
index 2414795..f597537 100644 (file)
 
 #include <vnet/mpls/mpls.h>
 
+static u8 *
+format_mpls_drop_trace (u8 * s, va_list * args)
+{
+  CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
+  CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
+
+  return s;
+}
+
+static void
+mpls_drop_trace (vlib_main_t * vm,
+                 vlib_node_runtime_t * node,
+                 vlib_frame_t * frame)
+{
+  u32 *from, n_left;
+
+  n_left = frame->n_vectors;
+  from = vlib_frame_vector_args (frame);
+
+  while (n_left >= 1)
+    {
+      vlib_buffer_t *b0;
+      u32 bi0;
+
+      bi0 = from[0];
+
+      b0 = vlib_get_buffer (vm, bi0);
+
+      if (b0->flags & VLIB_BUFFER_IS_TRACED)
+      {
+          vlib_add_trace (vm, node, b0, 0);
+      }
+      from += 1;
+      n_left -= 1;
+    }
+}
+
 always_inline uword
 mpls_terminate (vlib_main_t * vm,
                 vlib_node_runtime_t * node,
@@ -26,6 +63,9 @@ mpls_terminate (vlib_main_t * vm,
   u32 * buffers = vlib_frame_vector_args (frame);
   uword n_packets = frame->n_vectors;
 
+  if (node->flags & VLIB_NODE_FLAG_TRACE)
+      mpls_drop_trace (vm, node, frame);
+
   vlib_error_drop_buffers (vm, node,
                            buffers,
                            /* stride */ 1,
@@ -37,8 +77,7 @@ mpls_terminate (vlib_main_t * vm,
   return n_packets;
 }
 
-static uword
-mpls_punt (vlib_main_t * vm,
+VLIB_NODE_FN (mpls_punt_node) (vlib_main_t * vm,
            vlib_node_runtime_t * node,
            vlib_frame_t * frame)
 {
@@ -46,9 +85,9 @@ mpls_punt (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (mpls_punt_node) = {
-  .function = mpls_punt,
   .name = "mpls-punt",
   .vector_size = sizeof (u32),
+  .format_trace = format_mpls_drop_trace,
 
   .n_next_nodes = 1,
   .next_nodes = {
@@ -56,10 +95,7 @@ VLIB_REGISTER_NODE (mpls_punt_node) = {
   },
 };
 
-VLIB_NODE_FUNCTION_MULTIARCH (mpls_punt_node, mpls_punt)
-
-static uword
-mpls_drop (vlib_main_t * vm,
+VLIB_NODE_FN (mpls_drop_node) (vlib_main_t * vm,
            vlib_node_runtime_t * node,
            vlib_frame_t * frame)
 {
@@ -67,9 +103,9 @@ mpls_drop (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (mpls_drop_node) = {
-  .function = mpls_drop,
   .name = "mpls-drop",
   .vector_size = sizeof (u32),
+  .format_trace = format_mpls_drop_trace,
 
   .n_next_nodes = 1,
   .next_nodes = {
@@ -77,10 +113,7 @@ VLIB_REGISTER_NODE (mpls_drop_node) = {
   },
 };
 
-VLIB_NODE_FUNCTION_MULTIARCH (mpls_drop_node, mpls_drop)
-
-static uword
-mpls_not_enabled (vlib_main_t * vm,
+VLIB_NODE_FN (mpls_not_enabled_node) (vlib_main_t * vm,
                   vlib_node_runtime_t * node,
                   vlib_frame_t * frame)
 {
@@ -88,9 +121,9 @@ mpls_not_enabled (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (mpls_not_enabled_node) = {
-  .function = mpls_not_enabled,
   .name = "mpls-not-enabled",
   .vector_size = sizeof (u32),
+  .format_trace = format_mpls_drop_trace,
 
   .n_next_nodes = 1,
   .next_nodes = {
@@ -98,13 +131,11 @@ VLIB_REGISTER_NODE (mpls_not_enabled_node) = {
   },
 };
 
-VLIB_NODE_FUNCTION_MULTIARCH (mpls_not_enabled_node, mpls_not_enabled)
-
 VNET_FEATURE_ARC_INIT (mpls_input, static) =
 {
   .arc_name  = "mpls-input",
   .start_nodes = VNET_FEATURES ("mpls-input"),
-  .end_node = "mpls-lookup",
+  .last_in_arc = "mpls-lookup",
   .arc_index_ptr = &mpls_main.input_feature_arc_index,
 };
 
@@ -124,6 +155,7 @@ VNET_FEATURE_ARC_INIT (mpls_output, static) =
 {
   .arc_name  = "mpls-output",
   .start_nodes = VNET_FEATURES ("mpls-output", "mpls-midchain"),
+  .last_in_arc = "interface-output",
   .arc_index_ptr = &mpls_main.output_feature_arc_index,
 };
 
@@ -146,8 +178,6 @@ mpls_sw_interface_add_del (vnet_main_t * vnm,
 
   vnet_feature_enable_disable ("mpls-input", "mpls-not-enabled", sw_if_index,
                               is_add, 0, 0);
-  vnet_feature_enable_disable ("mpls-output", "interface-output", sw_if_index,
-                              is_add, 0, 0);
 
   return /* no error */ 0;
 }