X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlibmemory%2Fvlib_api_cli.c;h=5b62e61a235bbccaf67ff95a36748445879033ff;hb=051579d0f2bf5a408ed8439cfd28831e846389ab;hp=74ad3c5cd7686bb22c965078ffa60bf28770ce78;hpb=36217e3ca8a1ca2e7a341b6b44ffc25e6497191c;p=vpp.git diff --git a/src/vlibmemory/vlib_api_cli.c b/src/vlibmemory/vlib_api_cli.c index 74ad3c5cd76..5b62e61a235 100644 --- a/src/vlibmemory/vlib_api_cli.c +++ b/src/vlibmemory/vlib_api_cli.c @@ -242,20 +242,19 @@ vl_api_message_table_command (vlib_main_t * vm, vlib_cli_output (vm, "%-4s %-40s %6s %7s", "ID", "Name", "Bounce", "MP-safe"); - for (i = 1; i < vec_len (am->msg_names); i++) + for (i = 1; i < vec_len (am->msg_data); i++) { + vl_api_msg_data_t *m = vl_api_get_msg_data (am, i); if (verbose == 0) { vlib_cli_output (vm, "%-4d %s", i, - am->msg_names[i] ? am->msg_names[i] : - " [no handler]"); + m->name ? m->name : " [no handler]"); } else { vlib_cli_output (vm, "%-4d %-40s %6d %7d", i, - am->msg_names[i] ? am->msg_names[i] : - " [no handler]", am->message_bounce[i], - am->is_mp_safe[i]); + m->name ? m->name : " [no handler]", m->bounce, + m->is_mp_safe); } } @@ -435,7 +434,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, } close (fd); - CLIB_MEM_UNPOISON (hp, file_size); + clib_mem_unpoison (hp, file_size); nitems = ntohl (hp->nitems); @@ -487,7 +486,11 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, { u16 msg_index = unserialize_likely_small_unsigned_integer (sm); unserialize_cstring (sm, (char **) &name_and_crc); - u16 msg_index2 = vl_msg_api_get_msg_index (name_and_crc); + u32 msg_index2 = vl_msg_api_get_msg_index (name_and_crc); + ASSERT (~0 == msg_index2 || msg_index2 <= 65535); + if (~0 == msg_index2) + vlib_cli_output (vm, "warning: can't find msg index for id %d\n", + msg_index); vec_validate (msgid_vec, msg_index); msgid_vec[msg_index] = msg_index2; } @@ -496,7 +499,6 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, for (i = 0; i < first_index; i++) { - trace_cfg_t *cfgp; int size; u16 msg_id; @@ -504,18 +506,13 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, size = clib_host_to_net_u32 (*(u32 *) msg); msg += sizeof (u32); - assert_size (file_size_left, size); + assert_size (file_size_left, clib_max (size, sizeof (u16))); msg_id = ntohs (*((u16 *) msg)); - if (msg_id < vec_len (msgid_vec)) - msg_id = msgid_vec[msg_id]; - cfgp = am->api_trace_cfg + msg_id; - if (!cfgp) - { - vlib_cli_output (vm, "Ugh: msg id %d no trace config\n", msg_id); - munmap (hp, file_size); - vec_free (msgid_vec); - return; - } + if (msg_id >= vec_len (msgid_vec) || + msgid_vec[msg_id] >= vec_len (am->msg_data)) + vlib_cli_output (vm, "warning: unknown msg id %d for msg number %d\n", + msg_id, i); + msg += size; } @@ -524,32 +521,33 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, for (; i <= last_index; i++) { - trace_cfg_t *cfgp; + vl_api_msg_data_t *m; u16 msg_id; int size; if (which == DUMP) vlib_cli_output (vm, "---------- trace %d -----------\n", i); + assert_size (file_size_left, sizeof (u32)); size = clib_host_to_net_u32 (*(u32 *) msg); msg += sizeof (u32); + assert_size (file_size_left, clib_max (size, sizeof (u16))); msg_id = ntohs (*((u16 *) msg)); - if (msg_id < vec_len (msgid_vec)) - { - msg_id = msgid_vec[msg_id]; - } - cfgp = am->api_trace_cfg + msg_id; - if (!cfgp) + if (msg_id >= vec_len (msgid_vec) || + msgid_vec[msg_id] >= vec_len (am->msg_data)) { - vlib_cli_output (vm, "Ugh: msg id %d no trace config\n", msg_id); - munmap (hp, file_size); - vec_free (tmpbuf); - am->replay_in_progress = 0; - return; + vlib_cli_output ( + vm, "warning: unknown msg id %d for msg number %d, skipping\n", + msg_id, i); + msg += size; + continue; } + msg_id = msgid_vec[msg_id]; + m = vl_api_get_msg_data (am, msg_id); + /* Copy the buffer (from the read-only mmap'ed file) */ vec_validate (tmpbuf, size - 1 + sizeof (uword)); clib_memcpy (tmpbuf + sizeof (uword), msg, size); @@ -562,9 +560,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, if (((which == DUMP || which == DUMP_JSON) && clib_arch_is_little_endian)) { - void (*endian_fp) (void *); - if (msg_id >= vec_len (am->msg_endian_handlers) - || (am->msg_endian_handlers[msg_id] == 0)) + if (m && m->endian_handler == 0) { vlib_cli_output (vm, "Ugh: msg id %d no endian swap\n", msg_id); munmap (hp, file_size); @@ -572,8 +568,10 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, am->replay_in_progress = 0; return; } - endian_fp = am->msg_endian_handlers[msg_id]; - (*endian_fp) (tmpbuf + sizeof (uword)); + if (m) + { + m->endian_handler (tmpbuf + sizeof (uword)); + } } /* msg_id always in network byte order */ @@ -586,59 +584,30 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, switch (which) { case DUMP_JSON: - if (msg_id < vec_len (am->msg_print_json_handlers) && - am->msg_print_json_handlers[msg_id]) - { - u8 *(*print_fp) (void *, void *); - - print_fp = (void *) am->msg_print_json_handlers[msg_id]; - (*print_fp) (tmpbuf + sizeof (uword), vm); - } - else - { - vlib_cli_output (vm, "Skipping msg id %d: no JSON print fcn\n", - msg_id); - break; - } + vlib_cli_output (vm, "%U", format_vl_api_msg_json, am, msg_id, + tmpbuf + sizeof (uword)); break; case DUMP: - if (msg_id < vec_len (am->msg_print_handlers) && - am->msg_print_handlers[msg_id]) - { - u8 *(*print_fp) (void *, void *); - - print_fp = (void *) am->msg_print_handlers[msg_id]; - (*print_fp) (tmpbuf + sizeof (uword), vm); - } - else - { - vlib_cli_output (vm, "Skipping msg id %d: no print fcn\n", - msg_id); - break; - } + vlib_cli_output (vm, "%U", format_vl_api_msg_text, am, msg_id, + tmpbuf + sizeof (uword)); break; case INITIALIZERS: - if (msg_id < vec_len (am->msg_print_handlers) && - am->msg_print_handlers[msg_id]) + if (m) { u8 *s; int j; - u8 *(*print_fp) (void *, void *); - - print_fp = (void *) am->msg_print_handlers[msg_id]; - vlib_cli_output (vm, "/*"); + vlib_cli_output (vm, "/*%U*/", format_vl_api_msg_text, am, + msg_id, tmpbuf + sizeof (uword)); - (*print_fp) (tmpbuf + sizeof (uword), vm); vlib_cli_output (vm, "*/\n"); - s = format (0, "static u8 * vl_api_%s_%d[%d] = {", - am->msg_names[msg_id], i, - am->api_trace_cfg[msg_id].size); + s = format (0, "static u8 * vl_api_%s_%d[%d] = {", m->name, i, + m->trace_size); - for (j = 0; j < am->api_trace_cfg[msg_id].size; j++) + for (j = 0; j < m->trace_size; j++) { if ((j & 7) == 0) s = format (s, "\n "); @@ -651,22 +620,17 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, break; case REPLAY: - if (msg_id < vec_len (am->msg_print_handlers) && - am->msg_print_handlers[msg_id] && cfgp->replay_enable) + if (m && m->handler && m->replay_allowed) { - void (*handler) (void *, vlib_main_t *); - - handler = (void *) am->msg_handlers[msg_id]; - - if (!am->is_mp_safe[msg_id]) + if (!m->is_mp_safe) vl_msg_api_barrier_sync (); - (*handler) (tmpbuf + sizeof (uword), vm); - if (!am->is_mp_safe[msg_id]) + m->handler (tmpbuf + sizeof (uword)); + if (!m->is_mp_safe) vl_msg_api_barrier_release (); } else { - if (cfgp->replay_enable) + if (m && m->replay_allowed) vlib_cli_output (vm, "Skipping msg id %d: no handler\n", msg_id); break; @@ -674,7 +638,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, break; } - _vec_len (tmpbuf) = 0; + vec_set_len (tmpbuf, 0); msg += size; } @@ -709,11 +673,16 @@ vl_msg_print_trace (u8 *msg, void *ctx) vl_msg_print_args *a = ctx; api_main_t *am = vlibapi_get_main (); u16 msg_id = ntohs (*((u16 *) msg)); - void (*print_fp) (void *, void *); - void (**handlers) (void *, void *); + vl_api_msg_data_t *m = vl_api_get_msg_data (am, msg_id); u8 is_json = a->is_json; u8 *tmpbuf = 0; + if (!m) + { + vlib_cli_output (a->vm, "Unknown msg id %d\n", msg_id); + return 0; + } + if (clib_arch_is_little_endian) { u32 msg_length = vec_len (msg); @@ -721,25 +690,12 @@ vl_msg_print_trace (u8 *msg, void *ctx) clib_memcpy_fast (tmpbuf, msg, msg_length); msg = tmpbuf; - void (*endian_fp) (void *); - endian_fp = am->msg_endian_handlers[msg_id]; - (*endian_fp) (tmpbuf); + m->endian_handler (tmpbuf); } - if (is_json) - handlers = am->msg_print_json_handlers; - else - handlers = am->msg_print_handlers; - - if (msg_id < vec_len (handlers) && handlers[msg_id]) - { - print_fp = (void *) handlers[msg_id]; - (*print_fp) (msg, a->vm); - } - else - { - vlib_cli_output (a->vm, "Skipping msg id %d: no print fcn\n", msg_id); - } + vlib_cli_output (a->vm, "%U\n", + is_json ? format_vl_api_msg_json : format_vl_api_msg_text, + am, msg_id, msg); vec_free (tmpbuf); return 0; @@ -785,6 +741,10 @@ vl_msg_read_file (FILE *f) while ((n = fread (buf, 1, bufsize, f))) vec_add (v, buf, n); + /* most callers expect a NULL-terminated C-string */ + if (v) + vec_add1 (v, 0); + return v; } @@ -822,9 +782,8 @@ vl_msg_exec_json_command (vlib_main_t *vm, cJSON *o) { api_main_t *am = vlibapi_get_main (); u16 msg_id; - void *(*fromjson) (cJSON *, int *); int len = 0, rv = -1; - trace_cfg_t *cfgp; + vl_api_msg_data_t *m; u8 *msg = 0; cJSON *msg_id_obj = cJSON_GetObjectItem (o, "_msgname"); @@ -836,7 +795,7 @@ vl_msg_exec_json_command (vlib_main_t *vm, cJSON *o) char *name = cJSON_GetStringValue (msg_id_obj); cJSON *crc_obj = cJSON_GetObjectItem (o, "_crc"); - if (!msg_id_obj) + if (!crc_obj) { vlib_cli_output (vm, "Missing '_crc' element!\n"); return rv; @@ -846,6 +805,7 @@ vl_msg_exec_json_command (vlib_main_t *vm, cJSON *o) u8 *name_crc = format (0, "%s_%s%c", name, crc, 0); msg_id = vl_msg_find_id_by_name_and_crc (vm, am, (char *) name_crc); + m = vl_api_get_msg_data (am, msg_id); if (msg_id == (u16) ~0) { msg_id = vl_msg_find_id_by_name (vm, am, name); @@ -859,28 +819,19 @@ vl_msg_exec_json_command (vlib_main_t *vm, cJSON *o) } vec_free (name_crc); - cfgp = am->api_trace_cfg + msg_id; - if (!cfgp) - { - vlib_cli_output (vm, "msg id %d no trace config\n", msg_id); - return rv; - } - - if (cfgp->replay_enable) + if (m->replay_allowed) { - if (proc_warning) vlib_cli_output (vm, "warning: msg %d has different signature\n"); - fromjson = am->msg_fromjson_handlers[msg_id]; - if (!fromjson) + if (!m->fromjson_handler) { vlib_cli_output (vm, "missing fromjson convert function! id %d\n", msg_id); return rv; } - msg = (u8 *) fromjson (o, &len); + msg = (u8 *) m->fromjson_handler (o, &len); if (!msg) { vlib_cli_output (vm, "failed to convert JSON (msg id %d)!\n", @@ -889,25 +840,22 @@ vl_msg_exec_json_command (vlib_main_t *vm, cJSON *o) } if (clib_arch_is_little_endian) - { - void (*endian_fp) (void *); - endian_fp = am->msg_endian_handlers[msg_id]; - (*endian_fp) (msg); - } + m->endian_handler (msg); - void (*handler) (void *, vlib_main_t *); - handler = (void *) am->msg_handlers[msg_id]; - if (!handler) + if (!m->handler) { vlib_cli_output (vm, "no handler for msg id %d!\n", msg_id); goto end; } - if (!am->is_mp_safe[msg_id]) - vl_msg_api_barrier_sync (); - (*handler) (msg, vm); - if (!am->is_mp_safe[msg_id]) - vl_msg_api_barrier_release (); + if (m->handler) + { + if (!m->is_mp_safe) + vl_msg_api_barrier_sync (); + m->handler (msg); + if (!m->is_mp_safe) + vl_msg_api_barrier_release (); + } } rv = 0; @@ -1282,7 +1230,7 @@ extract_name (u8 * s) rv = vec_dup (s); while (vec_len (rv) && rv[vec_len (rv)] != '_') - _vec_len (rv)--; + vec_dec_len (rv, 1); rv[vec_len (rv)] = 0;