X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fplugins%2Fhs_apps%2Fsapi%2Fvpp_echo_bapi.c;h=784d74160d0897de8e1896ac20013c5af897c72f;hb=b4e5e50fe;hp=a565a91899a65d041f78c6ff458c73c0887bdf1b;hpb=8095b602c79c411999f04ded541db918cf1fabe0;p=vpp.git diff --git a/src/plugins/hs_apps/sapi/vpp_echo_bapi.c b/src/plugins/hs_apps/sapi/vpp_echo_bapi.c index a565a91899a..784d74160d0 100644 --- a/src/plugins/hs_apps/sapi/vpp_echo_bapi.c +++ b/src/plugins/hs_apps/sapi/vpp_echo_bapi.c @@ -44,9 +44,7 @@ echo_send_attach (echo_main_t * em) bmp->options[APP_OPTIONS_EVT_QUEUE_SIZE] = em->evt_q_size; if (em->appns_id) { - bmp->namespace_id_len = vec_len (em->appns_id); - clib_memcpy_fast (bmp->namespace_id, em->appns_id, - bmp->namespace_id_len); + vl_api_vec_to_api_string (em->appns_id, &bmp->namespace_id); bmp->options[APP_OPTIONS_FLAGS] |= em->appns_flags; bmp->options[APP_OPTIONS_NAMESPACE_SECRET] = em->appns_secret; } @@ -68,32 +66,42 @@ echo_send_detach (echo_main_t * em) } void -echo_send_add_crypto_ctx (echo_main_t * em) +echo_send_add_cert_key (echo_main_t * em) { - vl_api_application_tls_cert_add_t *cert_mp; - vl_api_application_tls_key_add_t *key_mp; - - cert_mp = vl_msg_api_alloc (sizeof (*cert_mp) + test_srv_crt_rsa_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 = em->my_client_index; - cert_mp->context = ntohl (0xfeedface); - cert_mp->cert_len = clib_host_to_net_u16 (test_srv_crt_rsa_len); - clib_memcpy_fast (cert_mp->cert, test_srv_crt_rsa, test_srv_crt_rsa_len); - vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & cert_mp); - - key_mp = vl_msg_api_alloc (sizeof (*key_mp) + test_srv_key_rsa_len); - clib_memset (key_mp, 0, sizeof (*key_mp) + test_srv_key_rsa_len); - key_mp->_vl_msg_id = ntohs (VL_API_APPLICATION_TLS_KEY_ADD); - key_mp->client_index = em->my_client_index; - key_mp->context = ntohl (0xfeedface); - key_mp->key_len = clib_host_to_net_u16 (test_srv_key_rsa_len); - clib_memcpy_fast (key_mp->key, test_srv_key_rsa, test_srv_key_rsa_len); - vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & key_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 = em->my_client_index; + bmp->context = ntohl (0xfeedface); + 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 (em->vl_input_queue, (u8 *) & bmp); } void -echo_send_listen (echo_main_t * em) +echo_send_del_cert_key (echo_main_t * em) +{ + 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 = em->my_client_index; + bmp->context = ntohl (0xfeedface); + bmp->index = clib_host_to_net_u32 (em->ckpair_index); + vl_msg_api_send_shmem (em->vl_input_queue, (u8 *) & bmp); +} + +void +echo_send_listen (echo_main_t * em, ip46_address_t * ip) { app_session_evt_t _app_evt, *app_evt = &_app_evt; session_listen_msg_t *mp; @@ -106,9 +114,11 @@ echo_send_listen (echo_main_t * em) mp->context = ntohl (0xfeedface); mp->wrk_index = 0; mp->is_ip4 = em->uri_elts.is_ip4; - clib_memcpy_fast (&mp->ip, &em->uri_elts.ip, sizeof (mp->ip)); + clib_memcpy_fast (&mp->ip, ip, sizeof (mp->ip)); mp->port = em->uri_elts.port; mp->proto = em->uri_elts.transport_proto; + mp->ckpair_index = em->ckpair_index; + mp->crypto_engine = em->crypto_engine; app_send_ctrl_evt_to_vpp (mq, app_evt); } @@ -130,41 +140,49 @@ echo_send_unbind (echo_main_t * em, echo_session_t * s) } void -echo_send_connect (u64 parent_session_handle, u32 opaque) +echo_send_connect (echo_main_t * em, void *args) { - echo_main_t *em = &echo_main; app_session_evt_t _app_evt, *app_evt = &_app_evt; session_connect_msg_t *mp; + echo_connect_args_t *a = (echo_connect_args_t *) args; svm_msg_q_t *mq = em->ctrl_mq; + clib_atomic_sub_fetch (&em->max_sim_connects, 1); + while (em->max_sim_connects <= 0) + ; + app_alloc_ctrl_evt_to_vpp (mq, app_evt, SESSION_CTRL_EVT_CONNECT); mp = (session_connect_msg_t *) app_evt->evt->data; memset (mp, 0, sizeof (*mp)); mp->client_index = em->my_client_index; - mp->context = ntohl (opaque); + mp->context = ntohl (a->context); mp->wrk_index = 0; mp->is_ip4 = em->uri_elts.is_ip4; - clib_memcpy_fast (&mp->ip, &em->uri_elts.ip, sizeof (mp->ip)); + clib_memcpy_fast (&mp->ip, &a->ip, sizeof (mp->ip)); + clib_memcpy_fast (&mp->lcl_ip, &a->lcl_ip, sizeof (mp->ip)); mp->port = em->uri_elts.port; mp->proto = em->uri_elts.transport_proto; - mp->parent_handle = parent_session_handle; + mp->parent_handle = a->parent_session_handle; + mp->ckpair_index = em->ckpair_index; + mp->crypto_engine = em->crypto_engine; + mp->flags = em->connect_flag; app_send_ctrl_evt_to_vpp (mq, app_evt); } void -echo_send_disconnect_session (u64 handle, u32 opaque) +echo_send_disconnect_session (echo_main_t * em, void *args) { - echo_main_t *em = &echo_main; echo_session_t *s; app_session_evt_t _app_evt, *app_evt = &_app_evt; session_disconnect_msg_t *mp; svm_msg_q_t *mq = em->ctrl_mq; + echo_disconnect_args_t *a = (echo_disconnect_args_t *) args; app_alloc_ctrl_evt_to_vpp (mq, app_evt, SESSION_CTRL_EVT_DISCONNECT); mp = (session_disconnect_msg_t *) app_evt->evt->data; memset (mp, 0, sizeof (*mp)); mp->client_index = em->my_client_index; - mp->handle = handle; + mp->handle = a->session_handle; app_send_ctrl_evt_to_vpp (mq, app_evt); if (!(s = echo_get_session_from_handle (em, mp->handle))) @@ -178,8 +196,8 @@ echo_send_disconnect_session (u64 handle, u32 opaque) * */ -static int -ssvm_segment_attach (char *name, ssvm_segment_type_t type, int fd) +int +echo_ssvm_segment_attach (char *name, ssvm_segment_type_t type, int fd) { fifo_segment_create_args_t _a, *a = &_a; fifo_segment_main_t *sm = &echo_main.segment_main; @@ -198,7 +216,7 @@ ssvm_segment_attach (char *name, ssvm_segment_type_t type, int fd) return 0; } -static inline void +void echo_segment_handle_add_del (echo_main_t * em, u64 segment_handle, u8 add) { clib_spinlock_lock (&em->segment_handles_lock); @@ -216,58 +234,53 @@ echo_segment_handle_add_del (echo_main_t * em, u64 segment_handle, u8 add) */ 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) { echo_main_t *em = &echo_main; if (mp->retval) { - ECHO_FAIL (ECHO_FAIL_VL_API_TLS_CERT_ADD_REPLY, - "tls cert add returned %d", + ECHO_FAIL (ECHO_FAIL_VL_API_CERT_KEY_ADD_REPLY, + "Adding cert and key returned %d", clib_net_to_host_u32 (mp->retval)); return; } /* No concurrency here, only bapi thread writes */ - if (em->state != STATE_ATTACHED_NO_CERT - && em->state != STATE_ATTACHED_ONE_CERT) + if (em->state != STATE_ATTACHED_NO_CERT) { - ECHO_FAIL (ECHO_FAIL_VL_API_TLS_CERT_ADD_REPLY, "Wrong state"); + ECHO_FAIL (ECHO_FAIL_VL_API_CERT_KEY_ADD_REPLY, "Wrong state"); return; } - em->state++; + em->ckpair_index = clib_net_to_host_u32 (mp->index); + em->state = STATE_ATTACHED; } 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) { echo_main_t *em = &echo_main; if (mp->retval) { - ECHO_FAIL (ECHO_FAIL_VL_API_TLS_KEY_ADD_REPLY, - "tls key add returned %d", + ECHO_FAIL (ECHO_FAIL_VL_API_CERT_KEY_DEL_REPLY, + "Delete cert and key returned %d", clib_net_to_host_u32 (mp->retval)); return; } - /* No concurrency here, only bapi thread writes */ - if (em->state != STATE_ATTACHED_NO_CERT - && em->state != STATE_ATTACHED_ONE_CERT) - { - ECHO_FAIL (ECHO_FAIL_VL_API_TLS_CERT_ADD_REPLY, "Wrong state"); - return; - } - em->state++; + em->state = STATE_CLEANED_CERT_KEY; } static void vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) { echo_main_t *em = &echo_main; - int *fds = 0, i; + int *fds = 0, i, rv; u32 n_fds = 0; u64 segment_handle; + char *segment_name = 0; + segment_handle = clib_net_to_host_u64 (mp->segment_handle); - ECHO_LOG (1, "Attached returned app %u", htons (mp->app_index)); + ECHO_LOG (2, "Attached returned app %u", htons (mp->app_index)); if (mp->retval) { @@ -276,14 +289,11 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) return; } - if (mp->segment_name_length == 0) + if (!mp->app_mq) { - ECHO_FAIL (ECHO_FAIL_VL_API_MISSING_SEGMENT_NAME, - "segment_name_length zero"); + ECHO_FAIL (ECHO_FAIL_VL_API_NULL_APP_MQ, "NULL app_mq"); return; } - - ASSERT (mp->app_mq); em->app_mq = uword_to_pointer (mp->app_mq, svm_msg_q_t *); em->ctrl_mq = uword_to_pointer (mp->vpp_ctrl_mq, svm_msg_q_t *); @@ -298,7 +308,7 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) } if (mp->fd_flags & SESSION_FD_F_VPP_MQ_SEGMENT) - if (ssvm_segment_attach (0, SSVM_SEGMENT_MEMFD, fds[n_fds++])) + if (echo_ssvm_segment_attach (0, SSVM_SEGMENT_MEMFD, fds[n_fds++])) { ECHO_FAIL (ECHO_FAIL_VL_API_SVM_FIFO_SEG_ATTACH, "svm_fifo_segment_attach failed on SSVM_SEGMENT_MEMFD"); @@ -306,14 +316,21 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) } if (mp->fd_flags & SESSION_FD_F_MEMFD_SEGMENT) - if (ssvm_segment_attach ((char *) mp->segment_name, - SSVM_SEGMENT_MEMFD, fds[n_fds++])) - { - ECHO_FAIL (ECHO_FAIL_VL_API_SVM_FIFO_SEG_ATTACH, - "svm_fifo_segment_attach ('%s') " - "failed on SSVM_SEGMENT_MEMFD", mp->segment_name); - goto failed; - } + { + segment_name = vl_api_from_api_to_new_c_string (&mp->segment_name); + rv = echo_ssvm_segment_attach (segment_name, + SSVM_SEGMENT_MEMFD, fds[n_fds++]); + if (rv != 0) + { + ECHO_FAIL (ECHO_FAIL_VL_API_SVM_FIFO_SEG_ATTACH, + "svm_fifo_segment_attach ('%s') " + "failed on SSVM_SEGMENT_MEMFD", segment_name); + vec_free (segment_name); + goto failed; + } + vec_free (segment_name); + } + if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD) svm_msg_q_set_consumer_eventfd (em->app_mq, fds[n_fds++]); @@ -321,17 +338,20 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) } else { - if (ssvm_segment_attach ((char *) mp->segment_name, SSVM_SEGMENT_SHM, - -1)) + segment_name = vl_api_from_api_to_new_c_string (&mp->segment_name); + rv = echo_ssvm_segment_attach (segment_name, SSVM_SEGMENT_SHM, -1); + if (rv != 0) { ECHO_FAIL (ECHO_FAIL_VL_API_SVM_FIFO_SEG_ATTACH, "svm_fifo_segment_attach ('%s') " - "failed on SSVM_SEGMENT_SHM", mp->segment_name); - return; + "failed on SSVM_SEGMENT_SHM", segment_name); + vec_free (segment_name); + goto failed; } + vec_free (segment_name); } echo_segment_handle_add_del (em, segment_handle, 1 /* add */ ); - ECHO_LOG (1, "Mapped segment 0x%lx", segment_handle); + ECHO_LOG (2, "Mapped segment 0x%lx", segment_handle); em->state = STATE_ATTACHED_NO_CERT; return; @@ -354,74 +374,11 @@ vl_api_application_detach_reply_t_handler (vl_api_application_detach_reply_t * echo_main.state = STATE_DETACHED; } -static void -vl_api_unmap_segment_t_handler (vl_api_unmap_segment_t * mp) -{ - echo_main_t *em = &echo_main; - u64 segment_handle = clib_net_to_host_u64 (mp->segment_handle); - echo_segment_handle_add_del (em, segment_handle, 0 /* add */ ); - ECHO_LOG (1, "Unmaped segment 0x%lx", segment_handle); -} - -static void -vl_api_map_another_segment_t_handler (vl_api_map_another_segment_t * mp) -{ - fifo_segment_main_t *sm = &echo_main.segment_main; - fifo_segment_create_args_t _a, *a = &_a; - echo_main_t *em = &echo_main; - int *fds = 0, i; - char *seg_name = (char *) mp->segment_name; - u64 segment_handle = clib_net_to_host_u64 (mp->segment_handle); - - if (mp->fd_flags & SESSION_FD_F_MEMFD_SEGMENT) - { - vec_validate (fds, 1); - if (vl_socket_client_recv_fd_msg (fds, 1, 5)) - { - ECHO_FAIL (ECHO_FAIL_VL_API_RECV_FD_MSG, - "vl_socket_client_recv_fd_msg failed"); - goto failed; - } - - if (ssvm_segment_attach (seg_name, SSVM_SEGMENT_MEMFD, fds[0])) - { - ECHO_FAIL (ECHO_FAIL_VL_API_SVM_FIFO_SEG_ATTACH, - "svm_fifo_segment_attach ('%s') " - "failed on SSVM_SEGMENT_MEMFD", seg_name); - goto failed; - } - vec_free (fds); - } - else - { - clib_memset (a, 0, sizeof (*a)); - a->segment_name = seg_name; - a->segment_size = mp->segment_size; - /* Attach to the segment vpp created */ - if (fifo_segment_attach (sm, a)) - { - ECHO_FAIL (ECHO_FAIL_VL_API_FIFO_SEG_ATTACH, - "fifo_segment_attach ('%s') failed", seg_name); - goto failed; - } - } - echo_segment_handle_add_del (em, segment_handle, 1 /* add */ ); - ECHO_LOG (1, "Mapped segment 0x%lx", segment_handle); - return; - -failed: - for (i = 0; i < vec_len (fds); i++) - close (fds[i]); - vec_free (fds); -} - -#define foreach_quic_echo_msg \ -_(APP_ATTACH_REPLY, app_attach_reply) \ -_(APPLICATION_DETACH_REPLY, application_detach_reply) \ -_(MAP_ANOTHER_SEGMENT, map_another_segment) \ -_(APPLICATION_TLS_CERT_ADD_REPLY, application_tls_cert_add_reply) \ -_(APPLICATION_TLS_KEY_ADD_REPLY, application_tls_key_add_reply) \ -_(UNMAP_SEGMENT, unmap_segment) +#define foreach_quic_echo_msg \ +_(APP_ATTACH_REPLY, app_attach_reply) \ +_(APPLICATION_DETACH_REPLY, application_detach_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) void echo_api_hookup (echo_main_t * em)