aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/tcp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/tcp')
-rw-r--r--src/vnet/tcp/tcp.c8
-rw-r--r--src/vnet/tcp/tcp_input.c3
2 files changed, 7 insertions, 4 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
diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c
index c3ce2eb1ae1..fb80d7f5759 100644
--- a/src/vnet/tcp/tcp_input.c
+++ b/src/vnet/tcp/tcp_input.c
@@ -2671,7 +2671,8 @@ tcp46_rcv_process_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
is_ip4);
if (tmp->state != tc0->state)
{
- clib_warning ("state changed");
+ if (tc0->state != TCP_STATE_CLOSED)
+ clib_warning ("state changed");
goto drop;
}
}