X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvcl_bapi.c;h=bb2b94f04d8d7182f1ce0022247497db5a51dab4;hb=77c821ccc6b72d18a247e95816ac1013b4dc664d;hp=8e24bfeee0cd0abb8a73bb34f95fde444fe98950;hpb=3b6c84c8411f0052410fa0f207fd90f99cee5a2b;p=vpp.git diff --git a/src/vcl/vcl_bapi.c b/src/vcl/vcl_bapi.c index 8e24bfeee0c..bb2b94f04d8 100644 --- a/src/vcl/vcl_bapi.c +++ b/src/vcl/vcl_bapi.c @@ -15,23 +15,14 @@ #include #include -#include -#define vl_typedefs /* define message structures */ -#include -#undef vl_typedefs +#include +#include +#include -/* declare message handlers for each api */ +#define REPLY_MSG_ID_BASE msg_id_base -#define vl_endianfun /* define message structures */ -#include -#undef vl_endianfun - -/* instantiate all the print functions we know about */ -#define vl_print(handle, ...) -#define vl_printfun -#include -#undef vl_printfun +static u16 msg_id_base; static u8 * format_api_error (u8 * s, va_list * args) @@ -100,11 +91,6 @@ 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); @@ -121,11 +107,18 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD) { - svm_msg_q_set_consumer_eventfd (wrk->app_event_queue, fds[n_fds]); + svm_msg_q_set_eventfd (wrk->app_event_queue, fds[n_fds]); vcl_mq_epoll_add_evfd (wrk, wrk->app_event_queue); n_fds++; } + vcl_segment_discover_mqs (vcl_vpp_worker_segment_handle (0), fds + n_fds, + mp->n_fds - n_fds); + 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; + vec_free (fds); } else @@ -215,7 +208,7 @@ vl_api_app_worker_add_del_reply_t_handler (vl_api_app_worker_add_del_reply_t * if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD) { - svm_msg_q_set_consumer_eventfd (wrk->app_event_queue, fds[n_fds]); + svm_msg_q_set_eventfd (wrk->app_event_queue, fds[n_fds]); vcl_mq_epoll_add_evfd (wrk, wrk->app_event_queue); n_fds++; } @@ -244,52 +237,78 @@ failed: } 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)); - wrk->bapi_app_state = STATE_APP_FAILED; + 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) { - vcl_worker_t *wrk = vcl_worker_get_current (); - if (mp->retval) { - VDBG (0, "add key failed: %U", format_api_error, ntohl (mp->retval)); - wrk->bapi_app_state = STATE_APP_FAILED; + VDBG (0, "Deleting cert and key failed: %U", format_api_error, + ntohl (mp->retval)); return; } - wrk->bapi_app_state = STATE_APP_READY; } -#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) + +#define vl_print(handle, ...) fformat (handle, __VA_ARGS__) +#define vl_endianfun /* define message structures */ +#include +#undef vl_endianfun + +#define vl_calcsizefun +#include +#undef vl_calcsizefun + +/* instantiate all the print functions we know about */ +#define vl_printfun +#include +#undef vl_printfun + +#define vl_api_version(n, v) static u32 api_version = v; +#include +#undef vl_api_version static void vcl_bapi_hookup (void) { -#define _(N, n) \ - vl_msg_api_set_handlers(VL_API_##N, #n, \ - vl_api_##n##_t_handler, \ - vl_noop_handler, \ - vl_api_##n##_t_endian, \ - vl_api_##n##_t_print, \ - sizeof(vl_api_##n##_t), 1); + u8 *msg_base_lookup_name = format (0, "session_%08x%c", api_version, 0); + + REPLY_MSG_ID_BASE = + vl_client_get_first_plugin_msg_id ((char *) msg_base_lookup_name); + + vec_free (msg_base_lookup_name); + + if (REPLY_MSG_ID_BASE == (u16) ~0) + return; + +#define _(N, n) \ + vl_msg_api_set_handlers ( \ + REPLY_MSG_ID_BASE + VL_API_##N, #n, vl_api_##n##_t_handler, \ + vl_noop_handler, vl_api_##n##_t_endian, vl_api_##n##_t_print, \ + sizeof (vl_api_##n##_t), 1, vl_api_##n##_t_print_json, \ + vl_api_##n##_t_tojson, vl_api_##n##_t_fromjson, \ + vl_api_##n##_t_calc_size); foreach_sock_msg; #undef _ } @@ -305,7 +324,7 @@ vcl_bapi_send_session_enable_disable (u8 is_enable) bmp = vl_msg_api_alloc (sizeof (*bmp)); memset (bmp, 0, sizeof (*bmp)); - bmp->_vl_msg_id = ntohs (VL_API_SESSION_ENABLE_DISABLE); + bmp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_SESSION_ENABLE_DISABLE); bmp->client_index = wrk->api_client_handle; bmp->context = htonl (0xfeedface); bmp->is_enable = is_enable; @@ -327,7 +346,7 @@ vcl_bapi_send_attach (void) bmp = vl_msg_api_alloc (sizeof (*bmp)); memset (bmp, 0, sizeof (*bmp)); - bmp->_vl_msg_id = ntohs (VL_API_APP_ATTACH); + bmp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_APP_ATTACH); bmp->client_index = wrk->api_client_handle; bmp->context = htonl (0xfeedface); bmp->options[APP_OPTIONS_FLAGS] = @@ -363,7 +382,7 @@ vcl_bapi_send_detach (void) bmp = vl_msg_api_alloc (sizeof (*bmp)); memset (bmp, 0, sizeof (*bmp)); - bmp->_vl_msg_id = ntohs (VL_API_APPLICATION_DETACH); + bmp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_APPLICATION_DETACH); bmp->client_index = wrk->api_client_handle; bmp->context = htonl (0xfeedface); vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) & bmp); @@ -378,7 +397,7 @@ vcl_bapi_send_app_worker_add_del (u8 is_add) mp = vl_msg_api_alloc (sizeof (*mp)); memset (mp, 0, sizeof (*mp)); - mp->_vl_msg_id = ntohs (VL_API_APP_WORKER_ADD_DEL); + mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_APP_WORKER_ADD_DEL); mp->client_index = wrk->api_client_handle; mp->app_index = clib_host_to_net_u32 (vcm->app_index); mp->context = wrk->wrk_index; @@ -398,7 +417,7 @@ vcl_bapi_send_child_worker_del (vcl_worker_t * child_wrk) mp = vl_msg_api_alloc (sizeof (*mp)); memset (mp, 0, sizeof (*mp)); - mp->_vl_msg_id = ntohs (VL_API_APP_WORKER_ADD_DEL); + mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_APP_WORKER_ADD_DEL); mp->client_index = wrk->api_client_handle; mp->app_index = clib_host_to_net_u32 (vcm->app_index); mp->context = wrk->wrk_index; @@ -408,38 +427,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->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); - vl_msg_api_send_shmem (wrk->vl_input_queue, (u8 *) & cert_mp); + u32 cert_len = ckpair->cert_len; + u32 key_len = ckpair->key_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 (REPLY_MSG_ID_BASE + 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, ckpair->cert, cert_len); + clib_memcpy_fast (bmp->certkey + cert_len, ckpair->key, 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->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); - 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 (REPLY_MSG_ID_BASE + 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 @@ -492,7 +514,7 @@ vcl_bapi_connect_to_vpp (void) vcl_bapi_cleanup (); vlibapi_set_main (&wrk->bapi_api_ctx); - vcl_bapi_hookup (); + vlibapi_set_memory_client_main (&wrk->bapi_mem_ctx); if (!vcl_cfg->vpp_bapi_socket_name) { @@ -517,6 +539,7 @@ vcl_bapi_connect_to_vpp (void) rv = VPPCOM_ECONNREFUSED; goto error; } + vcl_bapi_hookup (); am = vlibapi_get_main (); wrk->vl_input_queue = am->shmem_hdr->vl_input_queue; @@ -586,8 +609,8 @@ vcl_bapi_wait_for_wrk_state_change (vcl_bapi_app_state_t app_state) if (wrk->bapi_app_state == STATE_APP_FAILED) return VPPCOM_ECONNABORTED; } - VDBG (0, "timeout waiting for state %s (%d)", - vcl_bapi_app_state_str (app_state), app_state); + VDBG (0, "timeout waiting for state %s, current state %d", + vcl_bapi_app_state_str (app_state), wrk->bapi_app_state); vcl_evt (VCL_EVT_SESSION_TIMEOUT, vcm, bapi_app_state); return VPPCOM_ETIMEDOUT; @@ -706,48 +729,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); + 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); - return VPPCOM_OK; + 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); - wrk->bapi_app_state = STATE_APP_ADDING_TLS_DATA; - vcl_bapi_wait_for_wrk_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