session: always clear rx evt flag on ntf 40/39940/3
authorFlorin Coras <fcoras@cisco.com>
Fri, 17 Nov 2023 05:16:13 +0000 (21:16 -0800)
committerDave Wallace <dwallacelf@gmail.com>
Fri, 17 Nov 2023 12:08:58 +0000 (12:08 +0000)
Apps may drain fifos prior to handling of accept notification, e.g.,
vcl session relying on epoll lt mode.

Type: fix

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

src/vnet/session/session_input.c

index 42d7181..91e4b90 100644 (file)
@@ -113,20 +113,22 @@ 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 ||
                             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 ||
-             s->session_state == SESSION_STATE_CONNECTING)
+         if (!s)
            break;
          s->flags &= ~SESSION_F_RX_EVT;
+         if (PREDICT_FALSE (s->session_state == SESSION_STATE_ACCEPTING ||
+                            s->session_state == SESSION_STATE_CONNECTING))
+           break;
          app->cb_fns.builtin_app_rx_callback (s);
          break;
        case SESSION_IO_EVT_TX: