summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2017-03-02 18:24:10 -0500
committerFlorin Coras <florin.coras@gmail.com>2017-03-03 18:02:24 +0000
commitdfbee41b16541b51eb8f7f4d8a831ef9407fb419 (patch)
tree654a1681eff9c4ab3565e915964637b6fc2fde7a
parent87df12d5de67600414ae80b891e8a0f89e89ce5c (diff)
Improve api trace replay consistency checking
Change-Id: I2c4b9646d53e4c008ccbe6d09c6a683c776c1f60 Signed-off-by: Dave Barach <dave@barachs.net>
-rw-r--r--src/vlibapi/api.h3
-rw-r--r--src/vlibapi/api_shared.c6
-rw-r--r--src/vlibmemory/memory_vlib.c34
3 files changed, 41 insertions, 2 deletions
diff --git a/src/vlibapi/api.h b/src/vlibapi/api.h
index b40ece158ff..2cbeb63c44c 100644
--- a/src/vlibapi/api.h
+++ b/src/vlibapi/api.h
@@ -189,6 +189,9 @@ typedef struct
char *region_name;
char *root_path;
+
+ /* Replay in progress? */
+ int replay_in_progress;
} api_main_t;
extern api_main_t api_main;
diff --git a/src/vlibapi/api_shared.c b/src/vlibapi/api_shared.c
index 79921afe2d7..69ba10c1c08 100644
--- a/src/vlibapi/api_shared.c
+++ b/src/vlibapi/api_shared.c
@@ -890,6 +890,9 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename,
msg += size;
}
+ if (which == REPLAY)
+ am->replay_in_progress = 1;
+
for (; i <= last_index; i++)
{
trace_cfg_t *cfgp;
@@ -914,6 +917,7 @@ 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);
+ am->replay_in_progress = 0;
return;
}
@@ -937,6 +941,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);
+ am->replay_in_progress = 0;
return;
}
endian_fp = am->msg_endian_handlers[msg_id];
@@ -1038,6 +1043,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename,
munmap (hp, file_size);
vec_free (tmpbuf);
+ am->replay_in_progress = 0;
}
u8 *
diff --git a/src/vlibmemory/memory_vlib.c b/src/vlibmemory/memory_vlib.c
index 231caa58f12..3a7415c0867 100644
--- a/src/vlibmemory/memory_vlib.c
+++ b/src/vlibmemory/memory_vlib.c
@@ -1249,6 +1249,8 @@ vl_api_show_plugin_command (vlib_main_t * vm,
for (i = 0; i < vec_len (rp); i++)
vlib_cli_output (vm, "%U", format_api_msg_range, rp + i);
+ vec_free (rp);
+
return 0;
}
@@ -1369,9 +1371,37 @@ vl_api_rpc_call_main_thread (void *fp, u8 * data, u32 data_length)
static void
vl_api_trace_plugin_msg_ids_t_handler (vl_api_trace_plugin_msg_ids_t * mp)
{
- /* Do nothing. We just want to trace the message */
-}
+ api_main_t *am = &api_main;
+ vl_api_msg_range_t *rp;
+ uword *p;
+ /* Noop (except for tracing) during normal operation */
+ if (am->replay_in_progress == 0)
+ return;
+
+ p = hash_get_mem (am->msg_range_by_name, mp->plugin_name);
+ if (p == 0)
+ {
+ clib_warning ("WARNING: traced plugin '%s' not in current image",
+ mp->plugin_name);
+ return;
+ }
+
+ rp = vec_elt_at_index (am->msg_ranges, p[0]);
+ if (rp->first_msg_id != clib_net_to_host_u16 (mp->first_msg_id))
+ {
+ clib_warning ("WARNING: traced plugin '%s' first message id %d not %d",
+ mp->plugin_name, clib_net_to_host_u16 (mp->first_msg_id),
+ rp->first_msg_id);
+ }
+
+ if (rp->last_msg_id != clib_net_to_host_u16 (mp->last_msg_id))
+ {
+ clib_warning ("WARNING: traced plugin '%s' last message id %d not %d",
+ mp->plugin_name, clib_net_to_host_u16 (mp->last_msg_id),
+ rp->last_msg_id);
+ }
+}
#define foreach_rpc_api_msg \
_(RPC_CALL,rpc_call) \