From 9f9e969f149e40044fee9d2e47b7dd96f3ae4dfa Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Fri, 19 Oct 2018 17:49:00 -0700 Subject: tcp: count first lost hole (VPP-1465) Change-Id: I3ac136e2a10796d8fa86ddb6f0d6cabe5fa749f8 Signed-off-by: Florin Coras --- src/vnet/tcp/tcp_input.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'src/vnet') diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index e75c77d0e2f..87bacc24354 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -680,29 +680,32 @@ scoreboard_update_bytes (tcp_connection_t * tc, sack_scoreboard_t * sb) { bytes = sb->high_sacked - left->end; blks = 1; - if (bytes > (TCP_DUPACK_THRESHOLD - 1) * tc->snd_mss - && left->prev == TCP_INVALID_SACK_HOLE_INDEX) - sb->lost_bytes += scoreboard_hole_bytes (left); } - right = left; - while ((left = scoreboard_prev_hole (sb, right)) - && (bytes < (TCP_DUPACK_THRESHOLD - 1) * tc->snd_mss - && blks < TCP_DUPACK_THRESHOLD)) + while ((right = left) + && bytes < (TCP_DUPACK_THRESHOLD - 1) * tc->snd_mss + && blks < TCP_DUPACK_THRESHOLD + /* left not updated if above conditions fail */ + && (left = scoreboard_prev_hole (sb, right))) { bytes += right->start - left->end; blks++; - right = left; } - while (left) + /* left is first lost */ + if (left) { - bytes += right->start - left->end; - sb->lost_bytes += scoreboard_hole_bytes (left); - left->is_lost = 1; - right = left; - left = scoreboard_prev_hole (sb, left); + do + { + sb->lost_bytes += scoreboard_hole_bytes (right); + left->is_lost = 1; + left = scoreboard_prev_hole (sb, right); + if (left) + bytes += right->start - left->end; + } + while ((right = left)); } + sb->sacked_bytes = bytes; } -- cgit 1.2.3-korg