netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch 2.6.14-rc2] bonding: replicate IGMP traffic in activebackup mode
@ 2005-09-28 21:50 John W. Linville
  2005-10-04 11:58 ` Jeff Garzik
  0 siblings, 1 reply; 2+ messages in thread
From: John W. Linville @ 2005-09-28 21:50 UTC (permalink / raw)
  To: linux-kernel, netdev, bonding-devel; +Cc: ctindel, fubar, jgarzik

Replicate IGMP frames across all slaves in activebackup mode. This
ensures fail-over is rapid for multicast traffic as well. Otherwise,
multicast traffic will be lost until the next IGMP membership report
poll timeout.

Signed-off-by: John W. Linville <linville@tuxdriver.com>
---
This is conceptually similar to the treatment of IGMP traffic in
bond_alb_xmit. In that case, IGMP traffic transmitted on any slave
is re-routed to the active slave in order to ensure that multicast
traffic continues to be directed to the active receiver.

 drivers/net/bonding/bond_main.c |   53 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -4391,6 +4391,39 @@ out:
 	return 0;
 }
 
+static void bond_activebackup_xmit_copy(struct sk_buff *skb,
+                                         struct bonding *bond,
+                                         struct slave *slave)
+{
+	struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
+	struct ethhdr *eth_data;
+	u8 *hwaddr;
+	int res;
+
+	if (!skb2) {
+		printk(KERN_ERR DRV_NAME ": Error: "
+		       "bond_activebackup_xmit_copy(): skb_copy() failed\n");
+		return;
+	}
+
+	skb2->mac.raw = (unsigned char *)skb2->data;
+	eth_data = eth_hdr(skb2);
+
+	/* Pick an appropriate source MAC address */
+	hwaddr = slave->perm_hwaddr;
+	if (!memcmp(eth_data->h_source, hwaddr, ETH_ALEN))
+		hwaddr = bond->curr_active_slave->perm_hwaddr;
+
+	/* Set source MAC address appropriately */
+	memcpy(eth_data->h_source, hwaddr, ETH_ALEN);
+
+	res = bond_dev_queue_xmit(bond, skb2, slave->dev);
+	if (res)
+		dev_kfree_skb(skb2);
+
+	return;
+}
+
 /*
  * in active-backup mode, we know that bond->curr_active_slave is always valid if
  * the bond has a usable interface.
@@ -4407,10 +4440,26 @@ static int bond_xmit_activebackup(struct
 		goto out;
 	}
 
-	if (bond->curr_active_slave) { /* one usable interface */
-		res = bond_dev_queue_xmit(bond, skb, bond->curr_active_slave->dev);
+	if (!bond->curr_active_slave)
+		goto out;
+
+	/* Xmit IGMP frames on all slaves to ensure rapid fail-over
+	   for multicast traffic on snooping switches */
+	if (skb->protocol == __constant_htons(ETH_P_IP) &&
+	    skb->nh.iph->protocol == IPPROTO_IGMP) {
+		struct slave *slave, *active_slave;
+		int i;
+
+		active_slave = bond->curr_active_slave;
+		bond_for_each_slave_from_to(bond, slave, i, active_slave->next,
+		                            active_slave->prev)
+			if (IS_UP(slave->dev) &&
+			    (slave->link == BOND_LINK_UP))
+				bond_activebackup_xmit_copy(skb, bond, slave);
 	}
 
+	res = bond_dev_queue_xmit(bond, skb, bond->curr_active_slave->dev);
+
 out:
 	if (res) {
 		/* no suitable interface, frame not sent */

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [patch 2.6.14-rc2] bonding: replicate IGMP traffic in activebackup mode
  2005-09-28 21:50 [patch 2.6.14-rc2] bonding: replicate IGMP traffic in activebackup mode John W. Linville
@ 2005-10-04 11:58 ` Jeff Garzik
  0 siblings, 0 replies; 2+ messages in thread
From: Jeff Garzik @ 2005-10-04 11:58 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-kernel, netdev, bonding-devel, ctindel, fubar

John W. Linville wrote:
> Replicate IGMP frames across all slaves in activebackup mode. This
> ensures fail-over is rapid for multicast traffic as well. Otherwise,
> multicast traffic will be lost until the next IGMP membership report
> poll timeout.
> 
> Signed-off-by: John W. Linville <linville@tuxdriver.com>
> ---
> This is conceptually similar to the treatment of IGMP traffic in
> bond_alb_xmit. In that case, IGMP traffic transmitted on any slave
> is re-routed to the active slave in order to ensure that multicast
> traffic continues to be directed to the active receiver.
> 
>  drivers/net/bonding/bond_main.c |   53 ++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 51 insertions(+), 2 deletions(-)

Applied.  For future patches, please

* don't include description following the signed-off-by line

* if you are willing to special-case me, I actually don't like seeing a 
diffstat; I have to manually remove it before applying

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2005-10-04 11:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-28 21:50 [patch 2.6.14-rc2] bonding: replicate IGMP traffic in activebackup mode John W. Linville
2005-10-04 11:58 ` Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).