X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fmpls%2Fmpls_features.c;h=f59753723abef104f05d6d5299229ade2db041ea;hb=e5d34919b;hp=baf31c2b2e20a7fd078806b2a1531624eb6d39da;hpb=112ee88c496a5acb4ac21a2d9b8deef5514abd8f;p=vpp.git diff --git a/src/vnet/mpls/mpls_features.c b/src/vnet/mpls/mpls_features.c index baf31c2b2e2..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,12 +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"), + .last_in_arc = "mpls-lookup", .arc_index_ptr = &mpls_main.input_feature_arc_index, }; @@ -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; }