svn commit: r294540 - in head: etc/mtree include share/man/man4 share/man/man9 sys/netinet
Gleb Smirnoff
glebius at FreeBSD.org
Fri Jan 22 02:07:51 UTC 2016
Author: glebius
Date: Fri Jan 22 02:07:48 2016
New Revision: 294540
URL: https://svnweb.freebsd.org/changeset/base/294540
Log:
Provide new socket option TCP_CCALGOOPT, which stands for TCP congestion
control algorithm options. The argument is variable length and is opaque
to TCP, forwarded directly to the algorithm's ctl_output method.
Provide new includes directory netinet/cc, where algorithm specific
headers can be installed.
The new API doesn't yet have any in tree consumers.
The original code written by lstewart.
Reviewed by: rrs, emax
Sponsored by: Netflix
Differential Revision: https://reviews.freebsd.org/D711
Modified:
head/etc/mtree/BSD.include.dist
head/include/Makefile
head/share/man/man4/mod_cc.4
head/share/man/man4/tcp.4
head/share/man/man9/mod_cc.9
head/sys/netinet/tcp.h
head/sys/netinet/tcp_cc.h
head/sys/netinet/tcp_usrreq.c
Modified: head/etc/mtree/BSD.include.dist
==============================================================================
--- head/etc/mtree/BSD.include.dist Fri Jan 22 00:29:11 2016 (r294539)
+++ head/etc/mtree/BSD.include.dist Fri Jan 22 02:07:48 2016 (r294540)
@@ -270,6 +270,8 @@
..
..
netinet
+ cc
+ ..
..
netinet6
..
Modified: head/include/Makefile
==============================================================================
--- head/include/Makefile Fri Jan 22 00:29:11 2016 (r294539)
+++ head/include/Makefile Fri Jan 22 02:07:48 2016 (r294540)
@@ -53,6 +53,7 @@ LSUBDIRS= cam/ata cam/scsi \
geom/raid geom/raid3 geom/shsec geom/stripe geom/virstor \
net/altq \
netgraph/atm netgraph/netflow \
+ netinet/cc \
security/audit \
security/mac_biba security/mac_bsdextended security/mac_lomac \
security/mac_mls security/mac_partition \
Modified: head/share/man/man4/mod_cc.4
==============================================================================
--- head/share/man/man4/mod_cc.4 Fri Jan 22 00:29:11 2016 (r294539)
+++ head/share/man/man4/mod_cc.4 Fri Jan 22 02:07:48 2016 (r294540)
@@ -30,7 +30,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 12, 2015
+.Dd January 21, 2016
.Dt MOD_CC 4
.Os
.Sh NAME
@@ -49,7 +49,9 @@ using the
facility.
.Pp
The default algorithm is NewReno, and all connections use the default unless
-explicitly overridden using the TCP_CONGESTION socket option (see
+explicitly overridden using the
+.Dv TCP_CONGESTION
+socket option (see
.Xr tcp 4
for details).
The default can be changed using a
@@ -57,6 +59,14 @@ The default can be changed using a
MIB variable detailed in the
.Sx MIB Variables
section below.
+.Pp
+Algorithm specific parameters can be set or queried using the
+.Dv TCP_CCALGOOPT
+socket option (see
+.Xr tcp 4
+for details).
+Callers must pass a pointer to an algorithm specific data, and specify
+its size.
.Sh MIB Variables
The framework exposes the following variables in the
.Va net.inet.tcp.cc
Modified: head/share/man/man4/tcp.4
==============================================================================
--- head/share/man/man4/tcp.4 Fri Jan 22 00:29:11 2016 (r294539)
+++ head/share/man/man4/tcp.4 Fri Jan 22 02:07:48 2016 (r294540)
@@ -34,7 +34,7 @@
.\" From: @(#)tcp.4 8.1 (Berkeley) 6/5/93
.\" $FreeBSD$
.\"
-.Dd October 27, 2015
+.Dd January 21, 2016
.Dt TCP 4
.Os
.Sh NAME
@@ -137,6 +137,11 @@ send window size,
receive window size,
and
bandwidth-controlled window space.
+.It Dv TCP_CCALGOOPT
+Set or query congestion control algorithm specific parameters.
+See
+.Xr mod_cc 4
+for details.
.It Dv TCP_CONGESTION
Select or query the congestion control algorithm that TCP will use for the
connection.
Modified: head/share/man/man9/mod_cc.9
==============================================================================
--- head/share/man/man9/mod_cc.9 Fri Jan 22 00:29:11 2016 (r294539)
+++ head/share/man/man9/mod_cc.9 Fri Jan 22 02:07:48 2016 (r294540)
@@ -31,7 +31,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 26, 2014
+.Dd January 21, 2016
.Dt MOD_CC 9
.Os
.Sh NAME
@@ -40,7 +40,8 @@
.Nm CCV
.Nd Modular Congestion Control
.Sh SYNOPSIS
-.In netinet/cc.h
+.In netinet/tcp.h
+.In netinet/tcp_cc.h
.In netinet/cc/cc_module.h
.Fn DECLARE_CC_MODULE "ccname" "ccalgo"
.Fn CCV "ccv" "what"
@@ -74,6 +75,7 @@ struct cc_algo {
void (*cong_signal) (struct cc_var *ccv, uint32_t type);
void (*post_recovery) (struct cc_var *ccv);
void (*after_idle) (struct cc_var *ccv);
+ int (*ctl_output)(struct cc_var *, struct sockopt *, void *);
};
.Ed
.Pp
@@ -166,6 +168,20 @@ function is called when data transfer re
It should be implemented to adjust state as required.
.Pp
The
+.Va ctl_output
+function is called when
+.Xr getsockopt 2
+or
+.Xr setsockopt 2
+is called on a
+.Xr tcp 4
+socket with the
+.Va struct sockopt
+pointer forwarded unmodified from the TCP control, and a
+.Va void *
+pointer to algorithm specific argument.
+.Pp
+The
.Fn DECLARE_CC_MODULE
macro provides a convenient wrapper around the
.Xr DECLARE_MODULE 9
Modified: head/sys/netinet/tcp.h
==============================================================================
--- head/sys/netinet/tcp.h Fri Jan 22 00:29:11 2016 (r294539)
+++ head/sys/netinet/tcp.h Fri Jan 22 02:07:48 2016 (r294540)
@@ -165,6 +165,7 @@ struct tcphdr {
#define TCP_MD5SIG 16 /* use MD5 digests (RFC2385) */
#define TCP_INFO 32 /* retrieve tcp_info structure */
#define TCP_CONGESTION 64 /* get/set congestion control algorithm */
+#define TCP_CCALGOOPT 65 /* get/set cc algorithm specific options */
#define TCP_KEEPINIT 128 /* N, time to establish connection */
#define TCP_KEEPIDLE 256 /* L,N,X start keeplives after this period */
#define TCP_KEEPINTVL 512 /* L,N interval between keepalives */
Modified: head/sys/netinet/tcp_cc.h
==============================================================================
--- head/sys/netinet/tcp_cc.h Fri Jan 22 00:29:11 2016 (r294539)
+++ head/sys/netinet/tcp_cc.h Fri Jan 22 02:07:48 2016 (r294540)
@@ -151,6 +151,9 @@ struct cc_algo {
/* Called for an additional ECN processing apart from RFC3168. */
void (*ecnpkt_handler)(struct cc_var *ccv);
+ /* Called for {get|set}sockopt() on a TCP socket with TCP_CCALGOOPT. */
+ int (*ctl_output)(struct cc_var *, struct sockopt *, void *);
+
STAILQ_ENTRY (cc_algo) entries;
};
Modified: head/sys/netinet/tcp_usrreq.c
==============================================================================
--- head/sys/netinet/tcp_usrreq.c Fri Jan 22 00:29:11 2016 (r294539)
+++ head/sys/netinet/tcp_usrreq.c Fri Jan 22 02:07:48 2016 (r294540)
@@ -1480,7 +1480,33 @@ tcp_default_ctloutput(struct socket *so,
struct tcp_info ti;
struct cc_algo *algo;
char *buf;
-
+
+ /*
+ * For TCP_CCALGOOPT forward the control to CC module, for both
+ * SOPT_SET and SOPT_GET.
+ */
+ switch (sopt->sopt_name) {
+ case TCP_CCALGOOPT:
+ INP_WUNLOCK(inp);
+ buf = malloc(sopt->sopt_valsize, M_TEMP, M_WAITOK | M_ZERO);
+ error = sooptcopyin(sopt, buf, sopt->sopt_valsize,
+ sopt->sopt_valsize);
+ if (error) {
+ free(buf, M_TEMP);
+ return (error);
+ }
+ INP_WLOCK_RECHECK(inp);
+ if (CC_ALGO(tp)->ctl_output != NULL)
+ error = CC_ALGO(tp)->ctl_output(tp->ccv, sopt, buf);
+ else
+ error = ENOENT;
+ INP_WUNLOCK(inp);
+ if (error == 0 && sopt->sopt_dir == SOPT_GET)
+ error = sooptcopyout(sopt, buf, sopt->sopt_valsize);
+ free(buf, M_TEMP);
+ return (error);
+ }
+
switch (sopt->sopt_dir) {
case SOPT_SET:
switch (sopt->sopt_name) {
More information about the svn-src-head
mailing list