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 ++++++++++++++++++++++++++++++--------------- src/plugins/http/http.c | 1 + src/plugins/quic/quic.c | 1 + src/plugins/srtp/srtp.c | 1 + 4 files changed, 43 insertions(+), 20 deletions(-) (limited to 'src/plugins') 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* */ diff --git a/src/plugins/http/http.c b/src/plugins/http/http.c index d13f91159e4..9cd1382aaa3 100644 --- a/src/plugins/http/http.c +++ b/src/plugins/http/http.c @@ -261,6 +261,7 @@ http_ts_connected_callback (u32 http_app_index, u32 ho_hc_index, session_t *ts, as->connection_index = hc->c_c_index; as->app_wrk_index = hc->h_pa_wrk_index; as->session_state = SESSION_STATE_READY; + as->opaque = hc->h_pa_app_api_ctx; as->session_type = session_type_from_proto_and_ip ( TRANSPORT_PROTO_HTTP, session_type_is_ip4 (ts->session_type)); diff --git a/src/plugins/quic/quic.c b/src/plugins/quic/quic.c index 61380b8048c..f94a0c8d879 100644 --- a/src/plugins/quic/quic.c +++ b/src/plugins/quic/quic.c @@ -1290,6 +1290,7 @@ quic_connect_stream (session_t * quic_session, session_endpoint_cfg_t * sep) stream_data->app_rx_data_len = 0; stream_data->app_tx_data_len = 0; stream_session->session_state = SESSION_STATE_READY; + stream_session->opaque = sep->opaque; /* For now we only reset streams. Cleanup will be triggered by timers */ if ((rv = app_worker_init_connected (app_wrk, stream_session))) diff --git a/src/plugins/srtp/srtp.c b/src/plugins/srtp/srtp.c index 8b7c5b6374c..bb54e672918 100644 --- a/src/plugins/srtp/srtp.c +++ b/src/plugins/srtp/srtp.c @@ -154,6 +154,7 @@ srtp_ctx_init_client (srtp_tc_t *ctx) app_session = session_get (ctx->c_s_index, ctx->c_thread_index); app_session->app_wrk_index = ctx->parent_app_wrk_index; app_session->connection_index = ctx->srtp_ctx_handle; + app_session->opaque = ctx->parent_app_api_context; app_session->session_type = session_type_from_proto_and_ip (TRANSPORT_PROTO_SRTP, ctx->udp_is_ip4); -- cgit 1.2.3-korg