svm: allow mq attachments at random offsets
[vpp.git] / src / vcl / vcl_bapi.c
index 900fb96..a13948d 100644 (file)
@@ -65,7 +65,6 @@ static void
 vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp)
 {
   vcl_worker_t *wrk = vcl_worker_get (0);
-  svm_msg_q_t *ctrl_mq;
   u64 segment_handle;
   int *fds = 0, i, rv;
   u32 n_fds = 0;
@@ -77,11 +76,6 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp)
       goto failed;
     }
 
-  wrk->app_event_queue = uword_to_pointer (mp->app_mq, svm_msg_q_t *);
-  ctrl_mq = uword_to_pointer (mp->vpp_ctrl_mq, svm_msg_q_t *);
-  vec_validate (wrk->vpp_event_queues, mp->vpp_ctrl_mq_thread);
-  wrk->vpp_event_queues[mp->vpp_ctrl_mq_thread] = ctrl_mq;
-  vcm->ctrl_mq = wrk->ctrl_mq = ctrl_mq;
   segment_handle = clib_net_to_host_u64 (mp->segment_handle);
   if (segment_handle == VCL_INVALID_SEGMENT_HANDLE)
     {
@@ -102,6 +96,11 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp)
                                fds[n_fds++]))
          goto failed;
 
+      vcl_segment_attach_mq (vcl_vpp_worker_segment_handle (0),
+                            mp->vpp_ctrl_mq, mp->vpp_ctrl_mq_thread,
+                            &wrk->ctrl_mq);
+      vcm->ctrl_mq = wrk->ctrl_mq;
+
       if (mp->fd_flags & SESSION_FD_F_MEMFD_SEGMENT)
        {
          segment_name = vl_api_from_api_to_new_c_string (&mp->segment_name);
@@ -113,6 +112,8 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp)
            goto failed;
        }
 
+      vcl_segment_attach_mq (segment_handle, mp->app_mq, 0,
+                            &wrk->app_event_queue);
 
       if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD)
        {
@@ -171,8 +172,6 @@ vl_api_app_worker_add_del_reply_t_handler (vl_api_app_worker_add_del_reply_t *
     return;
 
   wrk->vpp_wrk_index = clib_net_to_host_u32 (mp->wrk_index);
-  wrk->app_event_queue = uword_to_pointer (mp->app_event_queue_address,
-                                          svm_msg_q_t *);
   wrk->ctrl_mq = vcm->ctrl_mq;
 
   segment_handle = clib_net_to_host_u64 (mp->segment_handle);
@@ -206,6 +205,9 @@ vl_api_app_worker_add_del_reply_t_handler (vl_api_app_worker_add_del_reply_t *
            goto failed;
        }
 
+      vcl_segment_attach_mq (segment_handle, mp->app_event_queue_address, 0,
+                            &wrk->app_event_queue);
+
       if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD)
        {
          svm_msg_q_set_consumer_eventfd (wrk->app_event_queue, fds[n_fds]);
@@ -287,7 +289,7 @@ vcl_bapi_send_session_enable_disable (u8 is_enable)
   memset (bmp, 0, sizeof (*bmp));
 
   bmp->_vl_msg_id = ntohs (VL_API_SESSION_ENABLE_DISABLE);
-  bmp->client_index = wrk->bapi_client_index;
+  bmp->client_index = wrk->api_client_handle;
   bmp->context = htonl (0xfeedface);
   bmp->is_enable = is_enable;
   vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) & bmp);
@@ -309,7 +311,7 @@ vcl_bapi_send_attach (void)
   memset (bmp, 0, sizeof (*bmp));
 
   bmp->_vl_msg_id = ntohs (VL_API_APP_ATTACH);
-  bmp->client_index = wrk->bapi_client_index;
+  bmp->client_index = wrk->api_client_handle;
   bmp->context = htonl (0xfeedface);
   bmp->options[APP_OPTIONS_FLAGS] =
     APP_OPTIONS_FLAGS_ACCEPT_REDIRECT | APP_OPTIONS_FLAGS_ADD_SEGMENT |
@@ -345,7 +347,7 @@ vcl_bapi_send_detach (void)
   memset (bmp, 0, sizeof (*bmp));
 
   bmp->_vl_msg_id = ntohs (VL_API_APPLICATION_DETACH);
-  bmp->client_index = wrk->bapi_client_index;
+  bmp->client_index = wrk->api_client_handle;
   bmp->context = htonl (0xfeedface);
   vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) & bmp);
 }
@@ -360,7 +362,7 @@ vcl_bapi_send_app_worker_add_del (u8 is_add)
   memset (mp, 0, sizeof (*mp));
 
   mp->_vl_msg_id = ntohs (VL_API_APP_WORKER_ADD_DEL);
-  mp->client_index = wrk->bapi_client_index;
+  mp->client_index = wrk->api_client_handle;
   mp->app_index = clib_host_to_net_u32 (vcm->app_index);
   mp->context = wrk->wrk_index;
   mp->is_add = is_add;
@@ -380,7 +382,7 @@ vcl_bapi_send_child_worker_del (vcl_worker_t * child_wrk)
   memset (mp, 0, sizeof (*mp));
 
   mp->_vl_msg_id = ntohs (VL_API_APP_WORKER_ADD_DEL);
-  mp->client_index = wrk->bapi_client_index;
+  mp->client_index = wrk->api_client_handle;
   mp->app_index = clib_host_to_net_u32 (vcm->app_index);
   mp->context = wrk->wrk_index;
   mp->is_add = 0;
