diff options
author | Linus Lüssing <linus.luessing@web.de> | 2013-08-01 01:06:20 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-07-31 17:40:21 -0700 |
commit | b00589af3b04736376f24625ab0b394642e89e29 (patch) | |
tree | 1661811588dd237d229e8bb9f33f8b81d5b98a9f /net/bridge/br_device.c | |
parent | cf3c4c03060b688cbc389ebc5065ebcce5653e96 (diff) | |
download | linux-stable-b00589af3b04736376f24625ab0b394642e89e29.tar.gz linux-stable-b00589af3b04736376f24625ab0b394642e89e29.tar.bz2 linux-stable-b00589af3b04736376f24625ab0b394642e89e29.zip |
bridge: disable snooping if there is no querier
If there is no querier on a link then we won't get periodic reports and
therefore won't be able to learn about multicast listeners behind ports,
potentially leading to lost multicast packets, especially for multicast
listeners that joined before the creation of the bridge.
These lost multicast packets can appear since c5c23260594
("bridge: Add multicast_querier toggle and disable queries by default")
in particular.
With this patch we are flooding multicast packets if our querier is
disabled and if we didn't detect any other querier.
A grace period of the Maximum Response Delay of the querier is added to
give multicast responses enough time to arrive and to be learned from
before disabling the flooding behaviour again.
Signed-off-by: Linus Lüssing <linus.luessing@web.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_device.c')
-rw-r--r-- | net/bridge/br_device.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 2ef66781fedb..69363bd37f64 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -70,7 +70,8 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) } mdst = br_mdb_get(br, skb, vid); - if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) + if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) && + br_multicast_querier_exists(br)) br_multicast_deliver(mdst, skb); else br_flood_deliver(br, skb, false); |