]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ipv4: Namespaceify tcp_fastopen knob
authorHaishuang Yan <yanhaishuang@cmss.chinamobile.com>
Wed, 27 Sep 2017 03:35:40 +0000 (11:35 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Oct 2017 00:55:54 +0000 (17:55 -0700)
Different namespace application might require enable TCP Fast Open
feature independently of the host.

This patch series continues making more of the TCP Fast Open related
sysctl knobs be per net-namespace.

Reported-by: Luca BRUNO <lucab@debian.org>
Signed-off-by: Haishuang Yan <yanhaishuang@cmss.chinamobile.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/netns/ipv4.h
include/net/tcp.h
net/ipv4/af_inet.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_fastopen.c
net/ipv4/tcp_ipv4.c

index abc84d986da49197850124f4b41527ac2a795772..16420ccaef15563e6698e8492fe90337380feb2b 100644 (file)
@@ -128,6 +128,7 @@ struct netns_ipv4 {
        int sysctl_tcp_timestamps;
        struct inet_timewait_death_row tcp_death_row;
        int sysctl_max_syn_backlog;
+       int sysctl_tcp_fastopen;
 
 #ifdef CONFIG_NET_L3_MASTER_DEV
        int sysctl_udp_l3mdev_accept;
index 770b608c843951e4ade3b87adb9f9eb54e0d10d8..9e414a99034fdd358b07792a7d68029f942cab92 100644 (file)
@@ -240,7 +240,6 @@ void tcp_time_wait(struct sock *sk, int state, int timeo);
 
 
 /* sysctl variables for tcp */
-extern int sysctl_tcp_fastopen;
 extern int sysctl_tcp_retrans_collapse;
 extern int sysctl_tcp_stdurg;
 extern int sysctl_tcp_rfc1337;
index e31108e5ef79c574751bb23773b41c2daf6e0975..ddd126d120acfe38d231396b6caad1321f53ee04 100644 (file)
@@ -195,7 +195,7 @@ int inet_listen(struct socket *sock, int backlog)
 {
        struct sock *sk = sock->sk;
        unsigned char old_state;
-       int err;
+       int err, tcp_fastopen;
 
        lock_sock(sk);
 
@@ -217,8 +217,9 @@ int inet_listen(struct socket *sock, int backlog)
                 * because the socket was in TCP_LISTEN state previously but
                 * was shutdown() rather than close().
                 */
-               if ((sysctl_tcp_fastopen & TFO_SERVER_WO_SOCKOPT1) &&
-                   (sysctl_tcp_fastopen & TFO_SERVER_ENABLE) &&
+               tcp_fastopen = sock_net(sk)->ipv4.sysctl_tcp_fastopen;
+               if ((tcp_fastopen & TFO_SERVER_WO_SOCKOPT1) &&
+                   (tcp_fastopen & TFO_SERVER_ENABLE) &&
                    !inet_csk(sk)->icsk_accept_queue.fastopenq.max_qlen) {
                        fastopen_queue_tune(sk, backlog);
                        tcp_fastopen_init_key_once(true);
index 0d3c038d7b0454eb2213ad88eb7ebfe27504b2ee..e31e853cf486effed1c90d0df1c1c1bfe1db9cb0 100644 (file)
@@ -400,13 +400,6 @@ static struct ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
-       {
-               .procname       = "tcp_fastopen",
-               .data           = &sysctl_tcp_fastopen,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = proc_dointvec,
-       },
        {
                .procname       = "tcp_fastopen_key",
                .mode           = 0600,
@@ -1085,6 +1078,13 @@ static struct ctl_table ipv4_net_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
+       {
+               .procname       = "tcp_fastopen",
+               .data           = &init_net.ipv4.sysctl_tcp_fastopen,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
 #ifdef CONFIG_IP_ROUTE_MULTIPATH
        {
                .procname       = "fib_multipath_use_neigh",
index 5091402720abca1737b60ab51266e9b40b588188..dac56c4ad357d2810880ccda353977f19e947fbb 100644 (file)
@@ -1126,7 +1126,7 @@ static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg,
        struct sockaddr *uaddr = msg->msg_name;
        int err, flags;
 
-       if (!(sysctl_tcp_fastopen & TFO_CLIENT_ENABLE) ||
+       if (!(sock_net(sk)->ipv4.sysctl_tcp_fastopen & TFO_CLIENT_ENABLE) ||
            (uaddr && msg->msg_namelen >= sizeof(uaddr->sa_family) &&
             uaddr->sa_family == AF_UNSPEC))
                return -EOPNOTSUPP;
@@ -2759,7 +2759,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
        case TCP_FASTOPEN_CONNECT:
                if (val > 1 || val < 0) {
                        err = -EINVAL;
-               } else if (sysctl_tcp_fastopen & TFO_CLIENT_ENABLE) {
+               } else if (net->ipv4.sysctl_tcp_fastopen & TFO_CLIENT_ENABLE) {
                        if (sk->sk_state == TCP_CLOSE)
                                tp->fastopen_connect = val;
                        else
index e3c33220c41810c87d1d6eebdd5de0b71930aed0..31b08ec38cb8aeb95601076213fcd9612d8f979b 100644 (file)
@@ -9,8 +9,6 @@
 #include <net/inetpeer.h>
 #include <net/tcp.h>
 
-int sysctl_tcp_fastopen __read_mostly = TFO_CLIENT_ENABLE;
-
 struct tcp_fastopen_context __rcu *tcp_fastopen_ctx;
 
 static DEFINE_SPINLOCK(tcp_fastopen_ctx_lock);
@@ -279,21 +277,22 @@ struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
                              struct request_sock *req,
                              struct tcp_fastopen_cookie *foc)
 {
-       struct tcp_fastopen_cookie valid_foc = { .len = -1 };
        bool syn_data = TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq + 1;
+       int tcp_fastopen = sock_net(sk)->ipv4.sysctl_tcp_fastopen;
+       struct tcp_fastopen_cookie valid_foc = { .len = -1 };
        struct sock *child;
 
        if (foc->len == 0) /* Client requests a cookie */
                NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPFASTOPENCOOKIEREQD);
 
-       if (!((sysctl_tcp_fastopen & TFO_SERVER_ENABLE) &&
+       if (!((tcp_fastopen & TFO_SERVER_ENABLE) &&
              (syn_data || foc->len >= 0) &&
              tcp_fastopen_queue_check(sk))) {
                foc->len = -1;
                return NULL;
        }
 
-       if (syn_data && (sysctl_tcp_fastopen & TFO_SERVER_COOKIE_NOT_REQD))
+       if (syn_data && (tcp_fastopen & TFO_SERVER_COOKIE_NOT_REQD))
                goto fastopen;
 
        if (foc->len >= 0 &&  /* Client presents or requests a cookie */
@@ -347,7 +346,7 @@ bool tcp_fastopen_cookie_check(struct sock *sk, u16 *mss,
                return false;
        }
 
-       if (sysctl_tcp_fastopen & TFO_CLIENT_NO_COOKIE) {
+       if (sock_net(sk)->ipv4.sysctl_tcp_fastopen & TFO_CLIENT_NO_COOKIE) {
                cookie->len = -1;
                return true;
        }
index d9416b5162bc1bdd1acd34fcb4da21cb6b62d0ae..88409b13c9d2264f8bf31e0f53c304c4e6bd9970 100644 (file)
@@ -2472,6 +2472,8 @@ static int __net_init tcp_sk_init(struct net *net)
        net->ipv4.sysctl_tcp_window_scaling = 1;
        net->ipv4.sysctl_tcp_timestamps = 1;
 
+       net->ipv4.sysctl_tcp_fastopen = TFO_CLIENT_ENABLE;
+
        return 0;
 fail:
        tcp_sk_exit(net);