X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_api.c;h=ff11bcb690a9db4f7f2af73527c84ad020025bc1;hb=0028e6f31624246e831b5b1a13dc46ab1d864fa7;hp=2121d2075e6aaef3e07b437bed244633cbdaf02a;hpb=7b3a3df263c7a5bf549f350553cbd9bce7ee40b3;p=vpp.git diff --git a/src/vnet/session/session_api.c b/src/vnet/session/session_api.c index 2121d2075e6..ff11bcb690a 100644 --- a/src/vnet/session/session_api.c +++ b/src/vnet/session/session_api.c @@ -81,41 +81,13 @@ session_send_fds (vl_api_registration_t * reg, int fds[], int n_fds) return 0; } -static int -mq_try_lock_and_alloc_msg (svm_msg_q_t * app_mq, svm_msg_q_msg_t * msg) -{ - int rv; - u8 try = 0; - while (try < 100) - { - rv = svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, - SESSION_MQ_CTRL_EVT_RING, - SVM_Q_NOWAIT, msg); - if (!rv) - return 0; - /* - * Break the loop if mq is full, usually this is because the - * app has crashed or is hanging on somewhere. - */ - if (rv != -1) - break; - try++; - usleep (1); - } - clib_warning ("failed to alloc msg"); - return -1; -} - static int mq_send_session_accepted_cb (session_t * s) { app_worker_t *app_wrk = app_worker_get (s->app_wrk_index); - svm_msg_q_msg_t _msg, *msg = &_msg; session_accepted_msg_t m = { 0 }; - svm_msg_q_t *app_mq; fifo_segment_t *eq_seg; session_t *listener; - session_event_t *evt; application_t *app; app = application_get (app_wrk->app_index); @@ -164,15 +136,14 @@ mq_send_session_accepted_cb (session_t * s) m.mq_index = s->thread_index; } - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return SESSION_E_MQ_MSG_ALLOC; + if (application_original_dst_is_enabled (app)) + { + session_get_original_dst (&m.lcl, &m.rmt, + session_get_transport_proto (s), + &m.original_dst_ip4, &m.original_dst_port); + } - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_ACCEPTED; - clib_memcpy_fast (evt->data, &m, sizeof (m)); - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_ACCEPTED, &m, sizeof (m)); return 0; } @@ -181,21 +152,12 @@ static inline void mq_send_session_close_evt (app_worker_t * app_wrk, session_handle_t sh, session_evt_type_t evt_type) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_disconnected_msg_t *mp; - svm_msg_q_t *app_mq; - session_event_t *evt; + session_disconnected_msg_t m = { 0 }; - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = evt_type; - mp = (session_disconnected_msg_t *) evt->data; - mp->handle = sh; - mp->context = app_wrk->api_client_index; - svm_msg_q_add_and_unlock (app_mq, msg); + m.handle = sh; + m.context = app_wrk->api_client_index; + + app_wrk_send_ctrl_evt (app_wrk, evt_type, &m, sizeof (m)); } static inline void @@ -249,13 +211,10 @@ int mq_send_session_connected_cb (u32 app_wrk_index, u32 api_context, session_t * s, session_error_t err) { - svm_msg_q_msg_t _msg, *msg = &_msg; session_connected_msg_t m = { 0 }; - svm_msg_q_t *app_mq; transport_connection_t *tc; fifo_segment_t *eq_seg; app_worker_t *app_wrk; - session_event_t *evt; application_t *app; app_wrk = app_worker_get (app_wrk_index); @@ -318,17 +277,8 @@ mq_send_session_connected_cb (u32 app_wrk_index, u32 api_context, snd_msg: - app_mq = app_wrk->event_queue; - - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return SESSION_E_MQ_MSG_ALLOC; + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_CONNECTED, &m, sizeof (m)); - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_CONNECTED; - clib_memcpy_fast (evt->data, &m, sizeof (m)); - - svm_msg_q_add_and_unlock (app_mq, msg); return 0; } @@ -336,13 +286,10 @@ 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; session_bound_msg_t m = { 0 }; - svm_msg_q_t *app_mq; transport_endpoint_t tep; fifo_segment_t *eq_seg; app_worker_t *app_wrk; - session_event_t *evt; application_t *app; app_listener_t *al; session_t *ls = 0; @@ -374,6 +321,8 @@ mq_send_session_bound_cb (u32 app_wrk_index, u32 api_context, if (session_transport_service_type (ls) == TRANSPORT_SERVICE_CL && ls->rx_fifo) { + m.mq_index = transport_cl_thread (); + m.vpp_evt_q = fifo_segment_msg_q_offset (eq_seg, m.mq_index); m.rx_fifo = fifo_segment_fifo_offset (ls->rx_fifo); m.tx_fifo = fifo_segment_fifo_offset (ls->tx_fifo); m.segment_handle = session_segment_handle (ls); @@ -381,17 +330,8 @@ mq_send_session_bound_cb (u32 app_wrk_index, u32 api_context, snd_msg: - app_mq = app_wrk->event_queue; - - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return SESSION_E_MQ_MSG_ALLOC; + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_BOUND, &m, sizeof (m)); - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_BOUND; - clib_memcpy_fast (evt->data, &m, sizeof (m)); - - svm_msg_q_add_and_unlock (app_mq, msg); return 0; } @@ -399,40 +339,26 @@ void mq_send_unlisten_reply (app_worker_t * app_wrk, session_handle_t sh, u32 context, int rv) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_unlisten_reply_msg_t *ump; - svm_msg_q_t *app_mq; - session_event_t *evt; - - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return; + session_unlisten_reply_msg_t m = { 0 }; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_UNLISTEN_REPLY; - ump = (session_unlisten_reply_msg_t *) evt->data; - ump->context = context; - ump->handle = sh; - ump->retval = rv; - svm_msg_q_add_and_unlock (app_mq, msg); + m.context = context; + m.handle = sh; + m.retval = rv; + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_UNLISTEN_REPLY, &m, + sizeof (m)); } static void mq_send_session_migrate_cb (session_t * s, session_handle_t new_sh) { - svm_msg_q_msg_t _msg, *msg = &_msg; session_migrated_msg_t m = { 0 }; fifo_segment_t *eq_seg; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; application_t *app; u32 thread_index; thread_index = session_thread_from_handle (new_sh); app_wrk = app_worker_get (s->app_wrk_index); - app_mq = app_wrk->event_queue; app = application_get (app_wrk->app_index); eq_seg = application_get_rx_mqs_segment (app); @@ -442,27 +368,15 @@ mq_send_session_migrate_cb (session_t * s, session_handle_t new_sh) m.vpp_evt_q = fifo_segment_msg_q_offset (eq_seg, thread_index); m.segment_handle = SESSION_INVALID_HANDLE; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return; - - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_MIGRATED; - clib_memcpy_fast (evt->data, &m, sizeof (m)); - - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_MIGRATED, &m, sizeof (m)); } static int mq_send_add_segment_cb (u32 app_wrk_index, u64 segment_handle) { - int fds[SESSION_N_FD_TYPE], n_fds = 0; - svm_msg_q_msg_t _msg, *msg = &_msg; - session_app_add_segment_msg_t *mp; + session_app_add_segment_msg_t m = { 0 }; vl_api_registration_t *reg; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; fifo_segment_t *fs; ssvm_private_t *sp; u8 fd_flags = 0; @@ -488,29 +402,16 @@ mq_send_add_segment_cb (u32 app_wrk_index, u64 segment_handle) } fd_flags |= SESSION_FD_F_MEMFD_SEGMENT; - fds[n_fds] = sp->fd; - n_fds += 1; } - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return -1; + m.segment_size = sp->ssvm_size; + m.fd_flags = fd_flags; + m.segment_handle = segment_handle; + strncpy ((char *) m.segment_name, (char *) sp->name, + sizeof (m.segment_name) - 1); - if (n_fds) - session_send_fds (reg, fds, n_fds); - - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_APP_ADD_SEGMENT; - mp = (session_app_add_segment_msg_t *) evt->data; - clib_memset (mp, 0, sizeof (*mp)); - mp->segment_size = sp->ssvm_size; - mp->fd_flags = fd_flags; - mp->segment_handle = segment_handle; - strncpy ((char *) mp->segment_name, (char *) sp->name, - sizeof (mp->segment_name) - 1); - - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt_fd (app_wrk, SESSION_CTRL_EVT_APP_ADD_SEGMENT, &m, + sizeof (m), sp->fd); return 0; } @@ -518,12 +419,9 @@ mq_send_add_segment_cb (u32 app_wrk_index, u64 segment_handle) static int mq_send_del_segment_cb (u32 app_wrk_index, u64 segment_handle) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_app_del_segment_msg_t *mp; + session_app_del_segment_msg_t m = { 0 }; vl_api_registration_t *reg; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; app_wrk = app_worker_get (app_wrk_index); reg = vl_mem_api_client_index_to_registration (app_wrk->api_client_index); @@ -533,17 +431,10 @@ mq_send_del_segment_cb (u32 app_wrk_index, u64 segment_handle) return -1; } - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return -1; + m.segment_handle = segment_handle; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_APP_DEL_SEGMENT; - mp = (session_app_del_segment_msg_t *) evt->data; - clib_memset (mp, 0, sizeof (*mp)); - mp->segment_handle = segment_handle; - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_APP_DEL_SEGMENT, &m, + sizeof (m)); return 0; } @@ -551,10 +442,7 @@ mq_send_del_segment_cb (u32 app_wrk_index, u64 segment_handle) static void mq_send_session_cleanup_cb (session_t * s, session_cleanup_ntf_t ntf) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_cleanup_msg_t *mp; - svm_msg_q_t *app_mq; - session_event_t *evt; + session_cleanup_msg_t m = { 0 }; app_worker_t *app_wrk; /* Propagate transport cleanup notifications only if app didn't close */ @@ -566,17 +454,10 @@ mq_send_session_cleanup_cb (session_t * s, session_cleanup_ntf_t ntf) if (!app_wrk) return; - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return; + m.handle = session_handle (s); + m.type = ntf; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_CLEANUP; - mp = (session_cleanup_msg_t *) evt->data; - mp->handle = session_handle (s); - mp->type = ntf; - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_CLEANUP, &m, sizeof (m)); } static session_cb_vft_t session_mq_cb_vft = { @@ -653,7 +534,8 @@ vl_api_app_attach_t_handler (vl_api_app_attach_t * mp) if ((rv = vnet_application_attach (a))) { - clib_warning ("attach returned: %d", rv); + clib_warning ("attach returned: %U", format_session_error, rv); + rv = VNET_API_ERROR_UNSPECIFIED; vec_free (a->namespace_id); goto done; } @@ -696,25 +578,28 @@ vl_api_app_attach_t_handler (vl_api_app_attach_t * mp) done: /* *INDENT-OFF* */ - REPLY_MACRO2 (VL_API_APP_ATTACH_REPLY, ({ - if (!rv) - { - ctrl_thread = n_workers ? 1 : 0; - segp = (fifo_segment_t *) a->segment; - rmp->app_index = clib_host_to_net_u32 (a->app_index); - rmp->app_mq = fifo_segment_msg_q_offset (segp, 0); - rmp->vpp_ctrl_mq = fifo_segment_msg_q_offset (rx_mqs_seg, ctrl_thread); - rmp->vpp_ctrl_mq_thread = ctrl_thread; - rmp->n_fds = n_fds; - rmp->fd_flags = fd_flags; - if (vec_len (segp->ssvm.name)) - { - vl_api_vec_to_api_string (segp->ssvm.name, &rmp->segment_name); - } - rmp->segment_size = segp->ssvm.ssvm_size; - rmp->segment_handle = clib_host_to_net_u64 (a->segment_handle); - } - })); + REPLY_MACRO3 ( + VL_API_APP_ATTACH_REPLY, + ((!rv) ? vec_len (((fifo_segment_t *) a->segment)->ssvm.name) : 0), ({ + if (!rv) + { + ctrl_thread = n_workers ? 1 : 0; + segp = (fifo_segment_t *) a->segment; + rmp->app_index = clib_host_to_net_u32 (a->app_index); + rmp->app_mq = fifo_segment_msg_q_offset (segp, 0); + rmp->vpp_ctrl_mq = + fifo_segment_msg_q_offset (rx_mqs_seg, ctrl_thread); + rmp->vpp_ctrl_mq_thread = ctrl_thread; + rmp->n_fds = n_fds; + rmp->fd_flags = fd_flags; + if (vec_len (segp->ssvm.name)) + { + vl_api_vec_to_api_string (segp->ssvm.name, &rmp->segment_name); + } + rmp->segment_size = segp->ssvm.ssvm_size; + rmp->segment_handle = clib_host_to_net_u64 (a->segment_handle); + } + })); /* *INDENT-ON* */ if (n_fds) @@ -757,7 +642,9 @@ vl_api_app_worker_add_del_t_handler (vl_api_app_worker_add_del_t * mp) rv = vnet_app_worker_add_del (&args); if (rv) { - clib_warning ("app worker add/del returned: %d", rv); + clib_warning ("app worker add/del returned: %U", format_session_error, + rv); + rv = VNET_API_ERROR_UNSPECIFIED; goto done; } @@ -780,22 +667,25 @@ vl_api_app_worker_add_del_t_handler (vl_api_app_worker_add_del_t * mp) /* *INDENT-OFF* */ done: - REPLY_MACRO2 (VL_API_APP_WORKER_ADD_DEL_REPLY, ({ - rmp->is_add = mp->is_add; - rmp->wrk_index = clib_host_to_net_u32 (args.wrk_map_index); - rmp->segment_handle = clib_host_to_net_u64 (args.segment_handle); - if (!rv && mp->is_add) - { - rmp->app_event_queue_address = - fifo_segment_msg_q_offset ((fifo_segment_t *) args.segment, 0); - rmp->n_fds = n_fds; - rmp->fd_flags = fd_flags; - if (vec_len (args.segment->name)) - { - vl_api_vec_to_api_string (args.segment->name, &rmp->segment_name); - } - } - })); + REPLY_MACRO3 ( + VL_API_APP_WORKER_ADD_DEL_REPLY, + ((!rv && mp->is_add) ? vec_len (args.segment->name) : 0), ({ + rmp->is_add = mp->is_add; + rmp->wrk_index = clib_host_to_net_u32 (args.wrk_map_index); + rmp->segment_handle = clib_host_to_net_u64 (args.segment_handle); + if (!rv && mp->is_add) + { + rmp->app_event_queue_address = + fifo_segment_msg_q_offset ((fifo_segment_t *) args.segment, 0); + rmp->n_fds = n_fds; + rmp->fd_flags = fd_flags; + if (vec_len (args.segment->name)) + { + vl_api_vec_to_api_string (args.segment->name, + &rmp->segment_name); + } + } + })); /* *INDENT-ON* */ if (n_fds) @@ -822,6 +712,12 @@ vl_api_application_detach_t_handler (vl_api_application_detach_t * mp) a->app_index = app->app_index; a->api_client_index = mp->client_index; rv = vnet_application_detach (a); + if (rv) + { + clib_warning ("vnet_application_detach: %U", format_session_error, + rv); + rv = VNET_API_ERROR_UNSPECIFIED; + } } done: @@ -845,7 +741,6 @@ vl_api_app_namespace_add_del_t_handler (vl_api_app_namespace_add_del_t * mp) vnet_app_namespace_add_del_args_t args = { .ns_id = ns_id, - .netns = 0, .sock_name = 0, .secret = clib_net_to_host_u64 (mp->secret), .sw_if_index = clib_net_to_host_u32 (mp->sw_if_index), @@ -879,7 +774,7 @@ vl_api_app_namespace_add_del_v2_t_handler ( vl_api_app_namespace_add_del_v2_t *mp) { vl_api_app_namespace_add_del_v2_reply_t *rmp; - u8 *ns_id = 0, *netns = 0; + u8 *ns_id = 0; u32 appns_index = 0; int rv = 0; @@ -890,13 +785,10 @@ vl_api_app_namespace_add_del_v2_t_handler ( } mp->namespace_id[sizeof (mp->namespace_id) - 1] = 0; - mp->netns[sizeof (mp->netns) - 1] = 0; ns_id = format (0, "%s", &mp->namespace_id); - netns = format (0, "%s", &mp->netns); vnet_app_namespace_add_del_args_t args = { .ns_id = ns_id, - .netns = netns, .sock_name = 0, .secret = clib_net_to_host_u64 (mp->secret), .sw_if_index = clib_net_to_host_u32 (mp->sw_if_index), @@ -915,7 +807,6 @@ vl_api_app_namespace_add_del_v2_t_handler ( } } vec_free (ns_id); - vec_free (netns); done: REPLY_MACRO2 (VL_API_APP_NAMESPACE_ADD_DEL_V2_REPLY, ({ @@ -924,12 +815,56 @@ done: })); } +static void +vl_api_app_namespace_add_del_v4_t_handler ( + vl_api_app_namespace_add_del_v4_t *mp) +{ + vl_api_app_namespace_add_del_v4_reply_t *rmp; + u8 *ns_id = 0, *sock_name = 0; + u32 appns_index = 0; + int rv = 0; + if (session_main_is_enabled () == 0) + { + rv = VNET_API_ERROR_FEATURE_DISABLED; + goto done; + } + mp->namespace_id[sizeof (mp->namespace_id) - 1] = 0; + ns_id = format (0, "%s", &mp->namespace_id); + sock_name = vl_api_from_api_to_new_vec (mp, &mp->sock_name); + vnet_app_namespace_add_del_args_t args = { + .ns_id = ns_id, + .sock_name = sock_name, + .secret = clib_net_to_host_u64 (mp->secret), + .sw_if_index = clib_net_to_host_u32 (mp->sw_if_index), + .ip4_fib_id = clib_net_to_host_u32 (mp->ip4_fib_id), + .ip6_fib_id = clib_net_to_host_u32 (mp->ip6_fib_id), + .is_add = mp->is_add, + }; + rv = vnet_app_namespace_add_del (&args); + if (!rv && mp->is_add) + { + appns_index = app_namespace_index_from_id (ns_id); + if (appns_index == APP_NAMESPACE_INVALID_INDEX) + { + clib_warning ("app ns lookup failed id:%s", ns_id); + rv = VNET_API_ERROR_UNSPECIFIED; + } + } + vec_free (ns_id); + vec_free (sock_name); +done: + REPLY_MACRO2 (VL_API_APP_NAMESPACE_ADD_DEL_V4_REPLY, ({ + if (!rv) + rmp->appns_index = clib_host_to_net_u32 (appns_index); + })); +} + static void vl_api_app_namespace_add_del_v3_t_handler ( vl_api_app_namespace_add_del_v3_t *mp) { vl_api_app_namespace_add_del_v3_reply_t *rmp; - u8 *ns_id = 0, *netns = 0, *sock_name = 0; + u8 *ns_id = 0, *sock_name = 0, *api_sock_name = 0; u32 appns_index = 0; int rv = 0; if (session_main_is_enabled () == 0) @@ -938,13 +873,22 @@ vl_api_app_namespace_add_del_v3_t_handler ( goto done; } mp->namespace_id[sizeof (mp->namespace_id) - 1] = 0; - mp->netns[sizeof (mp->netns) - 1] = 0; ns_id = format (0, "%s", &mp->namespace_id); - netns = format (0, "%s", &mp->netns); - sock_name = vl_api_from_api_to_new_vec (mp, &mp->sock_name); + api_sock_name = vl_api_from_api_to_new_vec (mp, &mp->sock_name); + mp->netns[sizeof (mp->netns) - 1] = 0; + if (strlen ((char *) mp->netns) != 0) + { + sock_name = + format (0, "abstract:%v,netns_name=%s", api_sock_name, &mp->netns); + } + else + { + sock_name = api_sock_name; + api_sock_name = 0; // for vec_free + } + vnet_app_namespace_add_del_args_t args = { .ns_id = ns_id, - .netns = netns, .sock_name = sock_name, .secret = clib_net_to_host_u64 (mp->secret), .sw_if_index = clib_net_to_host_u32 (mp->sw_if_index), @@ -963,8 +907,8 @@ vl_api_app_namespace_add_del_v3_t_handler ( } } vec_free (ns_id); - vec_free (netns); vec_free (sock_name); + vec_free (api_sock_name); done: REPLY_MACRO2 (VL_API_APP_NAMESPACE_ADD_DEL_V3_REPLY, ({ if (!rv) @@ -999,7 +943,10 @@ vl_api_session_rule_add_del_t_handler (vl_api_session_rule_add_del_t * mp) rv = vnet_session_rule_add_del (&args); if (rv) - clib_warning ("rule add del returned: %d", rv); + { + clib_warning ("rule add del returned: %U", format_session_error, rv); + rv = VNET_API_ERROR_UNSPECIFIED; + } vec_free (table_args->tag); REPLY_MACRO (VL_API_SESSION_RULE_ADD_DEL_REPLY); } @@ -1214,6 +1161,12 @@ vl_api_app_del_cert_key_pair_t_handler (vl_api_app_del_cert_key_pair_t * mp) } ckpair_index = clib_net_to_host_u32 (mp->index); rv = vnet_app_del_cert_key_pair (ckpair_index); + if (rv) + { + clib_warning ("vnet_app_del_cert_key_pair: %U", format_session_error, + rv); + rv = VNET_API_ERROR_UNSPECIFIED; + } done: REPLY_MACRO (VL_API_APP_DEL_CERT_KEY_PAIR_REPLY); @@ -1239,36 +1192,11 @@ VL_MSG_API_REAPER_FUNCTION (application_reaper_cb); * Socket api functions */ -static void -sapi_send_fds (app_worker_t * app_wrk, int *fds, int n_fds) -{ - app_sapi_msg_t smsg = { 0 }; - app_namespace_t *app_ns; - application_t *app; - clib_socket_t *cs; - u32 cs_index; - - app = application_get (app_wrk->app_index); - app_ns = app_namespace_get (app->ns_index); - cs_index = appns_sapi_handle_sock_index (app_wrk->api_client_index); - cs = appns_sapi_get_socket (app_ns, cs_index); - if (PREDICT_FALSE (!cs)) - return; - - /* There's no payload for the message only the type */ - smsg.type = APP_SAPI_MSG_TYPE_SEND_FDS; - clib_socket_sendmsg (cs, &smsg, sizeof (smsg), fds, n_fds); -} - static int mq_send_add_segment_sapi_cb (u32 app_wrk_index, u64 segment_handle) { - int fds[SESSION_N_FD_TYPE], n_fds = 0; - svm_msg_q_msg_t _msg, *msg = &_msg; - session_app_add_segment_msg_t *mp; + session_app_add_segment_msg_t m = { 0 }; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; fifo_segment_t *fs; ssvm_private_t *sp; u8 fd_flags = 0; @@ -1280,33 +1208,15 @@ mq_send_add_segment_sapi_cb (u32 app_wrk_index, u64 segment_handle) ASSERT (ssvm_type (sp) == SSVM_SEGMENT_MEMFD); fd_flags |= SESSION_FD_F_MEMFD_SEGMENT; - fds[n_fds] = sp->fd; - n_fds += 1; - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return -1; + m.segment_size = sp->ssvm_size; + m.fd_flags = fd_flags; + m.segment_handle = segment_handle; + strncpy ((char *) m.segment_name, (char *) sp->name, + sizeof (m.segment_name) - 1); - /* - * Send the fd over api socket - */ - sapi_send_fds (app_wrk, fds, n_fds); - - /* - * Send the actual message over mq - */ - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_APP_ADD_SEGMENT; - mp = (session_app_add_segment_msg_t *) evt->data; - clib_memset (mp, 0, sizeof (*mp)); - mp->segment_size = sp->ssvm_size; - mp->fd_flags = fd_flags; - mp->segment_handle = segment_handle; - strncpy ((char *) mp->segment_name, (char *) sp->name, - sizeof (mp->segment_name) - 1); - - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt_fd (app_wrk, SESSION_CTRL_EVT_APP_ADD_SEGMENT, &m, + sizeof (m), sp->fd); return 0; } @@ -1314,25 +1224,15 @@ mq_send_add_segment_sapi_cb (u32 app_wrk_index, u64 segment_handle) static int mq_send_del_segment_sapi_cb (u32 app_wrk_index, u64 segment_handle) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_app_del_segment_msg_t *mp; + session_app_del_segment_msg_t m = { 0 }; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; app_wrk = app_worker_get (app_wrk_index); - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return -1; + m.segment_handle = segment_handle; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_APP_DEL_SEGMENT; - mp = (session_app_del_segment_msg_t *) evt->data; - clib_memset (mp, 0, sizeof (*mp)); - mp->segment_handle = segment_handle; - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_APP_DEL_SEGMENT, &m, + sizeof (m)); return 0; } @@ -1485,7 +1385,7 @@ sapi_add_del_worker_handler (app_namespace_t * app_ns, app = application_get_if_valid (mp->app_index); if (!app) { - rv = VNET_API_ERROR_INVALID_VALUE; + rv = SESSION_E_INVALID; goto done; } @@ -1500,7 +1400,8 @@ sapi_add_del_worker_handler (app_namespace_t * app_ns, rv = vnet_app_worker_add_del (&args); if (rv) { - clib_warning ("app worker add/del returned: %d", rv); + clib_warning ("app worker add/del returned: %U", format_session_error, + rv); goto done; } @@ -1547,6 +1448,31 @@ done: clib_socket_sendmsg (cs, &msg, sizeof (msg), fds, n_fds); } +/* This is a workaround for the case when session layer starts reading + * the socket before the client actualy sends the data + */ +static clib_error_t * +sapi_socket_receive_wait (clib_socket_t *cs, u8 *msg, u32 msg_len) +{ + clib_error_t *err; + int n_tries = 5; + + while (1) + { + err = clib_socket_recvmsg (cs, msg, msg_len, 0, 0); + if (!err) + break; + + if (!n_tries) + return err; + + n_tries--; + usleep (1); + } + + return err; +} + static void sapi_add_del_cert_key_handler (app_namespace_t *app_ns, clib_socket_t *cs, app_sapi_cert_key_add_del_msg_t *mp) @@ -1570,11 +1496,11 @@ sapi_add_del_cert_key_handler (app_namespace_t *app_ns, clib_socket_t *cs, } vec_validate (certkey, mp->certkey_len - 1); - err = clib_socket_recvmsg (cs, certkey, mp->certkey_len, 0, 0); + + err = sapi_socket_receive_wait (cs, certkey, mp->certkey_len); if (err) { clib_error_report (err); - clib_error_free (err); rv = SESSION_E_INVALID; goto send_reply; } @@ -1635,7 +1561,9 @@ sapi_socket_detach (app_namespace_t * app_ns, clib_socket_t * cs) /* Cleanup everything because app worker closed socket or crashed */ handle = (app_ns_api_handle_t *) & cs->private_data; - app_wrk = app_worker_get (handle->aah_app_wrk_index); + app_wrk = app_worker_get_if_valid (handle->aah_app_wrk_index); + if (!app_wrk) + return; vnet_app_worker_add_del_args_t args = { .app_index = app_wrk->app_index, @@ -1801,27 +1729,10 @@ appns_sapi_add_ns_socket (app_namespace_t * app_ns) clib_socket_t *cs; char dir[4096]; - if (app_ns->netns) - { - if (!app_ns->sock_name) - app_ns->sock_name = format (0, "@vpp/session/%v%c", app_ns->ns_id, 0); - if (app_ns->sock_name[0] != '@') - return VNET_API_ERROR_INVALID_VALUE; - } - else - { - snprintf (dir, sizeof (dir), "%s%s", vlib_unix_get_runtime_dir (), - subdir); - err = vlib_unix_recursive_mkdir ((char *) dir); - if (err) - { - clib_error_report (err); - return VNET_API_ERROR_SYSCALL_ERROR_1; - } + snprintf (dir, sizeof (dir), "%s%s", vlib_unix_get_runtime_dir (), subdir); - if (!app_ns->sock_name) - app_ns->sock_name = format (0, "%s%v%c", dir, app_ns->ns_id, 0); - } + if (!app_ns->sock_name) + app_ns->sock_name = format (0, "%s%v%c", dir, app_ns->ns_id, 0); /* * Create and initialize socket to listen on @@ -1832,13 +1743,24 @@ appns_sapi_add_ns_socket (app_namespace_t * app_ns) CLIB_SOCKET_F_ALLOW_GROUP_WRITE | CLIB_SOCKET_F_SEQPACKET | CLIB_SOCKET_F_PASSCRED; - if ((err = clib_socket_init_netns (cs, app_ns->netns))) + if (clib_socket_prefix_get_type (cs->config) == CLIB_SOCKET_TYPE_UNIX) + { + err = vlib_unix_recursive_mkdir ((char *) dir); + if (err) + { + clib_error_report (err); + return SESSION_E_SYSCALL; + } + } + + if ((err = clib_socket_init (cs))) { clib_error_report (err); return -1; } - if (!app_ns->netns && stat ((char *) app_ns->sock_name, &file_stat) == -1) + if (clib_socket_prefix_get_type (cs->config) == CLIB_SOCKET_TYPE_UNIX && + stat ((char *) app_ns->sock_name, &file_stat) == -1) return -1; /* @@ -1860,19 +1782,6 @@ appns_sapi_add_ns_socket (app_namespace_t * app_ns) return 0; } -static void -vl_api_application_tls_cert_add_t_handler ( - vl_api_application_tls_cert_add_t *mp) -{ - /* deprecated */ -} - -static void -vl_api_application_tls_key_add_t_handler (vl_api_application_tls_key_add_t *mp) -{ - /* deprecated */ -} - #include static clib_error_t * session_api_hookup (vlib_main_t *vm)