From 47a9c651e21731ec4d20e123f6c591d7078f3992 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Tue, 12 Mar 2019 20:37:09 -0700 Subject: [PATCH] tcp: fix entering closing state while in fast recovery Change-Id: I30470e8a1404632b0350056769338dc69a94c105 Signed-off-by: Florin Coras --- src/vnet/tcp/tcp_input.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index c03c5db4332..0d75ba254ac 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -1317,18 +1317,20 @@ tcp_do_fastretransmits (tcp_worker_ctx_t * wrk) for (i = 0; i < vec_len (ongoing_fast_rxt); i++) { + tc = tcp_connection_get (ongoing_fast_rxt[i], thread_index); + if (!tcp_in_fastrecovery (tc)) + { + tc->flags &= ~TCP_CONN_FRXT_PENDING; + continue; + } + if (n_segs >= VLIB_FRAME_SIZE) { vec_add1 (wrk->postponed_fast_rxt, ongoing_fast_rxt[i]); continue; } - tc = tcp_connection_get (ongoing_fast_rxt[i], thread_index); tc->flags &= ~TCP_CONN_FRXT_PENDING; - - if (!tcp_in_fastrecovery (tc)) - continue; - burst_size = clib_min (max_burst_size, VLIB_FRAME_SIZE - n_segs); burst_bytes = transport_connection_tx_pacer_burst (&tc->connection, last_cpu_time); @@ -2959,6 +2961,14 @@ tcp46_rcv_process_inline (vlib_main_t * vm, vlib_node_runtime_t * node, session_tx_fifo_dequeue_drop (&tc0->connection, transport_max_tx_dequeue (&tc0->connection)); + /* Make it look as if we've recovered, if needed */ + if (tcp_in_cong_recovery (tc0)) + { + scoreboard_clear (&tc0->sack_sb); + tcp_fastrecovery_off (tc0); + tcp_recovery_off (tc0); + tc0->snd_nxt = tc0->snd_una_max = tc0->snd_una; + } tcp_send_fin (tc0); } else -- 2.16.6