]>
Commit | Line | Data |
---|---|---|
814f5a02 AD |
1 | From c83b8fab06fc8c80d6440649f117bb7541df5fd0 Mon Sep 17 00:00:00 2001 |
2 | From: Herbert Xu <herbert@gondor.apana.org.au> | |
3 | Date: Fri, 13 Apr 2012 02:37:42 +0000 | |
4 | Subject: bridge: Restart queries when last querier expires | |
5 | ||
6 | As it stands when we discover that a real querier (one that queries | |
7 | with a non-zero source address) we stop querying. However, even | |
8 | after said querier has fallen off the edge of the earth, we will | |
9 | never restart querying (unless the bridge itself is restarted). | |
10 | ||
11 | This patch fixes this by kicking our own querier into gear when | |
12 | the timer for other queriers expire. | |
13 | ||
14 | Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> | |
15 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
16 | --- | |
17 | diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c | |
18 | index 0385584..656b77c 100644 | |
19 | --- a/net/bridge/br_multicast.c | |
20 | +++ b/net/bridge/br_multicast.c | |
21 | @@ -33,6 +33,8 @@ | |
22 | ||
23 | #include "br_private.h" | |
24 | ||
25 | +static void br_multicast_start_querier(struct net_bridge *br); | |
26 | + | |
27 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | |
28 | static inline int ipv6_is_transient_multicast(const struct in6_addr *addr) | |
29 | { | |
30 | @@ -802,6 +804,21 @@ static void br_multicast_local_router_expired(unsigned long data) | |
31 | { | |
32 | } | |
33 | ||
34 | +static void br_multicast_querier_expired(unsigned long data) | |
35 | +{ | |
36 | + struct net_bridge_port *port = (void *)data; | |
37 | + struct net_bridge *br = port->br; | |
38 | + | |
39 | + spin_lock(&br->multicast_lock); | |
40 | + if (!netif_running(br->dev) || br->multicast_disabled) | |
41 | + goto out; | |
42 | + | |
43 | + br_multicast_start_querier(br); | |
44 | + | |
45 | +out: | |
46 | + spin_unlock(&br->multicast_lock); | |
47 | +} | |
48 | + | |
49 | static void __br_multicast_send_query(struct net_bridge *br, | |
50 | struct net_bridge_port *port, | |
51 | struct br_ip *ip) | |
52 | @@ -1612,7 +1629,7 @@ void br_multicast_init(struct net_bridge *br) | |
53 | setup_timer(&br->multicast_router_timer, | |
54 | br_multicast_local_router_expired, 0); | |
55 | setup_timer(&br->multicast_querier_timer, | |
56 | - br_multicast_local_router_expired, 0); | |
57 | + br_multicast_querier_expired, 0); | |
58 | setup_timer(&br->multicast_query_timer, br_multicast_query_expired, | |
59 | (unsigned long)br); | |
60 | } |