X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_api.c;h=153c528059c07d597e5e3b6b8121c8a19efb0d19;hb=c95eefb393d05167ce6e35e5617179f536de0bda;hp=0b610f3f313215b81bb70e101fc157151861ba05;hpb=9d3e1b433f394781a55a4c7c39b695d08dd2563f;p=vpp.git diff --git a/src/vnet/session/session_api.c b/src/vnet/session/session_api.c old mode 100755 new mode 100644 index 0b610f3f313..153c528059c --- a/src/vnet/session/session_api.c +++ b/src/vnet/session/session_api.c @@ -81,6 +81,7 @@ session_send_fds (vl_api_registration_t * reg, int fds[], int n_fds) return 0; } +/* ### WILL BE DEPRECATED POST 20.01 ### */ static int send_add_segment_callback (u32 api_client_index, u64 segment_handle) { @@ -130,6 +131,7 @@ send_add_segment_callback (u32 api_client_index, u64 segment_handle) return 0; } +/* ### WILL BE DEPRECATED POST 20.01 ### */ static int send_del_segment_callback (u32 api_client_index, u64 segment_handle) { @@ -196,6 +198,7 @@ mq_send_session_accepted_cb (session_t * s) mp->server_rx_fifo = pointer_to_uword (s->rx_fifo); mp->server_tx_fifo = pointer_to_uword (s->tx_fifo); mp->segment_handle = session_segment_handle (s); + mp->flags = s->flags; if (session_has_transport (s)) { @@ -470,7 +473,103 @@ mq_send_session_migrate_cb (session_t * s, session_handle_t new_sh) clib_warning ("not supported"); } -static session_cb_vft_t session_mq_cb_vft = { +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; + 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; + + app_wrk = app_worker_get (app_wrk_index); + + reg = vl_mem_api_client_index_to_registration (app_wrk->api_client_index); + if (!reg) + { + clib_warning ("no api registration for client: %u", + app_wrk->api_client_index); + return -1; + } + + fs = segment_manager_get_segment_w_handle (segment_handle); + sp = &fs->ssvm; + if (ssvm_type (sp) == SSVM_SEGMENT_MEMFD) + { + if (vl_api_registration_file_index (reg) == VL_API_INVALID_FI) + { + clib_warning ("can't send memfd fd"); + return -1; + } + + 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; + + 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); + + return 0; +} + +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; + 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); + if (!reg) + { + clib_warning ("no registration: %u", app_wrk->api_client_index); + return -1; + } + + app_mq = app_wrk->event_queue; + if (mq_try_lock_and_alloc_msg (app_mq, msg)) + return -1; + + 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); + + return 0; +} + +/* ### WILL BE DEPRECATED POST 20.01 ### */ +static session_cb_vft_t session_mq_cb_vft_old = { .session_accept_callback = mq_send_session_accepted_cb, .session_disconnect_callback = mq_send_session_disconnected_cb, .session_connected_callback = mq_send_session_connected_cb, @@ -480,6 +579,16 @@ static session_cb_vft_t session_mq_cb_vft = { .del_segment_callback = send_del_segment_callback, }; +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, + .session_connected_callback = mq_send_session_connected_cb, + .session_reset_callback = mq_send_session_reset_cb, + .session_migrate_callback = mq_send_session_migrate_cb, + .add_segment_callback = mq_send_add_segment_cb, + .del_segment_callback = mq_send_del_segment_cb, +}; + static void vl_api_session_enable_disable_t_handler (vl_api_session_enable_disable_t * mp) { @@ -519,7 +628,7 @@ vl_api_application_attach_t_handler (vl_api_application_attach_t * mp) clib_memset (a, 0, sizeof (*a)); a->api_client_index = mp->client_index; a->options = mp->options; - a->session_cb_vft = &session_mq_cb_vft; + a->session_cb_vft = &session_mq_cb_vft_old; if (mp->namespace_id_len > 64) { rv = VNET_API_ERROR_INVALID_VALUE; @@ -665,7 +774,7 @@ done: REPLY_MACRO2 (VL_API_APP_ATTACH_REPLY, ({ if (!rv) { - ctrl_thread = vlib_num_workers ()? 1 : 0; + ctrl_thread = vlib_num_workers () ? 1 : 0; ctrl_mq = session_main_get_vpp_event_queue (ctrl_thread); segp = a->segment; rmp->app_index = clib_host_to_net_u32 (a->app_index); @@ -887,6 +996,7 @@ vl_api_disconnect_session_reply_t_handler (vl_api_disconnect_session_reply_t * } } +/* ### WILL BE DEPRECATED POST 20.01 ### */ static void vl_api_map_another_segment_reply_t_handler (vl_api_map_another_segment_reply_t * mp) @@ -1403,7 +1513,7 @@ done: /* *INDENT-OFF* */ REPLY_MACRO2 (VL_API_APP_ADD_CERT_KEY_PAIR_REPLY, ({ if (!rv) - rmp->index = a->index; + rmp->index = clib_host_to_net_u32 (a->index); })); /* *INDENT-ON* */ } @@ -1412,16 +1522,18 @@ static void vl_api_app_del_cert_key_pair_t_handler (vl_api_app_del_cert_key_pair_t * mp) { vl_api_app_del_cert_key_pair_reply_t *rmp; + u32 ckpair_index; int rv = 0; if (session_main_is_enabled () == 0) { rv = VNET_API_ERROR_FEATURE_DISABLED; goto done; } - rv = vnet_app_del_cert_key_pair (mp->index); + ckpair_index = clib_net_to_host_u32 (mp->index); + rv = vnet_app_del_cert_key_pair (ckpair_index); done: - REPLY_MACRO (VL_API_APP_ADD_CERT_KEY_PAIR_REPLY); + REPLY_MACRO (VL_API_APP_DEL_CERT_KEY_PAIR_REPLY); } /* ### WILL BE DEPRECATED POST 20.01 ### */ @@ -1529,7 +1641,7 @@ setup_message_id_table (api_main_t * am) static clib_error_t * session_api_hookup (vlib_main_t * vm) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); #define _(N,n) \ vl_msg_api_set_handlers(VL_API_##N, #n, \