diff options
author | Dave Barach <dave@barachs.net> | 2016-12-02 13:31:25 -0500 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2016-12-05 09:19:43 +0000 |
commit | 072f8debf21c786ab785ed623229935e0a6cddb6 (patch) | |
tree | bf50847f3f54f9fd1dbc2ad630b85e96160bd004 /vlib-api/vlibapi | |
parent | e3371afc8a90177eef331cf609ddd89c9413aeb5 (diff) |
Variable-message-length tracing support, VPP-370
Clean up several message handlers which spuriously depended on having
a vlib_main_t * pointer passed as a second argument. That definitely
doesn't happen when replaying an api trace...
Change-Id: Id4cf9745f770933566cb13698ee779333ee35d79
Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'vlib-api/vlibapi')
-rw-r--r-- | vlib-api/vlibapi/api.h | 8 | ||||
-rw-r--r-- | vlib-api/vlibapi/api_shared.c | 47 |
2 files changed, 49 insertions, 6 deletions
diff --git a/vlib-api/vlibapi/api.h b/vlib-api/vlibapi/api.h index 10ca443b434..52452526b9b 100644 --- a/vlib-api/vlibapi/api.h +++ b/vlib-api/vlibapi/api.h @@ -208,6 +208,14 @@ typedef struct int is_mp_safe; } vl_msg_api_msg_config_t; +typedef struct msgbuf_ +{ + unix_shared_memory_queue_t *q; + u32 data_len; + u32 pad; + u8 data[0]; +} msgbuf_t; + /* api_shared.c prototypes */ int vl_msg_api_rx_trace_enabled (api_main_t * am); int vl_msg_api_tx_trace_enabled (api_main_t * am); diff --git a/vlib-api/vlibapi/api_shared.c b/vlib-api/vlibapi/api_shared.c index 2b2d81c2735..6a04fac92f4 100644 --- a/vlib-api/vlibapi/api_shared.c +++ b/vlib-api/vlibapi/api_shared.c @@ -21,6 +21,7 @@ #include <stdio.h> #include <stdlib.h> +#include <stddef.h> #include <string.h> #include <sys/types.h> #include <sys/mman.h> @@ -85,8 +86,10 @@ vl_msg_api_trace (api_main_t * am, vl_api_trace_t * tp, void *msg) u8 **this_trace; u8 **old_trace; u8 *msg_copy; + u32 length; trace_cfg_t *cfgp; u16 msg_id = ntohs (*((u16 *) msg)); + msgbuf_t *header = (msgbuf_t *) (((u8 *) msg) - offsetof (msgbuf_t, data)); cfgp = am->api_trace_cfg + msg_id; @@ -116,8 +119,10 @@ vl_msg_api_trace (api_main_t * am, vl_api_trace_t * tp, void *msg) this_trace = old_trace; } - vec_validate (msg_copy, cfgp->size - 1); - clib_memcpy (msg_copy, msg, cfgp->size); + length = clib_net_to_host_u32 (header->data_len); + + vec_validate (msg_copy, length - 1); + clib_memcpy (msg_copy, msg, length); *this_trace = msg_copy; } @@ -254,6 +259,7 @@ vl_msg_api_trace_save (api_main_t * am, vl_api_trace_which_t which, FILE * fp) */ for (i = 0; i < vec_len (tp->traces); i++) { + u32 msg_length; /*sa_ignore NO_NULL_CHK */ msg = tp->traces[i]; /* @@ -262,6 +268,13 @@ vl_msg_api_trace_save (api_main_t * am, vl_api_trace_which_t which, FILE * fp) */ if (!msg) continue; + + msg_length = clib_host_to_net_u32 (vec_len (msg)); + if (fwrite (&msg_length, 1, sizeof (msg_length), fp) + != sizeof (msg_length)) + { + return (-14); + } if (fwrite (msg, 1, vec_len (msg), fp) != vec_len (msg)) { return (-11); @@ -273,6 +286,7 @@ vl_msg_api_trace_save (api_main_t * am, vl_api_trace_which_t which, FILE * fp) /* Wrap case: write oldest -> end of buffer */ for (i = tp->curindex; i < vec_len (tp->traces); i++) { + u32 msg_length; msg = tp->traces[i]; /* * This retarded check required to pass @@ -281,6 +295,13 @@ vl_msg_api_trace_save (api_main_t * am, vl_api_trace_which_t which, FILE * fp) if (!msg) continue; + msg_length = clib_host_to_net_u32 (vec_len (msg)); + if (fwrite (&msg_length, 1, sizeof (msg_length), fp) + != sizeof (msg_length)) + { + return (-14); + } + if (fwrite (msg, 1, vec_len (msg), fp) != vec_len (msg)) { return (-12); @@ -289,6 +310,7 @@ vl_msg_api_trace_save (api_main_t * am, vl_api_trace_which_t which, FILE * fp) /* write beginning of buffer -> oldest-1 */ for (i = 0; i < tp->curindex; i++) { + u32 msg_length; /*sa_ignore NO_NULL_CHK */ msg = tp->traces[i]; /* @@ -298,6 +320,13 @@ vl_msg_api_trace_save (api_main_t * am, vl_api_trace_which_t which, FILE * fp) if (!msg) continue; + msg_length = clib_host_to_net_u32 (vec_len (msg)); + if (fwrite (&msg_length, 1, sizeof (msg_length), fp) + != sizeof (msg_length)) + { + return (-14); + } + if (fwrite (msg, 1, vec_len (msg), fp) != vec_len (msg)) { return (-13); @@ -668,7 +697,6 @@ vl_msg_api_set_handlers (int id, char *name, void *handler, void *cleanup, c->cleanup = cleanup; c->endian = endian; c->print = print; - c->size = size; c->traced = traced; c->replay = 1; c->message_bounce = 0; @@ -759,7 +787,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, u8 *msg; u8 endian_swap_needed = 0; api_main_t *am = &api_main; - static u8 *tmpbuf; + u8 *tmpbuf = 0; u32 nitems; void **saved_print_handlers = 0; @@ -838,6 +866,9 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, int size; u16 msg_id; + size = clib_host_to_net_u32 (*(u32 *) msg); + msg += sizeof (u32); + if (clib_arch_is_little_endian) msg_id = ntohs (*((u16 *) msg)); else @@ -850,7 +881,6 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, munmap (hp, file_size); return; } - size = cfgp->size; msg += size; } @@ -864,6 +894,9 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, if (which == DUMP) vlib_cli_output (vm, "---------- trace %d -----------\n", i); + size = clib_host_to_net_u32 (*(u32 *) msg); + msg += sizeof (u32); + if (clib_arch_is_little_endian) msg_id = ntohs (*((u16 *) msg)); else @@ -874,9 +907,9 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, { vlib_cli_output (vm, "Ugh: msg id %d no trace config\n", msg_id); munmap (hp, file_size); + vec_free (tmpbuf); return; } - size = cfgp->size; /* Copy the buffer (from the read-only mmap'ed file) */ vec_validate (tmpbuf, size - 1 + sizeof (uword)); @@ -897,6 +930,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, { vlib_cli_output (vm, "Ugh: msg id %d no endian swap\n", msg_id); munmap (hp, file_size); + vec_free (tmpbuf); return; } endian_fp = am->msg_endian_handlers[msg_id]; @@ -997,6 +1031,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename, } munmap (hp, file_size); + vec_free (tmpbuf); } u8 * |