svn commit: r367018 - stable/12/sys/netinet
Richard Scheffenegger
rscheff at FreeBSD.org
Sat Oct 24 20:48:36 UTC 2020
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;
More information about the svn-src-stable-12
mailing list