summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2018-12-20 10:16:01 -0800
committerFlorin Coras <fcoras@cisco.com>2018-12-20 10:32:41 -0800
commit1af9ab58fc25ae8b42bbf758eb63e04e0d1fafd1 (patch)
tree322aa88442e461dbca213102aecd6b1ec5bfeffc
parentfd0d50879f475a1b15cedb4ab49059a02c45ccfd (diff)
tcp: fix syn-sent reset
Change-Id: I4a811672b27c70bf0e9652c175c7f4168ec40ed7 Signed-off-by: Florin Coras <fcoras@cisco.com>
-rw-r--r--src/vnet/tcp/tcp.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c
index b1ed99a4dee..beadf9e1561 100644
--- a/src/vnet/tcp/tcp.c
+++ b/src/vnet/tcp/tcp.c
@@ -292,6 +292,8 @@ tcp_connection_reset (tcp_connection_t * tc)
* cleanly close the connection */
tcp_timer_set (tc, TCP_TIMER_WAITCLOSE, TCP_CLOSEWAIT_TIME);
stream_session_reset_notify (&tc->connection);
+ tc->state = TCP_STATE_CLOSED;
+ TCP_EVT_DBG (TCP_EVT_STATE_CHANGE, tc);
break;
case TCP_STATE_CLOSE_WAIT:
case TCP_STATE_FIN_WAIT_1:
@@ -299,12 +301,12 @@ tcp_connection_reset (tcp_connection_t * tc)
case TCP_STATE_CLOSING:
tcp_connection_timers_reset (tc);
tcp_timer_set (tc, TCP_TIMER_WAITCLOSE, TCP_CLOSEWAIT_TIME);
+ tc->state = TCP_STATE_CLOSED;
+ TCP_EVT_DBG (TCP_EVT_STATE_CHANGE, tc);
break;
case TCP_STATE_CLOSED:
- return;
+ break;
}
- tc->state = TCP_STATE_CLOSED;
- TCP_EVT_DBG (TCP_EVT_STATE_CHANGE, tc);
}
/**
@@ -329,7 +331,7 @@ tcp_connection_close (tcp_connection_t * tc)
switch (tc->state)
{
case TCP_STATE_SYN_SENT:
- tc->state = TCP_STATE_CLOSED;
+ /* Do nothing. Establish timer will pop and cleanup the connection */
break;
case TCP_STATE_SYN_RCVD:
tcp_connection_timers_reset (tc);
@@ -1219,8 +1221,9 @@ tcp_timer_establish_handler (u32 conn_index)
if (tc)
{
ASSERT (tc->state == TCP_STATE_SYN_SENT);
- session_stream_connect_notify (&tc->connection, 1 /* fail */ );
- TCP_DBG ("establish pop: %U", format_tcp_connection, tc, 2);
+ /* Notify app if we haven't tried to clean this up already */
+ if (!(tc->flags & TCP_CONN_HALF_OPEN_DONE))
+ session_stream_connect_notify (&tc->connection, 1 /* fail */ );
}
else
{
@@ -1228,7 +1231,6 @@ tcp_timer_establish_handler (u32 conn_index)
/* note: the connection may have already disappeared */
if (PREDICT_FALSE (tc == 0))
return;
- TCP_DBG ("establish pop: %U", format_tcp_connection, tc, 2);
ASSERT (tc->state == TCP_STATE_SYN_RCVD);
/* Start cleanup. App wasn't notified yet so use delete notify as
* opposed to delete to cleanup session layer state. */