|
FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
|
Go to the documentation of this file.
20 #include <sys/types.h>
39 if (total_counts == 0)
48 percent = ((f64) vector_rate_histogram[SLEEP_##n##_US]) \
49 / (f64) total_counts; \
51 vlib_cli_output (vm, "Sleep %3d us: %llu, %.2f%%",n, \
52 vector_rate_histogram[SLEEP_##n##_US], \
67 .path =
"show api histogram",
68 .short_help =
"show api histogram",
91 .path =
"clear api histogram",
92 .short_help =
"clear api histogram",
105 u32 *confused_indices = 0;
111 "Name",
"PID",
"Queue Length",
"Queue VA",
"Health");
121 health =
"questionable";
128 regp->
name, q->consumer_pid, q->cursize,
134 regpp -
am->vl_clients);
135 vec_add1 (confused_indices, regpp -
am->vl_clients);
144 for (
i = 0;
i <
vec_len (confused_indices);
i++)
151 if (
am->missing_clients)
153 am->missing_clients);
167 if (
am->rx_trace == 0)
173 if (
am->rx_trace->enabled == 0)
179 if (
am->tx_trace == 0)
185 if (
am->tx_trace->enabled == 0)
198 .short_help =
"Show API information",
208 .path =
"show api clients",
209 .short_help =
"Client information",
220 .path =
"show api trace-status",
221 .short_help =
"Display API trace status",
250 am->msg_names[
i] ?
am->msg_names[
i] :
256 am->msg_names[
i] ?
am->msg_names[
i] :
257 " [no handler]",
am->message_bounce[
i],
271 .path =
"show api message-table",
272 .short_help =
"Message Table",
280 int len0, len1, clen;
284 clen = len0 < len1 ? len0 : len1;
285 return (strncmp ((
char *) a0->
name, (
char *) a1->
name, clen));
294 s =
format (s,
"%-50s%9s%9s",
"Name",
"First-ID",
"Last-ID");
338 .path =
"show api plugin",
339 .short_help =
"show api plugin",
364 trace_name =
"TX trace";
369 trace_name =
"RX trace";
378 s =
format (s,
"%s: not yet configured.\n", trace_name);
382 s =
format (s,
"%s: used %d of %d items, %s enabled, %s wrapped\n",
389 __attribute__ ((weak));
397 u32 first_index,
u32 last_index,
400 vl_api_trace_file_header_t *hp;
407 u32 nitems, nitems_msgtbl;
408 void **saved_print_handlers = 0;
410 fd = open ((
char *) filename, O_RDONLY);
418 if (fstat (fd, &statb) < 0)
425 if (!(statb.st_mode & S_IFREG) || (statb.st_size < sizeof (*hp)))
432 file_size = statb.st_size;
433 file_size = (file_size + 4095) & ~(4095);
435 hp = mmap (0, file_size, PROT_READ, MAP_PRIVATE, fd, 0);
437 if (hp == (vl_api_trace_file_header_t *) MAP_FAILED)
447 nitems = ntohl (hp->nitems);
449 if (last_index == (
u32) ~ 0)
451 last_index = nitems - 1;
454 if (first_index >= nitems || last_index >= nitems)
457 first_index, last_index, nitems - 1);
458 munmap (hp, file_size);
463 "Note: wrapped/incomplete trace, results may vary\n");
467 saved_print_handlers = (
void **)
vec_dup (
am->msg_print_handlers);
471 msg = (
u8 *) (hp + 1);
475 u32 msgtbl_size = ntohl (hp->msgtbl_size);
481 for (
i = 0;
i < nitems_msgtbl;
i++)
487 msgid_vec[msg_index] = msg_index2;
492 for (
i = 0;
i < first_index;
i++)
498 size = clib_host_to_net_u32 (*(
u32 *) msg);
502 if (msg_id <
vec_len (msgid_vec))
503 msg_id = msgid_vec[msg_id];
504 cfgp =
am->api_trace_cfg + msg_id;
508 munmap (hp, file_size);
515 am->replay_in_progress = 1;
517 for (;
i <= last_index;
i++)
526 size = clib_host_to_net_u32 (*(
u32 *) msg);
530 if (msg_id <
vec_len (msgid_vec))
532 msg_id = msgid_vec[msg_id];
535 cfgp =
am->api_trace_cfg + msg_id;
539 munmap (hp, file_size);
541 am->replay_in_progress = 0;
557 void (*endian_fp) (
void *);
558 if (msg_id >=
vec_len (
am->msg_endian_handlers)
559 || (
am->msg_endian_handlers[msg_id] == 0))
562 munmap (hp, file_size);
564 am->replay_in_progress = 0;
567 endian_fp =
am->msg_endian_handlers[msg_id];
568 (*endian_fp) (tmpbuf +
sizeof (
uword));
582 if (msg_id <
vec_len (
am->msg_print_handlers) &&
583 am->msg_print_handlers[msg_id])
585 u8 *(*print_fp) (
void *,
void *);
587 print_fp = (
void *)
am->msg_print_handlers[msg_id];
588 (*print_fp) (tmpbuf +
sizeof (
uword),
vm);
599 if (msg_id <
vec_len (
am->msg_print_handlers) &&
600 am->msg_print_handlers[msg_id])
604 u8 *(*print_fp) (
void *,
void *);
606 print_fp = (
void *)
am->msg_print_handlers[msg_id];
610 (*print_fp) (tmpbuf +
sizeof (
uword),
vm);
613 s =
format (0,
"static u8 * vl_api_%s_%d[%d] = {",
614 am->msg_names[msg_id],
i,
615 am->api_trace_cfg[msg_id].size);
617 for (j = 0; j <
am->api_trace_cfg[msg_id].size; j++)
621 s =
format (s,
"0x%02x,", tmpbuf[
sizeof (
uword) + j]);
623 s =
format (s,
"\n};\n%c", 0);
630 if (msg_id <
vec_len (
am->msg_print_handlers) &&
635 handler = (
void *)
am->msg_handlers[msg_id];
637 if (!
am->is_mp_safe[msg_id])
639 (*handler) (tmpbuf +
sizeof (
uword),
vm);
640 if (!
am->is_mp_safe[msg_id])
653 _vec_len (tmpbuf) = 0;
657 if (saved_print_handlers)
660 vec_len (
am->msg_print_handlers) * sizeof (
void *));
664 munmap (hp, file_size);
666 am->replay_in_progress = 0;
684 u32 nitems = 256 << 10;
688 u8 *chroot_filename = 0;
702 if (
unformat (line_input,
"nitems %d", &nitems))
709 else if (
unformat (line_input,
"off"))
715 else if (
unformat (line_input,
"save %s", &filename))
717 if (strstr ((
char *) filename,
"..")
718 ||
index ((
char *) filename,
'/'))
725 chroot_filename =
format (0,
"/tmp/%s%c", filename, 0);
729 fp = fopen ((
char *) chroot_filename,
"w");
749 "Error while writing end of buffer trace to file\n");
752 "Error while writing start of buffer trace to file\n");
759 else if (
unformat (line_input,
"dump %s", &filename))
763 else if (
unformat (line_input,
"custom-dump %s", &filename))
767 else if (
unformat (line_input,
"replay %s", &filename))
771 else if (
unformat (line_input,
"initializers %s", &filename))
775 else if (
unformat (line_input,
"tx"))
787 else if (
unformat (line_input,
"status"))
792 else if (
unformat (line_input,
"free"))
799 else if (
unformat (line_input,
"post-mortem-on"))
801 else if (
unformat (line_input,
"post-mortem-off"))
822 .short_help =
"api trace [on|off][first <n>][last <n>][status][free]"
823 "[post-mortem-on][dump|custom-dump|save|replay <file>]",
841 else if (
unformat (input,
"tx nitems %u", &nitems)
871 else if (
unformat (input,
"debug on"))
873 am->msg_print_flag = 1;
875 else if (
unformat (input,
"debug off"))
877 am->msg_print_flag = 0;
901 .path =
"set api-trace",
902 .short_help =
"API trace [on][on tx][on rx][off][free][debug on][debug off]",
910 u32 nitems = 256 << 10;
918 if (
unformat (input,
"nitems %d", &nitems))
924 else if (
unformat (input,
"save-api-table %s",
925 &
am->save_msg_table_filename))
950 if (
unformat (input,
"length %d", &nitems) ||
951 (
unformat (input,
"len %d", &nitems)))
954 am->vlib_input_queue_length = nitems;
956 clib_warning (
"vlib input queue length %d too small, ignored",
1041 int compare_current = 0;
1042 int numeric_sort = 0;
1045 u32 ndifferences = 0;
1049 if (
unformat (input,
"file %s", &filename))
1051 else if (
unformat (input,
"compare-current")
1053 compare_current = 1;
1054 else if (
unformat (input,
"numeric"))
1061 if (numeric_sort && compare_current)
1063 (0,
"Comparison and numeric sorting are incompatible");
1077 for (
i = 0;
i < nmsgs;
i++)
1082 item->msg_index = msg_index;
1083 item->name_and_crc = name_and_crc;
1091 if (compare_current)
1099 for (
i = 0;
i < nmsgs;
i++)
1105 item->msg_index = msg_index;
1106 item->name_and_crc = name_and_crc;
1120 if (compare_current)
1147 ((
char *) table[
i].name_and_crc,
1148 (
char *) table[
i + 1].name_and_crc,
1159 || strcmp ((
char *) table[
i].
name, (
char *) table[
i + 1].
name))
1172 if (ndifferences == 0)
1238 .path =
"show api dump",
1239 .short_help =
"show api dump file <filename> [numeric | compare-current]",
static u8 * extract_name(u8 *s)
static clib_error_t * vl_api_status_command(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cli_cmd)
void vl_msg_api_barrier_release(void)
static vlib_cli_command_t trace
(constructor) VLIB_CLI_COMMAND (trace)
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
static vlib_cli_command_t cli_show_api_histogram_command
(constructor) VLIB_CLI_COMMAND (cli_show_api_histogram_command)
#define clib_memcpy(d, s, n)
u8 * name
name of the plugin
static vlib_cli_command_t cli_show_api_status_command
(constructor) VLIB_CLI_COMMAND (cli_show_api_status_command)
static vlib_cli_command_t cli_show_api_command
(constructor) VLIB_CLI_COMMAND (cli_show_api_command)
void vl_msg_api_custom_dump_configure(api_main_t *am)
#define clib_error_return(e, args...)
#define foreach_histogram_bucket
struct _svm_queue svm_queue_t
static heap_elt_t * first(heap_header_t *h)
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
svm_queue_t * vl_input_queue
shared memory only: pointer to client input queue
#define vec_delete(V, N, M)
Delete N elements starting at element M.
vl_api_trace_which_t
Trace RX / TX enum.
u16 last_msg_id
last assigned message ID
__clib_export void serialize_open_vector(serialize_main_t *m, u8 *vector)
static clib_error_t * api_trace_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
api_trace_command_fn - control the binary API trace / replay feature
#define pool_put_index(p, i)
Free pool element with given index.
static vlib_cli_command_t api_trace_command
(constructor) VLIB_CLI_COMMAND (api_trace_command)
static int table_name_and_crc_cmp(void *a1, void *a2)
#define VLIB_CONFIG_FUNCTION(x, n,...)
u8 enabled
trace is enabled
static clib_error_t * vl_api_show_plugin_command(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cli_cmd)
#define pool_foreach(VAR, POOL)
Iterate through pool.
int vl_msg_api_trace_save(api_main_t *am, vl_api_trace_which_t which, FILE *fp)
static vlib_cli_command_t dump_api_table_file
(constructor) VLIB_CLI_COMMAND (dump_api_table_file)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
Trace configuration for a single message.
int vl_msg_api_trace_configure(api_main_t *am, vl_api_trace_which_t which, u32 nitems)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
__clib_export clib_error_t * unserialize_open_clib_file(serialize_main_t *m, char *file)
#define vec_dup(V)
Return copy of vector (no header, no alignment)
static clib_error_t * dump_api_table_file_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vlib_worker_thread_barrier_sync(X)
An API client registration, only in vpp/vlib.
static clib_error_t * api_trace_config_fn(vlib_main_t *vm, unformat_input_t *input)
static vlib_cli_command_t cli_show_api_plugin_command
(constructor) VLIB_CLI_COMMAND (cli_show_api_plugin_command)
static void unserialize_integer(serialize_main_t *m, void *x, u32 n_bytes)
static heap_elt_t * last(heap_header_t *h)
if(node->flags &VLIB_NODE_FLAG_TRACE) vnet_interface_output_trace(vm
static api_main_t * vlibapi_get_main(void)
sll srl srl sll sra u16x4 i
u32 vl_msg_api_get_msg_index(u8 *name_and_crc)
void vl_sock_api_dump_clients(vlib_main_t *vm, api_main_t *am)
u8 * vl_api_serialize_message_table(api_main_t *am, u8 *vector)
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment)
#define VLIB_CLI_COMMAND(x,...)
static vlib_cli_command_t cli_clear_api_histogram_command
(constructor) VLIB_CLI_COMMAND (cli_clear_api_histogram_command)
static clib_error_t * vl_api_trace_command(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cli_cmd)
static clib_error_t * vl_api_show_histogram_command(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cli_cmd)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
__clib_export void unserialize_open_data(serialize_main_t *m, u8 *data, uword n_data_bytes)
API main structure, used by both vpp and binary API clients.
static clib_error_t * vl_api_clear_histogram_command(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cli_cmd)
__clib_export void unserialize_cstring(serialize_main_t *m, char **s)
#define vec_free(V)
Free vector's memory (no header).
static u8 * format_api_msg_range(u8 *s, va_list *args)
static int range_compare(vl_api_msg_range_t *a0, vl_api_msg_range_t *a1)
u32 nitems
Number of trace records.
u8 wrapped
trace has wrapped
int vl_msg_api_trace_free(api_main_t *am, vl_api_trace_which_t which)
description fragment has unexpected format
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header,...
Message range (belonging to a plugin)
u8 * format_vl_msg_api_trace_status(u8 *s, va_list *args)
u64 vector_rate_histogram[]
#define CLIB_MEM_UNPOISON(a, s)
static clib_error_t * vl_api_client_command(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cli_cmd)
static clib_error_t * vl_api_message_table_command(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cli_cmd)
static int table_id_cmp(void *a1, void *a2)
u16 first_msg_id
first assigned message ID
static vlib_cli_command_t cli_show_api_clients_command
(constructor) VLIB_CLI_COMMAND (cli_show_api_clients_command)
static uword pool_elts(void *v)
Number of active elements in a pool.
int replay_enable
This message can be replayed
void vl_msg_api_post_mortem_dump_enable_disable(int enable)
#define clib_arch_is_little_endian
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
__clib_export void unserialize_close(serialize_main_t *m)
#define vec_terminate_c_string(V)
(If necessary) NULL terminate a vector containing a c-string.
#define clib_warning(format, args...)
static u64 unserialize_likely_small_unsigned_integer(serialize_main_t *m)
static void cleanup(void)
static void vl_msg_api_process_file(vlib_main_t *vm, u8 *filename, u32 first_index, u32 last_index, vl_api_replay_t which)
int vl_msg_api_trace_onoff(api_main_t *am, vl_api_trace_which_t which, int onoff)
static clib_error_t * api_queue_config_fn(vlib_main_t *vm, unformat_input_t *input)
void vl_msg_api_barrier_sync(void)
static u8 * extract_crc(u8 *s)
static vlib_cli_command_t cli_show_api_message_table_command
(constructor) VLIB_CLI_COMMAND (cli_show_api_message_table_command)