session: track transport initiated close 85/43885/11
authorFlorin Coras <[email protected]>
Mon, 13 Oct 2025 23:46:48 +0000 (19:46 -0400)
committerDave Barach <[email protected]>
Tue, 14 Oct 2025 23:04:12 +0000 (23:04 +0000)
Type: improvement

Change-Id: Ie55b1fa37e3d652aa647aeff021fcaace36f5157
Signed-off-by: Florin Coras <[email protected]>
src/vnet/session/session_input.c
src/vnet/session/session_types.h
src/vnet/session/transport.c
src/vnet/session/transport_types.h

index 0604765..64ba7d3 100644 (file)
@@ -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)
index 460d354..a75e21c 100644 (file)
@@ -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_
 {
index e85eec4..981903c 100644 (file)
@@ -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;
 }
index 5c86fd6..e7ed5c3 100644 (file)
@@ -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; */