Module Name: src Committed By: christos Date: Wed Apr 10 00:16:04 UTC 2013
Modified Files: src/sys/netinet: tcp_subr.c tcp_usrreq.c tcp_var.h Log Message: Limit the tcp initial window setting to 10, leaving it by default to 4 and simplifying the code in process. Per draft-ietf-initcwnd-08.txt. To generate a diff of this commit: cvs rdiff -u -r1.248 -r1.249 src/sys/netinet/tcp_subr.c cvs rdiff -u -r1.165 -r1.166 src/sys/netinet/tcp_usrreq.c cvs rdiff -u -r1.169 -r1.170 src/sys/netinet/tcp_var.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet/tcp_subr.c diff -u src/sys/netinet/tcp_subr.c:1.248 src/sys/netinet/tcp_subr.c:1.249 --- src/sys/netinet/tcp_subr.c:1.248 Fri Sep 7 22:58:13 2012 +++ src/sys/netinet/tcp_subr.c Tue Apr 9 20:16:03 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_subr.c,v 1.248 2012/09/08 02:58:13 msaitoh Exp $ */ +/* $NetBSD: tcp_subr.c,v 1.249 2013/04/10 00:16:03 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_subr.c,v 1.248 2012/09/08 02:58:13 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_subr.c,v 1.249 2013/04/10 00:16:03 christos Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -173,11 +173,28 @@ int tcp_do_timestamps = 1; /* RFC1323 ti int tcp_ack_on_push = 0; /* set to enable immediate ACK-on-PUSH */ int tcp_do_ecn = 0; /* Explicit Congestion Notification */ #ifndef TCP_INIT_WIN -#define TCP_INIT_WIN 0 /* initial slow start window */ +#define TCP_INIT_WIN 4 /* initial slow start window */ #endif #ifndef TCP_INIT_WIN_LOCAL #define TCP_INIT_WIN_LOCAL 4 /* initial slow start window for local nets */ #endif +/* + * Up to 5 we scale linearly, to reach 3 * 1460; then (iw) * 1460. + * This is to simulate current behavior for iw == 4 + */ +int tcp_init_win_max[] = { + 1 * 1460, + 1 * 1460, + 2 * 1460, + 2 * 1460, + 3 * 1460, + 5 * 1460, + 6 * 1460, + 7 * 1460, + 8 * 1460, + 9 * 1460, + 10 * 1460 +}; int tcp_init_win = TCP_INIT_WIN; int tcp_init_win_local = TCP_INIT_WIN_LOCAL; int tcp_mss_ifmtu = 0; Index: src/sys/netinet/tcp_usrreq.c diff -u src/sys/netinet/tcp_usrreq.c:1.165 src/sys/netinet/tcp_usrreq.c:1.166 --- src/sys/netinet/tcp_usrreq.c:1.165 Sat Jun 2 17:36:47 2012 +++ src/sys/netinet/tcp_usrreq.c Tue Apr 9 20:16:03 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.165 2012/06/02 21:36:47 dsl Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.166 2013/04/10 00:16:03 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -95,7 +95,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.165 2012/06/02 21:36:47 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.166 2013/04/10 00:16:03 christos Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -1600,6 +1600,27 @@ sysctl_tcp_congctl(SYSCTLFN_ARGS) } static int +sysctl_tcp_init_win(SYSCTLFN_ARGS) +{ + int error; + u_int iw; + struct sysctlnode node; + + iw = *(u_int *)rnode->sysctl_data; + node = *rnode; + node.sysctl_data = &iw; + node.sysctl_size = sizeof(iw); + error = sysctl_lookup(SYSCTLFN_CALL(&node)); + if (error || newp == NULL) + return error; + + if (iw >= __arraycount(tcp_init_win_max)) + return EINVAL; + *(u_int *)rnode->sysctl_data = iw; + return 0; +} + +static int sysctl_tcp_keep(SYSCTLFN_ARGS) { int error; @@ -1732,7 +1753,7 @@ sysctl_net_inet_tcp_setup2(struct sysctl CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT, "init_win", SYSCTL_DESCR("Initial TCP congestion window"), - NULL, 0, &tcp_init_win, 0, + sysctl_tcp_init_win, 0, &tcp_init_win, 0, CTL_NET, pf, IPPROTO_TCP, TCPCTL_INIT_WIN, CTL_EOL); sysctl_createv(clog, 0, NULL, NULL, CTLFLAG_PERMANENT|CTLFLAG_READWRITE, @@ -1861,7 +1882,7 @@ sysctl_net_inet_tcp_setup2(struct sysctl CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT, "init_win_local", SYSCTL_DESCR("Initial TCP window size (in segments)"), - NULL, 0, &tcp_init_win_local, 0, + sysctl_tcp_init_win, 0, &tcp_init_win_local, 0, CTL_NET, pf, IPPROTO_TCP, TCPCTL_INIT_WIN_LOCAL, CTL_EOL); sysctl_createv(clog, 0, NULL, NULL, Index: src/sys/netinet/tcp_var.h diff -u src/sys/netinet/tcp_var.h:1.169 src/sys/netinet/tcp_var.h:1.170 --- src/sys/netinet/tcp_var.h:1.169 Thu Feb 2 14:43:08 2012 +++ src/sys/netinet/tcp_var.h Tue Apr 9 20:16:04 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_var.h,v 1.169 2012/02/02 19:43:08 tls Exp $ */ +/* $NetBSD: tcp_var.h,v 1.170 2013/04/10 00:16:04 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -613,8 +613,7 @@ struct syn_cache_head { * Compute the initial window for slow start. */ #define TCP_INITIAL_WINDOW(iw, segsz) \ - (((iw) == 0) ? (min(4 * (segsz), max(2 * (segsz), 4380))) : \ - ((segsz) * (iw))) + min((iw) * (segsz), max(2 * (segsz), tcp_init_win_max[(iw)])) /* * TCP statistics. @@ -797,6 +796,7 @@ extern int tcp_minmss; /* minimal seg s extern int tcp_msl; /* max segment life */ extern int tcp_init_win; /* initial window */ extern int tcp_init_win_local; /* initial window for local nets */ +extern int tcp_init_win_max[11];/* max sizes for values of tcp_init_win_* */ extern int tcp_mss_ifmtu; /* take MSS from interface, not in_maxmtu */ extern int tcp_compat_42; /* work around ancient broken TCP peers */ extern int tcp_cwm; /* enable Congestion Window Monitoring */