public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jay Vosburgh <fubar@us.ibm.com>
To: Jiri Pirko <jpirko@redhat.com>
Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	jgarzik@pobox.com, davem@davemloft.net,
	shemminger@linux-foundation.org,
	bridge@lists.linux-foundation.org,
	bonding-devel@lists.sourceforge.net, kaber@trash.net,
	mschmidt@redhat.com, dada1@cosmosbay.com
Subject: Re: [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try3
Date: Wed, 25 Mar 2009 09:31:53 -0700	[thread overview]
Message-ID: <28445.1237998713@death.nxdomain.ibm.com> (raw)
In-Reply-To: <20090325151937.GI3437@psychotron.englab.brq.redhat.com>

Jiri Pirko <jpirko@redhat.com> wrote:

>Basically here's what's going on. In every mode, bonding interface uses the same
>mac address for all enslaved devices. Except for mode balance-alb. 

	I think you mean "only balance-alb will simultaneously use
multiple MAC addresses across different slaves."  Yes?

	I ask because the active-backup mode with fail_over_mac=active
will change the bond's MAC to always be the MAC of whatever the
currently active slave is, but I don't think that will trigger the
problem you're talking about (because it'll only use one MAC at a time).

>[...] When you put
>this kind of bond device into a bridge it will only add one of mac adresses into
>a hash list of mac addresses, say X. This mac address is marked as local. But
>this bonding interface also has mac address Y. Now then packet arrives with
>destination address Y, this address is not marked as local and the packed looks
>like it needs to be forwarded. This packet is then lost which is wrong.
>
>Notice that interfaces can be added and removed from bond while it is in bridge.
>
>This patch solves the situation in the bonding without touching bridge code,
>as Patrick suggested. For every incoming frame to bonding it searches the
>destination address in slaves list and if any of slave addresses matches, it
>rewrites the address in frame by the adress of bonding master. This ensures that
>all frames comming thru the bonding in alb mode have the same address.
>
>Jirka
>
>
>Signed-off-by: Jiri Pirko <jpirko@redhat.com>
>
>diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
>index 27fb7f5..83998f4 100644
>--- a/drivers/net/bonding/bond_alb.c
>+++ b/drivers/net/bonding/bond_alb.c
>@@ -1762,6 +1762,26 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr)
> 	return 0;
> }
>
>+void bond_alb_change_dest(struct sk_buff *skb)
>+{
>+	struct net_device *bond_dev = skb->dev;
>+	struct bonding *bond = netdev_priv(bond_dev);
>+	unsigned char *dest = eth_hdr(skb)->h_dest;
>+	struct slave *slave;
>+	int i;
>+
>+	if (!compare_ether_addr_64bits(dest, bond_dev->dev_addr))
>+		return;
>+	read_lock(&bond->lock);
>+	bond_for_each_slave(bond, slave, i) {
>+		if (!compare_ether_addr_64bits(slave->dev->dev_addr, dest)) {
>+			memcpy(dest, bond_dev->dev_addr, ETH_ALEN);
>+			break;
>+		}
>+	}
>+	read_unlock(&bond->lock);
>+}
>+
> void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id)
> {
> 	if (bond->alb_info.current_alb_vlan &&
>diff --git a/drivers/net/bonding/bond_alb.h b/drivers/net/bonding/bond_alb.h
>index 50968f8..77f36fb 100644
>--- a/drivers/net/bonding/bond_alb.h
>+++ b/drivers/net/bonding/bond_alb.h
>@@ -127,6 +127,7 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
> int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
> void bond_alb_monitor(struct work_struct *);
> int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr);
>+void bond_alb_change_dest(struct sk_buff *skb);
> void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id);
> #endif /* __BOND_ALB_H__ */
>
>diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>index 3d76686..b62fdc4 100644
>--- a/drivers/net/bonding/bond_main.c
>+++ b/drivers/net/bonding/bond_main.c
>@@ -4294,6 +4294,19 @@ unwind:
> 	return res;
> }
>
>+/*
>+ * Called via bond_change_dest_hook.
>+ * note: already called with rcu_read_lock (preempt_disabled)
>+ */
>+void bond_change_dest(struct sk_buff *skb)
>+{
>+	struct net_device *bond_dev = skb->dev;
>+	struct bonding *bond = netdev_priv(bond_dev);
>+
>+	if (bond->params.mode == BOND_MODE_ALB)
>+		bond_alb_change_dest(skb);
>+}
>+
> static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *bond_dev)
> {
> 	struct bonding *bond = netdev_priv(bond_dev);
>@@ -5243,6 +5256,8 @@ static int __init bonding_init(void)
> 	register_inetaddr_notifier(&bond_inetaddr_notifier);
> 	bond_register_ipv6_notifier();
>
>+	bond_change_dest_hook = bond_change_dest;
>+
> 	goto out;
> err:
> 	list_for_each_entry(bond, &bond_dev_list, bond_list) {
>@@ -5266,6 +5281,8 @@ static void __exit bonding_exit(void)
> 	unregister_inetaddr_notifier(&bond_inetaddr_notifier);
> 	bond_unregister_ipv6_notifier();
>
>+	bond_change_dest_hook = NULL;
>+
> 	bond_destroy_sysfs();
>
> 	rtnl_lock();
>diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
>index ca849d2..df92b70 100644
>--- a/drivers/net/bonding/bonding.h
>+++ b/drivers/net/bonding/bonding.h
>@@ -375,5 +375,7 @@ static inline void bond_unregister_ipv6_notifier(void)
> }
> #endif
>
>+extern void (*bond_change_dest_hook)(struct sk_buff *skb);
>+
> #endif /* _LINUX_BONDING_H */
>
>diff --git a/net/core/dev.c b/net/core/dev.c
>index e3fe5c7..abe68d9 100644
>--- a/net/core/dev.c
>+++ b/net/core/dev.c
>@@ -2061,6 +2061,13 @@ static inline int deliver_skb(struct sk_buff *skb,
> 	return pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
> }
>
>+#if defined(CONFIG_BONDING) || defined(CONFIG_BONDING_MODULE)
>+void (*bond_change_dest_hook)(struct sk_buff *skb) __read_mostly;
>+EXPORT_SYMBOL(bond_change_dest_hook);
>+#else
>+#define bond_change_dest_hook(skb) do {} while (0)
>+#endif
>+
> #if defined(CONFIG_BRIDGE) || defined (CONFIG_BRIDGE_MODULE)
> /* These hooks defined here for ATM */
> struct net_bridge;
>@@ -2251,10 +2258,12 @@ int netif_receive_skb(struct sk_buff *skb)
> 	null_or_orig = NULL;
> 	orig_dev = skb->dev;
> 	if (orig_dev->master) {
>-		if (skb_bond_should_drop(skb))
>+		if (skb_bond_should_drop(skb)) {
> 			null_or_orig = orig_dev; /* deliver only exact match */
>-		else
>+		} else {
> 			skb->dev = orig_dev->master;
>+			bond_change_dest_hook(skb);

	Since you put the hook outside of the skb_bond_should_drop
function, does the VLAN accelerated receive path do the right thing if,
e.g., there's a VLAN on top of bonding and that VLAN is part of the
bridge?

	-J

---
	-Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com

  reply	other threads:[~2009-03-25 16:32 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-13 18:33 [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge Jiri Pirko
2009-03-14  5:39 ` Stephen Hemminger
2009-03-14  9:49   ` Jiri Pirko
2009-03-15 23:12     ` Stephen Hemminger
2009-03-16 11:11       ` Jiri Pirko
2009-03-19  6:20         ` David Miller
2009-03-19  8:44           ` Jiri Pirko
2009-03-19 10:21             ` David Miller
2009-03-19 11:19               ` Jiri Pirko
2009-03-19  8:50           ` Patrick McHardy
2009-03-19 16:31             ` Jiri Pirko
2009-03-25 13:04 ` [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try2 Jiri Pirko
2009-03-25 13:40   ` Eric Dumazet
2009-03-25 14:39     ` Jiri Pirko
2009-03-25 15:19 ` [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try3 Jiri Pirko
2009-03-25 16:31   ` Jay Vosburgh [this message]
2009-03-25 17:44     ` Jiri Pirko
2009-03-26  0:24       ` David Miller
2009-03-26  0:34       ` Jay Vosburgh
2009-03-26 11:12     ` Jiri Pirko
2009-03-26 15:52 ` [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try4 Jiri Pirko
2009-03-27  7:38   ` David Miller
2009-03-27  7:46     ` Jiri Pirko
2009-03-27  7:53     ` Patrick McHardy
2009-03-27  8:41       ` Jiri Pirko
2009-03-27  8:55         ` Patrick McHardy
2009-03-27  9:47           ` Jiri Pirko
2009-03-29 20:53       ` David Miller
2009-03-30 12:04         ` Patrick McHardy
2009-03-30 12:40           ` Jiri Pirko
2009-03-30 12:47             ` Patrick McHardy
2009-03-30 12:52               ` Jiri Pirko
2009-03-30 12:58                 ` Patrick McHardy
2009-04-13  8:37 ` [PATCH 0/4] bonding: allow bond in mode balance-alb to work properly in bridge -try5 Jiri Pirko
2009-04-13  8:38   ` [PATCH 1/4] net: introduce dev_mac_address_changed Jiri Pirko
2009-04-13 14:58     ` Stephen Hemminger
2009-04-13  8:42   ` [PATCH 2/4] net: introduce a list of device addresses dev_addr_list Jiri Pirko
2009-04-13 14:49     ` Stephen Hemminger
2009-04-13 22:54       ` David Miller
2009-04-13 22:53     ` David Miller
2009-04-13  8:44   ` [PATCH 3/4] net: bridge: use device address list instead of dev_addr Jiri Pirko
2009-04-13 14:54     ` Stephen Hemminger
2009-04-14 10:15       ` Jiri Pirko
2009-04-13 22:54     ` David Miller
2009-04-13  8:46   ` [PATCH 4/4] net: bonding: add slave device addresses in mode alb Jiri Pirko
2009-04-13 14:56     ` Stephen Hemminger
2009-04-15  8:17 ` [PATCH 0/3] bonding: allow bond in mode balance-alb to work properly in bridge -try6 Jiri Pirko
2009-04-15  8:18   ` [PATCH 1/3] net: introduce a list of device addresses dev_addr_list Jiri Pirko
2009-04-15  8:26     ` Li Zefan
2009-04-15  8:29       ` Jiri Pirko
2009-04-15  8:32       ` Jiri Pirko
2009-04-15  9:21         ` David Miller
2009-04-15  9:27         ` Eric Dumazet
2009-04-15  9:31           ` David Miller
2009-04-15 10:13             ` Patrick McHardy
2009-04-15 10:15               ` David Miller
2009-04-15 10:41                 ` Patrick McHardy
2009-04-15 10:45                   ` David Miller
2009-04-15 10:47                     ` Patrick McHardy
2009-04-15 14:42               ` Jiri Pirko
2009-04-15 11:17           ` Jiri Pirko
2009-04-15 11:22             ` Patrick McHardy
2009-04-15 11:28               ` Jiri Pirko
2009-04-15 12:28             ` Eric Dumazet
2009-04-15 18:02     ` [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v2) Jiri Pirko
2009-04-15 18:54       ` Eric Dumazet
2009-04-16  8:46         ` Jiri Pirko
2009-04-17 11:57       ` [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v3) Jiri Pirko
2009-04-17 15:33         ` Stephen Hemminger
2009-04-18  7:01           ` Jiri Pirko
2009-04-18  7:35             ` Eric Dumazet
2009-04-18  7:44               ` Jiri Pirko
2009-04-18  8:06                 ` Eric Dumazet
2009-04-18  8:58         ` [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v4) Jiri Pirko
2009-04-20 16:11           ` Jiri Pirko
2009-04-23  8:09             ` Jiri Pirko
2009-05-04 11:14           ` [PATCH] net: introduce a list of device addresses dev_addr_list (v5) Jiri Pirko
2009-05-05  4:37             ` David Miller
2009-05-05  6:37               ` Jiri Pirko
2009-05-05 12:48             ` [PATCH] net: introduce a list of device addresses dev_addr_list (v6) Jiri Pirko
2009-05-05 19:27               ` David Miller
2009-05-08 22:38                 ` Stephen Hemminger
2009-05-08 23:00                   ` David Miller
2009-05-08 23:12                     ` Stephen Hemminger
2009-05-08 23:25                       ` David Miller
2009-05-08 23:29                         ` Stephen Hemminger
2009-04-15  8:21   ` [PATCH 2/3] net: bridge: use device address list instead of dev_addr Jiri Pirko
2009-05-06 14:46     ` [PATCH net-next] net: bridge: use device address list instead of dev_addr (repost) Jiri Pirko
2009-05-06 15:08       ` Eric Dumazet
2009-05-06 19:26       ` Stephen Hemminger
2009-05-07 22:03         ` David Miller
2009-04-15  8:22   ` [PATCH 3/3] net: bonding: add slave device addresses in mode alb Jiri Pirko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=28445.1237998713@death.nxdomain.ibm.com \
    --to=fubar@us.ibm.com \
    --cc=bonding-devel@lists.sourceforge.net \
    --cc=bridge@lists.linux-foundation.org \
    --cc=dada1@cosmosbay.com \
    --cc=davem@davemloft.net \
    --cc=jgarzik@pobox.com \
    --cc=jpirko@redhat.com \
    --cc=kaber@trash.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mschmidt@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=shemminger@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox