summaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2019-09-12 18:49:44 -0700
committerAndrew Yourtchenko <ayourtch@gmail.com>2019-09-29 16:41:21 +0000
commitdedb3c8d95322cbac280660bc21665b35d8a3af1 (patch)
tree8a1a170d7d9f88337f1207a7781b8301d7223230 /src/vnet
parent9dba3dbf03b61b86c45091c12f82fa16bde54510 (diff)
tcp: cleanup scoreboard after recovery
Type: fix When recovering from congestion, remove last hole in scoreboard if it covers all bytes sent above snd_congestion. Change-Id: I752accd4590cd9bf553c35a1bb40a38c308c04f5 Signed-off-by: Florin Coras <fcoras@cisco.com> (cherry picked from commit 321cfa5fcb8f347329a5296e2024ef0e6cef319f)
Diffstat (limited to 'src/vnet')
-rwxr-xr-xsrc/vnet/tcp/tcp_input.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c
index 7ab7020ee9b..f4e1026e4c5 100755
--- a/src/vnet/tcp/tcp_input.c
+++ b/src/vnet/tcp/tcp_input.c
@@ -1298,7 +1298,14 @@ tcp_cc_is_spurious_retransmit (tcp_connection_t * tc)
static int
tcp_cc_recover (tcp_connection_t * tc)
{
+ sack_scoreboard_hole_t *hole;
+
ASSERT (tcp_in_cong_recovery (tc));
+
+ hole = scoreboard_first_hole (&tc->sack_sb);
+ if (hole && hole->start == tc->snd_una && hole->end == tc->snd_nxt)
+ scoreboard_clear (&tc->sack_sb);
+
if (tcp_cc_is_spurious_retransmit (tc))
{
tcp_cc_congestion_undo (tc);