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 + src/vnet/session/application_interface.h | 2 ++ src/vnet/session/application_local.c | 1 + src/vnet/session/application_worker.c | 2 +- src/vnet/session/session.c | 2 ++ src/vnet/tls/tls.c | 1 + 9 files changed, 50 insertions(+), 21 deletions(-) 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); diff --git a/src/vnet/session/application_interface.h b/src/vnet/session/application_interface.h index d76b9f7fd8b..b41f7a4c43f 100644 --- a/src/vnet/session/application_interface.h +++ b/src/vnet/session/application_interface.h @@ -74,6 +74,8 @@ typedef struct session_cb_vft_ /** Delegate fifo-tuning-logic to application */ int (*fifo_tuning_callback) (session_t * s, svm_fifo_t * f, session_ft_action_t act, u32 bytes); + /** Custom fifo allocation for proxy */ + int (*proxy_alloc_session_fifos) (session_t *s); } session_cb_vft_t; diff --git a/src/vnet/session/application_local.c b/src/vnet/session/application_local.c index 192c22b659a..e3451531a48 100644 --- a/src/vnet/session/application_local.c +++ b/src/vnet/session/application_local.c @@ -379,6 +379,7 @@ ct_session_connect_notify (session_t *ss, session_error_t err) session_set_state (cs, SESSION_STATE_CONNECTING); cs->app_wrk_index = client_wrk->wrk_index; cs->connection_index = cct->c_c_index; + cs->opaque = opaque; cct->c_s_index = cs->session_index; /* This will allocate fifos for the session. They won't be used for diff --git a/src/vnet/session/application_worker.c b/src/vnet/session/application_worker.c index 9e4b147ccf0..a806c4ad13d 100644 --- a/src/vnet/session/application_worker.c +++ b/src/vnet/session/application_worker.c @@ -406,7 +406,7 @@ app_worker_init_connected (app_worker_t * app_wrk, session_t * s) /* Allocate fifos for session, unless the app is a builtin proxy */ if (application_is_builtin_proxy (app)) - return 0; + return app->cb_fns.proxy_alloc_session_fifos (s); sm = app_worker_get_connect_segment_manager (app_wrk); return app_worker_alloc_session_fifos (sm, s); diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index b494041f9eb..1f73eefd773 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -920,6 +920,7 @@ session_stream_connect_notify (transport_connection_t * tc, s = session_alloc_for_connection (tc); session_set_state (s, SESSION_STATE_CONNECTING); s->app_wrk_index = app_wrk->wrk_index; + s->opaque = opaque; new_si = s->session_index; new_ti = s->thread_index; @@ -1342,6 +1343,7 @@ session_open_cl (session_endpoint_cfg_t *rmt, session_handle_t *rsh) app_wrk = app_worker_get (rmt->app_wrk_index); s = session_alloc_for_connection (tc); s->app_wrk_index = app_wrk->wrk_index; + s->opaque = rmt->opaque; session_set_state (s, SESSION_STATE_OPENED); if (app_worker_init_connected (app_wrk, s)) { diff --git a/src/vnet/tls/tls.c b/src/vnet/tls/tls.c index 8175e22097a..f229902ba68 100644 --- a/src/vnet/tls/tls.c +++ b/src/vnet/tls/tls.c @@ -224,6 +224,7 @@ tls_notify_app_connected (tls_ctx_t * ctx, session_error_t err) } app_session->app_wrk_index = ctx->parent_app_wrk_index; + app_session->opaque = ctx->parent_app_api_context; if ((err = app_worker_init_connected (app_wrk, app_session))) goto failed; -- cgit 1.2.3-korg