diff options
Diffstat (limited to 'src/vlib/handoff_trace.c')
-rw-r--r-- | src/vlib/handoff_trace.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/vlib/handoff_trace.c b/src/vlib/handoff_trace.c new file mode 100644 index 00000000000..7a6743885da --- /dev/null +++ b/src/vlib/handoff_trace.c @@ -0,0 +1,125 @@ +/* + * handoff_trace.c - used to generate handoff trace records + * + * Copyright (c) 2019 Cisco Systems and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <vlib/vlib.h> +#include <vnet/vnet.h> +#include <vnet/pg/pg.h> +#include <vppinfra/error.h> + +typedef struct +{ + u32 prev_thread; + u32 prev_trace_index; +} handoff_trace_t; + +/* packet trace format function */ +static u8 * +format_handoff_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 *); + handoff_trace_t *t = va_arg (*args, handoff_trace_t *); + + s = format (s, "HANDED-OFF: from thread %d trace index %d", + t->prev_thread, t->prev_trace_index); + return s; +} + +static vlib_node_registration_t handoff_trace_node; + +#define foreach_handoff_trace_error \ +_(BUGS, "Warning: packets sent to the handoff trace node!") + +typedef enum +{ +#define _(sym,str) HANDOFF_TRACE_ERROR_##sym, + foreach_handoff_trace_error +#undef _ + HANDOFF_TRACE_N_ERROR, +} handoff_trace_error_t; + +static char *handoff_trace_error_strings[] = { +#define _(sym,string) string, + foreach_handoff_trace_error +#undef _ +}; + +static uword +handoff_trace_node_fn (vlib_main_t * vm, + vlib_node_runtime_t * node, vlib_frame_t * frame) +{ + vlib_buffer_free (vm, vlib_frame_vector_args (frame), frame->n_vectors); + + vlib_node_increment_counter (vm, node->node_index, + HANDOFF_TRACE_ERROR_BUGS, frame->n_vectors); + + return frame->n_vectors; +} + +typedef enum +{ + HANDOFF_TRACE_NEXT_DROP, + HANDOFF_TRACE_N_NEXT, +} tdummy_next_t; + +/* *INDENT-OFF* */ +VLIB_REGISTER_NODE (handoff_trace_node, static) = +{ + .name = "handoff_trace", + .function = handoff_trace_node_fn, + .vector_size = sizeof (u32), + .format_trace = format_handoff_trace, + .type = VLIB_NODE_TYPE_INTERNAL, + .n_next_nodes = HANDOFF_TRACE_N_NEXT, + + /* edit / add dispositions here */ + .next_nodes = { + [HANDOFF_TRACE_NEXT_DROP] = "error-drop", + }, + + .n_errors = ARRAY_LEN(handoff_trace_error_strings), + .error_strings = handoff_trace_error_strings, +}; +/* *INDENT-ON* */ + +void +vlib_add_handoff_trace (vlib_main_t * vm, vlib_buffer_t * b) +{ + u32 prev_thread = vlib_buffer_get_trace_thread (b); + u32 prev_trace_index = vlib_buffer_get_trace_index (b); + handoff_trace_t *t; + vlib_node_runtime_t *node + = vlib_node_get_runtime (vm, handoff_trace_node.index); + + vlib_trace_buffer (vm, node, 0 /* fake next frame index */ , + b, 1 /* folllow chain */ ); + + t = vlib_add_trace (vm, node, b, sizeof (*t)); + + t->prev_thread = prev_thread; + t->prev_trace_index = prev_trace_index; +} + + +/* *INDENT-ON* */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |