interface: add api test file
[vpp.git] / src / vpp-api / vapi / vapi.c
index 1a0fdbb..513ff98 100644 (file)
@@ -32,6 +32,7 @@
 #include <vlibmemory/memory_client.h>
 
 #include <vapi/memclnt.api.vapi.h>
+#include <vapi/vlib.api.vapi.h>
 
 /* we need to use control pings for some stuff and because we're forced to put
  * the code in headers, we need a way to be able to grab the ids of these
@@ -40,6 +41,7 @@ vapi_msg_id_t vapi_msg_id_control_ping = 0;
 vapi_msg_id_t vapi_msg_id_control_ping_reply = 0;
 
 DEFINE_VAPI_MSG_IDS_MEMCLNT_API_JSON;
+DEFINE_VAPI_MSG_IDS_VLIB_API_JSON;
 
 struct
 {
@@ -220,6 +222,10 @@ vapi_msg_alloc (vapi_ctx_t ctx, size_t size)
       return NULL;
     }
   void *rv = vl_msg_api_alloc_or_null (size);
+  if (rv)
+    {
+      clib_memset (rv, 0, size);
+    }
   return rv;
 }
 
@@ -262,8 +268,9 @@ vapi_ctx_alloc (vapi_ctx_t * result)
     {
       goto fail;
     }
-  memset (ctx->vapi_msg_id_t_to_vl_msg_id, ~0,
-         __vapi_metadata.count * sizeof (*ctx->vapi_msg_id_t_to_vl_msg_id));
+  clib_memset (ctx->vapi_msg_id_t_to_vl_msg_id, ~0,
+              __vapi_metadata.count *
+              sizeof (*ctx->vapi_msg_id_t_to_vl_msg_id));
   ctx->event_cbs = calloc (__vapi_metadata.count, sizeof (*ctx->event_cbs));
   if (!ctx->event_cbs)
     {
@@ -306,6 +313,10 @@ vapi_connect (vapi_ctx_t ctx, const char *name,
     {
       return VAPI_EINVAL;
     }
+  if (!clib_mem_get_per_cpu_heap () && !clib_mem_init (0, 1024 * 1024 * 32))
+    {
+      return VAPI_ENOMEM;
+    }
   ctx->requests_size = max_outstanding_requests;
   const size_t size = ctx->requests_size * sizeof (*ctx->requests);
   void *tmp = realloc (ctx->requests, size);
@@ -314,7 +325,7 @@ vapi_connect (vapi_ctx_t ctx, const char *name,
       return VAPI_ENOMEM;
     }
   ctx->requests = tmp;
-  memset (ctx->requests, 0, size);
+  clib_memset (ctx->requests, 0, size);
   /* coverity[MISSING_LOCK] - 177211 requests_mutex is not needed here */
   ctx->requests_start = ctx->requests_count = 0;
   if (chroot_prefix)
@@ -441,7 +452,7 @@ vapi_send (vapi_ctx_t ctx, void *msg)
       goto out;
     }
   int tmp;
-  svm_queue_t *q = api_main.shmem_hdr->vl_input_queue;
+  svm_queue_t *q = vlibapi_get_main ()->shmem_hdr->vl_input_queue;
 #if VAPI_DEBUG
   unsigned msgid = be16toh (*(u16 *) msg);
   if (msgid <= ctx->vl_msg_id_max)
@@ -468,6 +479,8 @@ vapi_send (vapi_ctx_t ctx, void *msg)
     {
       rv = VAPI_EAGAIN;
     }
+  else
+    VL_MSG_API_POISON (msg);
 out:
   VAPI_DBG ("vapi_send() rv = %d", rv);
   return rv;
@@ -482,7 +495,7 @@ vapi_send2 (vapi_ctx_t ctx, void *msg1, void *msg2)
       rv = VAPI_EINVAL;
       goto out;
     }
-  svm_queue_t *q = api_main.shmem_hdr->vl_input_queue;
+  svm_queue_t *q = vlibapi_get_main ()->shmem_hdr->vl_input_queue;
 #if VAPI_DEBUG
   unsigned msgid1 = be16toh (*(u16 *) msg1);
   unsigned msgid2 = be16toh (*(u16 *) msg2);
@@ -512,6 +525,8 @@ vapi_send2 (vapi_ctx_t ctx, void *msg1, void *msg2)
     {
       rv = VAPI_EAGAIN;
     }
+  else
+    VL_MSG_API_POISON (msg1);
 out:
   VAPI_DBG ("vapi_send() rv = %d", rv);
   return rv;
@@ -526,7 +541,7 @@ vapi_recv (vapi_ctx_t ctx, void **msg, size_t * msg_size,
       return VAPI_EINVAL;
     }
   vapi_error_e rv = VAPI_OK;
-  api_main_t *am = &api_main;
+  api_main_t *am = vlibapi_get_main ();
   uword data;
 
   if (am->our_pid == 0)
@@ -542,6 +557,7 @@ again:
 
   if (tmp == 0)
     {
+      VL_MSG_API_UNPOISON ((void *) data);
 #if VAPI_DEBUG_ALLOC
       vapi_add_to_be_freed ((void *) data);
 #endif
@@ -647,8 +663,8 @@ vapi_dispatch_response (vapi_ctx_t ctx, vapi_msg_id_t id,
                                                        requests_start].callback_ctx,
                                                       VAPI_ENORESP, true,
                                                       NULL);
-         memset (&ctx->requests[ctx->requests_start], 0,
-                 sizeof (ctx->requests[ctx->requests_start]));
+         clib_memset (&ctx->requests[ctx->requests_start], 0,
+                      sizeof (ctx->requests[ctx->requests_start]));
          ++ctx->requests_start;
          --ctx->requests_count;
          if (ctx->requests_start == ctx->requests_size)
@@ -689,8 +705,8 @@ vapi_dispatch_response (vapi_ctx_t ctx, vapi_msg_id_t id,
        }
       if (is_last)
        {
-         memset (&ctx->requests[ctx->requests_start], 0,
-                 sizeof (ctx->requests[ctx->requests_start]));
+         clib_memset (&ctx->requests[ctx->requests_start], 0,
+                      sizeof (ctx->requests[ctx->requests_start]));
          ++ctx->requests_start;
          --ctx->requests_count;
          if (ctx->requests_start == ctx->requests_size)
@@ -849,7 +865,7 @@ vapi_lookup_vl_msg_id (vapi_ctx_t ctx, vapi_msg_id_t id)
 int
 vapi_get_client_index (vapi_ctx_t ctx)
 {
-  return api_main.my_client_index;
+  return vlibapi_get_main ()->my_client_index;
 }
 
 bool