X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvcl_bapi.c;h=7d241624d01c3d78ae9b8e24ff90ca3889812516;hb=a5a9efd4d;hp=900fb96624247ff323a926157d3881f779b2ed56;hpb=935ce75cb060da34991e6b02bec5680445f85323;p=vpp.git diff --git a/src/vcl/vcl_bapi.c b/src/vcl/vcl_bapi.c index 900fb966242..7d241624d01 100644 --- a/src/vcl/vcl_bapi.c +++ b/src/vcl/vcl_bapi.c @@ -52,20 +52,21 @@ static void vl_api_session_enable_disable_reply_t_handler (vl_api_session_enable_disable_reply_t * mp) { + vcl_worker_t *wrk = vcl_worker_get (0); + if (mp->retval) { clib_warning ("VCL<%d>: session_enable_disable failed: %U", getpid (), format_api_error, ntohl (mp->retval)); } else - vcm->bapi_app_state = STATE_APP_ENABLED; + wrk->bapi_app_state = STATE_APP_ENABLED; } 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 +78,8 @@ 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; + vcl_set_worker_index (0); + segment_handle = clib_net_to_host_u64 (mp->segment_handle); if (segment_handle == VCL_INVALID_SEGMENT_HANDLE) { @@ -102,6 +100,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 +116,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) { @@ -135,11 +140,11 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) } vcm->app_index = clib_net_to_host_u32 (mp->app_index); - vcm->bapi_app_state = STATE_APP_ATTACHED; + wrk->bapi_app_state = STATE_APP_ATTACHED; return; failed: - vcm->bapi_app_state = STATE_APP_FAILED; + wrk->bapi_app_state = STATE_APP_FAILED; for (i = clib_max (n_fds - 1, 0); i < vec_len (fds); i++) close (fds[i]); vec_free (fds); @@ -155,13 +160,6 @@ vl_api_app_worker_add_del_reply_t_handler (vl_api_app_worker_add_del_reply_t * u32 wrk_index; char *segment_name = 0; - if (mp->retval) - { - clib_warning ("VCL<%d>: add/del worker failed: %U", getpid (), - format_api_error, ntohl (mp->retval)); - goto failed; - } - if (!mp->is_add) return; @@ -170,9 +168,15 @@ vl_api_app_worker_add_del_reply_t_handler (vl_api_app_worker_add_del_reply_t * if (!wrk) return; + if (mp->retval) + { + clib_warning ("VCL<%d>: add/del worker failed: %U", getpid (), + format_api_error, ntohl (mp->retval)); + goto failed; + } + + vcl_set_worker_index (wrk_index); 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 +210,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]); @@ -225,41 +232,51 @@ vl_api_app_worker_add_del_reply_t_handler (vl_api_app_worker_add_del_reply_t * if (rv != 0) goto failed; } - vcm->bapi_app_state = STATE_APP_READY; + wrk->bapi_app_state = STATE_APP_READY; VDBG (0, "worker %u vpp-worker %u added", wrk_index, wrk->vpp_wrk_index); return; failed: - vcm->bapi_app_state = STATE_APP_FAILED; + wrk->bapi_app_state = STATE_APP_FAILED; for (i = clib_max (n_fds - 1, 0); i < vec_len (fds); i++) close (fds[i]); vec_free (fds); } static void - vl_api_application_tls_cert_add_reply_t_handler - (vl_api_application_tls_cert_add_reply_t * mp) +vl_api_app_add_cert_key_pair_reply_t_handler ( + vl_api_app_add_cert_key_pair_reply_t *mp) { + vcl_worker_t *wrk = vcl_worker_get_current (); + if (mp->retval) - VDBG (0, "add cert failed: %U", format_api_error, ntohl (mp->retval)); - vcm->bapi_app_state = STATE_APP_READY; + { + VDBG (0, "Adding cert and key failed: %U", format_api_error, + ntohl (mp->retval)); + return; + } + wrk->bapi_return = clib_net_to_host_u32 (mp->index); + wrk->bapi_app_state = STATE_APP_READY; } static void - vl_api_application_tls_key_add_reply_t_handler - (vl_api_application_tls_key_add_reply_t * mp) +vl_api_app_del_cert_key_pair_reply_t_handler ( + vl_api_app_del_cert_key_pair_reply_t *mp) { if (mp->retval) - VDBG (0, "add key failed: %U", format_api_error, ntohl (mp->retval)); - vcm->bapi_app_state = STATE_APP_READY; + { + VDBG (0, "Deleting cert and key failed: %U", format_api_error, + ntohl (mp->retval)); + return; + } } -#define foreach_sock_msg \ -_(SESSION_ENABLE_DISABLE_REPLY, session_enable_disable_reply) \ -_(APP_ATTACH_REPLY, app_attach_reply) \ -_(APPLICATION_TLS_CERT_ADD_REPLY, application_tls_cert_add_reply) \ -_(APPLICATION_TLS_KEY_ADD_REPLY, application_tls_key_add_reply) \ -_(APP_WORKER_ADD_DEL_REPLY, app_worker_add_del_reply) \ +#define foreach_sock_msg \ + _ (SESSION_ENABLE_DISABLE_REPLY, session_enable_disable_reply) \ + _ (APP_ATTACH_REPLY, app_attach_reply) \ + _ (APP_ADD_CERT_KEY_PAIR_REPLY, app_add_cert_key_pair_reply) \ + _ (APP_DEL_CERT_KEY_PAIR_REPLY, app_del_cert_key_pair_reply) \ + _ (APP_WORKER_ADD_DEL_REPLY, app_worker_add_del_reply) static void vcl_bapi_hookup (void) @@ -287,7 +304,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 +326,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 +362,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 +377,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 +397,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; @@ -389,38 +406,41 @@ vcl_bapi_send_child_worker_del (vcl_worker_t * child_wrk) vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) & mp); } -void -vcl_bapi_send_application_tls_cert_add (vcl_session_t * session, char *cert, - u32 cert_len) +static void +vcl_bapi_send_app_add_cert_key_pair (vppcom_cert_key_pair_t *ckpair) { vcl_worker_t *wrk = vcl_worker_get_current (); - vl_api_application_tls_cert_add_t *cert_mp; - - 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->context = session->session_index; - cert_mp->cert_len = clib_host_to_net_u16 (cert_len); - clib_memcpy_fast (cert_mp->cert, cert, cert_len); - vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) & cert_mp); + u32 cert_len = test_srv_crt_rsa_len; + u32 key_len = test_srv_key_rsa_len; + vl_api_app_add_cert_key_pair_t *bmp; + + bmp = vl_msg_api_alloc (sizeof (*bmp) + cert_len + key_len); + clib_memset (bmp, 0, sizeof (*bmp) + cert_len + key_len); + + bmp->_vl_msg_id = ntohs (VL_API_APP_ADD_CERT_KEY_PAIR); + bmp->client_index = wrk->api_client_handle; + bmp->context = wrk->wrk_index; + bmp->cert_len = clib_host_to_net_u16 (cert_len); + bmp->certkey_len = clib_host_to_net_u16 (key_len + cert_len); + clib_memcpy_fast (bmp->certkey, test_srv_crt_rsa, cert_len); + clib_memcpy_fast (bmp->certkey + cert_len, test_srv_key_rsa, key_len); + + vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) &bmp); } -void -vcl_bapi_send_application_tls_key_add (vcl_session_t * session, char *key, - u32 key_len) +static void +vcl_bapi_send_app_del_cert_key_pair (u32 ckpair_index) { vcl_worker_t *wrk = vcl_worker_get_current (); - vl_api_application_tls_key_add_t *key_mp; - - 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->context = session->session_index; - key_mp->key_len = clib_host_to_net_u16 (key_len); - clib_memcpy_fast (key_mp->key, key, key_len); - vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) & key_mp); + vl_api_app_del_cert_key_pair_t *bmp; + bmp = vl_msg_api_alloc (sizeof (*bmp)); + clib_memset (bmp, 0, sizeof (*bmp)); + + bmp->_vl_msg_id = ntohs (VL_API_APP_DEL_CERT_KEY_PAIR); + bmp->client_index = wrk->api_client_handle; + bmp->context = wrk->wrk_index; + bmp->index = clib_host_to_net_u32 (ckpair_index); + vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) &bmp); } u32 @@ -466,59 +486,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); @@ -572,16 +575,16 @@ vcl_bapi_app_state_str (vcl_bapi_app_state_t state) } static int -vcl_bapi_wait_for_app_state_change (vcl_bapi_app_state_t app_state) +vcl_bapi_wait_for_wrk_state_change (vcl_bapi_app_state_t app_state) { vcl_worker_t *wrk = vcl_worker_get_current (); f64 timeout = clib_time_now (&wrk->clib_time) + vcm->cfg.app_timeout; while (clib_time_now (&wrk->clib_time) < timeout) { - if (vcm->bapi_app_state == app_state) + if (wrk->bapi_app_state == app_state) return VPPCOM_OK; - if (vcm->bapi_app_state == STATE_APP_FAILED) + if (wrk->bapi_app_state == STATE_APP_FAILED) return VPPCOM_ECONNABORTED; } VDBG (0, "timeout waiting for state %s (%d)", @@ -594,12 +597,13 @@ vcl_bapi_wait_for_app_state_change (vcl_bapi_app_state_t app_state) static int vcl_bapi_session_enable (void) { + vcl_worker_t *wrk = vcl_worker_get_current (); int rv; - if (vcm->bapi_app_state != STATE_APP_ENABLED) + if (wrk->bapi_app_state != STATE_APP_ENABLED) { vcl_bapi_send_session_enable_disable (1 /* is_enabled == TRUE */ ); - rv = vcl_bapi_wait_for_app_state_change (STATE_APP_ENABLED); + rv = vcl_bapi_wait_for_wrk_state_change (STATE_APP_ENABLED); if (PREDICT_FALSE (rv)) { VDBG (0, "application session enable timed out! returning %d (%s)", @@ -613,9 +617,10 @@ vcl_bapi_session_enable (void) static int vcl_bapi_init (void) { + vcl_worker_t *wrk = vcl_worker_get_current (); int rv; - vcm->bapi_app_state = STATE_APP_START; + wrk->bapi_app_state = STATE_APP_START; vcl_bapi_init_error_string_table (); rv = vcl_bapi_connect_to_vpp (); if (rv) @@ -644,7 +649,7 @@ vcl_bapi_attach (void) return rv; vcl_bapi_send_attach (); - rv = vcl_bapi_wait_for_app_state_change (STATE_APP_ATTACHED); + rv = vcl_bapi_wait_for_wrk_state_change (STATE_APP_ATTACHED); if (PREDICT_FALSE (rv)) { VDBG (0, "application attach timed out! returning %d (%s)", rv, @@ -658,12 +663,14 @@ vcl_bapi_attach (void) int vcl_bapi_app_worker_add (void) { + vcl_worker_t *wrk = vcl_worker_get_current (); + if (vcl_bapi_connect_to_vpp ()) return -1; - vcm->bapi_app_state = STATE_APP_ADDING_WORKER; + wrk->bapi_app_state = STATE_APP_ADDING_WORKER; vcl_bapi_send_app_worker_add_del (1 /* is_add */ ); - if (vcl_bapi_wait_for_app_state_change (STATE_APP_READY)) + if (vcl_bapi_wait_for_wrk_state_change (STATE_APP_READY)) return -1; return 0; } @@ -700,48 +707,27 @@ vcl_bapi_recv_fds (vcl_worker_t * wrk, int *fds, int n_fds) } int -vppcom_session_tls_add_cert (uint32_t session_handle, char *cert, - uint32_t cert_len) +vcl_bapi_add_cert_key_pair (vppcom_cert_key_pair_t *ckpair) { - vcl_worker_t *wrk = vcl_worker_get_current (); - vcl_session_t *session = 0; - - session = vcl_session_get_w_handle (wrk, session_handle); - if (!session) - return VPPCOM_EBADFD; - if (cert_len == 0 || cert_len == ~0) - return VPPCOM_EBADFD; + if (ckpair->key_len == 0 || ckpair->key_len == ~0) + return VPPCOM_EINVAL; - /* - * Send listen request to vpp and wait for reply - */ - vcl_bapi_send_application_tls_cert_add (session, cert, cert_len); - vcm->bapi_app_state = STATE_APP_ADDING_TLS_DATA; - vcl_bapi_wait_for_app_state_change (STATE_APP_READY); - return VPPCOM_OK; + vcl_bapi_send_app_add_cert_key_pair (ckpair); + wrk->bapi_app_state = STATE_APP_ADDING_TLS_DATA; + vcl_bapi_wait_for_wrk_state_change (STATE_APP_READY); + if (wrk->bapi_app_state == STATE_APP_READY) + return wrk->bapi_return; + return VPPCOM_EFAULT; } int -vppcom_session_tls_add_key (uint32_t session_handle, char *key, - uint32_t key_len) +vcl_bapi_del_cert_key_pair (u32 ckpair_index) { - - vcl_worker_t *wrk = vcl_worker_get_current (); - vcl_session_t *session = 0; - - session = vcl_session_get_w_handle (wrk, session_handle); - if (!session) - return VPPCOM_EBADFD; - - if (key_len == 0 || key_len == ~0) - return VPPCOM_EBADFD; - - vcl_bapi_send_application_tls_key_add (session, key, key_len); - vcm->bapi_app_state = STATE_APP_ADDING_TLS_DATA; - vcl_bapi_wait_for_app_state_change (STATE_APP_READY); - return VPPCOM_OK; + /* Don't wait for reply */ + vcl_bapi_send_app_del_cert_key_pair (ckpair_index); + return 0; } int @@ -758,7 +744,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; } }