X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fapplication.c;h=85b5f93942713b58d5b06294f156a04de0b4c9e7;hb=30e79c2e388a98160a3660f4f03103890c9b1b7c;hp=69f33290a73bf65f98c90a038a3b4611d5c06397;hpb=fa76a76bf3388f09d55d0c83e7aea507c44f9619;p=vpp.git diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index 69f33290a73..85b5f939427 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -94,6 +94,8 @@ app_worker_map_free (application_t * app, app_worker_map_t * map) static app_worker_map_t * app_worker_map_get (application_t * app, u32 map_index) { + if (pool_is_free_index (app->worker_maps, map_index)) + return 0; return pool_elt_at_index (app->worker_maps, map_index); } @@ -722,6 +724,48 @@ app_worker_stop_listen (app_worker_t * app_wrk, session_handle_t handle) return 0; } +int +app_worker_own_session (app_worker_t * app_wrk, stream_session_t * s) +{ + segment_manager_t *sm; + svm_fifo_t *rxf, *txf; + + s->app_wrk_index = app_wrk->wrk_index; + + rxf = s->server_rx_fifo; + txf = s->server_tx_fifo; + + if (!rxf || !txf) + return 0; + + s->server_rx_fifo = 0; + s->server_tx_fifo = 0; + + sm = app_worker_get_or_alloc_connect_segment_manager (app_wrk); + if (session_alloc_fifos (sm, s)) + return -1; + + if (!svm_fifo_is_empty (rxf)) + { + clib_memcpy_fast (s->server_rx_fifo->data, rxf->data, rxf->nitems); + s->server_rx_fifo->head = rxf->head; + s->server_rx_fifo->tail = rxf->tail; + s->server_rx_fifo->cursize = rxf->cursize; + } + + if (!svm_fifo_is_empty (txf)) + { + clib_memcpy_fast (s->server_tx_fifo->data, txf->data, txf->nitems); + s->server_tx_fifo->head = txf->head; + s->server_tx_fifo->tail = txf->tail; + s->server_tx_fifo->cursize = txf->cursize; + } + + segment_manager_dealloc_fifos (rxf->segment_index, rxf, txf); + + return 0; +} + /** * Start listening local transport endpoint for requested transport. * @@ -887,6 +931,14 @@ app_worker_get_connect_segment_manager (app_worker_t * app) return segment_manager_get (app->connects_seg_manager); } +segment_manager_t * +app_worker_get_or_alloc_connect_segment_manager (app_worker_t * app_wrk) +{ + if (app_wrk->connects_seg_manager == (u32) ~ 0) + app_worker_alloc_connects_segment_manager (app_wrk); + return segment_manager_get (app_wrk->connects_seg_manager); +} + segment_manager_t * app_worker_get_listen_segment_manager (app_worker_t * app, stream_session_t * listener) @@ -1591,8 +1643,8 @@ application_local_session_connect (app_worker_t * client_wrk, local_session_t * ll, u32 opaque) { u32 seg_size, evt_q_sz, evt_q_elts, margin = 16 << 10; + u32 round_rx_fifo_sz, round_tx_fifo_sz, sm_index; segment_manager_properties_t *props, *cprops; - u32 round_rx_fifo_sz, round_tx_fifo_sz; int rv, has_transport, seg_index; svm_fifo_segment_private_t *seg; application_t *server, *client; @@ -1654,8 +1706,13 @@ application_local_session_connect (app_worker_t * client_wrk, segment_manager_segment_reader_unlock (sm); goto failed; } + sm_index = segment_manager_index (sm); ls->server_rx_fifo->ct_session_index = ls->session_index; ls->server_tx_fifo->ct_session_index = ls->session_index; + ls->server_rx_fifo->segment_manager = sm_index; + ls->server_tx_fifo->segment_manager = sm_index; + ls->server_rx_fifo->segment_index = seg_index; + ls->server_tx_fifo->segment_index = seg_index; ls->svm_segment_index = seg_index; ls->listener_index = ll->session_index; ls->client_wrk_index = client_wrk->wrk_index; @@ -1688,14 +1745,14 @@ failed: return rv; } -static uword +static u64 application_client_local_connect_key (local_session_t * ls) { - return ((uword) ls->app_wrk_index << 32 | (uword) ls->session_index); + return (((u64) ls->app_wrk_index) << 32 | (u64) ls->session_index); } static void -application_client_local_connect_key_parse (uword key, u32 * app_wrk_index, +application_client_local_connect_key_parse (u64 key, u32 * app_wrk_index, u32 * session_index) { *app_wrk_index = key >> 32; @@ -1711,7 +1768,7 @@ application_local_session_connect_notify (local_session_t * ls) application_t *client; int rv, is_fail = 0; u64 segment_handle; - uword client_key; + u64 client_key; client_wrk = app_worker_get (ls->client_wrk_index); server_wrk = app_worker_get (ls->app_wrk_index); @@ -1752,7 +1809,7 @@ application_local_session_cleanup (app_worker_t * client_wrk, svm_fifo_segment_private_t *seg; stream_session_t *listener; segment_manager_t *sm; - uword client_key; + u64 client_key; u8 has_transport; /* Retrieve listener transport type as it is the one that decides where @@ -2172,7 +2229,7 @@ app_worker_format_local_connects (app_worker_t * app, int verbose) u32 app_wrk_index, session_index; app_worker_t *server_wrk; local_session_t *ls; - uword client_key; + u64 client_key; u64 value; /* Header */