X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fmpls%2Fmpls_features.c;h=f59753723abef104f05d6d5299229ade2db041ea;hb=b307c712f459f90d8a585fe51ba15ac8b931cdbe;hp=a7593c55b09bfccedfd2c7c2c32b4e07eb1d9644;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vnet/mpls/mpls_features.c b/src/vnet/mpls/mpls_features.c index a7593c55b09..f59753723ab 100644 --- a/src/vnet/mpls/mpls_features.c +++ b/src/vnet/mpls/mpls_features.c @@ -17,6 +17,43 @@ #include +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,24 +131,23 @@ 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"), + .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 */ }; @@ -123,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, }; @@ -145,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; }