diff options
author | Andy Gospodarek <andy@greyhouse.net> | 2010-01-06 07:56:37 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-01-07 03:46:39 -0500 |
commit | ca8d9ea30bc79b2965a1d169dcb2f48f02af4d2d (patch) | |
tree | f4bc15ecbd4a2604621e8c9d6bb2241bd206c6a6 /net/core | |
parent | d160439e7753aa19092bb12d8f4c6c918f8267e0 (diff) |
fix bonding: allow arp_ip_targets on separate vlans to use arp validation
On Wed, Jan 06, 2010 at 10:10:03PM +0100, Eric Dumazet wrote:
> Le 06/01/2010 19:38, Eric Dumazet a écrit :
> >
> > (net-next-2.6 doesnt work well on my bond/vlan setup, I suspect I need a bisection)
>
> David, I had to revert 1f3c8804acba841b5573b953f5560d2683d2db0d
> (bonding: allow arp_ip_targets on separate vlans to use arp validation)
>
> Or else, my vlan devices dont work (unfortunatly I dont have much time
> these days to debug the thing)
>
> My config :
>
> +---------+
> vlan.103 -----+ bond0 +--- eth1 (bnx2)
> | +
> vlan.825 -----+ +--- eth2 (tg3)
> +---------+
>
> $ cat /proc/net/bonding/bond0
> Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
>
> Bonding Mode: fault-tolerance (active-backup)
> Primary Slave: None
> Currently Active Slave: eth2
> MII Status: up
> MII Polling Interval (ms): 100
> Up Delay (ms): 0
> Down Delay (ms): 0
>
> Slave Interface: eth1 (bnx2)
> MII Status: down
> Link Failure Count: 1
> Permanent HW addr: 00:1e:0b:ec:d3:d2
>
> Slave Interface: eth2 (tg3)
> MII Status: up
> Link Failure Count: 0
> Permanent HW addr: 00:1e:0b:92:78:50
>
This patch fixes up a problem with found with commit
1f3c8804acba841b5573b953f5560d2683d2db0d. The original change
overloaded null_or_orig, but doing that prevented any packet handlers
that were not tied to a specific device (i.e. ptype->dev == NULL) from
ever receiving any frames.
The null_or_orig variable cannot be overloaded, and must be kept as NULL
to prevent the frame from being ignored by packet handlers designed to
accept frames on any interface.
Signed-off-by: Andy Gospodarek <andy@greyhouse.net>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index f9aa699ab6cb..d9ab9be0c323 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2430,6 +2430,7 @@ int netif_receive_skb(struct sk_buff *skb) | |||
2430 | struct packet_type *ptype, *pt_prev; | 2430 | struct packet_type *ptype, *pt_prev; |
2431 | struct net_device *orig_dev; | 2431 | struct net_device *orig_dev; |
2432 | struct net_device *null_or_orig; | 2432 | struct net_device *null_or_orig; |
2433 | struct net_device *null_or_bond; | ||
2433 | int ret = NET_RX_DROP; | 2434 | int ret = NET_RX_DROP; |
2434 | __be16 type; | 2435 | __be16 type; |
2435 | 2436 | ||
@@ -2500,21 +2501,19 @@ ncls: | |||
2500 | * bonding interfaces still make their way to any base bonding | 2501 | * bonding interfaces still make their way to any base bonding |
2501 | * device that may have registered for a specific ptype. The | 2502 | * device that may have registered for a specific ptype. The |
2502 | * handler may have to adjust skb->dev and orig_dev. | 2503 | * handler may have to adjust skb->dev and orig_dev. |
2503 | * | ||
2504 | * null_or_orig can be overloaded since it will not be set when | ||
2505 | * using VLANs on top of bonding. Putting it here prevents | ||
2506 | * disturbing the ptype_all handlers above. | ||
2507 | */ | 2504 | */ |
2505 | null_or_bond = NULL; | ||
2508 | if ((skb->dev->priv_flags & IFF_802_1Q_VLAN) && | 2506 | if ((skb->dev->priv_flags & IFF_802_1Q_VLAN) && |
2509 | (vlan_dev_real_dev(skb->dev)->priv_flags & IFF_BONDING)) { | 2507 | (vlan_dev_real_dev(skb->dev)->priv_flags & IFF_BONDING)) { |
2510 | null_or_orig = vlan_dev_real_dev(skb->dev); | 2508 | null_or_bond = vlan_dev_real_dev(skb->dev); |
2511 | } | 2509 | } |
2512 | 2510 | ||
2513 | type = skb->protocol; | 2511 | type = skb->protocol; |
2514 | list_for_each_entry_rcu(ptype, | 2512 | list_for_each_entry_rcu(ptype, |
2515 | &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { | 2513 | &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { |
2516 | if (ptype->type == type && (ptype->dev == null_or_orig || | 2514 | if (ptype->type == type && (ptype->dev == null_or_orig || |
2517 | ptype->dev == skb->dev || ptype->dev == orig_dev)) { | 2515 | ptype->dev == skb->dev || ptype->dev == orig_dev || |
2516 | ptype->dev == null_or_bond)) { | ||
2518 | if (pt_prev) | 2517 | if (pt_prev) |
2519 | ret = deliver_skb(skb, pt_prev, orig_dev); | 2518 | ret = deliver_skb(skb, pt_prev, orig_dev); |
2520 | pt_prev = ptype; | 2519 | pt_prev = ptype; |