Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Oct 2020 20:48:35 +0000 (UTC)
From:      Richard Scheffenegger <rscheff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r367018 - stable/12/sys/netinet
Message-ID:  <202010242048.09OKmZB9062409@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rscheff
Date: Sat Oct 24 20:48:35 2020
New Revision: 367018
URL: https://svnweb.freebsd.org/changeset/base/367018

Log:
  MFC r366570: Stop sending tiny new data segments during SACK recovery
  
  Consider the currently in-use TCP options when
  calculating the amount of new data to be injected during
  SACK loss recovery. That addresses the effect that very small
  (new) segments could be injected on partial ACKs while
  still performing a SACK loss recovery.
  
  Reported by:	Liang Tian
  Reviewed by:	tuexen, chengc_netapp.com
  MFC after:	2 weeks
  Sponsored by:	NetApp, Inc.
  Differential Revision:	https://reviews.freebsd.org/D26446

Modified:
  stable/12/sys/netinet/tcp_output.c
  stable/12/sys/netinet/tcp_sack.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/netinet/tcp_output.c
==============================================================================
--- stable/12/sys/netinet/tcp_output.c	Sat Oct 24 20:23:20 2020	(r367017)
+++ stable/12/sys/netinet/tcp_output.c	Sat Oct 24 20:48:35 2020	(r367018)
@@ -322,7 +322,7 @@ again:
 			sendalot = 1;
 			TCPSTAT_INC(tcps_sack_rexmits);
 			TCPSTAT_ADD(tcps_sack_rexmit_bytes,
-			    min(len, tp->t_maxseg));
+			    min(len, tcp_maxseg(tp)));
 		}
 	}
 after_sack_rexmit:
@@ -841,7 +841,6 @@ send:
 			if (flags & TH_SYN)
 				to.to_flags |= TOF_SACKPERM;
 			else if (TCPS_HAVEESTABLISHED(tp->t_state) &&
-			    (tp->t_flags & TF_SACK_PERMIT) &&
 			    tp->rcv_numsacks > 0) {
 				to.to_flags |= TOF_SACK;
 				to.to_nsacks = tp->rcv_numsacks;

Modified: stable/12/sys/netinet/tcp_sack.c
==============================================================================
--- stable/12/sys/netinet/tcp_sack.c	Sat Oct 24 20:23:20 2020	(r367017)
+++ stable/12/sys/netinet/tcp_sack.c	Sat Oct 24 20:48:35 2020	(r367018)
@@ -787,15 +787,16 @@ void
 tcp_sack_partialack(struct tcpcb *tp, struct tcphdr *th)
 {
 	int num_segs = 1;
+	u_int maxseg = tcp_maxseg(tp);
 
 	INP_WLOCK_ASSERT(tp->t_inpcb);
 	tcp_timer_activate(tp, TT_REXMT, 0);
 	tp->t_rtttime = 0;
 	/* Send one or 2 segments based on how much new data was acked. */
-	if ((BYTES_THIS_ACK(tp, th) / tp->t_maxseg) >= 2)
+	if ((BYTES_THIS_ACK(tp, th) / maxseg) >= 2)
 		num_segs = 2;
 	tp->snd_cwnd = (tp->sackhint.sack_bytes_rexmit +
-	    (tp->snd_nxt - tp->sack_newdata) + num_segs * tp->t_maxseg);
+	    (tp->snd_nxt - tp->sack_newdata) + num_segs * maxseg);
 	if (tp->snd_cwnd > tp->snd_ssthresh)
 		tp->snd_cwnd = tp->snd_ssthresh;
 	tp->t_flags |= TF_ACKNOW;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202010242048.09OKmZB9062409>