session: maintain old state on premature close

Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I2ea821e0499a3874c4579f5480ea86f30ebe615f
(cherry picked from commit 84c9ee3d69)
This commit is contained in:
Florin Coras
2023-10-09 18:25:39 -07:00
committed by Florin Coras
parent 1ec3a70f66
commit 471dc6b1e3

View File

@ -77,7 +77,8 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
{ {
application_t *app = application_get (app_wrk->app_index); application_t *app = application_get (app_wrk->app_index);
svm_msg_q_t *mq = app_wrk->event_queue; svm_msg_q_t *mq = app_wrk->event_queue;
u8 ring_index, mq_is_cong, was_closed; u8 ring_index, mq_is_cong;
session_state_t old_state;
session_event_t *evt; session_event_t *evt;
u32 n_evts = 128, i; u32 n_evts = 128, i;
session_t *s; session_t *s;
@ -148,7 +149,7 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
break; break;
case SESSION_CTRL_EVT_ACCEPTED: case SESSION_CTRL_EVT_ACCEPTED:
s = session_get (evt->session_index, thread_index); s = session_get (evt->session_index, thread_index);
was_closed = s->session_state >= SESSION_STATE_TRANSPORT_CLOSING; old_state = s->session_state;
if (app->cb_fns.session_accept_callback (s)) if (app->cb_fns.session_accept_callback (s))
{ {
session_close (s); session_close (s);
@ -162,15 +163,18 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
s->flags &= ~SESSION_F_RX_EVT; s->flags &= ~SESSION_F_RX_EVT;
app->cb_fns.builtin_app_rx_callback (s); app->cb_fns.builtin_app_rx_callback (s);
} }
if (was_closed) if (old_state >= SESSION_STATE_TRANSPORT_CLOSING)
app_worker_close_notify (app_wrk, s); {
session_set_state (s, old_state);
app_worker_close_notify (app_wrk, s);
}
} }
break; break;
case SESSION_CTRL_EVT_CONNECTED: case SESSION_CTRL_EVT_CONNECTED:
if (!(evt->as_u64[1] & 0xffffffff)) if (!(evt->as_u64[1] & 0xffffffff))
{ {
s = session_get (evt->session_index, thread_index); s = session_get (evt->session_index, thread_index);
was_closed = s->session_state >= SESSION_STATE_TRANSPORT_CLOSING; old_state = s->session_state;
} }
else else
s = 0; s = 0;
@ -185,13 +189,16 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
s->app_wrk_index = SESSION_INVALID_INDEX; s->app_wrk_index = SESSION_INVALID_INDEX;
break; break;
} }
if (was_closed)
app_worker_close_notify (app_wrk, s);
if (s->flags & SESSION_F_RX_EVT) if (s->flags & SESSION_F_RX_EVT)
{ {
s->flags &= ~SESSION_F_RX_EVT; s->flags &= ~SESSION_F_RX_EVT;
app->cb_fns.builtin_app_rx_callback (s); app->cb_fns.builtin_app_rx_callback (s);
} }
if (old_state >= SESSION_STATE_TRANSPORT_CLOSING)
{
session_set_state (s, old_state);
app_worker_close_notify (app_wrk, s);
}
break; break;
case SESSION_CTRL_EVT_DISCONNECTED: case SESSION_CTRL_EVT_DISCONNECTED:
s = session_get (evt->session_index, thread_index); s = session_get (evt->session_index, thread_index);