Commit 1fcd5d44 authored by Hangbin Liu's avatar Hangbin Liu Committed by David S. Miller

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: default avatarHangbin Liu <liuhangbin@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 696c6544
...@@ -2793,31 +2793,15 @@ static bool bond_has_this_ip(struct bonding *bond, __be32 ip) ...@@ -2793,31 +2793,15 @@ static bool bond_has_this_ip(struct bonding *bond, __be32 ip)
return ret; return ret;
} }
/* We go to the (large) trouble of VLAN tagging ARP frames because static bool bond_handle_vlan(struct slave *slave, struct bond_vlan_tag *tags,
* switches in VLAN mode (especially if ports are configured as struct sk_buff *skb)
* "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 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; struct net_device *bond_dev = slave->bond->dev;
struct net_device *slave_dev = slave->dev;
slave_dbg(bond_dev, slave_dev, "arp %d on slave: dst %pI4 src %pI4\n", struct bond_vlan_tag *outer_tag = tags;
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 (!tags || tags->vlan_proto == VLAN_N_VID) if (!tags || tags->vlan_proto == VLAN_N_VID)
goto xmit; return true;
tags++; tags++;
...@@ -2834,7 +2818,7 @@ static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip, ...@@ -2834,7 +2818,7 @@ static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
tags->vlan_id); tags->vlan_id);
if (!skb) { if (!skb) {
net_err_ratelimited("failed to insert inner VLAN tag\n"); net_err_ratelimited("failed to insert inner VLAN tag\n");
return; return false;
} }
tags++; tags++;
...@@ -2847,8 +2831,34 @@ static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip, ...@@ -2847,8 +2831,34 @@ static void bond_arp_send(struct slave *slave, int arp_op, __be32 dest_ip,
outer_tag->vlan_id); outer_tag->vlan_id);
} }
xmit: return true;
arp_xmit(skb); }
/* 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. /* Validate the device path between the @start_dev and the @end_dev.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment