X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=blobdiff_plain;f=src%2Fplugins%2Fhs_apps%2Fsapi%2Fvpp_echo_bapi.c;h=30f3b78aff327dc9ddef5e8855bf2cf313bb38b9;hp=e71c0e9adbaff3df1a3f8625c1b57036b50eeb67;hb=36217e3ca;hpb=8219f1f361083cc63022b70d11b08f52833d4789 diff --git a/src/plugins/hs_apps/sapi/vpp_echo_bapi.c b/src/plugins/hs_apps/sapi/vpp_echo_bapi.c index e71c0e9adba..30f3b78aff3 100644 --- a/src/plugins/hs_apps/sapi/vpp_echo_bapi.c +++ b/src/plugins/hs_apps/sapi/vpp_echo_bapi.c @@ -18,6 +18,9 @@ #include +#define REPLY_MSG_ID_BASE msg_id_base +static u16 msg_id_base; + /* * * Binary API Messages @@ -31,7 +34,7 @@ echo_send_attach (echo_main_t * em) bmp = vl_msg_api_alloc (sizeof (*bmp)); clib_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 = em->my_client_index; bmp->context = ntohl (0xfeedface); bmp->options[APP_OPTIONS_FLAGS] = APP_OPTIONS_FLAGS_ACCEPT_REDIRECT; @@ -58,7 +61,7 @@ echo_send_detach (echo_main_t * em) bmp = vl_msg_api_alloc (sizeof (*bmp)); clib_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 = em->my_client_index; bmp->context = ntohl (0xfeedface); @@ -75,7 +78,7 @@ echo_send_add_cert_key (echo_main_t * em) 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->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + 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); @@ -93,13 +96,38 @@ echo_send_del_cert_key (echo_main_t * em) 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->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + 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); } +static u8 +echo_transport_needs_crypto (transport_proto_t proto) +{ + return proto == TRANSPORT_PROTO_TLS || proto == TRANSPORT_PROTO_DTLS || + proto == TRANSPORT_PROTO_QUIC; +} + +static void +echo_msg_add_crypto_ext_config (echo_main_t *em, uword *offset) +{ + transport_endpt_ext_cfg_t cfg; + svm_fifo_chunk_t *c; + + c = echo_segment_alloc_chunk (ECHO_MQ_SEG_HANDLE, 0, sizeof (cfg), offset); + if (!c) + return; + + memset (&cfg, 0, sizeof (cfg)); + cfg.type = TRANSPORT_ENDPT_EXT_CFG_CRYPTO; + cfg.len = sizeof (cfg); + cfg.crypto.ckpair_index = em->ckpair_index; + cfg.crypto.crypto_engine = em->crypto_engine; + clib_memcpy_fast (c->data, &cfg, cfg.len); +} + void echo_send_listen (echo_main_t * em, ip46_address_t * ip) { @@ -117,8 +145,8 @@ echo_send_listen (echo_main_t * em, ip46_address_t * 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; + if (echo_transport_needs_crypto (mp->proto)) + echo_msg_add_crypto_ext_config (em, &mp->ext_config); app_send_ctrl_evt_to_vpp (mq, app_evt); } @@ -163,8 +191,8 @@ echo_send_connect (echo_main_t * em, void *args) mp->port = em->uri_elts.port; mp->proto = em->uri_elts.transport_proto; mp->parent_handle = a->parent_session_handle; - mp->ckpair_index = em->ckpair_index; - mp->crypto_engine = em->crypto_engine; + if (echo_transport_needs_crypto (mp->proto)) + echo_msg_add_crypto_ext_config (em, &mp->ext_config); mp->flags = em->connect_flag; app_send_ctrl_evt_to_vpp (mq, app_evt); } @@ -262,6 +290,104 @@ echo_segment_detach (u64 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) +{ + 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); + } + + 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_offset (fs, rxf_offset); + s->tx_fifo = fifo_segment_alloc_fifo_w_offset (fs, txf_offset); + s->rx_fifo->segment_index = fs_index; + s->tx_fifo->segment_index = fs_index; + s->rx_fifo->shr->client_session_index = s->session_index; + s->tx_fifo->shr->client_session_index = s->session_index; + + 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, + s->rx_fifo->shr->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; +} + +svm_fifo_chunk_t * +echo_segment_alloc_chunk (uword segment_handle, u32 slice_index, u32 size, + uword *offset) +{ + echo_main_t *em = &echo_main; + svm_fifo_chunk_t *c; + 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 0; + } + + clib_spinlock_lock (&em->segment_handles_lock); + + fs = fifo_segment_get_segment (&em->segment_main, fs_index); + c = fifo_segment_alloc_chunk_w_slice (fs, slice_index, size); + *offset = fifo_segment_chunk_offset (fs, c); + + clib_spinlock_unlock (&em->segment_handles_lock); + + return c; +} + /* * * Binary API callbacks @@ -305,8 +431,6 @@ static void em->state = STATE_CLEANED_CERT_KEY; } -#define ECHO_MQ_SEG_HANDLE ((u64) ~0 - 1) - static void vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) { @@ -331,8 +455,6 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) 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) { @@ -352,6 +474,8 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) "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) { @@ -368,9 +492,10 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) } 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++]); + svm_msg_q_set_eventfd (em->app_mq, fds[n_fds++]); vec_free (fds); } @@ -418,16 +543,37 @@ _(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) +#define vl_print(handle, ...) fformat (handle, __VA_ARGS__) +#define vl_endianfun +#include +#undef vl_endianfun + +#define vl_printfun +#include +#undef vl_printfun + +#define vl_api_version(n, v) static u32 api_version = v; +#include +#undef vl_api_version + void echo_api_hookup (echo_main_t * em) { -#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 *name = format (0, "session_%08x%c", api_version, 0); + + REPLY_MSG_ID_BASE = vl_client_get_first_plugin_msg_id ((char *) name); + + vec_free (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); foreach_quic_echo_msg; #undef _ }