summaryrefslogtreecommitdiffstats
path: root/src/vnet/session
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2018-12-17 08:24:19 -0800
committerDave Barach <openvpp@barachs.net>2018-12-18 22:42:37 +0000
commita9d5bea69fafbcc2f24d71439433c9b710db665f (patch)
tree7a2f9f9af6548bfd6067b6f04351a949f9e594ec /src/vnet/session
parent65eb77231cbcf4e0ad9c04ad511035c5154853ac (diff)
tcp/session: drop connections if message queue is full
Also cleanup session table when transport closes and app didn't reply to the close notification. Change-Id: Ie3d518e3afff73437561561b46dbf695c24632ad Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/session')
-rw-r--r--src/vnet/session/session.c15
-rw-r--r--src/vnet/session/session.h2
2 files changed, 10 insertions, 7 deletions
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c
index 7f9a32f46de..a03b53dd3bd 100644
--- a/src/vnet/session/session.c
+++ b/src/vnet/session/session.c
@@ -194,7 +194,6 @@ session_alloc_for_connection (transport_connection_t * tc)
s = session_alloc (thread_index);
s->session_type = session_type_from_proto_and_ip (tc->proto, tc->is_ip4);
- s->session_state = SESSION_STATE_CONNECTING;
s->enqueue_epoch = (u64) ~ 0;
/* Attach transport to session and vice versa */
@@ -629,6 +628,7 @@ session_stream_connect_notify (transport_connection_t * tc, u8 is_fail)
}
else
{
+ new_s->session_state = SESSION_STATE_CONNECTING;
new_s->app_wrk_index = app_wrk->wrk_index;
new_si = new_s->session_index;
new_ti = new_s->thread_index;
@@ -723,7 +723,7 @@ session_dgram_connect_notify (transport_connection_t * tc,
return 0;
}
-void
+int
stream_session_accept_notify (transport_connection_t * tc)
{
app_worker_t *app_wrk;
@@ -733,9 +733,9 @@ stream_session_accept_notify (transport_connection_t * tc)
s = session_get (tc->s_index, tc->thread_index);
app_wrk = app_worker_get_if_valid (s->app_wrk_index);
if (!app_wrk)
- return;
+ return -1;
app = application_get (app_wrk->app_index);
- app->cb_fns.session_accept_callback (s);
+ return app->cb_fns.session_accept_callback (s);
}
/**
@@ -805,7 +805,10 @@ stream_session_delete_notify (transport_connection_t * tc)
case SESSION_STATE_TRANSPORT_CLOSING:
/* If transport finishes or times out before we get a reply
* from the app, do the whole disconnect since we might still
- * have lingering events */
+ * have lingering events. Cleanup session table in advance
+ * because transport will soon be closed and closed sessions
+ * are assumed to have been removed from the lookup table */
+ session_lookup_del_session (s);
stream_session_disconnect (s);
s->session_state = SESSION_STATE_CLOSED;
break;
@@ -872,7 +875,7 @@ stream_session_accept (transport_connection_t * tc, u32 listener_index,
if (notify)
{
application_t *app = application_get (app_wrk->app_index);
- app->cb_fns.session_accept_callback (s);
+ return app->cb_fns.session_accept_callback (s);
}
return 0;
diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h
index be2490fbe95..6c1bdb639df 100644
--- a/src/vnet/session/session.h
+++ b/src/vnet/session/session.h
@@ -610,7 +610,7 @@ int session_dequeue_notify (stream_session_t * s);
void stream_session_init_fifos_pointers (transport_connection_t * tc,
u32 rx_pointer, u32 tx_pointer);
-void stream_session_accept_notify (transport_connection_t * tc);
+int stream_session_accept_notify (transport_connection_t * tc);
void stream_session_disconnect_notify (transport_connection_t * tc);
void stream_session_delete_notify (transport_connection_t * tc);
void stream_session_reset_notify (transport_connection_t * tc);