/* 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;
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);
- app->cb_fns.session_disconnect_callback (s);
+ 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);
- app->cb_fns.session_reset_callback (s);
+ 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);
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);