From 0f1ce4347e83a4ed0de880babf899a3e2c9b2566 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Mon, 13 Oct 2025 19:46:48 -0400 Subject: [PATCH] session: track transport initiated close Type: improvement Change-Id: Ie55b1fa37e3d652aa647aeff021fcaace36f5157 Signed-off-by: Florin Coras --- src/vnet/session/session_input.c | 22 ++++++++++++++++------ src/vnet/session/session_types.h | 3 ++- src/vnet/session/transport.c | 4 ++-- src/vnet/session/transport_types.h | 10 +++++----- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/vnet/session/session_input.c b/src/vnet/session/session_input.c index 060476520c2..64ba7d32079 100644 --- a/src/vnet/session/session_input.c +++ b/src/vnet/session/session_input.c @@ -171,7 +171,10 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, if (svm_fifo_max_dequeue (s->rx_fifo)) app->cb_fns.builtin_app_rx_callback (s); if (!(s->flags & SESSION_F_APP_CLOSED)) - app->cb_fns.session_disconnect_callback (s); + { + s->flags |= SESSION_F_TPT_INIT_CLOSE; + app->cb_fns.session_disconnect_callback (s); + } } else { @@ -210,7 +213,10 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, if (svm_fifo_max_dequeue (s->rx_fifo)) app->cb_fns.builtin_app_rx_callback (s); if (!(s->flags & SESSION_F_APP_CLOSED)) - app->cb_fns.session_disconnect_callback (s); + { + s->flags |= SESSION_F_TPT_INIT_CLOSE; + app->cb_fns.session_disconnect_callback (s); + } } else { @@ -220,14 +226,18 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, 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); + if (s->flags & SESSION_F_APP_CLOSED) + break; + s->flags |= SESSION_F_TPT_INIT_CLOSE; + 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); + if (s->flags & SESSION_F_APP_CLOSED) + break; + s->flags |= SESSION_F_TPT_INIT_CLOSE; + app->cb_fns.session_reset_callback (s); break; case SESSION_CTRL_EVT_UNLISTEN_REPLY: if (is_builtin) diff --git a/src/vnet/session/session_types.h b/src/vnet/session/session_types.h index 460d354fd96..a75e21caf7d 100644 --- a/src/vnet/session/session_types.h +++ b/src/vnet/session/session_types.h @@ -189,7 +189,8 @@ typedef enum _ (HALF_OPEN, "half-open") \ _ (APP_CLOSED, "app-closed") \ _ (IS_CLESS, "connectionless") \ - _ (RX_READY, "rx-ready") + _ (RX_READY, "rx-ready") \ + _ (TPT_INIT_CLOSE, "transport-init-close") typedef enum session_flags_bits_ { diff --git a/src/vnet/session/transport.c b/src/vnet/session/transport.c index e85eec48ac1..981903c3591 100644 --- a/src/vnet/session/transport.c +++ b/src/vnet/session/transport.c @@ -85,7 +85,7 @@ format_transport_flags (u8 *s, va_list *args) transport_connection_flags_t flags; int i, last = -1; - flags = va_arg (*args, transport_connection_flags_t); + flags = va_arg (*args, u32); for (i = 0; i < TRANSPORT_CONNECTION_N_FLAGS; i++) if (flags & (1 << i)) @@ -127,7 +127,7 @@ format_transport_connection (u8 * s, va_list * args) s = format (s, "%Upacer: %U\n", format_white_space, indent, format_transport_pacer, &tc->pacer, tc->thread_index); s = format (s, "%Utransport: flags: %U\n", format_white_space, indent, - format_transport_flags, tc->flags); + format_transport_flags, (u32) tc->flags); } return s; } diff --git a/src/vnet/session/transport_types.h b/src/vnet/session/transport_types.h index 5c86fd6ea8b..e7ed5c35ff3 100644 --- a/src/vnet/session/transport_types.h +++ b/src/vnet/session/transport_types.h @@ -69,7 +69,7 @@ typedef enum transport_connection_flags_ TRANSPORT_CONNECTION_F_##sym = 1 << TRANSPORT_CONNECTION_F_BIT_##sym, foreach_transport_connection_flag #undef _ -} transport_connection_flags_t; +} __clib_packed transport_connection_flags_t; typedef struct _spacer { @@ -111,11 +111,11 @@ typedef struct _transport_connection u8 opaque_conn_id[TRANSPORT_CONN_ID_LEN]; }; - u32 s_index; /**< Parent session index */ - u32 c_index; /**< Connection index in transport pool */ + u32 s_index; /**< Parent session index */ + u32 c_index; /**< Connection index in transport pool */ clib_thread_index_t thread_index; /**< Worker-thread index */ - u8 flags; /**< Transport specific flags */ - u8 dscp; /**< Differentiated Services Code Point */ + transport_connection_flags_t flags; /**< Transport specific flags */ + u8 dscp; /**< Differentiated Services Code Point */ /*fib_node_index_t rmt_fei; dpo_id_t rmt_dpo; */ -- 2.16.6