summaryrefslogtreecommitdiffstats
path: root/src/vnet/session
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2019-05-23 22:28:16 -0700
committerFlorin Coras <fcoras@cisco.com>2019-05-25 03:09:12 -0700
commit06a2eeca69793c7ef3eeba937bb1bdb074cc0e7f (patch)
treebddee32fd98bbe46da6cd5e57c5a641fe27341a0 /src/vnet/session
parent359776abfb807cb62affc90e89ecc074c7b7beb4 (diff)
tcp: handle fin+rst in same frame
Change-Id: Ie7a6c7b92a6beeb356f01384216a4982fb3d420e Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/session')
-rw-r--r--src/vnet/session/session.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c
index 1a304a6f80e..298d8d8bb06 100644
--- a/src/vnet/session/session.c
+++ b/src/vnet/session/session.c
@@ -822,9 +822,16 @@ session_transport_closed_notify (transport_connection_t * tc)
if (!(s = session_get_if_valid (tc->s_index, tc->thread_index)))
return;
+ /* Transport thinks that app requested close but it actually didn't.
+ * Can happen for tcp if fin and rst are received in close succession. */
+ if (s->session_state == SESSION_STATE_READY)
+ {
+ session_transport_closing_notify (tc);
+ svm_fifo_dequeue_drop_all (s->tx_fifo);
+ }
/* If app close has not been received or has not yet resulted in
* a transport close, only mark the session transport as closed */
- if (s->session_state <= SESSION_STATE_CLOSING)
+ else if (s->session_state <= SESSION_STATE_CLOSING)
{
session_lookup_del_session (s);
s->session_state = SESSION_STATE_TRANSPORT_CLOSED;