]> Pileus Git - ~andy/linux/commitdiff
bonding: fix to rejoin multicast groups immediately
authorFlavio Leitner <fleitner@redhat.com>
Tue, 5 Oct 2010 14:23:58 +0000 (14:23 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 Oct 2010 03:26:57 +0000 (20:26 -0700)
The IGMP specs states that if the system receives a
membership report, it shouldn't send another for the
next minute. However, if a link failure happens right
after that, the backup slave and the switch connected
to this slave will not know about the multicast and
the traffic will hang for about a minute.

This patch fixes it to rejoin multicast groups immediately
after a failover restoring the multicast traffic.

Signed-off-by: Flavio Leitner <fleitner@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/igmp.c

index 2a4bb76f2132957da25326ce98653b249d9ccaaf..25f339672b2891347ffed75adc3d91fb6486598b 100644 (file)
@@ -1269,14 +1269,14 @@ void ip_mc_rejoin_group(struct ip_mc_list *im)
        if (im->multiaddr == IGMP_ALL_HOSTS)
                return;
 
-       if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) {
-               igmp_mod_timer(im, IGMP_Initial_Report_Delay);
-               return;
-       }
-       /* else, v3 */
-       im->crcount = in_dev->mr_qrv ? in_dev->mr_qrv :
-               IGMP_Unsolicited_Report_Count;
-       igmp_ifc_event(in_dev);
+       /* a failover is happening and switches
+        * must be notified immediately */
+       if (IGMP_V1_SEEN(in_dev))
+               igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT);
+       else if (IGMP_V2_SEEN(in_dev))
+               igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT);
+       else
+               igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT);
 #endif
 }
 EXPORT_SYMBOL(ip_mc_rejoin_group);