diff options
Diffstat (limited to 'src/vnet')
-rw-r--r-- | src/vnet/buffer.h | 17 | ||||
-rw-r--r-- | src/vnet/interface.c | 15 | ||||
-rw-r--r-- | src/vnet/unix/gdb_funcs.c | 13 | ||||
-rw-r--r-- | src/vnet/util/trajectory.c | 95 |
4 files changed, 134 insertions, 6 deletions
diff --git a/src/vnet/buffer.h b/src/vnet/buffer.h index 7567b875248..045328816cd 100644 --- a/src/vnet/buffer.h +++ b/src/vnet/buffer.h @@ -317,9 +317,26 @@ typedef struct { union { +#if VLIB_BUFFER_TRACE_TRAJECTORY > 0 + /* buffer trajectory tracing */ + struct + { + u16 *trajectory_trace; + }; +#endif + u32 unused[12]; }; } vnet_buffer_opaque2_t; +#define vnet_buffer2(b) ((vnet_buffer_opaque2_t *) (b)->opaque2) + +/* + * The opaque2 field of the vlib_buffer_t is intepreted as a + * vnet_buffer_opaque2_t. Hence it should be big enough to accommodate one. + */ +STATIC_ASSERT (sizeof (vnet_buffer_opaque2_t) <= + STRUCT_SIZE_OF (vlib_buffer_t, opaque2), + "VNET buffer opaque2 meta-data too large for vlib_buffer"); #endif /* included_vnet_buffer_h */ diff --git a/src/vnet/interface.c b/src/vnet/interface.c index 159ce8c6494..eb5d3d0fced 100644 --- a/src/vnet/interface.c +++ b/src/vnet/interface.c @@ -1170,6 +1170,7 @@ vnet_interface_init (vlib_main_t * vm) vnet_interface_main_t *im = &vnm->interface_main; vlib_buffer_t *b = 0; vnet_buffer_opaque_t *o = 0; + clib_error_t *error; /* * Keep people from shooting themselves in the foot. @@ -1250,15 +1251,17 @@ vnet_interface_init (vlib_main_t * vm) } } - { - clib_error_t *error; + if ((error = vlib_call_init_function (vm, vnet_interface_cli_init))) + return error; - if ((error = vlib_call_init_function (vm, vnet_interface_cli_init))) - return error; + vnm->interface_tag_by_sw_if_index = hash_create (0, sizeof (uword)); +#if VLIB_BUFFER_TRACE_TRAJECTORY > 0 + if ((error = vlib_call_init_function (vm, trajectory_trace_init))) return error; - } - vnm->interface_tag_by_sw_if_index = hash_create (0, sizeof (uword)); +#endif + + return 0; } VLIB_INIT_FUNCTION (vnet_interface_init); diff --git a/src/vnet/unix/gdb_funcs.c b/src/vnet/unix/gdb_funcs.c index 32e22d924ba..40d0d663472 100644 --- a/src/vnet/unix/gdb_funcs.c +++ b/src/vnet/unix/gdb_funcs.c @@ -190,6 +190,8 @@ show_gdb_command_fn (vlib_main_t * vm, vlib_cli_command_t * cmd) { vlib_cli_output (vm, "vl(p) returns vec_len(p)"); + vlib_cli_output (vm, "vb(b) returns vnet_buffer(b) [opaque]"); + vlib_cli_output (vm, "vb2(b) returns vnet_buffer2(b) [opaque2]"); vlib_cli_output (vm, "pe(p) returns pool_elts(p)"); vlib_cli_output (vm, "pifi(p, i) returns pool_is_free_index(p, i)"); vlib_cli_output (vm, "gdb_show_errors(0|1) dumps error counters"); @@ -217,6 +219,17 @@ vnet_buffer_opaque_t *vb (void *vb_arg) return rv; } +vnet_buffer_opaque2_t *vb2 (void *vb_arg) +{ + vlib_buffer_t *b = (vlib_buffer_t *)vb_arg; + vnet_buffer_opaque2_t *rv; + + rv = vnet_buffer2(b); + + return rv; +} + + /* Cafeteria plan, maybe you don't want these functions */ clib_error_t * gdb_func_init (vlib_main_t * vm) { return 0; } diff --git a/src/vnet/util/trajectory.c b/src/vnet/util/trajectory.c new file mode 100644 index 00000000000..24b51254ecd --- /dev/null +++ b/src/vnet/util/trajectory.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2017 Cisco 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. + */ + +/** \file + * Buffer trace trajectory utilities + */ + +#include <vnet/vnet.h> + +/** + * Dump a trajectory trace, reasonably easy to call from gdb + */ +void +vnet_dump_trajectory_trace (vlib_main_t * vm, u32 bi) +{ +#if VLIB_BUFFER_TRACE_TRAJECTORY > 0 + vlib_node_main_t *vnm = &vm->node_main; + vlib_buffer_t *b; + u16 *trace; + u8 i; + + b = vlib_get_buffer (vm, bi); + + trace = vnet_buffer2 (b)->trajectory_trace; + + fformat (stderr, "Context trace for bi %d b 0x%llx, visited %d\n", + bi, b, vec_len (trace)); + + for (i = 0; i < vec_len (trace); i++) + { + u32 node_index; + + node_index = trace[i]; + + if (node_index > vec_len (vnm->nodes)) + { + fformat (stderr, "Skip bogus node index %d\n", node_index); + continue; + } + + fformat (stderr, "%v (%d)\n", vnm->nodes[node_index]->name, node_index); + } +#else + fformat (stderr, "in vlib/buffers.h, " + "#define VLIB_BUFFER_TRACE_TRAJECTORY 1\n"); + +#endif +} + +#if VLIB_BUFFER_TRACE_TRAJECTORY > 0 + +void +init_trajectory_trace (vlib_buffer_t * b) +{ + vec_validate (vnet_buffer2 (b)->trajectory_trace, 7); + _vec_len (vnet_buffer2 (b)->trajectory_trace) = 0; +} + +void +add_trajectory_trace (vlib_buffer_t * b, u32 node_index) +{ + vec_add1 (vnet_buffer2 (b)->trajectory_trace, (u16) node_index); +} + +static clib_error_t * +trajectory_trace_init (vlib_main_t * vm) +{ + vlib_buffer_trace_trajectory_cb = add_trajectory_trace; + vlib_buffer_trace_trajectory_init_cb = init_trajectory_trace; + return 0; +} + +VLIB_INIT_FUNCTION (trajectory_trace_init); + +#endif + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |