Commit aef22e5b authored by David Stevens's avatar David Stevens Committed by Patrick McHardy

[IPV4]: Add per-device sysctl to force IGMP version.

parent 6e22ce74
...@@ -21,6 +21,7 @@ struct ipv4_devconf ...@@ -21,6 +21,7 @@ struct ipv4_devconf
int medium_id; int medium_id;
int no_xfrm; int no_xfrm;
int no_policy; int no_policy;
int force_igmp_version;
void *sysctl; void *sysctl;
}; };
......
...@@ -360,6 +360,7 @@ enum ...@@ -360,6 +360,7 @@ enum
NET_IPV4_CONF_MEDIUM_ID=14, NET_IPV4_CONF_MEDIUM_ID=14,
NET_IPV4_CONF_NOXFRM=15, NET_IPV4_CONF_NOXFRM=15,
NET_IPV4_CONF_NOPOLICY=16, NET_IPV4_CONF_NOPOLICY=16,
NET_IPV4_CONF_FORCE_IGMP_VERSION=17,
}; };
/* /proc/sys/net/ipv4/netfilter */ /* /proc/sys/net/ipv4/netfilter */
......
...@@ -1132,7 +1132,7 @@ int ipv4_doint_and_flush_strategy(ctl_table *table, int *name, int nlen, ...@@ -1132,7 +1132,7 @@ int ipv4_doint_and_flush_strategy(ctl_table *table, int *name, int nlen,
static struct devinet_sysctl_table { static struct devinet_sysctl_table {
struct ctl_table_header *sysctl_header; struct ctl_table_header *sysctl_header;
ctl_table devinet_vars[17]; ctl_table devinet_vars[18];
ctl_table devinet_dev[2]; ctl_table devinet_dev[2];
ctl_table devinet_conf_dir[2]; ctl_table devinet_conf_dir[2];
ctl_table devinet_proto_dir[2]; ctl_table devinet_proto_dir[2];
...@@ -1269,6 +1269,15 @@ static struct devinet_sysctl_table { ...@@ -1269,6 +1269,15 @@ static struct devinet_sysctl_table {
.proc_handler = &ipv4_doint_and_flush, .proc_handler = &ipv4_doint_and_flush,
.strategy = &ipv4_doint_and_flush_strategy, .strategy = &ipv4_doint_and_flush_strategy,
}, },
{
.ctl_name = NET_IPV4_CONF_FORCE_IGMP_VERSION,
.procname = "force_igmp_version",
.data = &ipv4_devconf.force_igmp_version,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &ipv4_doint_and_flush,
.strategy = &ipv4_doint_and_flush_strategy,
},
}, },
.devinet_dev = { .devinet_dev = {
{ {
......
...@@ -126,10 +126,14 @@ ...@@ -126,10 +126,14 @@
* contradict to specs provided this delay is small enough. * contradict to specs provided this delay is small enough.
*/ */
#define IGMP_V1_SEEN(in_dev) ((in_dev)->mr_v1_seen && \ #define IGMP_V1_SEEN(in_dev) (ipv4_devconf.force_igmp_version == 1 || \
time_before(jiffies, (in_dev)->mr_v1_seen)) (in_dev)->cnf.force_igmp_version == 1 || \
#define IGMP_V2_SEEN(in_dev) ((in_dev)->mr_v2_seen && \ ((in_dev)->mr_v1_seen && \
time_before(jiffies, (in_dev)->mr_v2_seen)) time_before(jiffies, (in_dev)->mr_v1_seen)))
#define IGMP_V2_SEEN(in_dev) (ipv4_devconf.force_igmp_version == 2 || \
(in_dev)->cnf.force_igmp_version == 2 || \
((in_dev)->mr_v2_seen && \
time_before(jiffies, (in_dev)->mr_v2_seen)))
static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im); static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im);
static void igmpv3_del_delrec(struct in_device *in_dev, __u32 multiaddr); static void igmpv3_del_delrec(struct in_device *in_dev, __u32 multiaddr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment