summaryrefslogtreecommitdiffstats
path: root/net/bridge/br_input.c
diff options
context:
space:
mode:
authorLinus Lüssing <linus.luessing@web.de>2013-08-01 01:06:20 +0200
committerDavid S. Miller <davem@davemloft.net>2013-07-31 17:40:21 -0700
commitb00589af3b04736376f24625ab0b394642e89e29 (patch)
tree1661811588dd237d229e8bb9f33f8b81d5b98a9f /net/bridge/br_input.c
parentcf3c4c03060b688cbc389ebc5065ebcce5653e96 (diff)
downloadlinux-b00589af3b04736376f24625ab0b394642e89e29.tar.gz
linux-b00589af3b04736376f24625ab0b394642e89e29.tar.bz2
linux-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_input.c')
-rw-r--r--net/bridge/br_input.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index 1b8b8b824cd7..8c561c0aa636 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -101,7 +101,8 @@ int br_handle_frame_finish(struct sk_buff *skb)
unicast = false;
} else if (is_multicast_ether_addr(dest)) {
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)) {
if ((mdst && mdst->mglist) ||
br_multicast_is_router(br))
skb2 = skb;