diff options
Diffstat (limited to 'src/vcl')
-rw-r--r-- | src/vcl/vcl_bapi.c | 82 | ||||
-rw-r--r-- | src/vcl/vcl_private.c | 41 | ||||
-rw-r--r-- | src/vcl/vcl_private.h | 4 | ||||
-rw-r--r-- | src/vcl/vppcom.c | 94 |
4 files changed, 119 insertions, 102 deletions
diff --git a/src/vcl/vcl_bapi.c b/src/vcl/vcl_bapi.c index b91e928f3e9..efa5cc170ef 100644 --- a/src/vcl/vcl_bapi.c +++ b/src/vcl/vcl_bapi.c @@ -61,46 +61,6 @@ static void vcm->app_state = STATE_APP_ENABLED; } -static int -vcl_segment_attach (u64 segment_handle, char *name, ssvm_segment_type_t type, - int fd) -{ - fifo_segment_create_args_t _a, *a = &_a; - int rv; - - memset (a, 0, sizeof (*a)); - a->segment_name = (char *) name; - a->segment_type = type; - - if (type == SSVM_SEGMENT_MEMFD) - a->memfd_fd = fd; - - if ((rv = fifo_segment_attach (&vcm->segment_main, a))) - { - clib_warning ("svm_fifo_segment_attach ('%s') failed", name); - return rv; - } - vcl_segment_table_add (segment_handle, a->new_segment_indices[0]); - vec_reset_length (a->new_segment_indices); - return 0; -} - -static void -vcl_segment_detach (u64 segment_handle) -{ - fifo_segment_main_t *sm = &vcm->segment_main; - fifo_segment_t *segment; - u32 segment_index; - - segment_index = vcl_segment_table_lookup (segment_handle); - if (segment_index == (u32) ~ 0) - return; - segment = fifo_segment_get_segment (sm, segment_index); - fifo_segment_delete (sm, segment); - vcl_segment_table_del (segment_handle); - VDBG (0, "detached segment %u handle %u", segment_index, segment_handle); -} - static u64 vcl_vpp_worker_segment_handle (u32 wrk_index) { @@ -260,46 +220,6 @@ failed: } static void -vl_api_map_another_segment_t_handler (vl_api_map_another_segment_t * mp) -{ - ssvm_segment_type_t seg_type = SSVM_SEGMENT_SHM; - u64 segment_handle; - int fd = -1; - - if (mp->fd_flags) - { - vl_socket_client_recv_fd_msg (&fd, 1, 5); - seg_type = SSVM_SEGMENT_MEMFD; - } - - segment_handle = clib_net_to_host_u64 (mp->segment_handle); - if (segment_handle == VCL_INVALID_SEGMENT_HANDLE) - { - clib_warning ("invalid segment handle"); - return; - } - - if (vcl_segment_attach (segment_handle, (char *) mp->segment_name, - seg_type, fd)) - { - clib_warning ("VCL<%d>: svm_fifo_segment_attach ('%s') failed", - getpid (), mp->segment_name); - return; - } - - VDBG (1, "VCL<%d>: mapped new segment '%s' size %d", getpid (), - mp->segment_name, mp->segment_size); -} - -static void -vl_api_unmap_segment_t_handler (vl_api_unmap_segment_t * mp) -{ - u64 segment_handle = clib_net_to_host_u64 (mp->segment_handle); - vcl_segment_detach (segment_handle); - VDBG (1, "Unmapped segment: %d", segment_handle); -} - -static void vl_api_application_tls_cert_add_reply_t_handler (vl_api_application_tls_cert_add_reply_t * mp) { @@ -322,8 +242,6 @@ _(SESSION_ENABLE_DISABLE_REPLY, session_enable_disable_reply) \ _(APP_ATTACH_REPLY, app_attach_reply) \ _(APPLICATION_TLS_CERT_ADD_REPLY, application_tls_cert_add_reply) \ _(APPLICATION_TLS_KEY_ADD_REPLY, application_tls_key_add_reply) \ -_(MAP_ANOTHER_SEGMENT, map_another_segment) \ -_(UNMAP_SEGMENT, unmap_segment) \ _(APP_WORKER_ADD_DEL_REPLY, app_worker_add_del_reply) \ void diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c index 6e887c878cd..f3cee5d6f8e 100644 --- a/src/vcl/vcl_private.c +++ b/src/vcl/vcl_private.c @@ -405,6 +405,47 @@ vcl_session_write_ready (vcl_session_t * session) return svm_fifo_max_enqueue_prod (session->tx_fifo); } +int +vcl_segment_attach (u64 segment_handle, char *name, ssvm_segment_type_t type, + int fd) +{ + fifo_segment_create_args_t _a, *a = &_a; + int rv; + + memset (a, 0, sizeof (*a)); + a->segment_name = (char *) name; + a->segment_type = type; + + if (type == SSVM_SEGMENT_MEMFD) + a->memfd_fd = fd; + + if ((rv = fifo_segment_attach (&vcm->segment_main, a))) + { + clib_warning ("svm_fifo_segment_attach ('%s') failed", name); + return rv; + } + vcl_segment_table_add (segment_handle, a->new_segment_indices[0]); + vec_reset_length (a->new_segment_indices); + return 0; +} + +void +vcl_segment_detach (u64 segment_handle) +{ + fifo_segment_main_t *sm = &vcm->segment_main; + fifo_segment_t *segment; + u32 segment_index; + + segment_index = vcl_segment_table_lookup (segment_handle); + if (segment_index == (u32) ~ 0) + return; + segment = fifo_segment_get_segment (sm, segment_index); + fifo_segment_delete (sm, segment); + vcl_segment_table_del (segment_handle); + VDBG (0, "detached segment %u handle %u", segment_index, segment_handle); +} + + /* * fd.io coding-style-patch-verification: ON * diff --git a/src/vcl/vcl_private.h b/src/vcl/vcl_private.h index 9116111afe2..db4bcd315b6 100644 --- a/src/vcl/vcl_private.h +++ b/src/vcl/vcl_private.h @@ -626,6 +626,10 @@ void vppcom_send_application_tls_key_add (vcl_session_t * session, char *key, void vcl_send_app_worker_add_del (u8 is_add); void vcl_send_child_worker_del (vcl_worker_t * wrk); +int vcl_segment_attach (u64 segment_handle, char *name, + ssvm_segment_type_t type, int fd); +void vcl_segment_detach (u64 segment_handle); + u32 vcl_max_nsid_len (void); u8 *format_api_error (u8 * s, va_list * args); diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index a854011fa0d..4224a086a21 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -23,23 +23,17 @@ __thread uword __vcl_worker_index = ~0; static int -vcl_wait_for_segment (u64 segment_handle) +vcl_segment_is_not_mounted (vcl_worker_t * wrk, u64 segment_handle) { - vcl_worker_t *wrk = vcl_worker_get_current (); - u32 wait_for_seconds = 10, segment_index; - f64 timeout; + u32 segment_index; if (segment_handle == VCL_INVALID_SEGMENT_HANDLE) return 0; - timeout = clib_time_now (&wrk->clib_time) + wait_for_seconds; - while (clib_time_now (&wrk->clib_time) < timeout) - { - segment_index = vcl_segment_table_lookup (segment_handle); - if (segment_index != VCL_INVALID_SEGMENT_INDEX) - return 0; - usleep (10); - } + segment_index = vcl_segment_table_lookup (segment_handle); + if (segment_index != VCL_INVALID_SEGMENT_INDEX) + return 0; + return 1; } @@ -371,9 +365,9 @@ vcl_session_accepted_handler (vcl_worker_t * wrk, session_accepted_msg_t * mp, goto error; } - if (vcl_wait_for_segment (mp->segment_handle)) + if (vcl_segment_is_not_mounted (wrk, mp->segment_handle)) { - VDBG (0, "ERROR: segment for session %u couldn't be mounted!", + VDBG (0, "ERROR: segment for session %u is not mounted!", session->session_index); goto error; } @@ -459,9 +453,9 @@ vcl_session_connected_handler (vcl_worker_t * wrk, svm_msg_q_t *); rx_fifo = uword_to_pointer (mp->server_rx_fifo, svm_fifo_t *); tx_fifo = uword_to_pointer (mp->server_tx_fifo, svm_fifo_t *); - if (vcl_wait_for_segment (mp->segment_handle)) + if (vcl_segment_is_not_mounted (wrk, mp->segment_handle)) { - VDBG (0, "segment for session %u couldn't be mounted!", + VDBG (0, "segment for session %u is not mounted!", session->session_index); session->session_state = STATE_FAILED | STATE_DISCONNECT; vcl_send_session_disconnect (wrk, session); @@ -481,9 +475,9 @@ vcl_session_connected_handler (vcl_worker_t * wrk, { session->ct_rx_fifo = uword_to_pointer (mp->ct_rx_fifo, svm_fifo_t *); session->ct_tx_fifo = uword_to_pointer (mp->ct_tx_fifo, svm_fifo_t *); - if (vcl_wait_for_segment (mp->ct_segment_handle)) + if (vcl_segment_is_not_mounted (wrk, mp->ct_segment_handle)) { - VDBG (0, "ct segment for session %u couldn't be mounted!", + VDBG (0, "ct segment for session %u is not mounted!", session->session_index); session->session_state = STATE_FAILED | STATE_DISCONNECT; vcl_send_session_disconnect (wrk, session); @@ -715,9 +709,9 @@ vcl_session_worker_update_reply_handler (vcl_worker_t * wrk, void *data) VDBG (0, "unknown handle 0x%llx", msg->handle); return; } - if (vcl_wait_for_segment (msg->segment_handle)) + if (vcl_segment_is_not_mounted (wrk, msg->segment_handle)) { - clib_warning ("segment for session %u couldn't be mounted!", + clib_warning ("segment for session %u is not mounted!", s->session_index); return; } @@ -737,6 +731,48 @@ vcl_session_worker_update_reply_handler (vcl_worker_t * wrk, void *data) s->vpp_handle, wrk->wrk_index); } +static void +vcl_session_app_add_segment_handler (vcl_worker_t * wrk, void *data) +{ + ssvm_segment_type_t seg_type = SSVM_SEGMENT_SHM; + session_app_add_segment_msg_t *msg; + u64 segment_handle; + int fd = -1; + + msg = (session_app_add_segment_msg_t *) data; + + if (msg->fd_flags) + { + vl_socket_client_recv_fd_msg2 (&wrk->bapi_sock_ctx, &fd, 1, 5); + seg_type = SSVM_SEGMENT_MEMFD; + } + + segment_handle = msg->segment_handle; + if (segment_handle == VCL_INVALID_SEGMENT_HANDLE) + { + clib_warning ("invalid segment handle"); + return; + } + + if (vcl_segment_attach (segment_handle, (char *) msg->segment_name, + seg_type, fd)) + { + VDBG (0, "vcl_segment_attach ('%s') failed", msg->segment_name); + return; + } + + VDBG (1, "mapped new segment '%s' size %d", msg->segment_name, + msg->segment_size); +} + +static void +vcl_session_app_del_segment_handler (vcl_worker_t * wrk, void *data) +{ + session_app_del_segment_msg_t *msg = (session_app_del_segment_msg_t *) data; + vcl_segment_detach (msg->segment_handle); + VDBG (1, "Unmapped segment: %d", msg->segment_handle); +} + static int vcl_handle_mq_event (vcl_worker_t * wrk, session_event_t * e) { @@ -782,6 +818,12 @@ vcl_handle_mq_event (vcl_worker_t * wrk, session_event_t * e) case SESSION_CTRL_EVT_WORKER_UPDATE_REPLY: vcl_session_worker_update_reply_handler (wrk, e->data); break; + case SESSION_CTRL_EVT_APP_ADD_SEGMENT: + vcl_session_app_add_segment_handler (wrk, e->data); + break; + case SESSION_CTRL_EVT_APP_DEL_SEGMENT: + vcl_session_app_del_segment_handler (wrk, e->data); + break; default: clib_warning ("unhandled %u", e->event_type); } @@ -2091,6 +2133,12 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, case SESSION_CTRL_EVT_REQ_WORKER_UPDATE: vcl_session_req_worker_update_handler (wrk, e->data); break; + case SESSION_CTRL_EVT_APP_ADD_SEGMENT: + vcl_session_app_add_segment_handler (wrk, e->data); + break; + case SESSION_CTRL_EVT_APP_DEL_SEGMENT: + vcl_session_app_del_segment_handler (wrk, e->data); + break; default: clib_warning ("unhandled: %u", e->event_type); break; @@ -2669,6 +2717,12 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, case SESSION_CTRL_EVT_WORKER_UPDATE_REPLY: vcl_session_worker_update_reply_handler (wrk, e->data); break; + case SESSION_CTRL_EVT_APP_ADD_SEGMENT: + vcl_session_app_add_segment_handler (wrk, e->data); + break; + case SESSION_CTRL_EVT_APP_DEL_SEGMENT: + vcl_session_app_del_segment_handler (wrk, e->data); + break; default: VDBG (0, "unhandled: %u", e->event_type); break; |