Make igmp sysctl knobs namespace aware
Subsystems (4)
cover Make igmp sysctl knobs namespace aware
This series continue making more of the net related sysctls namespace aware. The first 2 and last patches are straight forward and convert sysctls which weren't defined to be namespace aware. The only thing in them is that each removes a define which is used in only one place (to initialise the respective sysctl) so I don't think this is a huge loss.
The third patch however, converts igmp_llm_reports which was already defined in the ipv4_net_table but wasn't using any of the net namespace infrastructure.
Nikolay Borisov (4):
igmp: Namespaceify igmp_max_memberships sysctl knob
igmp: Namespaceify igmp_max_msf sysctl knob
igmp: Namespaceify igmp_llm_reports sysctl knob
igmp: Namespacify igmp_qrv sysctl knob
include/linux/igmp.h | 5 ---- include/net/netns/ipv4.h | 5 ++++ net/ipv4/igmp.c | 64 ++++++++++++++++++++++++---------------------- net/ipv4/ip_sockglue.c | 5 ++-- net/ipv4/sysctl_net_ipv4.c | 50 ++++++++++++++++++------------------ net/ipv4/tcp_ipv4.c | 6 +++++ 6 files changed, 73 insertions(+), 62 deletions(-)
Signature · 1 line
2.5.0
PATCH 1/4 igmp: Namespaceify igmp_max_memberships sysctl knob
--- include/linux/igmp.h | 1 - include/net/netns/ipv4.h | 2 ++ net/ipv4/igmp.c | 4 +--- net/ipv4/sysctl_net_ipv4.c | 14 +++++++------- net/ipv4/tcp_ipv4.c | 2 ++ 5 files changed, 12 insertions(+), 11 deletions(-)
include/linux/igmp.h +0 -1
@@ -38,7 +38,6 @@ static inline struct igmpv3_query * }extern int sysctl_igmp_llm_reports; -extern int sysctl_igmp_max_memberships;extern int sysctl_igmp_max_msf;extern int sysctl_igmp_qrv;
include/net/netns/ipv4.h +2 -0
@@ -108,6 +108,8 @@ struct netns_ipv4 {int sysctl_tcp_fin_timeout;unsigned int sysctl_tcp_notsent_lowat; +int sysctl_igmp_max_memberships; +struct ping_group_range ping_group_range;atomic_t dev_addr_genid;
net/ipv4/igmp.c +1 -3
@@ -107,7 +107,6 @@#include <linux/seq_file.h> #endif -#define IP_MAX_MEMBERSHIPS 20#define IP_MAX_MSF 10/* IGMP reports for link-local multicast groups are enabled by default */
@@ -1727,7 +1726,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_memberships__read_mostly =IP_MAX_MEMBERSHIPS ;int sysctl_igmp_max_msf__read_mostly =IP_MAX_MSF ;#ifdef CONFIG_IP_MULTICAST int sysctl_igmp_qrv__read_mostly =IGMP_QUERY_ROBUSTNESS_VARIABLE ;
@@ -2074,7 +2072,7 @@ int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr) count++; } err = -ENOBUFS ; -if (count >= sysctl_igmp_max_memberships) +if (count >= net->ipv4.sysctl_igmp_max_memberships) goto done; iml =sock_kmalloc (sk,sizeof (*iml),GFP_KERNEL );if (!iml)
net/ipv4/sysctl_net_ipv4.c +7 -7
@@ -368,13 +368,6 @@ static struct ctl_table ipv4_table[] = { .proc_handler = proc_dointvec }, { - .procname = "igmp_max_memberships", - .data = &sysctl_igmp_max_memberships, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec - }, - { .procname = "igmp_max_msf", .data = &sysctl_igmp_max_msf, .maxlen = sizeof(int),
@@ -872,6 +865,13 @@ static struct ctl_table ipv4_net_table[] = { .proc_handler = proc_dointvec }, { + .procname = "igmp_max_memberships", + .data = &init_net.ipv4.sysctl_igmp_max_memberships, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, + { .procname = "tcp_keepalive_time", .data = &init_net.ipv4.sysctl_tcp_keepalive_time, .maxlen = sizeof(int),
net/ipv4/tcp_ipv4.c +2 -0
@@ -2397,6 +2397,8 @@ static int __net_init tcp_sk_init(struct net *net) net->ipv4.sysctl_tcp_fin_timeout =TCP_FIN_TIMEOUT ; net->ipv4.sysctl_tcp_notsent_lowat =UINT_MAX ; + net->ipv4.sysctl_igmp_max_memberships =20 ; +return 0 ; fail:tcp_sk_exit (net);
Signature · 1 line
2.5.0
PATCH 2/4 igmp: Namespaceify igmp_max_msf sysctl knob
In reply to Nikolay Borisov--- include/linux/igmp.h | 1 - include/net/netns/ipv4.h | 1 + net/ipv4/igmp.c | 5 +---- net/ipv4/ip_sockglue.c | 5 +++-- net/ipv4/sysctl_net_ipv4.c | 14 +++++++------- net/ipv4/tcp_ipv4.c | 1 + 6 files changed, 13 insertions(+), 14 deletions(-)
include/linux/igmp.h +0 -1
@@ -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 {
include/net/netns/ipv4.h +1 -0
@@ -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;
net/ipv4/igmp.c +1 -4
@@ -107,8 +107,6 @@#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; }
net/ipv4/ip_sockglue.c +3 -2
@@ -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; }
net/ipv4/sysctl_net_ipv4.c +7 -7
@@ -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",
@@ -872,6 +865,13 @@ static struct ctl_table ipv4_net_table[] = { .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, .maxlen = sizeof(int),
net/ipv4/tcp_ipv4.c +1 -0
@@ -2398,6 +2398,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:
Signature · 1 line
2.5.0
PATCH 3/4 igmp: Namespaceify igmp_llm_reports sysctl knob
In reply to Nikolay BorisovThis was initially introduced in commit df2cf4a78e48 ("IGMP: Inhibit reports for local multicast groups") by defining the sysctl in the ipv4_net_table array, however it was never implemented to be namespace aware. Fix this by changing the code accordingly.
--- include/linux/igmp.h | 1 - include/net/netns/ipv4.h | 1 + net/ipv4/igmp.c | 26 +++++++++++++++----------- net/ipv4/sysctl_net_ipv4.c | 2 +- net/ipv4/tcp_ipv4.c | 2 ++ 5 files changed, 19 insertions(+), 13 deletions(-)
include/linux/igmp.h +0 -1
@@ -37,7 +37,6 @@ static inline struct igmpv3_query *return (struct igmpv3_query *)skb_transport_header (skb); } -extern int sysctl_igmp_llm_reports;extern int sysctl_igmp_qrv;struct ip_sf_socklist {
include/net/netns/ipv4.h +1 -0
@@ -110,6 +110,7 @@ struct netns_ipv4 {int sysctl_igmp_max_memberships;int sysctl_igmp_max_msf; +int sysctl_igmp_llm_reports;struct ping_group_range ping_group_range;
net/ipv4/igmp.c +15 -11
@@ -107,9 +107,6 @@#include <linux/seq_file.h> #endif -/* IGMP reports for link-local multicast groups are enabled by default */ -int sysctl_igmp_llm_reports__read_mostly =1 ; -#ifdef CONFIG_IP_MULTICAST /* Parameter names and values are taken from igmp-v2-06 draft */
@@ -430,6 +427,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc, int type, int gdeleted, int sdeleted) { struct net_device *dev = pmc->interface->dev; +struct net *net =dev_net (dev);struct igmpv3_report *pih;struct igmpv3_grec *pgr =NULL ;struct ip_sf_list *psf, *psf_next, *psf_prev, **psf_list;
@@ -437,7 +435,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,if (pmc->multiaddr ==IGMP_ALL_HOSTS )return skb; -if (ipv4_is_local_multicast (pmc->multiaddr) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (pmc->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)return skb; isquery = type == IGMPV3_MODE_IS_INCLUDE ||
@@ -540,6 +538,7 @@ empty_source:static int igmpv3_send_report (struct in_device *in_dev,struct ip_mc_list *pmc) {struct sk_buff *skb =NULL ; +struct net *net =dev_net (in_dev->dev);int type;if (!pmc) {
@@ -548,7 +547,7 @@ static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)if (pmc->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (pmc->multiaddr) && - !sysctl_igmp_llm_reports) + !net->ipv4.sysctl_igmp_llm_reports)continue ;spin_lock_bh (&pmc->lock);if (pmc->sfcount[MCAST_EXCLUDE ])
@@ -684,7 +683,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,if (type ==IGMPV3_HOST_MEMBERSHIP_REPORT )return igmpv3_send_report (in_dev, pmc); -if (ipv4_is_local_multicast (group) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (group) && !net->ipv4.sysctl_igmp_llm_reports)return 0 ;if (type ==IGMP_HOST_LEAVE_MESSAGE )
@@ -855,12 +854,13 @@ static int igmp_marksources(struct ip_mc_list *pmc, int nsrcs, __be32 *srcs)static bool igmp_heard_report (struct in_device *in_dev,__be32 group) {struct ip_mc_list *im; +struct net *net =dev_net (in_dev->dev);/* Timers are only set for non-local groups */ if (group ==IGMP_ALL_HOSTS )return false; -if (ipv4_is_local_multicast (group) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (group) && !net->ipv4.sysctl_igmp_llm_reports)return false;rcu_read_lock ();
@@ -884,6 +884,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,__be32 group = ih->group;int max_delay;int mark =0 ; +struct net *net =dev_net (in_dev->dev);if (len ==8 ) {
@@ -969,7 +970,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,if (im->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (im->multiaddr) && - !sysctl_igmp_llm_reports) + !net->ipv4.sysctl_igmp_llm_reports)continue ;spin_lock_bh (&im->lock);if (im->tm_running)
@@ -1183,6 +1184,7 @@ static void igmpv3_clear_delrec(struct in_device *in_dev)static void igmp_group_dropped (struct ip_mc_list *im) {struct in_device *in_dev = im->interface; +struct net *net =dev_net (in_dev->dev);#ifdef CONFIG_IP_MULTICAST int reporter;#endif
@@ -1195,7 +1197,7 @@ static void igmp_group_dropped(struct ip_mc_list *im)#ifdef CONFIG_IP_MULTICAST if (im->multiaddr ==IGMP_ALL_HOSTS )return ; -if (ipv4_is_local_multicast (im->multiaddr) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)return ; reporter = im->reporter;
@@ -1220,6 +1222,7 @@ static void igmp_group_dropped(struct ip_mc_list *im)static void igmp_group_added (struct ip_mc_list *im) {struct in_device *in_dev = im->interface; +struct net *net =dev_net (in_dev->dev);if (im->loaded ==0 ) { im->loaded =1 ;
@@ -1229,7 +1232,7 @@ static void igmp_group_added(struct ip_mc_list *im)#ifdef CONFIG_IP_MULTICAST if (im->multiaddr ==IGMP_ALL_HOSTS )return ; -if (ipv4_is_local_multicast (im->multiaddr) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)return ;if (in_dev->dead)
@@ -1530,6 +1533,7 @@ static void ip_mc_rejoin_groups(struct in_device *in_dev)#ifdef CONFIG_IP_MULTICAST struct ip_mc_list *im;int type; +struct net *net =dev_net (in_dev->dev);ASSERT_RTNL ();
@@ -1537,7 +1541,7 @@ static void ip_mc_rejoin_groups(struct in_device *in_dev)if (im->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (im->multiaddr) && - !sysctl_igmp_llm_reports) + !net->ipv4.sysctl_igmp_llm_reports)continue ;/* a failover is happening and switches
net/ipv4/sysctl_net_ipv4.c +1 -1
@@ -852,7 +852,7 @@ static struct ctl_table ipv4_net_table[] = { }, { .procname = "igmp_link_local_mcast_reports", - .data = &sysctl_igmp_llm_reports, + .data = &init_net.ipv4.sysctl_igmp_llm_reports, .maxlen = sizeof(int), .mode =0644 , .proc_handler = proc_dointvec
net/ipv4/tcp_ipv4.c +2 -0
@@ -2399,6 +2399,8 @@ static int __net_init tcp_sk_init(struct net *net) net->ipv4.sysctl_igmp_max_memberships =20 ; net->ipv4.sysctl_igmp_max_msf =10 ; +/* IGMP reports for link-local multicast groups are enabled by default */ + net->ipv4.sysctl_igmp_llm_reports =1 ;return 0 ; fail:
Signature · 1 line
2.5.0
kbuild test robot
build botRe: [PATCH 3/4] igmp: Namespaceify igmp_llm_reports sysctl knob
reproduce:
Hi Nikolay,
[auto build test WARNING on net-next/master]
[also build test WARNING on next-20160208]
[cannot apply to net/master v4.5-rc3]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/Nikolay-Borisov/Make-igmp-sysctl-knobs-namespace-aware/20160209-053257 config: x86_64-randconfig-x017-201606 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64
All warnings (new ones prefixed by >>):
net/ipv4/igmp.c: In function 'igmp_group_dropped':
>> net/ipv4/igmp.c:1187:14: warning: unused variable 'net' [-Wunused-variable]
struct net *net = dev_net(in_dev->dev);
^
net/ipv4/igmp.c: In function 'igmp_group_added':
net/ipv4/igmp.c:1225:14: warning: unused variable 'net' [-Wunused-variable]
struct net *net = dev_net(in_dev->dev);
^vim +/net +1187 net/ipv4/igmp.c
1171 spin_lock_bh(&pmc->lock);
1172 psf = pmc->tomb;
1173 pmc->tomb = NULL;
1174 spin_unlock_bh(&pmc->lock);
1175 for (; psf; psf = psf_next) {
1176 psf_next = psf->sf_next;
1177 kfree(psf);
1178 }
1179 }
1180 rcu_read_unlock();
1181 }
1182 #endif
1183
1184 static void igmp_group_dropped(struct ip_mc_list *im)
1185 {
1186 struct in_device *in_dev = im->interface;
> 1187 struct net *net = dev_net(in_dev->dev);
1188 #ifdef CONFIG_IP_MULTICAST
1189 int reporter;
1190 #endif
1191
1192 if (im->loaded) {
1193 im->loaded = 0;
1194 ip_mc_filter_del(in_dev, im->multiaddr);
1195 }
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
PATCH v2 3/4 igmp: Namespaceify igmp_llm_reports sysctl knob
In reply to Nikolay BorisovFrom: Nikolay Borisov <[email protected]>
This was initially introduced in df2cf4a78e488d26 ("IGMP: Inhibit reports for local multicast groups") by defining the sysctl in the ipv4_net_table array, however it was never implemented to be namespace aware. Fix this by changing the code accordingly.
---
v2:
Move definition of a local struct net var
inside ifdef to silence build warning
include/linux/igmp.h | 1 - include/net/netns/ipv4.h | 1 + net/ipv4/igmp.c | 26 +++++++++++++++----------- net/ipv4/sysctl_net_ipv4.c | 2 +- net/ipv4/tcp_ipv4.c | 2 ++ 5 files changed, 19 insertions(+), 13 deletions(-)
include/linux/igmp.h +0 -1
@@ -37,7 +37,6 @@ static inline struct igmpv3_query *return (struct igmpv3_query *)skb_transport_header (skb); } -extern int sysctl_igmp_llm_reports;extern int sysctl_igmp_qrv;struct ip_sf_socklist {
include/net/netns/ipv4.h +1 -0
@@ -110,6 +110,7 @@ struct netns_ipv4 {int sysctl_igmp_max_memberships;int sysctl_igmp_max_msf; +int sysctl_igmp_llm_reports;struct ping_group_range ping_group_range;
net/ipv4/igmp.c +15 -11
@@ -107,9 +107,6 @@#include <linux/seq_file.h> #endif -/* IGMP reports for link-local multicast groups are enabled by default */ -int sysctl_igmp_llm_reports__read_mostly =1 ; -#ifdef CONFIG_IP_MULTICAST /* Parameter names and values are taken from igmp-v2-06 draft */
@@ -430,6 +427,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc, int type, int gdeleted, int sdeleted) { struct net_device *dev = pmc->interface->dev; +struct net *net =dev_net (dev);struct igmpv3_report *pih;struct igmpv3_grec *pgr =NULL ;struct ip_sf_list *psf, *psf_next, *psf_prev, **psf_list;
@@ -437,7 +435,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,if (pmc->multiaddr ==IGMP_ALL_HOSTS )return skb; -if (ipv4_is_local_multicast (pmc->multiaddr) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (pmc->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)return skb; isquery = type == IGMPV3_MODE_IS_INCLUDE ||
@@ -540,6 +538,7 @@ empty_source:static int igmpv3_send_report (struct in_device *in_dev,struct ip_mc_list *pmc) {struct sk_buff *skb =NULL ; +struct net *net =dev_net (in_dev->dev);int type;if (!pmc) {
@@ -548,7 +547,7 @@ static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)if (pmc->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (pmc->multiaddr) && - !sysctl_igmp_llm_reports) + !net->ipv4.sysctl_igmp_llm_reports)continue ;spin_lock_bh (&pmc->lock);if (pmc->sfcount[MCAST_EXCLUDE ])
@@ -684,7 +683,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,if (type ==IGMPV3_HOST_MEMBERSHIP_REPORT )return igmpv3_send_report (in_dev, pmc); -if (ipv4_is_local_multicast (group) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (group) && !net->ipv4.sysctl_igmp_llm_reports)return 0 ;if (type ==IGMP_HOST_LEAVE_MESSAGE )
@@ -855,12 +854,13 @@ static int igmp_marksources(struct ip_mc_list *pmc, int nsrcs, __be32 *srcs)static bool igmp_heard_report (struct in_device *in_dev,__be32 group) {struct ip_mc_list *im; +struct net *net =dev_net (in_dev->dev);/* Timers are only set for non-local groups */ if (group ==IGMP_ALL_HOSTS )return false; -if (ipv4_is_local_multicast (group) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (group) && !net->ipv4.sysctl_igmp_llm_reports)return false;rcu_read_lock ();
@@ -884,6 +884,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,__be32 group = ih->group;int max_delay;int mark =0 ; +struct net *net =dev_net (in_dev->dev);if (len ==8 ) {
@@ -969,7 +970,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,if (im->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (im->multiaddr) && - !sysctl_igmp_llm_reports) + !net->ipv4.sysctl_igmp_llm_reports)continue ;spin_lock_bh (&im->lock);if (im->tm_running)
@@ -1184,6 +1185,7 @@ static void igmp_group_dropped(struct ip_mc_list *im) {struct in_device *in_dev = im->interface;#ifdef CONFIG_IP_MULTICAST +struct net *net =dev_net (in_dev->dev);int reporter;#endif
@@ -1195,7 +1197,7 @@ static void igmp_group_dropped(struct ip_mc_list *im)#ifdef CONFIG_IP_MULTICAST if (im->multiaddr ==IGMP_ALL_HOSTS )return ; -if (ipv4_is_local_multicast (im->multiaddr) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)return ; reporter = im->reporter;
@@ -1220,6 +1222,7 @@ static void igmp_group_dropped(struct ip_mc_list *im)static void igmp_group_added (struct ip_mc_list *im) {struct in_device *in_dev = im->interface; +struct net *net =dev_net (in_dev->dev);if (im->loaded ==0 ) { im->loaded =1 ;
@@ -1229,7 +1232,7 @@ static void igmp_group_added(struct ip_mc_list *im)#ifdef CONFIG_IP_MULTICAST if (im->multiaddr ==IGMP_ALL_HOSTS )return ; -if (ipv4_is_local_multicast (im->multiaddr) && !sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports)return ;if (in_dev->dead)
@@ -1530,6 +1533,7 @@ static void ip_mc_rejoin_groups(struct in_device *in_dev)#ifdef CONFIG_IP_MULTICAST struct ip_mc_list *im;int type; +struct net *net =dev_net (in_dev->dev);ASSERT_RTNL ();
@@ -1537,7 +1541,7 @@ static void ip_mc_rejoin_groups(struct in_device *in_dev)if (im->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (im->multiaddr) && - !sysctl_igmp_llm_reports) + !net->ipv4.sysctl_igmp_llm_reports)continue ;/* a failover is happening and switches
net/ipv4/sysctl_net_ipv4.c +1 -1
@@ -852,7 +852,7 @@ static struct ctl_table ipv4_net_table[] = { }, { .procname = "igmp_link_local_mcast_reports", - .data = &sysctl_igmp_llm_reports, + .data = &init_net.ipv4.sysctl_igmp_llm_reports, .maxlen = sizeof(int), .mode =0644 , .proc_handler = proc_dointvec
net/ipv4/tcp_ipv4.c +2 -0
@@ -2399,6 +2399,8 @@ static int __net_init tcp_sk_init(struct net *net) net->ipv4.sysctl_igmp_max_memberships =20 ; net->ipv4.sysctl_igmp_max_msf =10 ; +/* IGMP reports for link-local multicast groups are enabled by default */ + net->ipv4.sysctl_igmp_llm_reports =1 ;return 0 ; fail:
Signature · 1 line
2.5.0
PATCH 4/4 igmp: Namespacify igmp_qrv sysctl knob
In reply to Nikolay Borisov--- include/linux/igmp.h | 2 -- include/net/netns/ipv4.h | 1 + net/ipv4/igmp.c | 29 +++++++++++++++++------------ net/ipv4/sysctl_net_ipv4.c | 20 ++++++++++---------- net/ipv4/tcp_ipv4.c | 1 + 5 files changed, 29 insertions(+), 24 deletions(-)
include/linux/igmp.h +0 -2
@@ -37,8 +37,6 @@ static inline struct igmpv3_query *return (struct igmpv3_query *)skb_transport_header (skb); } -extern int sysctl_igmp_qrv; -struct ip_sf_socklist {unsigned int sl_max;unsigned int sl_count;
include/net/netns/ipv4.h +1 -0
@@ -111,6 +111,7 @@ struct netns_ipv4 {int sysctl_igmp_max_memberships;int sysctl_igmp_max_msf;int sysctl_igmp_llm_reports; +int sysctl_igmp_qrv;struct ping_group_range ping_group_range;
net/ipv4/igmp.c +17 -12
@@ -762,9 +762,10 @@ static void igmp_ifc_timer_expire(unsigned long data)static void igmp_ifc_event (struct in_device *in_dev) { +struct net *net =dev_net (in_dev->dev);if (IGMP_V1_SEEN (in_dev) ||IGMP_V2_SEEN (in_dev))return ; - in_dev->mr_ifc_count = in_dev->mr_qrv ?: sysctl_igmp_qrv; + in_dev->mr_ifc_count = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;igmp_ifc_start_timer (in_dev,1 ); }
@@ -1086,6 +1087,7 @@ static void ip_mc_filter_del(struct in_device *in_dev, __be32 addr)static void igmpv3_add_delrec (struct in_device *in_dev,struct ip_mc_list *im) {struct ip_mc_list *pmc; +struct net *net =dev_net (in_dev->dev);/* this is an "ip_mc_list" for convenience; only the fields below * are actually used. In particular, the refcnt and users are not
@@ -1100,7 +1102,7 @@ static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im) pmc->interface = im->interface;in_dev_hold (in_dev); pmc->multiaddr = im->multiaddr; - pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; + pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; pmc->sfmode = im->sfmode;if (pmc->sfmode ==MCAST_INCLUDE ) {struct ip_sf_list *psf;
@@ -1245,7 +1247,7 @@ static void igmp_group_added(struct ip_mc_list *im) }/* else, v3 */ - im->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; + im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;igmp_ifc_event (in_dev);#endif }
@@ -1314,6 +1316,7 @@ static void ip_mc_hash_remove(struct in_device *in_dev,void ip_mc_inc_group (struct in_device *in_dev,__be32 addr) {struct ip_mc_list *im; +struct net *net =dev_net (in_dev->dev);ASSERT_RTNL ();
@@ -1340,7 +1343,7 @@ void ip_mc_inc_group(struct in_device *in_dev, __be32 addr)spin_lock_init (&im->lock);#ifdef CONFIG_IP_MULTICAST setup_timer (&im->timer, igmp_timer_expire, (unsigned long )im); - im->unsolicit_count = sysctl_igmp_qrv; + im->unsolicit_count = net->ipv4.sysctl_igmp_qrv;#endif im->next_rcu = in_dev->mc_list;
@@ -1640,6 +1643,7 @@ void ip_mc_down(struct in_device *in_dev)void ip_mc_init_dev (struct in_device *in_dev) { +struct net *net =dev_net (in_dev->dev);ASSERT_RTNL ();#ifdef CONFIG_IP_MULTICAST
@@ -1647,7 +1651,7 @@ void ip_mc_init_dev(struct in_device *in_dev) (unsigned long)in_dev);setup_timer (&in_dev->mr_ifc_timer, igmp_ifc_timer_expire, (unsigned long )in_dev); - in_dev->mr_qrv = sysctl_igmp_qrv; + in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv;#endif spin_lock_init (&in_dev->mc_tomb_lock);
@@ -1658,11 +1662,12 @@ void ip_mc_init_dev(struct in_device *in_dev)void ip_mc_up (struct in_device *in_dev) {struct ip_mc_list *pmc; +struct net *net =dev_net (in_dev->dev);ASSERT_RTNL ();#ifdef CONFIG_IP_MULTICAST - in_dev->mr_qrv = sysctl_igmp_qrv; + in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv;#endif ip_mc_inc_group (in_dev,IGMP_ALL_HOSTS );
@@ -1728,9 +1733,6 @@ static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr)/* * Join a socket to a group */ -#ifdef CONFIG_IP_MULTICAST -int sysctl_igmp_qrv__read_mostly =IGMP_QUERY_ROBUSTNESS_VARIABLE ; -#endif static int ip_mc_del1_src (struct ip_mc_list *pmc,int sfmode,__be32 *psfsrc)
@@ -1755,6 +1757,7 @@ static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,if (!psf->sf_count[MCAST_INCLUDE ] && !psf->sf_count[MCAST_EXCLUDE ]) {#ifdef CONFIG_IP_MULTICAST struct in_device *in_dev = pmc->interface; +struct net *net =dev_net (in_dev->dev);#endif /* no more filters for this source */
@@ -1765,7 +1768,7 @@ static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,#ifdef CONFIG_IP_MULTICAST if (psf->sf_oldin && !IGMP_V1_SEEN (in_dev) && !IGMP_V2_SEEN (in_dev)) { - psf->sf_crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; + psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; psf->sf_next = pmc->tomb; pmc->tomb = psf; rv =1 ;
@@ -1823,12 +1826,13 @@ static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode, pmc->sfcount[MCAST_INCLUDE]) {#ifdef CONFIG_IP_MULTICAST struct ip_sf_list *psf; +struct net *net =dev_net (in_dev->dev);#endif /* filter mode change */ pmc->sfmode =MCAST_INCLUDE ;#ifdef CONFIG_IP_MULTICAST - pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; + pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; in_dev->mr_ifc_count = pmc->crcount;for (psf = pmc->sources; psf; psf = psf->sf_next) psf->sf_crcount =0 ;
@@ -1995,6 +1999,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, }else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE ] !=0 )) {#ifdef CONFIG_IP_MULTICAST struct ip_sf_list *psf; +struct net *net =dev_net (pmc->interface->dev); in_dev = pmc->interface;#endif
@@ -2006,7 +2011,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,#ifdef CONFIG_IP_MULTICAST /* else no filters; keep old mode for reports */ - pmc->crcount = in_dev->mr_qrv ?: sysctl_igmp_qrv; + pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; in_dev->mr_ifc_count = pmc->crcount;for (psf = pmc->sources; psf; psf = psf->sf_next) psf->sf_crcount =0 ;
net/ipv4/sysctl_net_ipv4.c +10 -10
@@ -367,16 +367,6 @@ static struct ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, -#ifdef CONFIG_IP_MULTICAST - { - .procname = "igmp_qrv", - .data = &sysctl_igmp_qrv, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = &one - }, -#endif { .procname = "inet_peer_threshold", .data = &inet_peer_threshold,
@@ -871,6 +861,16 @@ static struct ctl_table ipv4_net_table[] = { .mode = 0644, .proc_handler = proc_dointvec }, +#ifdef CONFIG_IP_MULTICAST + { + .procname = "igmp_qrv", + .data = &init_net.ipv4.sysctl_igmp_qrv, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &one + }, +#endif { .procname = "tcp_keepalive_time", .data = &init_net.ipv4.sysctl_tcp_keepalive_time,
net/ipv4/tcp_ipv4.c +1 -0
@@ -2401,6 +2401,7 @@ static int __net_init tcp_sk_init(struct net *net) net->ipv4.sysctl_igmp_max_msf =10 ;/* IGMP reports for link-local multicast groups are enabled by default */ net->ipv4.sysctl_igmp_llm_reports =1 ; + net->ipv4.sysctl_igmp_qrv =2 ;return 0 ; fail:
Signature · 1 line
2.5.0