@@ -399,7 +401,7 @@ vcl_bapi_send_application_tls_cert_add (vcl_session_t * session, char *cert,
   cert_mp = vl_msg_api_alloc (sizeof (*cert_mp) + cert_len);
   clib_memset (cert_mp, 0, sizeof (*cert_mp));
   cert_mp->_vl_msg_id = ntohs (VL_API_APPLICATION_TLS_CERT_ADD);
-  cert_mp->client_index = wrk->bapi_client_index;
+  cert_mp->client_index = wrk->api_client_handle;
   cert_mp->context = session->session_index;
   cert_mp->cert_len = clib_host_to_net_u16 (cert_len);
   clib_memcpy_fast (cert_mp->cert, cert, cert_len);
@@ -416,7 +418,7 @@ vcl_bapi_send_application_tls_key_add (vcl_session_t * session, char *key,
   key_mp = vl_msg_api_alloc (sizeof (*key_mp) + key_len);
   clib_memset (key_mp, 0, sizeof (*key_mp));
   key_mp->_vl_msg_id = ntohs (VL_API_APPLICATION_TLS_KEY_ADD);
-  key_mp->client_index = wrk->bapi_client_index;
+  key_mp->client_index = wrk->api_client_handle;
   key_mp->context = session->session_index;
   key_mp->key_len = clib_host_to_net_u16 (key_len);
   clib_memcpy_fast (key_mp->key, key, key_len);
@@ -466,59 +468,42 @@ vcl_bapi_connect_to_vpp (void)
   api_main_t *am;
   u8 *wrk_name;
 
-  wrk_name = format (0, "%s-wrk-%u%c", vcm->app_name, wrk->wrk_index, 0);
+  wrk_name = format (0, "%v-wrk-%u%c", vcm->app_name, wrk->wrk_index, 0);
 
   /* Make sure api is cleaned up in case this is a connect from a
    * forked worker */
   vcl_bapi_cleanup ();
 
   vlibapi_set_main (&wrk->bapi_api_ctx);
-  vlibapi_set_memory_client_main (&wrk->bapi_shm_ctx);
   vcl_bapi_hookup ();
 
-  if (vcl_cfg->vpp_bapi_socket_name)
+  if (!vcl_cfg->vpp_bapi_socket_name)
     {
-      if (vl_socket_client_connect2 (&wrk->bapi_sock_ctx,
-                                    (char *) vcl_cfg->vpp_bapi_socket_name,
-                                    (char *) wrk_name,
-                                    0 /* default rx/tx buffer */ ))
-       {
-         VERR ("app (%s) socket connect failed!", wrk_name);
-         rv = VPPCOM_ECONNREFUSED;
-         goto error;
-       }
-
-      if (vl_socket_client_init_shm2 (&wrk->bapi_sock_ctx, 0,
-                                     1 /* want_pthread */ ))
-       {
-         VERR ("app (%s) init shm failed!", wrk_name);
-         rv = VPPCOM_ECONNREFUSED;
-         goto error;
-       }
+      rv = VPPCOM_EINVAL;
+      goto error;
     }
-  else
-    {
-      if (!vcl_cfg->vpp_bapi_filename)
-       vcl_cfg->vpp_bapi_filename = format (0, "/vpe-api%c", 0);
 
-      vl_set_memory_root_path ((char *) vcl_cfg->vpp_bapi_chroot);
-
-      VDBG (0, "app (%s) connecting to VPP api (%s)...",
-           wrk_name, vcl_cfg->vpp_bapi_filename);
+  if (vl_socket_client_connect2 (&wrk->bapi_sock_ctx,
+                                (char *) vcl_cfg->vpp_bapi_socket_name,
+                                (char *) wrk_name,
+                                0 /* default rx/tx buffer */ ))
+    {
+      VERR ("app (%s) socket connect failed!", wrk_name);
+      rv = VPPCOM_ECONNREFUSED;
+      goto error;
+    }
 
-      if (vl_client_connect_to_vlib ((char *) vcl_cfg->vpp_bapi_filename,
-                                    (char *) wrk_name,
-                                    vcm->cfg.vpp_api_q_length) < 0)
-       {
-         VERR ("app (%s) connect failed!", wrk_name);
-         rv = VPPCOM_ECONNREFUSED;
-         goto error;
-       }
+  if (vl_socket_client_init_shm2 (&wrk->bapi_sock_ctx, 0,
+                                 1 /* want_pthread */ ))
+    {
+      VERR ("app (%s) init shm failed!", wrk_name);
+      rv = VPPCOM_ECONNREFUSED;
+      goto error;
     }
 
   am = vlibapi_get_main ();
   wrk->vl_input_queue = am->shmem_hdr->vl_input_queue;
-  wrk->bapi_client_index = (u32) am->my_client_index;
+  wrk->api_client_handle = (u32) am->my_client_index;
 
   VDBG (0, "app (%s) is connected to VPP!", wrk_name);
   vcl_evt (VCL_EVT_INIT, vcm);
@@ -758,7 +743,7 @@ vcl_bapi_worker_set (void)
       if (vcm->workers[i].current_pid == wrk->current_pid)
        {
          wrk->vl_input_queue = vcm->workers[i].vl_input_queue;
-         wrk->bapi_client_index = vcm->workers[i].bapi_client_index;
+         wrk->api_client_handle = vcm->workers[i].api_client_handle;
          return 0;
        }
     }