summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2023-10-06 16:45:04 -0700
committerFlorin Coras <fcoras@cisco.com>2023-10-07 10:03:56 -0700
commit9ffec14a2202e1268c4a2f189c39a90986090a25 (patch)
tree2b0849d65bcb6254a8648356fa4591308cbe705b /src
parent589fe7ca61111d742ed2e6249728eb54423bab16 (diff)
session: handle accept and connect errors
If builtin apps refuse connections, they should be cleaned up. Type: fix Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I95ef22902ac3fe873e15e250aa5f03031c2dc0c4
Diffstat (limited to 'src')
-rw-r--r--src/vnet/session/session_input.c34
-rw-r--r--src/vnet/session/session_node.c1
2 files changed, 29 insertions, 6 deletions
diff --git a/src/vnet/session/session_input.c b/src/vnet/session/session_input.c
index 2c89c31a827..cdd6a884949 100644
--- a/src/vnet/session/session_input.c
+++ b/src/vnet/session/session_input.c
@@ -77,10 +77,11 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
{
application_t *app = application_get (app_wrk->app_index);
svm_msg_q_t *mq = app_wrk->event_queue;
+ u8 ring_index, mq_is_cong, was_closed;
session_event_t *evt;
u32 n_evts = 128, i;
- u8 ring_index, mq_is_cong;
session_t *s;
+ int rv;
n_evts = clib_min (n_evts, clib_fifo_elts (app_wrk->wrk_evts[thread_index]));
@@ -145,16 +146,37 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
break;
case SESSION_CTRL_EVT_ACCEPTED:
s = session_get (evt->session_index, thread_index);
- app->cb_fns.session_accept_callback (s);
+ was_closed = s->session_state >= SESSION_STATE_TRANSPORT_CLOSING;
+ if (app->cb_fns.session_accept_callback (s))
+ {
+ session_close (s);
+ s->app_wrk_index = SESSION_INVALID_INDEX;
+ break;
+ }
+ if (is_builtin && was_closed)
+ app_worker_close_notify (app_wrk, s);
break;
case SESSION_CTRL_EVT_CONNECTED:
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;
+ }
else
s = 0;
- app->cb_fns.session_connected_callback (app_wrk->wrk_index,
- evt->as_u64[1] >> 32, s,
- evt->as_u64[1] & 0xffffffff);
+ rv = app->cb_fns.session_connected_callback (
+ app_wrk->wrk_index, evt->as_u64[1] >> 32, s,
+ evt->as_u64[1] & 0xffffffff);
+ if (!s)
+ break;
+ if (rv)
+ {
+ session_close (s);
+ s->app_wrk_index = SESSION_INVALID_INDEX;
+ break;
+ }
+ if (was_closed)
+ app_worker_close_notify (app_wrk, s);
break;
case SESSION_CTRL_EVT_DISCONNECTED:
s = session_get (evt->session_index, thread_index);
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c
index 4f2cae4d196..d27b804550a 100644
--- a/src/vnet/session/session_node.c
+++ b/src/vnet/session/session_node.c
@@ -456,6 +456,7 @@ session_mq_accepted_reply_handler (session_worker_t *wrk,
a->app_index = mp->context;
a->handle = mp->handle;
vnet_disconnect_session (a);
+ s->app_wrk_index = SESSION_INVALID_INDEX;
return;
}