vlib: fix coverity 274750
[vpp.git] / src / vlibmemory / vlib_api_cli.c
index bdbedec..9991a96 100644 (file)
@@ -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);
        }
     }
 
@@ -510,7 +509,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename,
       assert_size (file_size_left, clib_max (size, sizeof (u16)));
       msg_id = ntohs (*((u16 *) msg));
       if (msg_id >= vec_len (msgid_vec) ||
-         msgid_vec[msg_id] >= vec_len (am->api_trace_cfg))
+         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);
 
@@ -522,7 +521,7 @@ 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;
 
@@ -537,7 +536,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename,
       msg_id = ntohs (*((u16 *) msg));
 
       if (msg_id >= vec_len (msgid_vec) ||
-         msgid_vec[msg_id] >= vec_len (am->api_trace_cfg))
+         msgid_vec[msg_id] >= vec_len (am->msg_data))
        {
          vlib_cli_output (
            vm, "warning: unknown msg id %d for msg number %d, skipping\n",
@@ -547,7 +546,7 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename,
        }
 
       msg_id = msgid_vec[msg_id];
-      cfgp = am->api_trace_cfg + 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));
@@ -561,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);
@@ -571,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 */
@@ -585,13 +584,9 @@ 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])
+         if (m && m->print_json_handler)
            {
-             u8 *(*print_fp) (void *, void *);
-
-             print_fp = (void *) am->msg_print_json_handlers[msg_id];
-             (*print_fp) (tmpbuf + sizeof (uword), vm);
+             m->print_json_handler (tmpbuf + sizeof (uword), vm);
            }
          else
            {
@@ -602,13 +597,9 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename,
          break;
 
        case DUMP:
-         if (msg_id < vec_len (am->msg_print_handlers) &&
-             am->msg_print_handlers[msg_id])
+         if (m && m->print_handler)
            {
-             u8 *(*print_fp) (void *, void *);
-
-             print_fp = (void *) am->msg_print_handlers[msg_id];
-             (*print_fp) (tmpbuf + sizeof (uword), vm);
+             m->print_handler (tmpbuf + sizeof (uword), vm);
            }
          else
            {
@@ -619,25 +610,20 @@ vl_msg_api_process_file (vlib_main_t * vm, u8 * filename,
          break;
 
        case INITIALIZERS:
-         if (msg_id < vec_len (am->msg_print_handlers) &&
-             am->msg_print_handlers[msg_id])
+         if (m && m->print_handler)
            {
              u8 *s;
              int j;
-             u8 *(*print_fp) (void *, void *);
-
-             print_fp = (void *) am->msg_print_handlers[msg_id];
 
              vlib_cli_output (vm, "/*");
 
-             (*print_fp) (tmpbuf + sizeof (uword), vm);
+             m->print_handler (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    ");
@@ -650,22 +636,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->print_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->replay_allowed)
                vlib_cli_output (vm, "Skipping msg id %d: no handler\n",
                                 msg_id);
              break;
@@ -708,11 +689,17 @@ 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);
+  void (*handler) (void *, void *) = 0;
   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);
@@ -720,25 +707,15 @@ 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;
+  handler = is_json ? m->print_json_handler : m->print_handler;
 
-  if (msg_id < vec_len (handlers) && handlers[msg_id])
-    {
-      print_fp = (void *) handlers[msg_id];
-      (*print_fp) (msg, a->vm);
-    }
+  if (handler)
+    handler (msg, a->vm);
   else
-    {
-      vlib_cli_output (a->vm, "Skipping msg id %d: no print fcn\n", msg_id);
-    }
+    vlib_cli_output (a->vm, "Skipping msg id %d: no print fcn\n", msg_id);
 
   vec_free (tmpbuf);
   return 0;
@@ -825,9 +802,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");
@@ -849,6 +825,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);
@@ -862,28 +839,19 @@ vl_msg_exec_json_command (vlib_main_t *vm, cJSON *o)
     }
   vec_free (name_crc);
 
-  cfgp = am->api_trace_cfg + msg_id;
-  if (!am->api_trace_cfg)
+  if (m->replay_allowed)
     {
-      vlib_cli_output (vm, "msg id %d no trace config\n", msg_id);
-      return rv;
-    }
-
-  if (cfgp->replay_enable)
-    {
-
       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",
@@ -892,24 +860,18 @@ 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])
+      if (!m->is_mp_safe)
        vl_msg_api_barrier_sync ();
-      (*handler) (msg, vm);
-      if (!am->is_mp_safe[msg_id])
+      m->handler (msg);
+      if (!m->is_mp_safe)
        vl_msg_api_barrier_release ();
     }
 
@@ -1285,7 +1247,7 @@ extract_name (u8 * s)
   rv = vec_dup (s);
 
   while (vec_len (rv) && rv[vec_len (rv)] != '_')
-    vec_dec_len (rv, 0);
+    vec_dec_len (rv, 1);
 
   rv[vec_len (rv)] = 0;