/* * 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 /** * 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) { if (!clib_mem_is_vec (vnet_buffer2 (b)->trajectory_trace)) { vnet_buffer2 (b)->trajectory_trace = 0; 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: */