aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/session
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2024-04-09 13:27:53 -0700
committerDave Barach <vpp@barachs.net>2024-04-10 19:35:48 +0000
commitaa78631d755bf9f55532935599b9964f943a27f3 (patch)
tree00217504b9886568b1b6db09a47272943829e57c /src/vnet/session
parent50e7ea7b14863a155a359fb192df9a23883a3391 (diff)
session: add api to detach session from app
Type: improvement Change-Id: Ib824d0ca9efc7d8967e043db69017655b2dcf6b5 Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/session')
-rw-r--r--src/vnet/session/session.c14
-rw-r--r--src/vnet/session/session.h1
-rw-r--r--src/vnet/session/session_input.c6
3 files changed, 17 insertions, 4 deletions
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c
index 633aebd5483..e1a93a6e250 100644
--- a/src/vnet/session/session.c
+++ b/src/vnet/session/session.c
@@ -1596,6 +1596,20 @@ session_reset (session_t * s)
session_program_transport_ctrl_evt (s, SESSION_CTRL_EVT_RESET);
}
+void
+session_detach_app (session_t *s)
+{
+ if (s->session_state < SESSION_STATE_TRANSPORT_CLOSING)
+ session_close (s);
+ else if (s->session_state < SESSION_STATE_TRANSPORT_CLOSED)
+ session_set_state (s, SESSION_STATE_APP_CLOSED);
+ else if (s->session_state < SESSION_STATE_CLOSED)
+ session_set_state (s, SESSION_STATE_CLOSED);
+
+ s->flags |= SESSION_F_APP_CLOSED;
+ s->app_wrk_index = APP_INVALID_INDEX;
+}
+
/**
* Notify transport the session can be half-disconnected.
*
diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h
index aa4776b154f..a5604bf8725 100644
--- a/src/vnet/session/session.h
+++ b/src/vnet/session/session.h
@@ -448,6 +448,7 @@ int session_stop_listen (session_t * s);
void session_half_close (session_t *s);
void session_close (session_t * s);
void session_reset (session_t * s);
+void session_detach_app (session_t *s);
void session_transport_half_close (session_t *s);
void session_transport_close (session_t * s);
void session_transport_reset (session_t * s);
diff --git a/src/vnet/session/session_input.c b/src/vnet/session/session_input.c
index e7a81c343f4..73b777127fd 100644
--- a/src/vnet/session/session_input.c
+++ b/src/vnet/session/session_input.c
@@ -154,8 +154,7 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
old_state = s->session_state;
if (app->cb_fns.session_accept_callback (s))
{
- session_close (s);
- s->app_wrk_index = APP_INVALID_INDEX;
+ session_detach_app (s);
break;
}
if (is_builtin)
@@ -184,8 +183,7 @@ app_worker_flush_events_inline (app_worker_t *app_wrk, u32 thread_index,
break;
if (rv)
{
- session_close (s);
- s->app_wrk_index = APP_INVALID_INDEX;
+ session_detach_app (s);
break;
}
if (old_state >= SESSION_STATE_TRANSPORT_CLOSING)