From 2ceb818f8eca4b8aebd0a4f2b36a641c832d8819 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Thu, 31 Aug 2023 17:33:47 -0700 Subject: session: fix allocation of proxy fifos Fifos need to be synchronously allocated once a transport like tcp accepts a session. Since events are now delivered asynchronously, proxy apps must explicitly register a cb function that manages fifo allocation prior to being notified of connect event. Type: fix Fixes: 0242d30 Signed-off-by: Florin Coras Change-Id: I7df973b7014e53e0766ea2bdc61e9871160bc18b --- src/plugins/hs_apps/proxy.c | 60 ++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 20 deletions(-) (limited to 'src/plugins/hs_apps') diff --git a/src/plugins/hs_apps/proxy.c b/src/plugins/hs_apps/proxy.c index 77c047b41a8..1010bf4cfa7 100644 --- a/src/plugins/hs_apps/proxy.c +++ b/src/plugins/hs_apps/proxy.c @@ -478,9 +478,46 @@ static session_cb_vft_t proxy_session_cb_vft = { .builtin_app_tx_callback = proxy_tx_callback, .session_reset_callback = proxy_reset_callback, .session_cleanup_callback = proxy_cleanup_callback, - .fifo_tuning_callback = common_fifo_tuning_callback + .fifo_tuning_callback = common_fifo_tuning_callback, }; +static int +active_open_alloc_session_fifos (session_t *s) +{ + proxy_main_t *pm = &proxy_main; + svm_fifo_t *rxf, *txf; + proxy_session_t *ps; + + clib_spinlock_lock_if_init (&pm->sessions_lock); + + ps = proxy_session_get (s->opaque); + + txf = ps->server_rx_fifo; + rxf = ps->server_tx_fifo; + + /* + * Reset the active-open tx-fifo master indices so the active-open session + * will receive data, etc. + */ + txf->shr->master_session_index = s->session_index; + txf->master_thread_index = s->thread_index; + + /* + * Account for the active-open session's use of the fifos + * so they won't disappear until the last session which uses + * them disappears + */ + rxf->refcnt++; + txf->refcnt++; + + clib_spinlock_unlock_if_init (&pm->sessions_lock); + + s->rx_fifo = rxf; + s->tx_fifo = txf; + + return 0; +} + static int active_open_connected_callback (u32 app_index, u32 opaque, session_t * s, session_error_t err) @@ -521,24 +558,6 @@ active_open_connected_callback (u32 app_index, u32 opaque, return -1; } - s->tx_fifo = ps->server_rx_fifo; - s->rx_fifo = ps->server_tx_fifo; - - /* - * Reset the active-open tx-fifo master indices so the active-open session - * will receive data, etc. - */ - s->tx_fifo->shr->master_session_index = s->session_index; - s->tx_fifo->master_thread_index = s->thread_index; - - /* - * Account for the active-open session's use of the fifos - * so they won't disappear until the last session which uses - * them disappears - */ - s->tx_fifo->refcnt++; - s->rx_fifo->refcnt++; - s->opaque = opaque; clib_spinlock_unlock_if_init (&pm->sessions_lock); @@ -651,7 +670,8 @@ static session_cb_vft_t active_open_clients = { .session_cleanup_callback = active_open_cleanup_callback, .builtin_app_rx_callback = active_open_rx_callback, .builtin_app_tx_callback = active_open_tx_callback, - .fifo_tuning_callback = common_fifo_tuning_callback + .fifo_tuning_callback = common_fifo_tuning_callback, + .proxy_alloc_session_fifos = active_open_alloc_session_fifos, }; /* *INDENT-ON* */ -- cgit 1.2.3-korg