diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2012-04-12 22:37:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-15 12:51:35 -0400 |
commit | c5c23260594c5701af66ef754916775ba6a46bbc (patch) | |
tree | 2e0f5ce991fd3d3ad77e61745c84a4ca32b8601d /net/bridge/br_sysfs_br.c | |
parent | c83b8fab06fc8c80d6440649f117bb7541df5fd0 (diff) |
bridge: Add multicast_querier toggle and disable queries by default
Sending general queries was implemented as an optimisation to speed
up convergence on start-up. In order to prevent interference with
multicast routers a zero source address has to be used.
Unfortunately these packets appear to cause some multicast-aware
switches to misbehave, e.g., by disrupting multicast packets to us.
Since the multicast snooping feature still functions without sending
our own queries, this patch will change the default to not send
queries.
For those that need queries in order to speed up convergence on start-up,
a toggle is provided to restore the previous behaviour.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_sysfs_br.c')
-rw-r--r-- | net/bridge/br_sysfs_br.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c index 766fd7fb0295..c5c059333eab 100644 --- a/net/bridge/br_sysfs_br.c +++ b/net/bridge/br_sysfs_br.c | |||
@@ -379,6 +379,23 @@ static ssize_t store_multicast_snooping(struct device *d, | |||
379 | static DEVICE_ATTR(multicast_snooping, S_IRUGO | S_IWUSR, | 379 | static DEVICE_ATTR(multicast_snooping, S_IRUGO | S_IWUSR, |
380 | show_multicast_snooping, store_multicast_snooping); | 380 | show_multicast_snooping, store_multicast_snooping); |
381 | 381 | ||
382 | static ssize_t show_multicast_querier(struct device *d, | ||
383 | struct device_attribute *attr, | ||
384 | char *buf) | ||
385 | { | ||
386 | struct net_bridge *br = to_bridge(d); | ||
387 | return sprintf(buf, "%d\n", br->multicast_querier); | ||
388 | } | ||
389 | |||
390 | static ssize_t store_multicast_querier(struct device *d, | ||
391 | struct device_attribute *attr, | ||
392 | const char *buf, size_t len) | ||
393 | { | ||
394 | return store_bridge_parm(d, buf, len, br_multicast_set_querier); | ||
395 | } | ||
396 | static DEVICE_ATTR(multicast_querier, S_IRUGO | S_IWUSR, | ||
397 | show_multicast_querier, store_multicast_querier); | ||
398 | |||
382 | static ssize_t show_hash_elasticity(struct device *d, | 399 | static ssize_t show_hash_elasticity(struct device *d, |
383 | struct device_attribute *attr, char *buf) | 400 | struct device_attribute *attr, char *buf) |
384 | { | 401 | { |
@@ -702,6 +719,7 @@ static struct attribute *bridge_attrs[] = { | |||
702 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING | 719 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING |
703 | &dev_attr_multicast_router.attr, | 720 | &dev_attr_multicast_router.attr, |
704 | &dev_attr_multicast_snooping.attr, | 721 | &dev_attr_multicast_snooping.attr, |
722 | &dev_attr_multicast_querier.attr, | ||
705 | &dev_attr_hash_elasticity.attr, | 723 | &dev_attr_hash_elasticity.attr, |
706 | &dev_attr_hash_max.attr, | 724 | &dev_attr_hash_max.attr, |
707 | &dev_attr_multicast_last_member_count.attr, | 725 | &dev_attr_multicast_last_member_count.attr, |