From 2748d279600dfb2d1d177455d0fa1b7d9630ee73 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Tue, 14 Oct 2025 02:19:01 -0400 Subject: [PATCH] session: track rx ready state as flag Instead of checking session state to decide if session layer should deliver rx notifications to app, on state transition, update rx ready flag. This should then avoid generating spurious rx notifications 1) after session is disconnected by transport and 2) if session is closed prior to accept with pending rx notification (which 1fce82e allows). Type: improvement Change-Id: I2ddd8ae5fe410fdfe4049d09c68cd1fd4dc79b8b Signed-off-by: Florin Coras --- src/vnet/session/application_worker.c | 2 +- src/vnet/session/session_input.c | 28 ++++++++++++++++++---------- src/vnet/session/session_node.c | 2 ++ src/vnet/session/session_types.h | 3 ++- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/vnet/session/application_worker.c b/src/vnet/session/application_worker.c index 21850fec5be..68b7e159e51 100644 --- a/src/vnet/session/application_worker.c +++ b/src/vnet/session/application_worker.c @@ -200,7 +200,7 @@ app_worker_alloc_wrk_cl_session (app_worker_t *app_wrk, session_t *ls) s = session_alloc (0 /* listener on main worker */); session_set_state (s, SESSION_STATE_LISTENING); - s->flags |= SESSION_F_IS_CLESS; + s->flags |= SESSION_F_IS_CLESS | SESSION_F_RX_READY; s->app_wrk_index = app_wrk->wrk_index; ls = session_get_from_handle (lsh); s->session_type = ls->session_type; diff --git a/src/vnet/session/session_input.c b/src/vnet/session/session_input.c index 4e601feb8a6..060476520c2 100644 --- a/src/vnet/session/session_input.c +++ b/src/vnet/session/session_input.c @@ -121,9 +121,8 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, case SESSION_IO_EVT_RX: s = session_get (evt->session_index, thread_index); s->flags &= ~SESSION_F_RX_EVT; - /* Application didn't confirm accept yet */ - if (PREDICT_FALSE (s->session_state == SESSION_STATE_ACCEPTING || - s->session_state == SESSION_STATE_CONNECTING)) + /* App is unaware of the session or closing notification provided */ + if (PREDICT_FALSE (!(s->flags & SESSION_F_RX_READY))) break; app->cb_fns.builtin_app_rx_callback (s); break; @@ -133,8 +132,7 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, if (!s) break; s->flags &= ~SESSION_F_RX_EVT; - if (PREDICT_FALSE (s->session_state == SESSION_STATE_ACCEPTING || - s->session_state == SESSION_STATE_CONNECTING)) + if (PREDICT_FALSE (!(s->flags & SESSION_F_RX_READY))) break; app->cb_fns.builtin_app_rx_callback (s); break; @@ -175,12 +173,16 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, if (!(s->flags & SESSION_F_APP_CLOSED)) app->cb_fns.session_disconnect_callback (s); } - else if (!session_has_transport (s)) + else { - /* Special handling for cut-through sessions for builtin apps - * similar to session_mq_accepted_reply_handler */ - session_set_state (s, SESSION_STATE_READY); - ct_session_connect_notify (s, SESSION_E_NONE); + s->flags |= SESSION_F_RX_READY; + if (!session_has_transport (s)) + { + /* Special handling for cut-through sessions for builtin + * apps similar to session_mq_accepted_reply_handler */ + session_set_state (s, SESSION_STATE_READY); + ct_session_connect_notify (s, SESSION_E_NONE); + } } } break; @@ -210,14 +212,20 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, if (!(s->flags & SESSION_F_APP_CLOSED)) app->cb_fns.session_disconnect_callback (s); } + else + { + s->flags |= SESSION_F_RX_READY; + } break; case SESSION_CTRL_EVT_DISCONNECTED: s = session_get (evt->session_index, thread_index); + s->flags &= ~SESSION_F_RX_READY; if (!(s->flags & SESSION_F_APP_CLOSED)) app->cb_fns.session_disconnect_callback (s); break; case SESSION_CTRL_EVT_RESET: s = session_get (evt->session_index, thread_index); + s->flags &= ~SESSION_F_RX_READY; if (!(s->flags & SESSION_F_APP_CLOSED)) app->cb_fns.session_reset_callback (s); break; diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index 6c1655147f7..aca494e7830 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -480,6 +480,8 @@ session_mq_accepted_reply_handler (session_worker_t *wrk, s->rx_fifo->app_session_index = s->rx_fifo->shr->client_session_index; s->tx_fifo->app_session_index = s->tx_fifo->shr->client_session_index; + s->flags |= SESSION_F_RX_READY; + /* Special handling for cut-through sessions */ if (!session_has_transport (s)) { diff --git a/src/vnet/session/session_types.h b/src/vnet/session/session_types.h index dda76c4b5e7..460d354fd96 100644 --- a/src/vnet/session/session_types.h +++ b/src/vnet/session/session_types.h @@ -188,7 +188,8 @@ typedef enum _ (CUSTOM_FIFO_TUNING, "custom-fifo-tuning") \ _ (HALF_OPEN, "half-open") \ _ (APP_CLOSED, "app-closed") \ - _ (IS_CLESS, "connectionless") + _ (IS_CLESS, "connectionless") \ + _ (RX_READY, "rx-ready") typedef enum session_flags_bits_ { -- 2.16.6