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 57d6d06..a91ec9f 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 759cf62..522a2cf 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 5b86257..6da2e46 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 5f73a7c..92808f1 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 6ea3dbb..225659a 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 4b20378..055d8a9 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: