From nobody Wed Sep 14 01:29:08 2022 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 4MS2mj2RkBz4bmNk; Wed, 14 Sep 2022 01:29:09 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4MS2mj0sVLz3yF3; Wed, 14 Sep 2022 01:29:09 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1663118949; 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=u9Y61Oa+/Dh/IgrBIdcbUGPSmPagQNBMMGFp2bQYX4s=; b=rxBJDJgRFpBcnCOS048WZNPjIjpvv0z1FS19Y9SpUFVuyDf2/faRnVNcZg015n680DE3Qs MJ5tnx6sYmB4K+ad0uFRNxXlC7GlOaMwU1gR8X0hhygnf0V/y6vRQVC0AizJFGPk3m4/uA qMvjnK9lS6MYhe0GE4tz5CaUCmj5+veML9sY4NrrJGZqTnPOGhviQbdnLf2gNmmUCre+jy vHYB9KYWqVKu9r/7oE3v9oxWA8llTndDpeE/EEQSOkoCJzeGIQV4hISJaRrvBJWyj3++Pd LtTpi496WZNJdVpG7XhGPfV6vggTDRLd3oX6o3NV2q2nFWpFRpfR64ZQepXosg== 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 4MS2mh6kthzWrH; Wed, 14 Sep 2022 01:29:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 28E1T8me032119; Wed, 14 Sep 2022 01:29:08 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 28E1T8Xr032118; Wed, 14 Sep 2022 01:29:08 GMT (envelope-from git) Date: Wed, 14 Sep 2022 01:29:08 GMT Message-Id: <202209140129.28E1T8Xr032118@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Richard Scheffenegger Subject: git: 2b8ee332b938 - stable/13 - tcp: finish SACK loss recovery on sudden lack of SACK blocks 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: 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/stable/13 X-Git-Reftype: branch X-Git-Commit: 2b8ee332b9384596cefc91fead1c294fdd9252b4 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1663118949; 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=u9Y61Oa+/Dh/IgrBIdcbUGPSmPagQNBMMGFp2bQYX4s=; b=STC6skrgJEAZ/nYoP0691CdyGddjR5Bu/dTA2wyO98ImYFseMGlGTMXRCX9IQtRW/ZATuA zNYPSZy4d0zQymZhgdf9sgJnkUJBGL/Nda99ULx+iyIHtgW6fFLQNehyyW3trT3YVDHLBG SA/ajyslIRUKtRZaoV4IOEjfroZ75yaebRD1XsnVuSNyiWTDM6gZksOMV4TV4hoMjypITY pE1mGboq9vaom/r0m0UVDwW8aYkUc0Yw3NmUUPJtpmy3JtCOtEFTmG+IT+wzesZMOtEBMc hMB34LavkxT616lcnZ4B/JiPok4rbVbpS4fa7qb1Xx5KIKrq/vvQd3nLW/w70A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1663118949; a=rsa-sha256; cv=none; b=VcKqdqAVCsHy82kJtiIrtfPEu/ClT9Actg0BO6Q7qnmxTXo79Ukzily7348pnEfhxtV9Pt q+AWVVBmSUPyMKsJHE/4IH+G4fxxmB9YJHQrgCZ8NL48dbjV03W/VdYEE7CQ3BWfdaiJmG JIzzzjF7Z6674SQWO3vx0a5o876KkwN5aX2AEnK9/BryW/0js5Ceqj03DR/FX2eNHmmmEx NLm+sMtBEl5M9rlJ6KXW60XmeZfLMpeAFaLlE1xNcAMTFlT88hfLazngJNrHcmeSnGdlgI 9zrfagQ/ngRoRO5XamE3o/S2OlAYYZ9J4dpNin1KukfBfEZJQbBQfKaAPtolaQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by rscheff: URL: https://cgit.FreeBSD.org/src/commit/?id=2b8ee332b9384596cefc91fead1c294fdd9252b4 commit 2b8ee332b9384596cefc91fead1c294fdd9252b4 Author: Richard Scheffenegger AuthorDate: 2022-08-31 12:49:25 +0000 Commit: Richard Scheffenegger CommitDate: 2022-09-14 01:28:03 +0000 tcp: finish SACK loss recovery on sudden lack of SACK blocks While a receiver should continue sending SACK blocks for the duration of a SACK loss recovery, if for some reason the TCP options no longer contain these SACK blocks, but we already started maintaining the Scoreboard, keep on handling incoming ACKs (without SACK) as belonging to the SACK recovery. Reported by: thj Reviewed by: tuexen, #transport MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D36046 (cherry picked from commit c21b7b55bea2cc2bf3b420c70a9018e703ed6f00) --- sys/netinet/tcp_input.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 601b4a63716f..b2a2fc878b8a 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -287,6 +287,20 @@ kmod_tcpstat_add(int statnum, int val) counter_u64_add(VNET(tcpstat)[statnum], val); } +/* + * Make sure that we only start a SACK loss recovery when + * receiving a duplicate ACK with a SACK block, and also + * complete SACK loss recovery in case the other end + * reneges. + */ +static bool inline +tcp_is_sack_recovery(struct tcpcb *tp, struct tcpopt *to) +{ + return ((tp->t_flags & TF_SACK_PERMIT) && + ((to->to_flags & TOF_SACK) || + (!TAILQ_EMPTY(&tp->snd_holes)))); +} + #ifdef TCP_HHOOK /* * Wrapper for the TCP established input helper hook. @@ -2525,9 +2539,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, TCPSTAT_INC(tcps_rcvacktoomuch); goto dropafterack; } - if ((tp->t_flags & TF_SACK_PERMIT) && - ((to.to_flags & TOF_SACK) || - !TAILQ_EMPTY(&tp->snd_holes))) + if (tcp_is_sack_recovery(tp, &to)) sack_changed = tcp_sack_doack(tp, &to, th->th_ack); else /* @@ -2597,8 +2609,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, * duplicating packets or a possible DoS attack. */ if (th->th_ack != tp->snd_una || - ((tp->t_flags & TF_SACK_PERMIT) && - (to.to_flags & TOF_SACK) && + (tcp_is_sack_recovery(tp, &to) && !sack_changed)) break; else if (!tcp_timer_active(tp, TT_REXMT)) @@ -2610,8 +2621,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so, if (V_tcp_do_prr && IN_FASTRECOVERY(tp->t_flags)) { tcp_do_prr_ack(tp, th, &to); - } else if ((tp->t_flags & TF_SACK_PERMIT) && - (to.to_flags & TOF_SACK) && + } else if (tcp_is_sack_recovery(tp, &to) && IN_FASTRECOVERY(tp->t_flags)) { int awnd; @@ -2684,8 +2694,7 @@ enter_recovery: * snd_ssthresh is already updated by * cc_cong_signal. */ - if ((tp->t_flags & TF_SACK_PERMIT) && - (to.to_flags & TOF_SACK)) { + if (tcp_is_sack_recovery(tp, &to)) { tp->sackhint.prr_delivered = tp->sackhint.sacked_bytes; } else { @@ -2697,8 +2706,7 @@ enter_recovery: tp->sackhint.recover_fs = max(1, tp->snd_nxt - tp->snd_una); } - if ((tp->t_flags & TF_SACK_PERMIT) && - (to.to_flags & TOF_SACK)) { + if (tcp_is_sack_recovery(tp, &to)) { TCPSTAT_INC( tcps_sack_recovery_episode); tp->snd_recover = tp->snd_nxt; @@ -2790,8 +2798,7 @@ enter_recovery: * from the left side. Such partial ACKs should not be * counted as dupacks here. */ - if ((tp->t_flags & TF_SACK_PERMIT) && - (to.to_flags & TOF_SACK) && + if (tcp_is_sack_recovery(tp, &to) && sack_changed) { tp->t_dupacks++; /* limit overhead by setting maxseg last */ @@ -3973,8 +3980,7 @@ tcp_do_prr_ack(struct tcpcb *tp, struct tcphdr *th, struct tcpopt *to) * (del_data) and an estimate of how many bytes are in the * network. */ - if (((tp->t_flags & TF_SACK_PERMIT) && - (to->to_flags & TOF_SACK)) || + if (tcp_is_sack_recovery(tp, to) || (IN_CONGRECOVERY(tp->t_flags) && !IN_FASTRECOVERY(tp->t_flags))) { del_data = tp->sackhint.delivered_data; @@ -4018,8 +4024,7 @@ tcp_do_prr_ack(struct tcpcb *tp, struct tcphdr *th, struct tcpopt *to) * accordingly. */ if (IN_FASTRECOVERY(tp->t_flags)) { - if ((tp->t_flags & TF_SACK_PERMIT) && - (to->to_flags & TOF_SACK)) { + if (tcp_is_sack_recovery(tp, to)) { tp->snd_cwnd = tp->snd_nxt - tp->snd_recover + tp->sackhint.sack_bytes_rexmit + (snd_cnt * maxseg);