diff options
author | Cong Wang <amwang@redhat.com> | 2013-05-21 17:52:56 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-22 17:54:37 -0400 |
commit | 6b7df111ece130fa979a0c4f58e53674c1e47d3e (patch) | |
tree | ecbed2edcc3b7378329d8932a3402fa3a481b43f | |
parent | 9f00b2e7cf241fa389733d41b615efdaa2cb0f5b (diff) |
bridge: send query as soon as leave is received
Continue sending queries when leave is received if the user marks
it as a querier.
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Adam Baker <linux@baker-net.org.uk>
Signed-off-by: Cong Wang <amwang@redhat.com>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/bridge/br_multicast.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 40bda804fbd9..37a467697967 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
@@ -1250,6 +1250,32 @@ static void br_multicast_leave_group(struct net_bridge *br, | |||
1250 | if (!mp) | 1250 | if (!mp) |
1251 | goto out; | 1251 | goto out; |
1252 | 1252 | ||
1253 | if (br->multicast_querier && | ||
1254 | !timer_pending(&br->multicast_querier_timer)) { | ||
1255 | __br_multicast_send_query(br, port, &mp->addr); | ||
1256 | |||
1257 | time = jiffies + br->multicast_last_member_count * | ||
1258 | br->multicast_last_member_interval; | ||
1259 | mod_timer(port ? &port->multicast_query_timer : | ||
1260 | &br->multicast_query_timer, time); | ||
1261 | |||
1262 | for (p = mlock_dereference(mp->ports, br); | ||
1263 | p != NULL; | ||
1264 | p = mlock_dereference(p->next, br)) { | ||
1265 | if (p->port != port) | ||
1266 | continue; | ||
1267 | |||
1268 | if (!hlist_unhashed(&p->mglist) && | ||
1269 | (timer_pending(&p->timer) ? | ||
1270 | time_after(p->timer.expires, time) : | ||
1271 | try_to_del_timer_sync(&p->timer) >= 0)) { | ||
1272 | mod_timer(&p->timer, time); | ||
1273 | } | ||
1274 | |||
1275 | break; | ||
1276 | } | ||
1277 | } | ||
1278 | |||
1253 | if (port && (port->flags & BR_MULTICAST_FAST_LEAVE)) { | 1279 | if (port && (port->flags & BR_MULTICAST_FAST_LEAVE)) { |
1254 | struct net_bridge_port_group __rcu **pp; | 1280 | struct net_bridge_port_group __rcu **pp; |
1255 | 1281 | ||