svn commit: r361565 - releng/11.4/sys/netinet
Richard Scheffenegger
rscheff at FreeBSD.org
Wed May 27 22:34:47 UTC 2020
Author: rscheff
Date: Wed May 27 22:34:46 2020
New Revision: 361565
URL: https://svnweb.freebsd.org/changeset/base/361565
Log:
MFS r361436: MFC r361347: With RFC3168 ECN, CWR SHOULD only be sent with new data.
Overly conservative data receivers may ignore the CWR flag on other
packets, and keep ECE latched. This can result in continuous reduction
of the congestion window, and very poor performance when ECN is
enabled.
This does NOT contain the merge of the change to RACK since at this
time that code does not exist in stable/11, and there is no plan to
merge RACK to stable/11.
PR: 243590
Reviewed by: rgrimes (mentor), rrs
Approved by: re(gjb)
Sponsored by: NetApp, Inc.
Differential Revision: https://reviews.freebsd.org/D23364
Modified:
releng/11.4/sys/netinet/tcp_input.c
releng/11.4/sys/netinet/tcp_output.c
Directory Properties:
releng/11.4/ (props changed)
Modified: releng/11.4/sys/netinet/tcp_input.c
==============================================================================
--- releng/11.4/sys/netinet/tcp_input.c Wed May 27 21:56:45 2020 (r361564)
+++ releng/11.4/sys/netinet/tcp_input.c Wed May 27 22:34:46 2020 (r361565)
@@ -417,9 +417,15 @@ cc_cong_signal(struct tcpcb *tp, struct tcphdr *th, ui
}
break;
case CC_ECN:
- if (!IN_CONGRECOVERY(tp->t_flags)) {
+ if (!IN_CONGRECOVERY(tp->t_flags) ||
+ /*
+ * Allow ECN reaction on ACK to CWR, if
+ * that data segment was also CE marked.
+ */
+ SEQ_GEQ(th->th_ack, tp->snd_recover)) {
+ EXIT_CONGRECOVERY(tp->t_flags);
TCPSTAT_INC(tcps_ecn_rcwnd);
- tp->snd_recover = tp->snd_max;
+ tp->snd_recover = tp->snd_max + 1;
if (tp->t_flags & TF_ECN_PERMIT)
tp->t_flags |= TF_ECN_SND_CWR;
}
Modified: releng/11.4/sys/netinet/tcp_output.c
==============================================================================
--- releng/11.4/sys/netinet/tcp_output.c Wed May 27 21:56:45 2020 (r361564)
+++ releng/11.4/sys/netinet/tcp_output.c Wed May 27 22:34:46 2020 (r361565)
@@ -1161,7 +1161,8 @@ send:
* Ignore pure ack packets, retransmissions and window probes.
*/
if (len > 0 && SEQ_GEQ(tp->snd_nxt, tp->snd_max) &&
- !((tp->t_flags & TF_FORCEDATA) && len == 1)) {
+ !((tp->t_flags & TF_FORCEDATA) && len == 1 &&
+ SEQ_LT(tp->snd_una, tp->snd_max))) {
#ifdef INET6
if (isipv6)
ip6->ip6_flow |= htonl(IPTOS_ECN_ECT0 << 20);
@@ -1169,15 +1170,15 @@ send:
#endif
ip->ip_tos |= IPTOS_ECN_ECT0;
TCPSTAT_INC(tcps_ecn_ect0);
+ /*
+ * Reply with proper ECN notifications.
+ * Only set CWR on new data segments.
+ */
+ if (tp->t_flags & TF_ECN_SND_CWR) {
+ flags |= TH_CWR;
+ tp->t_flags &= ~TF_ECN_SND_CWR;
+ }
}
-
- /*
- * Reply with proper ECN notifications.
- */
- if (tp->t_flags & TF_ECN_SND_CWR) {
- flags |= TH_CWR;
- tp->t_flags &= ~TF_ECN_SND_CWR;
- }
if (tp->t_flags & TF_ECN_SND_ECE)
flags |= TH_ECE;
}
More information about the svn-src-releng
mailing list