Page MenuHomeFreeBSD

D21798.id64568.diff
No OneTemporary

D21798.id64568.diff

Index: share/man/man4/tcp.4
===================================================================
--- share/man/man4/tcp.4
+++ share/man/man4/tcp.4
@@ -34,7 +34,7 @@
.\" From: @(#)tcp.4 8.1 (Berkeley) 6/5/93
.\" $FreeBSD$
.\"
-.Dd August 26, 2019
+.Dd November 16, 2019
.Dt TCP 4
.Os
.Sh NAME
@@ -538,6 +538,15 @@
Start with small values for lower-capacity links.
Large bursts can cause buffer overruns and packet drops if routers have small
buffers or the link is experiencing congestion.
+.It Va newcwd
+Enable the New Congestion Window Validation mechanism as described in RFC 7661.
+This gently reduces the congestion window during periods, where TCP is
+application limited and the network bandwidth is not utilized completely.
+That prevents self-inflicted packet losses once the application starts to
+transmit data at a higher speed.
+.It Va rfc6675_pipe
+Calculate the bytes in flight using the algorithm described in RFC 6675, and
+is also a prerequisite to enable Proportional Rate Reduction.
.It Va rfc3042
Enable the Limited Transmit algorithm as described in RFC 3042.
It helps avoid timeouts on lossy links and also when the congestion window
Index: sys/netinet/tcp_input.c
===================================================================
--- sys/netinet/tcp_input.c
+++ sys/netinet/tcp_input.c
@@ -150,6 +150,11 @@
&VNET_NAME(drop_synfin), 0,
"Drop TCP packets with SYN+FIN set");
+VNET_DEFINE(int, tcp_do_newcwv) = 0;
+SYSCTL_INT(_net_inet_tcp, OID_AUTO, newcwv, CTLFLAG_VNET | CTLFLAG_RW,
+ &VNET_NAME(tcp_do_newcwv), 0,
+ "Enable New Congestion Window Validation per RFC7661");
+
VNET_DEFINE(int, tcp_do_rfc6675_pipe) = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, rfc6675_pipe, CTLFLAG_VNET | CTLFLAG_RW,
&VNET_NAME(tcp_do_rfc6675_pipe), 0,
@@ -297,7 +302,9 @@
tp->ccv->nsegs = nsegs;
tp->ccv->bytes_this_ack = BYTES_THIS_ACK(tp, th);
- if (tp->snd_cwnd <= tp->snd_wnd)
+ if ((!V_tcp_do_newcwv && (tp->snd_cwnd <= tp->snd_wnd)) ||
+ (V_tcp_do_newcwv && (tp->snd_cwnd <= tp->snd_wnd) &&
+ (tp->snd_cwnd < (tcp_compute_pipe(tp) * 2))))
tp->ccv->flags |= CCF_CWND_LIMITED;
else
tp->ccv->flags &= ~CCF_CWND_LIMITED;
Index: sys/netinet/tcp_stacks/rack.c
===================================================================
--- sys/netinet/tcp_stacks/rack.c
+++ sys/netinet/tcp_stacks/rack.c
@@ -1663,7 +1663,9 @@
tp->ccv->bytes_this_ack = max;
}
}
- if (tp->snd_cwnd <= tp->snd_wnd)
+ if ((!V_tcp_do_newcwv && (tp->snd_cwnd <= tp->snd_wnd)) ||
+ (V_tcp_do_newcwv && (tp->snd_cwnd <= tp->snd_wnd) &&
+ (tp->snd_cwnd < (tcp_compute_pipe(tp) * 2))))
tp->ccv->flags |= CCF_CWND_LIMITED;
else
tp->ccv->flags &= ~CCF_CWND_LIMITED;
Index: sys/netinet/tcp_var.h
===================================================================
--- sys/netinet/tcp_var.h
+++ sys/netinet/tcp_var.h
@@ -767,6 +767,7 @@
VNET_DECLARE(int, tcp_do_autorcvbuf);
VNET_DECLARE(int, tcp_do_autosndbuf);
VNET_DECLARE(int, tcp_do_ecn);
+VNET_DECLARE(int, tcp_do_newcwv);
VNET_DECLARE(int, tcp_do_rfc1323);
VNET_DECLARE(int, tcp_do_rfc3042);
VNET_DECLARE(int, tcp_do_rfc3390);
@@ -789,6 +790,7 @@
VNET_DECLARE(struct inpcbhead, tcb);
VNET_DECLARE(struct inpcbinfo, tcbinfo);
+#define V_tcp_do_newcwv VNET(tcp_do_newcwv)
#define V_drop_synfin VNET(drop_synfin)
#define V_path_mtu_discovery VNET(path_mtu_discovery)
#define V_tcb VNET(tcb)

File Metadata

Mime Type
text/plain
Expires
Tue, Feb 17, 3:15 AM (13 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28799230
Default Alt Text
D21798.id64568.diff (3 KB)

Event Timeline