session: propagate delayed rx evts after connect/accept 27/39627/1
authorFlorin Coras <fcoras@cisco.com>
Sat, 7 Oct 2023 21:22:52 +0000 (14:22 -0700)
committerFlorin Coras <fcoras@cisco.com>
Sat, 7 Oct 2023 21:23:18 +0000 (14:23 -0700)
Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I4a2e8f864df7269ec5a3c4fd4d8785a67b687d58

src/vnet/session/session_input.c

index cdd6a88..404ee8b 100644 (file)
@@ -112,16 +112,18 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
        {
        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))
+         if (PREDICT_FALSE (s->session_state == SESSION_STATE_ACCEPTING ||
+                            s->session_state == SESSION_STATE_CONNECTING))
            break;
+         s->flags &= ~SESSION_F_RX_EVT;
          app->cb_fns.builtin_app_rx_callback (s);
          break;
        /* Handle sessions that might not be on current thread */
        case SESSION_IO_EVT_BUILTIN_RX:
          s = session_get_from_handle_if_valid (evt->session_handle);
-         if (!s || s->session_state == SESSION_STATE_ACCEPTING)
+         if (!s || s->session_state == SESSION_STATE_ACCEPTING ||
+             s->session_state == SESSION_STATE_CONNECTING)
            break;
          s->flags &= ~SESSION_F_RX_EVT;
          app->cb_fns.builtin_app_rx_callback (s);
@@ -153,8 +155,16 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
              s->app_wrk_index = SESSION_INVALID_INDEX;
              break;
            }
-         if (is_builtin && was_closed)
-           app_worker_close_notify (app_wrk, s);
+         if (is_builtin)
+           {
+             if (s->flags & SESSION_F_RX_EVT)
+               {
+                 s->flags &= ~SESSION_F_RX_EVT;
+                 app->cb_fns.builtin_app_rx_callback (s);
+               }
+             if (was_closed)
+               app_worker_close_notify (app_wrk, s);
+           }
          break;
        case SESSION_CTRL_EVT_CONNECTED:
          if (!(evt->as_u64[1] & 0xffffffff))
@@ -177,6 +187,11 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
            }
          if (was_closed)
            app_worker_close_notify (app_wrk, s);
+         if (s->flags & SESSION_F_RX_EVT)
+           {
+             s->flags &= ~SESSION_F_RX_EVT;
+             app->cb_fns.builtin_app_rx_callback (s);
+           }
          break;
        case SESSION_CTRL_EVT_DISCONNECTED:
          s = session_get (evt->session_index, thread_index);