bonding: allow arp_ip_targets on separate vlans to use arp validation
This allows a bond device to specify an arp_ip_target as a host that is
not on the same vlan as the base bond device and still use arp
validation.  A configuration like this, now works:
BONDING_OPTS="mode=active-backup arp_interval=1000 arp_ip_target=10.0.100.1 arp_validate=3"
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 qlen 1000
    link/ether 00:13:21:be:33:e9 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 qlen 1000
    link/ether 00:13:21:be:33:e9 brd ff:ff:ff:ff:ff:ff
8: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 00:13:21:be:33:e9 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::213:21ff:febe:33e9/64 scope link
       valid_lft forever preferred_lft forever
9: bond0.100@bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 00:13:21:be:33:e9 brd ff:ff:ff:ff:ff:ff
    inet 10.0.100.2/24 brd 10.0.100.255 scope global bond0.100
    inet6 fe80::213:21ff:febe:33e9/64 scope link
       valid_lft forever preferred_lft forever
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
ARP Polling Interval (ms): 1000
ARP IP target/s (n.n.n.n form): 10.0.100.1
Slave Interface: eth1
MII Status: up
Link Failure Count: 1
Permanent HW addr: 00:40:05:30:ff:30
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:13:21:be:33:e9
Signed-off-by: Andy Gospodarek <andy@greyhouse.net>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									3a999e6eb5
								
							
						
					
					
						commit
						1f3c8804ac
					
				| @ -2615,6 +2615,17 @@ static int bond_arp_rcv(struct sk_buff *skb, struct net_device *dev, struct pack | ||||
| 	unsigned char *arp_ptr; | ||||
| 	__be32 sip, tip; | ||||
| 
 | ||||
| 	if (dev->priv_flags & IFF_802_1Q_VLAN) { | ||||
| 		/*
 | ||||
| 		 * When using VLANS and bonding, dev and oriv_dev may be | ||||
| 		 * incorrect if the physical interface supports VLAN | ||||
| 		 * acceleration.  With this change ARP validation now | ||||
| 		 * works for hosts only reachable on the VLAN interface. | ||||
| 		 */ | ||||
| 		dev = vlan_dev_real_dev(dev); | ||||
| 		orig_dev = dev_get_by_index_rcu(dev_net(skb->dev),skb->skb_iif); | ||||
| 	} | ||||
| 
 | ||||
| 	if (!(dev->priv_flags & IFF_BONDING) || !(dev->flags & IFF_MASTER)) | ||||
| 		goto out; | ||||
| 
 | ||||
|  | ||||
| @ -14,6 +14,7 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | ||||
| 	if (skb_bond_should_drop(skb)) | ||||
| 		goto drop; | ||||
| 
 | ||||
| 	skb->skb_iif = skb->dev->ifindex; | ||||
| 	__vlan_hwaccel_put_tag(skb, vlan_tci); | ||||
| 	skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); | ||||
| 
 | ||||
| @ -85,6 +86,7 @@ vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp, | ||||
| 	if (skb_bond_should_drop(skb)) | ||||
| 		goto drop; | ||||
| 
 | ||||
| 	skb->skb_iif = skb->dev->ifindex; | ||||
| 	__vlan_hwaccel_put_tag(skb, vlan_tci); | ||||
| 	skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); | ||||
| 
 | ||||
|  | ||||
| @ -2495,12 +2495,26 @@ ncls: | ||||
| 	if (!skb) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Make sure frames received on VLAN interfaces stacked on | ||||
| 	 * bonding interfaces still make their way to any base bonding | ||||
| 	 * device that may have registered for a specific ptype.  The | ||||
| 	 * handler may have to adjust skb->dev and orig_dev. | ||||
| 	 * | ||||
| 	 * null_or_orig can be overloaded since it will not be set when | ||||
| 	 * using VLANs on top of bonding.  Putting it here prevents | ||||
| 	 * disturbing the ptype_all handlers above. | ||||
| 	 */ | ||||
| 	if ((skb->dev->priv_flags & IFF_802_1Q_VLAN) && | ||||
| 	    (vlan_dev_real_dev(skb->dev)->priv_flags & IFF_BONDING)) { | ||||
| 		null_or_orig = vlan_dev_real_dev(skb->dev); | ||||
| 	} | ||||
| 
 | ||||
| 	type = skb->protocol; | ||||
| 	list_for_each_entry_rcu(ptype, | ||||
| 			&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { | ||||
| 		if (ptype->type == type && | ||||
| 		    (ptype->dev == null_or_orig || ptype->dev == skb->dev || | ||||
| 		     ptype->dev == orig_dev)) { | ||||
| 		if (ptype->type == type && (ptype->dev == null_or_orig || | ||||
| 		     ptype->dev == skb->dev || ptype->dev == orig_dev)) { | ||||
| 			if (pt_prev) | ||||
| 				ret = deliver_skb(skb, pt_prev, orig_dev); | ||||
| 			pt_prev = ptype; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user