vppapigen: support per-file (major,minor,patch) version stamps
[vpp.git] / src / vlibapi / api_shared.c
index 6774e3d..831e863 100644 (file)
@@ -418,7 +418,10 @@ msg_handler_internal (api_main_t * am,
       if (do_it)
        {
          if (!am->is_mp_safe[id])
-           vl_msg_api_barrier_sync ();
+           {
+             vl_msg_api_barrier_trace_context (am->msg_names[id]);
+             vl_msg_api_barrier_sync ();
+           }
          (*am->msg_handlers[id]) (the_msg);
          if (!am->is_mp_safe[id])
            vl_msg_api_barrier_release ();
@@ -498,7 +501,10 @@ vl_msg_api_handler_with_vm_node (api_main_t * am,
        vl_msg_api_trace (am, am->rx_trace, the_msg);
 
       if (!am->is_mp_safe[id])
-       vl_msg_api_barrier_sync ();
+       {
+         vl_msg_api_barrier_trace_context (am->msg_names[id]);
+         vl_msg_api_barrier_sync ();
+       }
       (*handler) (the_msg, vm, node);
       if (!am->is_mp_safe[id])
        vl_msg_api_barrier_release ();
@@ -624,6 +630,12 @@ vl_msg_api_replay_handler (void *the_msg)
   /* do NOT free the message buffer... */
 }
 
+u32
+vl_msg_api_get_msg_length (void *msg_arg)
+{
+  return vl_msg_api_get_msg_length_inline (msg_arg);
+}
+
 /*
  * vl_msg_api_socket_handler
  */
@@ -659,9 +671,11 @@ vl_msg_api_config (vl_msg_api_msg_config_t * c)
   foreach_msg_api_vector;
 #undef _
 
-  if (am->msg_names[c->id])
-    clib_warning ("BUG: multiple registrations of 'vl_api_%s_t_handler'",
-                 c->name);
+  if (am->msg_handlers[c->id] && am->msg_handlers[c->id] != c->handler)
+    clib_warning
+      ("BUG: re-registering 'vl_api_%s_t_handler'."
+       "Handler was %llx, replaced by %llx",
+       c->name, am->msg_handlers[c->id], c->handler);
 
   am->msg_names[c->id] = c->name;
   am->msg_handlers[c->id] = c->handler;
@@ -702,6 +716,18 @@ vl_msg_api_set_handlers (int id, char *name, void *handler, void *cleanup,
   vl_msg_api_config (c);
 }
 
+void
+vl_msg_api_clean_handlers (int msg_id)
+{
+  vl_msg_api_msg_config_t cfg;
+  vl_msg_api_msg_config_t *c = &cfg;
+
+  memset (c, 0, sizeof (*c));
+
+  c->id = msg_id;
+  vl_msg_api_config (c);
+}
+
 void
 vl_msg_api_set_cleanup_handler (int msg_id, void *fp)
 {
@@ -828,7 +854,7 @@ vl_msg_api_set_first_available_msg_id (u16 first_avail)
 }
 
 u16
-vl_msg_api_get_msg_ids (char *name, int n)
+vl_msg_api_get_msg_ids (const char *name, int n)
 {
   api_main_t *am = &api_main;
   u8 *name_copy;
@@ -872,7 +898,7 @@ vl_msg_api_get_msg_ids (char *name, int n)
 }
 
 void
-vl_msg_api_add_msg_name_crc (api_main_t * am, char *string, u32 id)
+vl_msg_api_add_msg_name_crc (api_main_t * am, const char *string, u32 id)
 {
   uword *p;
 
@@ -889,6 +915,15 @@ vl_msg_api_add_msg_name_crc (api_main_t * am, char *string, u32 id)
   hash_set_mem (am->msg_index_by_name_and_crc, string, id);
 }
 
+void
+vl_msg_api_add_version (api_main_t * am, const char *string,
+                       u32 major, u32 minor, u32 patch)
+{
+  api_version_t version = {.major = major,.minor = minor,.patch = patch };
+  ASSERT (strlen (string) < 64);
+  strncpy (version.name, string, 64);
+  vec_add1 (am->api_version_list, version);
+}
 
 /*
  * fd.io coding-style-patch-verification: ON