git: f858eb916fd2 - main - tcp: send SACK rescue retransmission also mid-stream

From: Richard Scheffenegger <rscheff_at_FreeBSD.org>
Date: Tue, 28 Mar 2023 02:48:11 UTC
The branch main has been updated by rscheff:

URL: https://cgit.FreeBSD.org/src/commit/?id=f858eb916fd263f696c290798d4a260b6e55af60

commit f858eb916fd263f696c290798d4a260b6e55af60
Author:     Richard Scheffenegger <rscheff@FreeBSD.org>
AuthorDate: 2023-03-28 02:01:48 +0000
Commit:     Richard Scheffenegger <rscheff@FreeBSD.org>
CommitDate: 2023-03-28 02:47:01 +0000

    tcp: send SACK rescue retransmission also mid-stream
    
    Previously, SACK rescue retransmissions would only happen
    on a loss recovery at the tail end of the send buffer.
    
    This extends the mechanism such that partial ACKs without SACK
    mid-stream also trigger a rescue retransmission to try avoid
    an otherwise unavoidable retransmission timeout.
    
    Reviewed By:            tuexen, #transport
    Sponsored by:           NetApp, Inc.
    Differential Revision:  https://reviews.freebsd.org/D39274
---
 sys/netinet/tcp_sack.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sys/netinet/tcp_sack.c b/sys/netinet/tcp_sack.c
index 558773f91228..5900bc19e2e0 100644
--- a/sys/netinet/tcp_sack.c
+++ b/sys/netinet/tcp_sack.c
@@ -879,7 +879,6 @@ tcp_sack_partialack(struct tcpcb *tp, struct tcphdr *th)
 	 */
 	if ((V_tcp_do_newsack) &&
 	    SEQ_LT(th->th_ack, tp->snd_recover) &&
-	    (tp->snd_recover == tp->snd_max) &&
 	    TAILQ_EMPTY(&tp->snd_holes) &&
 	    (tp->sackhint.delivered_data > 0)) {
 		/*
@@ -891,6 +890,7 @@ tcp_sack_partialack(struct tcpcb *tp, struct tcphdr *th)
 		tcp_seq highdata = tp->snd_max;
 		if (tp->t_flags & TF_SENTFIN)
 			highdata--;
+		highdata = SEQ_MIN(highdata, tp->snd_recover);
 		if (th->th_ack != highdata) {
 			tp->snd_fack = th->th_ack;
 			(void)tcp_sackhole_insert(tp, SEQ_MAX(th->th_ack,