diff options
Diffstat (limited to 'src/vnet')
-rw-r--r-- | src/vnet/session/application.c | 17 | ||||
-rw-r--r-- | src/vnet/session/application.h | 3 | ||||
-rw-r--r-- | src/vnet/session/application_interface.h | 16 | ||||
-rw-r--r-- | src/vnet/session/session.h | 1 | ||||
-rwxr-xr-x | src/vnet/session/session_api.c | 84 |
5 files changed, 121 insertions, 0 deletions
diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index 1ad94cc2778..b7498d00881 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -769,6 +769,12 @@ application_has_global_scope (application_t * app) return app->flags & APP_OPTIONS_FLAGS_USE_GLOBAL_SCOPE; } +u8 +application_use_mq_for_ctrl (application_t * app) +{ + return app->flags & APP_OPTIONS_FLAGS_USE_MQ_FOR_CTRL_MSGS; +} + /** * Send an API message to the external app, to map new segment */ @@ -1163,6 +1169,17 @@ application_get_local_session_from_handle (session_handle_t handle) return application_get_local_session (server_wrk, session_index); } +local_session_t * +application_get_local_listen_session_from_handle (session_handle_t lh) +{ + u32 ll_index, server_wrk_index; + app_worker_t *server_wrk; + + local_session_parse_handle (lh, &server_wrk_index, &ll_index); + server_wrk = app_worker_get (server_wrk_index); + return application_get_local_listen_session (server_wrk, ll_index); +} + always_inline void application_local_listener_session_endpoint (local_session_t * ll, session_endpoint_t * sep) diff --git a/src/vnet/session/application.h b/src/vnet/session/application.h index cf855660ca5..de609d2d7a0 100644 --- a/src/vnet/session/application.h +++ b/src/vnet/session/application.h @@ -247,6 +247,7 @@ u32 application_local_session_table (application_t * app); u8 *application_name_from_index (u32 app_wrk_index); u8 application_has_local_scope (application_t * app); u8 application_has_global_scope (application_t * app); +u8 application_use_mq_for_ctrl (application_t * app); void application_setup_proxy (application_t * app); void application_remove_proxy (application_t * app); @@ -262,6 +263,8 @@ local_session_t *application_get_local_session (app_worker_t * app, u32 session_index); local_session_t *application_get_local_session_from_handle (session_handle_t handle); +local_session_t + * application_get_local_listen_session_from_handle (session_handle_t lh); int application_start_local_listen (app_worker_t * server, session_endpoint_t * sep, session_handle_t * handle); diff --git a/src/vnet/session/application_interface.h b/src/vnet/session/application_interface.h index 13ec73adf0f..1f481dcf85e 100644 --- a/src/vnet/session/application_interface.h +++ b/src/vnet/session/application_interface.h @@ -209,6 +209,22 @@ typedef struct #undef _ } app_session_t; +typedef struct session_bound_msg_ +{ + u32 context; + u64 handle; + i32 retval; + u8 lcl_is_ip4; + u8 lcl_ip[16]; + u16 lcl_port; + u64 rx_fifo; + u64 tx_fifo; + u64 vpp_evt_q; + u32 segment_size; + u8 segment_name_length; + u8 segment_name[128]; +} __clib_packed session_bound_msg_t; + typedef struct session_accepted_msg_ { u32 context; diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index 63ed83d40df..184fa997736 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -39,6 +39,7 @@ typedef enum FIFO_EVENT_DISCONNECT, FIFO_EVENT_BUILTIN_RX, FIFO_EVENT_RPC, + SESSION_CTRL_EVT_BOUND, SESSION_CTRL_EVT_ACCEPTED, SESSION_CTRL_EVT_ACCEPTED_REPLY, SESSION_CTRL_EVT_CONNECTED, diff --git a/src/vnet/session/session_api.c b/src/vnet/session/session_api.c index c12354fdeae..13a337699d2 100755 --- a/src/vnet/session/session_api.c +++ b/src/vnet/session/session_api.c @@ -636,6 +636,72 @@ done: return 0; } +static int +mq_send_session_bound_cb (u32 app_wrk_index, u32 api_context, + session_handle_t handle, int rv) +{ + svm_msg_q_msg_t _msg, *msg = &_msg; + svm_msg_q_t *app_mq, *vpp_evt_q; + transport_connection_t *tc; + stream_session_t *ls = 0; + session_bound_msg_t *mp; + app_worker_t *app_wrk; + session_event_t *evt; + application_t *app; + + app_wrk = app_worker_get (app_wrk_index); + app = application_get (app_wrk->app_index); + app_mq = app_wrk->event_queue; + if (!app_mq) + { + clib_warning ("app %u with api index: %u not attached", app->app_index, + app->api_client_index); + return -1; + } + + svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, SESSION_MQ_CTRL_EVT_RING, + SVM_Q_WAIT, msg); + svm_msg_q_unlock (app_mq); + evt = svm_msg_q_msg_data (app_mq, msg); + memset (evt, 0, sizeof (*evt)); + evt->event_type = SESSION_CTRL_EVT_BOUND; + mp = (session_bound_msg_t *) evt->data; + mp->context = api_context; + + if (rv) + goto done; + + mp->handle = handle; + if (application_has_global_scope (app)) + { + ls = listen_session_get_from_handle (handle); + tc = listen_session_get_transport (ls); + mp->lcl_port = tc->lcl_port; + mp->lcl_is_ip4 = tc->is_ip4; + clib_memcpy (mp->lcl_ip, &tc->lcl_ip, sizeof (tc->lcl_ip)); + } + else + { + local_session_t *local; + local = application_get_local_listen_session_from_handle (handle); + mp->lcl_port = local->port; + mp->lcl_is_ip4 = session_type_is_ip4 (local->session_type); + } + + if (ls && session_transport_service_type (ls) == TRANSPORT_SERVICE_CL) + { + mp->rx_fifo = pointer_to_uword (ls->server_rx_fifo); + mp->tx_fifo = pointer_to_uword (ls->server_tx_fifo); + vpp_evt_q = session_manager_get_vpp_event_queue (0); + mp->vpp_evt_q = pointer_to_uword (vpp_evt_q); + } + +done: + mp->retval = rv; + svm_msg_q_add (app_mq, msg, SVM_Q_WAIT); + return 0; +} + static session_cb_vft_t session_mq_cb_vft = { .session_accept_callback = mq_send_session_accepted_cb, .session_disconnect_callback = mq_send_session_disconnected_cb, @@ -791,6 +857,7 @@ vl_api_bind_uri_t_handler (vl_api_bind_uri_t * mp) stream_session_t *s; application_t *app = 0; svm_msg_q_t *vpp_evt_q; + app_worker_t *app_wrk; int rv; if (session_manager_is_enabled () == 0) @@ -837,6 +904,14 @@ done: } })); /* *INDENT-ON* */ + + /* If app uses mq for control messages, send an mq message as well */ + if (app && application_use_mq_for_ctrl (app)) + { + app_wrk = application_get_worker (app, 0); + mq_send_session_bound_cb (app_wrk->wrk_index, mp->context, a->handle, + rv); + } } static void @@ -1070,6 +1145,7 @@ vl_api_bind_sock_t_handler (vl_api_bind_sock_t * mp) int rv = 0; clib_error_t *error; application_t *app = 0; + app_worker_t *app_wrk; stream_session_t *s; transport_connection_t *tc = 0; ip46_address_t *ip46; @@ -1129,6 +1205,14 @@ done: } })); /* *INDENT-ON* */ + + /* If app uses mq for control messages, send an mq message as well */ + if (app && application_use_mq_for_ctrl (app)) + { + app_wrk = application_get_worker (app, mp->wrk_index); + mq_send_session_bound_cb (app_wrk->wrk_index, mp->context, a->handle, + rv); + } } static void |