X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fapplication.c;h=fad3e1c2292d1e313c6cff372f7a5471c93ff078;hb=326b81e30e63a8296df51d85e6514356cd737225;hp=8cf32896631799b51a48d7069751f701258030f5;hpb=ab2f6dbf9f7b7164a9810f4c80c8abf8463e42ad;p=vpp.git diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index 8cf32896631..fad3e1c2292 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -557,13 +557,12 @@ app_worker_free (app_worker_t * app_wrk) && app_wrk->first_segment_manager != app_wrk->connects_seg_manager) { sm = segment_manager_get (app_wrk->first_segment_manager); + sm->first_is_protected = 0; + sm->app_wrk_index = SEGMENT_MANAGER_INVALID_APP_INDEX; /* .. and has no fifos, e.g. it might be used for redirected sessions, * remove it */ if (!segment_manager_has_fifos (sm)) - { - sm->app_wrk_index = SEGMENT_MANAGER_INVALID_APP_INDEX; - segment_manager_del (sm); - } + segment_manager_del (sm); } /* @@ -762,10 +761,12 @@ application_start_listen (application_t * app, sep_ext->is_ip4); ls = listen_session_new (0, sst); ls->app_index = app->app_index; - + lh = listen_session_get_handle (ls); if (session_listen (ls, sep_ext)) goto err; + + ls = listen_session_get_from_handle (lh); app_listener = app_listener_alloc (app); ls->listener_db_index = app_listener->al_index; @@ -779,7 +780,7 @@ application_start_listen (application_t * app, app_listener->workers = clib_bitmap_set (app_listener->workers, app_wrk->wrk_map_index, 1); - *res = listen_session_get_handle (ls); + *res = lh; return 0; err: @@ -871,10 +872,10 @@ app_worker_get_connect_segment_manager (app_worker_t * app) segment_manager_t * app_worker_get_listen_segment_manager (app_worker_t * app, - stream_session_t * s) + stream_session_t * listener) { uword *smp; - smp = hash_get (app->listeners_table, listen_session_get_handle (s)); + smp = hash_get (app->listeners_table, listen_session_get_handle (listener)); ASSERT (smp != 0); return segment_manager_get (*smp); } @@ -1265,9 +1266,10 @@ app_send_io_evt_rx (app_worker_t * app_wrk, stream_session_t * s, u8 lock) evt->fifo = s->server_rx_fifo; evt->event_type = FIFO_EVENT_APP_RX; + (void) svm_fifo_set_event (s->server_rx_fifo); + if (app_enqueue_evt (mq, &msg, lock)) return -1; - (void) svm_fifo_set_event (s->server_rx_fifo); return 0; } @@ -1317,9 +1319,8 @@ static app_send_evt_handler_fn * const app_send_evt_handler_fns[3] = { /** * Send event to application * - * Logic from queue perspective is non-blocking. That is, if there's - * not enough space to enqueue a message, we return. However, if the lock - * flag is set, we do wait for queue mutex. + * Logic from queue perspective is non-blocking. If there's + * not enough space to enqueue a message, we return. */ int app_worker_send_event (app_worker_t * app, stream_session_t * s, u8 evt_type) @@ -1328,6 +1329,12 @@ app_worker_send_event (app_worker_t * app, stream_session_t * s, u8 evt_type) return app_send_evt_handler_fns[evt_type] (app, s, 0 /* lock */ ); } +/** + * Send event to application + * + * Logic from queue perspective is blocking. However, if queue is full, + * we return. + */ int app_worker_lock_and_send_event (app_worker_t * app, stream_session_t * s, u8 evt_type) @@ -1619,10 +1626,8 @@ application_local_session_connect (app_worker_t * client_wrk, segment_manager_segment_reader_unlock (sm); goto failed; } - ls->server_rx_fifo->master_session_index = ls->session_index; - ls->server_tx_fifo->master_session_index = ls->session_index; - ls->server_rx_fifo->master_thread_index = ~0; - ls->server_tx_fifo->master_thread_index = ~0; + ls->server_rx_fifo->ct_session_index = ls->session_index; + ls->server_tx_fifo->ct_session_index = ls->session_index; ls->svm_segment_index = seg_index; ls->listener_index = ll->session_index; ls->client_wrk_index = client_wrk->wrk_index; @@ -1714,21 +1719,28 @@ application_local_session_cleanup (app_worker_t * client_wrk, local_session_t * ls) { svm_fifo_segment_private_t *seg; + stream_session_t *listener; segment_manager_t *sm; uword client_key; u8 has_transport; - has_transport = session_has_transport ((stream_session_t *) ls); - client_key = application_client_local_connect_key (ls); + /* Retrieve listener transport type as it is the one that decides where + * the fifos are allocated */ + has_transport = application_local_session_listener_has_transport (ls); if (!has_transport) sm = application_get_local_segment_manager_w_session (server_wrk, ls); else - sm = app_worker_get_listen_segment_manager (server_wrk, - (stream_session_t *) ls); + { + listener = listen_session_get (ls->listener_index); + sm = app_worker_get_listen_segment_manager (server_wrk, listener); + } seg = segment_manager_get_segment (sm, ls->svm_segment_index); if (client_wrk) - hash_unset (client_wrk->local_connects, client_key); + { + client_key = application_client_local_connect_key (ls); + hash_unset (client_wrk->local_connects, client_key); + } if (!has_transport) { @@ -1924,9 +1936,10 @@ format_app_worker_listener (u8 * s, va_list * args) if (verbose) { - s = format (s, "%-40s%-25s%=10u%-15u%-15u%-10u", str, app_name, - app_wrk->wrk_map_index, app->api_client_index, handle, - sm_index); + char buf[32]; + sprintf (buf, "%u(%u)", app_wrk->wrk_map_index, app_wrk->wrk_index); + s = format (s, "%-40s%-25s%=10s%-15u%-15u%-10u", str, app_name, + buf, app->api_client_index, handle, sm_index); } else s = format (s, "%-40s%-25s%=10u", str, app_name, app_wrk->wrk_map_index);