sock api: add infra for bootstrapping shm clients
[vpp.git] / src / vlibmemory / memory_shared.c
index 7af2433..0a3c23c 100644 (file)
@@ -364,21 +364,11 @@ vl_set_api_pvt_heap_size (u64 size)
   am->api_pvt_heap_size = size;
 }
 
-void
-vl_init_shmem (svm_region_t * vlib_rp, int is_vlib, int is_private_region)
+static void
+vl_api_default_mem_config (vl_shmem_hdr_t * shmem_hdr)
 {
   api_main_t *am = &api_main;
-  vl_shmem_hdr_t *shmem_hdr = 0;
   u32 vlib_input_queue_length;
-  void *oldheap;
-  ASSERT (vlib_rp);
-
-  /* $$$$ need private region config parameters */
-
-  oldheap = svm_push_data_heap (vlib_rp);
-
-  vec_validate (shmem_hdr, 0);
-  shmem_hdr->version = VL_SHM_VERSION;
 
   /* vlib main input queue */
   vlib_input_queue_length = 1024;
@@ -389,7 +379,6 @@ vl_init_shmem (svm_region_t * vlib_rp, int is_vlib, int is_private_region)
     unix_shared_memory_queue_init (vlib_input_queue_length, sizeof (uword),
                                   getpid (), am->vlib_signal);
 
-  /* Set up the msg ring allocator */
 #define _(sz,n)                                                 \
     do {                                                        \
         ring_alloc_t _rp;                                       \
@@ -417,6 +406,70 @@ vl_init_shmem (svm_region_t * vlib_rp, int is_vlib, int is_private_region)
 
   foreach_clnt_aring_size;
 #undef _
+}
+
+void
+vl_api_mem_config (vl_shmem_hdr_t * hdr, vl_api_shm_elem_config_t * config)
+{
+  api_main_t *am = &api_main;
+  vl_api_shm_elem_config_t *c;
+  ring_alloc_t *rp;
+  u32 size;
+
+  if (!config)
+    {
+      vl_api_default_mem_config (hdr);
+      return;
+    }
+
+  vec_foreach (c, config)
+  {
+    switch (c->type)
+      {
+      case VL_API_QUEUE:
+       hdr->vl_input_queue = unix_shared_memory_queue_init (c->count,
+                                                            c->size,
+                                                            getpid (),
+                                                            am->vlib_signal);
+       continue;
+      case VL_API_VLIB_RING:
+       vec_add2 (hdr->vl_rings, rp, 1);
+       break;
+      case VL_API_CLIENT_RING:
+       vec_add2 (hdr->client_rings, rp, 1);
+       break;
+      default:
+       clib_warning ("unknown config type: %d", c->type);
+       continue;
+      }
+
+    size = sizeof (ring_alloc_t) + c->size;
+    rp->rp = unix_shared_memory_queue_init (c->count, size, 0, 0);
+    rp->size = size;
+    rp->nitems = c->count;
+    rp->hits = 0;
+    rp->misses = 0;
+  }
+}
+
+void
+vl_init_shmem (svm_region_t * vlib_rp, vl_api_shm_elem_config_t * config,
+              int is_vlib, int is_private_region)
+{
+  api_main_t *am = &api_main;
+  vl_shmem_hdr_t *shmem_hdr = 0;
+  void *oldheap;
+  ASSERT (vlib_rp);
+
+  /* $$$$ need private region config parameters */
+
+  oldheap = svm_push_data_heap (vlib_rp);
+
+  vec_validate (shmem_hdr, 0);
+  shmem_hdr->version = VL_SHM_VERSION;
+
+  /* Set up the queue and msg ring allocator */
+  vl_api_mem_config (shmem_hdr, config);
 
   if (is_private_region == 0)
     {
@@ -581,7 +634,8 @@ vl_map_shmem (const char *region_name, int is_vlib)
     }
 
   /* Nope, it's our problem... */
-  vl_init_shmem (vlib_rp, 1 /* is vlib */ , 0 /* is_private_region */ );
+  vl_init_shmem (vlib_rp, 0 /* default config */ , 1 /* is vlib */ ,
+                0 /* is_private_region */ );
 
   vec_add1 (am->mapped_shmem_regions, vlib_rp);
   return 0;