From ed5be47009aca45008ba9d44e76ac51ec1f7f156 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Wed, 5 Jan 2022 10:16:07 -0800 Subject: tcp: mark lost first sack hole on timeout Type: improvement Signed-off-by: Florin Coras Change-Id: I1abff943f3fe3ff0219126b5b8beded4ad859758 --- src/vnet/tcp/tcp_output.c | 5 ++++- src/vnet/tcp/tcp_sack.c | 21 +++++++++++++++++++++ src/vnet/tcp/tcp_sack.h | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/vnet/tcp/tcp_output.c b/src/vnet/tcp/tcp_output.c index dfcb4ee394e..5647b8f6737 100644 --- a/src/vnet/tcp/tcp_output.c +++ b/src/vnet/tcp/tcp_output.c @@ -1337,7 +1337,10 @@ tcp_timer_retransmit_handler (tcp_connection_t * tc) } if (tcp_opts_sack_permitted (&tc->rcv_opts)) - tcp_check_sack_reneging (tc); + { + tcp_check_sack_reneging (tc); + scoreboard_rxt_mark_lost (&tc->sack_sb, tc->snd_una, tc->snd_nxt); + } /* Update send congestion to make sure that rxt has data to send */ tc->snd_congestion = tc->snd_nxt; diff --git a/src/vnet/tcp/tcp_sack.c b/src/vnet/tcp/tcp_sack.c index 8f51b517361..63af07b50cd 100644 --- a/src/vnet/tcp/tcp_sack.c +++ b/src/vnet/tcp/tcp_sack.c @@ -264,6 +264,27 @@ scoreboard_init_rxt (sack_scoreboard_t * sb, u32 snd_una) sb->rescue_rxt = snd_una - 1; } +void +scoreboard_rxt_mark_lost (sack_scoreboard_t *sb, u32 snd_una, u32 snd_nxt) +{ + sack_scoreboard_hole_t *hole; + + hole = scoreboard_first_hole (sb); + if (!hole) + { + hole = scoreboard_insert_hole (sb, TCP_INVALID_SACK_HOLE_INDEX, snd_una, + snd_nxt); + sb->tail = scoreboard_hole_index (sb, hole); + sb->high_sacked = snd_una; + } + + if (hole->is_lost) + return; + + hole->is_lost = 1; + sb->lost_bytes += scoreboard_hole_bytes (hole); +} + void scoreboard_init (sack_scoreboard_t * sb) { diff --git a/src/vnet/tcp/tcp_sack.h b/src/vnet/tcp/tcp_sack.h index 1c3fa95510b..bb206b92dbb 100644 --- a/src/vnet/tcp/tcp_sack.h +++ b/src/vnet/tcp/tcp_sack.h @@ -105,6 +105,8 @@ void scoreboard_clear (sack_scoreboard_t * sb); void scoreboard_clear_reneging (sack_scoreboard_t * sb, u32 start, u32 end); void scoreboard_init (sack_scoreboard_t * sb); void scoreboard_init_rxt (sack_scoreboard_t * sb, u32 snd_una); +void scoreboard_rxt_mark_lost (sack_scoreboard_t *sb, u32 snd_una, + u32 snd_nxt); format_function_t format_tcp_scoreboard; -- cgit 1.2.3-korg