igmp: Namespaceify igmp_max_msf sysctl knob
authorNikolay Borisov <kernel@kyup.com>
Mon, 8 Feb 2016 21:29:22 +0000 (23:29 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Feb 2016 14:59:22 +0000 (09:59 -0500)
Signed-off-by: Nikolay Borisov <kernel@kyup.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/igmp.h
include/net/netns/ipv4.h
net/ipv4/igmp.c
net/ipv4/ip_sockglue.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp_ipv4.c

index 57d6d06ce0b36039acda8dca6991de36456f4a2a..a91ec9f575e70eb07fba94ea41c9676b2ad2a1c0 100644 (file)
@@ -38,7 +38,6 @@ static inline struct igmpv3_query *
 }
 
 extern int sysctl_igmp_llm_reports;
-extern int sysctl_igmp_max_msf;
 extern int sysctl_igmp_qrv;
 
 struct ip_sf_socklist {
index 759cf624eec236c5989635d238be6edda7e100ef..522a2cfe1ad932924c103a4d284ab5b95152f1d8 100644 (file)
@@ -109,6 +109,7 @@ struct netns_ipv4 {
        unsigned int sysctl_tcp_notsent_lowat;
 
        int sysctl_igmp_max_memberships;
+       int sysctl_igmp_max_msf;
 
        struct ping_group_range ping_group_range;
 
index 5b86257c9d6bb012061f54e59f378da62e14e06e..6da2e467b63cf1cb0c8b477ce65a65dec16f7a3f 100644 (file)
 #include <linux/seq_file.h>
 #endif
 
-#define IP_MAX_MSF             10
-
 /* IGMP reports for link-local multicast groups are enabled by default */
 int sysctl_igmp_llm_reports __read_mostly = 1;
 
@@ -1726,7 +1724,6 @@ static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr)
 /*
  *     Join a socket to a group
  */
-int sysctl_igmp_max_msf __read_mostly = IP_MAX_MSF;
 #ifdef CONFIG_IP_MULTICAST
 int sysctl_igmp_qrv __read_mostly = IGMP_QUERY_ROBUSTNESS_VARIABLE;
 #endif
@@ -2244,7 +2241,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
        }
        /* else, add a new source to the filter */
 
-       if (psl && psl->sl_count >= sysctl_igmp_max_msf) {
+       if (psl && psl->sl_count >= net->ipv4.sysctl_igmp_max_msf) {
                err = -ENOBUFS;
                goto done;
        }
index 5f73a7c03e27d334c771f144825c4a2f718d71ba..92808f147ef5bafa61ce538ec5cb99df8945e45d 100644 (file)
@@ -571,6 +571,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                            int optname, char __user *optval, unsigned int optlen)
 {
        struct inet_sock *inet = inet_sk(sk);
+       struct net *net = sock_net(sk);
        int val = 0, err;
        bool needs_rtnl = setsockopt_needs_rtnl(optname);
 
@@ -910,7 +911,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                }
                /* numsrc >= (1G-4) overflow in 32 bits */
                if (msf->imsf_numsrc >= 0x3ffffffcU ||
-                   msf->imsf_numsrc > sysctl_igmp_max_msf) {
+                   msf->imsf_numsrc > net->ipv4.sysctl_igmp_max_msf) {
                        kfree(msf);
                        err = -ENOBUFS;
                        break;
@@ -1065,7 +1066,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
 
                /* numsrc >= (4G-140)/128 overflow in 32 bits */
                if (gsf->gf_numsrc >= 0x1ffffff ||
-                   gsf->gf_numsrc > sysctl_igmp_max_msf) {
+                   gsf->gf_numsrc > net->ipv4.sysctl_igmp_max_msf) {
                        err = -ENOBUFS;
                        goto mc_msf_out;
                }
index 6ea3dbb96db47e95617283e0e5c9ef3c6d6a28b2..225659a02cf2a4b72bd5a7d9b23fd062c6fb006b 100644 (file)
@@ -367,13 +367,6 @@ static struct ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
-       {
-               .procname       = "igmp_max_msf",
-               .data           = &sysctl_igmp_max_msf,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = proc_dointvec
-       },
 #ifdef CONFIG_IP_MULTICAST
        {
                .procname       = "igmp_qrv",
@@ -871,6 +864,13 @@ static struct ctl_table ipv4_net_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
+       {
+               .procname       = "igmp_max_msf",
+               .data           = &init_net.ipv4.sysctl_igmp_max_msf,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec
+       },
        {
                .procname       = "tcp_keepalive_time",
                .data           = &init_net.ipv4.sysctl_tcp_keepalive_time,
index 4b203789900b3016f68ab900e0bfb3f9e7a6b9dc..055d8a9a0c613fb169d33e76c15c6986568577a5 100644 (file)
@@ -2400,6 +2400,7 @@ static int __net_init tcp_sk_init(struct net *net)
        net->ipv4.sysctl_tcp_notsent_lowat = UINT_MAX;
 
        net->ipv4.sysctl_igmp_max_memberships = 20;
+       net->ipv4.sysctl_igmp_max_msf = 10;
 
        return 0;
 fail: