X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fhs_apps%2Fsapi%2Fvpp_echo_bapi.c;h=6ad825d787267d6c32b680e47a9d0fbc747ca4d0;hb=b462418890240b2e38dbf522f9dd0196b79e0fa8;hp=f343ad12865d177ac9749cf9d8a07dffd30b0f41;hpb=08f26641fa920d5a9629140430660adcf736a1c7;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 f343ad12865..6ad825d7872 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; } @@ -103,7 +101,7 @@ echo_send_del_cert_key (echo_main_t * em) } void -echo_send_listen (echo_main_t * em) +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; @@ -116,7 +114,7 @@ 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; @@ -142,11 +140,11 @@ 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); @@ -157,32 +155,34 @@ echo_send_connect (u64 parent_session_handle, u32 opaque) 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))) @@ -196,11 +196,13 @@ echo_send_disconnect_session (u64 handle, u32 opaque) * */ -static int -ssvm_segment_attach (char *name, ssvm_segment_type_t type, int fd) +int +echo_segment_attach (u64 segment_handle, 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; + echo_main_t *em = &echo_main; + fifo_segment_main_t *sm; int rv; clib_memset (a, 0, sizeof (*a)); @@ -210,21 +212,126 @@ ssvm_segment_attach (char *name, ssvm_segment_type_t type, int fd) if (type == SSVM_SEGMENT_MEMFD) a->memfd_fd = fd; + sm = &em->segment_main; + if ((rv = fifo_segment_attach (sm, a))) return rv; - vec_reset_length (a->new_segment_indices); + + clib_spinlock_lock (&em->segment_handles_lock); + hash_set (em->shared_segment_handles, segment_handle, + a->new_segment_indices[0]); + clib_spinlock_unlock (&em->segment_handles_lock); + + vec_free (a->new_segment_indices); return 0; } -static inline void -echo_segment_handle_add_del (echo_main_t * em, u64 segment_handle, u8 add) +u32 +echo_segment_lookup (u64 segment_handle) { + echo_main_t *em = &echo_main; + uword *segment_idxp; + + ECHO_LOG (3, "Check if segment mapped 0x%lx...", segment_handle); + clib_spinlock_lock (&em->segment_handles_lock); - if (add) - hash_set (em->shared_segment_handles, segment_handle, 1); - else - hash_unset (em->shared_segment_handles, segment_handle); + segment_idxp = hash_get (em->shared_segment_handles, segment_handle); + clib_spinlock_unlock (&em->segment_handles_lock); + if (!segment_idxp) + return ~0; + + ECHO_LOG (2, "Segment not mapped (0x%lx)", segment_handle); + return ((u32) *segment_idxp); +} + +void +echo_segment_detach (u64 segment_handle) +{ + echo_main_t *em = &echo_main; + fifo_segment_main_t *sm; + + u32 segment_index = echo_segment_lookup (segment_handle); + if (segment_index == (u32) ~0) + return; + + sm = &em->segment_main; + + clib_spinlock_lock (&em->segment_handles_lock); + fifo_segment_delete (sm, fifo_segment_get_segment (sm, segment_index)); + hash_unset (em->shared_segment_handles, segment_handle); + clib_spinlock_unlock (&em->segment_handles_lock); +} + +int +echo_attach_session (uword segment_handle, uword rxf_offset, uword txf_offset, + uword mq_offset, echo_session_t *s) +{ + svm_fifo_shared_t *rx_fifo, *tx_fifo; + echo_main_t *em = &echo_main; + u32 fs_index, eqs_index; + fifo_segment_t *fs; + + fs_index = echo_segment_lookup (segment_handle); + if (fs_index == (u32) ~0) + { + ECHO_LOG (0, "ERROR: segment for session %u is not mounted!", + s->session_index); + return -1; + } + + if (mq_offset != (uword) ~0) + { + eqs_index = echo_segment_lookup (ECHO_MQ_SEG_HANDLE); + ASSERT (eqs_index != (u32) ~0); + } + + rx_fifo = uword_to_pointer (rxf_offset, svm_fifo_shared_t *); + tx_fifo = uword_to_pointer (txf_offset, svm_fifo_shared_t *); + rx_fifo->client_session_index = s->session_index; + tx_fifo->client_session_index = s->session_index; + + clib_spinlock_lock (&em->segment_handles_lock); + + fs = fifo_segment_get_segment (&em->segment_main, fs_index); + s->rx_fifo = fifo_segment_alloc_fifo_w_shared (fs, rx_fifo); + s->tx_fifo = fifo_segment_alloc_fifo_w_shared (fs, tx_fifo); + + if (mq_offset != (uword) ~0) + { + fs = fifo_segment_get_segment (&em->segment_main, eqs_index); + s->vpp_evt_q = + fifo_segment_msg_q_attach (fs, mq_offset, rx_fifo->slice_index); + } + + clib_spinlock_unlock (&em->segment_handles_lock); + + return 0; +} + +int +echo_segment_attach_mq (uword segment_handle, uword mq_offset, u32 mq_index, + svm_msg_q_t **mq) +{ + echo_main_t *em = &echo_main; + fifo_segment_t *fs; + u32 fs_index; + + fs_index = echo_segment_lookup (segment_handle); + if (fs_index == (u32) ~0) + { + ECHO_LOG (0, "ERROR: mq segment %lx for is not attached!", + segment_handle); + return -1; + } + + clib_spinlock_lock (&em->segment_handles_lock); + + fs = fifo_segment_get_segment (&em->segment_main, fs_index); + *mq = fifo_segment_msg_q_attach (fs, mq_offset, mq_index); + clib_spinlock_unlock (&em->segment_handles_lock); + + return 0; } /* @@ -274,9 +381,11 @@ 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 (2, "Attached returned app %u", htons (mp->app_index)); @@ -287,20 +396,11 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) return; } - if (mp->segment_name_length == 0) - { - ECHO_FAIL (ECHO_FAIL_VL_API_MISSING_SEGMENT_NAME, - "segment_name_length zero"); - return; - } - if (!mp->app_mq) { ECHO_FAIL (ECHO_FAIL_VL_API_NULL_APP_MQ, "NULL app_mq"); return; } - 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 *); if (mp->n_fds) { @@ -313,22 +413,33 @@ 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_segment_attach (ECHO_MQ_SEG_HANDLE, 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"); goto failed; } + echo_segment_attach_mq (ECHO_MQ_SEG_HANDLE, mp->vpp_ctrl_mq, + mp->vpp_ctrl_mq_thread, &em->ctrl_mq); 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_segment_attach (segment_handle, 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); + } + echo_segment_attach_mq (segment_handle, mp->app_mq, 0, &em->app_mq); + if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD) svm_msg_q_set_consumer_eventfd (em->app_mq, fds[n_fds++]); @@ -336,16 +447,19 @@ 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_segment_attach (segment_handle, 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 (2, "Mapped segment 0x%lx", segment_handle); em->state = STATE_ATTACHED_NO_CERT; @@ -369,74 +483,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 (2, "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 (2, "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) \ _(APP_ADD_CERT_KEY_PAIR_REPLY, app_add_cert_key_pair_reply) \ -_(APP_DEL_CERT_KEY_PAIR_REPLY, app_del_cert_key_pair_reply) \ -_(UNMAP_SEGMENT, unmap_segment) +_(APP_DEL_CERT_KEY_PAIR_REPLY, app_del_cert_key_pair_reply) void echo_api_hookup (echo_main_t * em)