session: track rx ready state as flag 86/43886/3
authorFlorin Coras <[email protected]>
Tue, 14 Oct 2025 06:19:01 +0000 (02:19 -0400)
committerFlorin Coras <[email protected]>
Tue, 14 Oct 2025 06:41:55 +0000 (02:41 -0400)
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 <[email protected]>
src/vnet/session/application_worker.c
src/vnet/session/session_input.c
src/vnet/session/session_node.c
src/vnet/session/session_types.h

index 21850fe..68b7e15 100644 (file)
@@ -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;
index 4e601fe..0604765 100644 (file)
@@ -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;
index 6c16551..aca494e 100644 (file)
@@ -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))
     {
index dda76c4..460d354 100644 (file)
@@ -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_
 {