summaryrefslogtreecommitdiffstats
path: root/src/vnet/tcp/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/tcp/tcp.c')
-rw-r--r--src/vnet/tcp/tcp.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c
index 564f200bc00..7f6a087b2f3 100644
--- a/src/vnet/tcp/tcp.c
+++ b/src/vnet/tcp/tcp.c
@@ -284,7 +284,8 @@ tcp_connection_reset (tcp_connection_t * tc)
break;
case TCP_STATE_SYN_SENT:
session_stream_connect_notify (&tc->connection, 1 /* fail */ );
- tcp_connection_cleanup (tc);
+ tcp_connection_set_state (tc, TCP_STATE_CLOSED);
+ tcp_timer_set (tc, TCP_TIMER_WAITCLOSE, TCP_CLEANUP_TIME);
break;
case TCP_STATE_ESTABLISHED:
tcp_connection_timers_reset (tc);
@@ -307,6 +308,7 @@ tcp_connection_reset (tcp_connection_t * tc)
tcp_connection_set_state (tc, TCP_STATE_CLOSED);
break;
case TCP_STATE_CLOSED:
+ case TCP_STATE_TIME_WAIT:
break;
default:
TCP_DBG ("reset state: %u", tc->state);
@@ -1293,9 +1295,9 @@ tcp_timer_waitclose_handler (u32 conn_index)
* is closed. We haven't sent everything but we did try. */
tcp_cong_recovery_off (tc);
tcp_send_fin (tc);
- rto = clib_max (tc->rto >> tc->rto_boff, 1);
+ rto = clib_max ((tc->rto >> tc->rto_boff) * TCP_TO_TIMER_TICK, 1);
tcp_timer_set (tc, TCP_TIMER_WAITCLOSE,
- clib_min (rto * TCP_TO_TIMER_TICK, TCP_2MSL_TIME));
+ clib_min (rto, TCP_2MSL_TIME));
session_transport_closed_notify (&tc->connection);
}
else