From: Florin Coras Date: Tue, 14 Oct 2025 06:19:01 +0000 (-0400) Subject: session: track rx ready state as flag X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F86%2F43886%2F3;p=vpp.git 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 --- 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_ {