aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/igmp.c
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2010-11-18 12:33:19 -0500
committerDavid S. Miller <davem@davemloft.net>2010-11-18 12:33:19 -0500
commit866f3b25a2eb60d7529c227a0ecd80c3aba443fd (patch)
treeb11b24cf158a232641548b6c652bf9e001ae1446 /net/ipv4/igmp.c
parentdda0b38692a7298f433b92b1329867b1ecabb4bb (diff)
bonding: IGMP handling cleanup
Instead of iterating in_dev->mc_list from bonding driver, its better to call a helper function provided by igmp.c Details of implementation (locking) are private to igmp code. ip_mc_rejoin_group(struct ip_mc_list *im) becomes ip_mc_rejoin_groups(struct in_device *in_dev); Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/igmp.c')
-rw-r--r--net/ipv4/igmp.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index afb1e82a59f9..50f6bc1a002a 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -1267,26 +1267,32 @@ EXPORT_SYMBOL(ip_mc_inc_group);
1267 1267
1268/* 1268/*
1269 * Resend IGMP JOIN report; used for bonding. 1269 * Resend IGMP JOIN report; used for bonding.
1270 * Called with rcu_read_lock()
1270 */ 1271 */
1271void ip_mc_rejoin_group(struct ip_mc_list *im) 1272void ip_mc_rejoin_groups(struct in_device *in_dev)
1272{ 1273{
1273#ifdef CONFIG_IP_MULTICAST 1274#ifdef CONFIG_IP_MULTICAST
1274 struct in_device *in_dev = im->interface; 1275 struct ip_mc_list *im;
1276 int type;
1275 1277
1276 if (im->multiaddr == IGMP_ALL_HOSTS) 1278 for_each_pmc_rcu(in_dev, im) {
1277 return; 1279 if (im->multiaddr == IGMP_ALL_HOSTS)
1280 continue;
1278 1281
1279 /* a failover is happening and switches 1282 /* a failover is happening and switches
1280 * must be notified immediately */ 1283 * must be notified immediately
1281 if (IGMP_V1_SEEN(in_dev)) 1284 */
1282 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT); 1285 if (IGMP_V1_SEEN(in_dev))
1283 else if (IGMP_V2_SEEN(in_dev)) 1286 type = IGMP_HOST_MEMBERSHIP_REPORT;
1284 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT); 1287 else if (IGMP_V2_SEEN(in_dev))
1285 else 1288 type = IGMPV2_HOST_MEMBERSHIP_REPORT;
1286 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT); 1289 else
1290 type = IGMPV3_HOST_MEMBERSHIP_REPORT;
1291 igmp_send_report(in_dev, im, type);
1292 }
1287#endif 1293#endif
1288} 1294}
1289EXPORT_SYMBOL(ip_mc_rejoin_group); 1295EXPORT_SYMBOL(ip_mc_rejoin_groups);
1290 1296
1291/* 1297/*
1292 * A socket has left a multicast group on device dev 1298 * A socket has left a multicast group on device dev