tcp: make syn-rcvd timeout configurable
[vpp.git] / src / vnet / session / session_input.c
index e686881..73b7771 100644 (file)
@@ -145,25 +145,26 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
          /* No app cb function currently */
          if (is_builtin)
            break;
-         mq_send_session_bound_cb (app_wrk->wrk_index, evt->as_u64[1] >> 32,
-                                   evt->session_handle,
-                                   evt->as_u64[1] & 0xffffffff);
+         app->cb_fns.session_listened_callback (
+           app_wrk->wrk_index, evt->as_u64[1] >> 32, evt->session_handle,
+           evt->as_u64[1] & 0xffffffff);
          break;
        case SESSION_CTRL_EVT_ACCEPTED:
          s = session_get (evt->session_index, thread_index);
          old_state = s->session_state;
          if (app->cb_fns.session_accept_callback (s))
            {
-             session_close (s);
-             s->app_wrk_index = SESSION_INVALID_INDEX;
+             session_detach_app (s);
              break;
            }
          if (is_builtin)
            {
              if (old_state >= SESSION_STATE_TRANSPORT_CLOSING)
                {
-                 session_set_state (s, old_state);
-                 app_worker_close_notify (app_wrk, s);
+                 session_set_state (s,
+                                    clib_max (old_state, s->session_state));
+                 if (!(s->flags & SESSION_F_APP_CLOSED))
+                   app->cb_fns.session_disconnect_callback (s);
                }
            }
          break;
@@ -182,32 +183,32 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
            break;
          if (rv)
            {
-             session_close (s);
-             s->app_wrk_index = SESSION_INVALID_INDEX;
+             session_detach_app (s);
              break;
            }
          if (old_state >= SESSION_STATE_TRANSPORT_CLOSING)
            {
-             session_set_state (s, old_state);
-             app_worker_close_notify (app_wrk, s);
+             session_set_state (s, clib_max (old_state, s->session_state));
+             if (!(s->flags & SESSION_F_APP_CLOSED))
+               app->cb_fns.session_disconnect_callback (s);
            }
          break;
        case SESSION_CTRL_EVT_DISCONNECTED:
          s = session_get (evt->session_index, thread_index);
-         if (s->session_state <= SESSION_STATE_TRANSPORT_CLOSING)
+         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);
-         if (s->session_state <= SESSION_STATE_TRANSPORT_CLOSING)
+         if (!(s->flags & SESSION_F_APP_CLOSED))
            app->cb_fns.session_reset_callback (s);
          break;
        case SESSION_CTRL_EVT_UNLISTEN_REPLY:
          if (is_builtin)
            break;
-         mq_send_unlisten_reply (app_wrk, evt->session_handle,
-                                 evt->as_u64[1] >> 32,
-                                 evt->as_u64[1] & 0xffffffff);
+         app->cb_fns.session_unlistened_callback (
+           app_wrk->wrk_index, evt->session_handle, evt->as_u64[1] >> 32,
+           evt->as_u64[1] & 0xffffffff);
          break;
        case SESSION_CTRL_EVT_MIGRATED:
          s = session_get (evt->session_index, thread_index);
@@ -222,13 +223,20 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
          break;
        case SESSION_CTRL_EVT_TRANSPORT_CLOSED:
          s = session_get (evt->session_index, thread_index);
+         /* Notification enqueued before session was refused by app */
+         if (PREDICT_FALSE (s->app_wrk_index == APP_INVALID_INDEX))
+           break;
          if (app->cb_fns.session_transport_closed_callback)
            app->cb_fns.session_transport_closed_callback (s);
          break;
        case SESSION_CTRL_EVT_CLEANUP:
          s = session_get (evt->as_u64[0] & 0xffffffff, thread_index);
-         if (app->cb_fns.session_cleanup_callback)
-           app->cb_fns.session_cleanup_callback (s, evt->as_u64[0] >> 32);
+         /* Notification enqueued before session was refused by app */
+         if (PREDICT_TRUE (s->app_wrk_index != APP_INVALID_INDEX))
+           {
+             if (app->cb_fns.session_cleanup_callback)
+               app->cb_fns.session_cleanup_callback (s, evt->as_u64[0] >> 32);
+           }
          if (evt->as_u64[0] >> 32 != SESSION_CLEANUP_SESSION)
            break;
          uword_to_pointer (evt->as_u64[1], void (*) (session_t * s)) (s);