forked from Minki/linux
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