Bonding: split bond_handle_vlan from bond_arp_send
Function bond_handle_vlan() is split from bond_arp_send() for later IPv6 usage. Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
696c654441
Коммит
1fcd5d448c
|
@ -2793,31 +2793,15 @@ static bool bond_has_this_ip(struct bonding *bond, __be32 ip)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* We go to the (large) trouble of VLAN tagging ARP frames because
|
||||
* switches in VLAN mode (especially if ports are configured as
|
||||
* "native" to a VLAN) might not pass non-tagged frames.
|
||||
*/
|
||||
static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
|
||||
__be32 src_ip, struct bond_vlan_tag *tags)
|
||||
static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct bond_vlan_tag *outer_tag = tags;
|
||||
struct net_device *slave_dev = slave->dev;
|
||||
struct net_device *bond_dev = slave->bond->dev;
|
||||
|
||||
slave_dbg(bond_dev, slave_dev, "arp %d on slave: dst %pI4 src %pI4\n",
|
||||
arp_op, &dest_ip, &src_ip);
|
||||
|
||||
skb = arp_create(arp_op, ETH_P_ARP, dest_ip, slave_dev, src_ip,
|
||||
NULL, slave_dev->dev_addr, NULL);
|
||||
|
||||
if (!skb) {
|
||||
net_err_ratelimited("ARP packet allocation failed\n");
|
||||
return;
|
||||
}
|
||||
struct net_device *slave_dev = slave->dev;
|
||||
struct bond_vlan_tag *outer_tag = tags;
|
||||
|
||||
if (!tags || tags->vlan_proto == VLAN_N_VID)
|
||||
goto xmit;
|
||||
return true;
|
||||
|
||||
tags++;
|
||||
|
||||
|
@ -2834,7 +2818,7 @@ static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
|
|||
tags->vlan_id);
|
||||
if (!skb) {
|
||||
net_err_ratelimited("failed to insert inner VLAN tag\n");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
tags++;
|
||||
|
@ -2847,8 +2831,34 @@ static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
|
|||
outer_tag->vlan_id);
|
||||
}
|
||||
|
||||
xmit:
|
||||
arp_xmit(skb);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* We go to the (large) trouble of VLAN tagging ARP frames because
|
||||
* switches in VLAN mode (especially if ports are configured as
|
||||
* "native" to a VLAN) might not pass non-tagged frames.
|
||||
*/
|
||||
static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
|
||||
__be32 src_ip, struct bond_vlan_tag *tags)
|
||||
{
|
||||
struct net_device *bond_dev = slave->bond->dev;
|
||||
struct net_device *slave_dev = slave->dev;
|
||||
struct sk_buff *skb;
|
||||
|
||||
slave_dbg(bond_dev, slave_dev, "arp %d on slave: dst %pI4 src %pI4\n",
|
||||
arp_op, &dest_ip, &src_ip);
|
||||
|
||||
skb = arp_create(arp_op, ETH_P_ARP, dest_ip, slave_dev, src_ip,
|
||||
NULL, slave_dev->dev_addr, NULL);
|
||||
|
||||
if (!skb) {
|
||||
net_err_ratelimited("ARP packet allocation failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (bond_handle_vlan(slave, tags, skb))
|
||||
arp_xmit(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Validate the device path between the @start_dev and the @end_dev.
|
||||
|
|
Загрузка…
Ссылка в новой задаче