tcp: handle fin+rst in same frame 26/19826/2
authorFlorin Coras <fcoras@cisco.com>
Fri, 24 May 2019 05:28:16 +0000 (22:28 -0700)
committerFlorin Coras <fcoras@cisco.com>
Sat, 25 May 2019 10:09:12 +0000 (03:09 -0700)
Change-Id: Ie7a6c7b92a6beeb356f01384216a4982fb3d420e
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vnet/session/session.c

index 1a304a6..298d8d8 100644 (file)
@@ -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;