#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,
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,
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)
{
}
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 = {
},
};
-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)
{
}
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 = {
},
};
-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)
{
}
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 = {
},
};
-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"),
+ .last_in_arc = "mpls-lookup",
.arc_index_ptr = &mpls_main.input_feature_arc_index,
};
-VNET_FEATURE_INIT (mpls_lookup, static) = {
+VNET_FEATURE_INIT (mpls_not_enabled, static) = {
.arc_name = "mpls-input",
- .node_name = "mpls-lookup",
- .runs_before = VNET_FEATURES ("mpls-not-enabled"),
+ .node_name = "mpls-not-enabled",
+ .runs_before = VNET_FEATURES ("mpls-lookup"),
};
-VNET_FEATURE_INIT (mpls_not_enabled, static) = {
+VNET_FEATURE_INIT (mpls_lookup, static) = {
.arc_name = "mpls-input",
- .node_name = "mpls-not-enabled",
+ .node_name = "mpls-lookup",
.runs_before = VNET_FEATURES (0), /* not before any other features */
};
{
.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,
};
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;
}