From nobody Wed Aug 6 21:50:17 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4by3qs6vWJz64GLp; Wed, 06 Aug 2025 21:50:17 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4by3qs5ffpz3KV2; Wed, 06 Aug 2025 21:50:17 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754517017; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=4WZnIR3kfoJgrju4iLjf9DvvRjEef13SoTRMfknWtX0=; b=I0GMmM9j/zj/GMpy1sHkJ+0tjO8Ye2BrB8J0buKaKxoAf7azH20/ejkq7f2eLUPhgRd0KW Rq+Nmm+j369+55c6ZGEisQq/I/FetX0Eg01xvK7QBpLmOhVVSKtxsPOeG6sRmCiR+ysfPN Mdtvdu67QeaoeFeX7jgFJgJasQxl943Ufzd0LgfGx5O5nWvfEo0NhdfVplJryP/5d34pxn NIo2GybAgWTG+Xt4KYp5tKqXZVGNaDk78HRXGYezV2zDEiPdGCBxGmvyK+2t2gt0vtaf/L 3UTVxBfxu+yMHtSDqGJnfYpTNz0Vw1yFJ0tK+qRHu92Mg59shOQeCAOiUBnzOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754517017; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=4WZnIR3kfoJgrju4iLjf9DvvRjEef13SoTRMfknWtX0=; b=jDD45T+BVwODWViTkytKxI2a6KaJvIz4sajdwDlZJYP/7a6E7hW/BKAD/rhFhvjjElVQ/1 SGbP2QahgYcjdpHSNcEkjYTk31DvaruooGeXyhGBhHgHhZzdFcNuYtMYqqCPreOKdlCdVE +URjcWAaLZRmV+OM3vSrTWNZV4r5BqYkAEuVlYpBJdBoFEuzgHA1gD5tCwN4xs8EAtU6j8 AL7M2ZbbpfMd2cV7qtoGSSZ2UuhVf0/iqhwblNrD/N19WTFiYaQQ83ufEMkteIfkJke0o9 9O4DN2Cuk8QoWEwS9jk0KNRnSIOZS/pI6SEAvP/v11bVodDvFKxcdlSDsHhjyQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754517017; a=rsa-sha256; cv=none; b=E3RNZNVFJlxeXsmiul1O30IlX0goehtA5/szrDwmSw9hQjACqbiLhvWwEdDoFtA4vGng2h TUx0EpX9OjlBw4PrUtIcfXhIWRYEhVVLTHNAK5hAdPqTSVHeMTiFyHg1n+MrqGda9Nc5OT PoX61Sb+IqizvrcSpWT6pm9Th5hSGDWt+x1neVzURqbjoRQH6idJcHOw1LXlSh0Q/qr3wu 7P5vlRKqiX+WY8LQPFKWqpgsjEY8WmZtdZ1J1Y9T8NiI9DKEsbvqy5VGeGiT1dRD5pFymt gHpqGaJ8XYFSqggCge9sMO80JQwY7IMoZ2KKD09zTsyDxaDmUf3RgotpMhTtSA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4by3qs4y97zfhB; Wed, 06 Aug 2025 21:50:17 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 576LoHO6057502; Wed, 6 Aug 2025 21:50:17 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 576LoHmC057491; Wed, 6 Aug 2025 21:50:17 GMT (envelope-from git) Date: Wed, 6 Aug 2025 21:50:17 GMT Message-Id: <202508062150.576LoHmC057491@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Richard Scheffenegger Subject: git: 65d4a8339984 - main - tcp: ensure SACK rxmit never ends up left of its hole List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rscheff X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 65d4a83399843cb4c6dd44061599390843c162db Auto-Submitted: auto-generated The branch main has been updated by rscheff: URL: https://cgit.FreeBSD.org/src/commit/?id=65d4a83399843cb4c6dd44061599390843c162db commit 65d4a83399843cb4c6dd44061599390843c162db Author: Richard Scheffenegger AuthorDate: 2025-08-06 20:25:30 +0000 Commit: Richard Scheffenegger CommitDate: 2025-08-06 21:47:05 +0000 tcp: ensure SACK rxmit never ends up left of its hole When a RTO happens during SACK loss recovery, snd_recover can possibly pulled left. With Lost Retransmission Detection (LRD) this can lead to rxmit of a hole to end up pointing to the left of the hole, which is unexpected and leads to complications. Reviewed By: tuexen, #transport Sponsored by: NetApp, Inc. MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D51725 --- sys/netinet/tcp_output.c | 2 +- sys/netinet/tcp_sack.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index bc5b42ee6f2c..2dfb7faf56e3 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -1250,7 +1250,7 @@ send: * fack acks recoverypoint. */ if ((tp->t_flags & TF_LRD) && SEQ_GEQ(p->rxmit, p->end)) - p->rxmit = tp->snd_recover; + p->rxmit = SEQ_MAX(p->rxmit, tp->snd_recover); tp->sackhint.sack_bytes_rexmit += len; } if (IN_RECOVERY(tp->t_flags)) { diff --git a/sys/netinet/tcp_sack.c b/sys/netinet/tcp_sack.c index 66275cb04bdd..b6c55fac50b3 100644 --- a/sys/netinet/tcp_sack.c +++ b/sys/netinet/tcp_sack.c @@ -816,7 +816,7 @@ tcp_sack_doack(struct tcpcb *tp, struct tcpopt *to, tcp_seq th_ack) cur->end = sblkp->start; cur->rxmit = SEQ_MIN(cur->rxmit, cur->end); if ((tp->t_flags & TF_LRD) && SEQ_GEQ(cur->rxmit, cur->end)) - cur->rxmit = tp->snd_recover; + cur->rxmit = SEQ_MAX(cur->rxmit, tp->snd_recover); } else { /* * ACKs some data in middle of a hole; need @@ -843,7 +843,7 @@ tcp_sack_doack(struct tcpcb *tp, struct tcpopt *to, tcp_seq th_ack) cur->rxmit = SEQ_MIN(cur->rxmit, cur->end); if ((tp->t_flags & TF_LRD) && SEQ_GEQ(cur->rxmit, cur->end)) - cur->rxmit = tp->snd_recover; + cur->rxmit = SEQ_MAX(cur->rxmit, tp->snd_recover); delivered_data += (sblkp->end - sblkp->start); } }