b/drivers/net/bonding/bond_main.c
@@ -2661,7 +2661,7 @@ static int bond_has_this_ip(struct bonding *bond,
__be32 ip)
* 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 net_device *slave_dev, int arp_op,
__be32 dest_ip, __be32 src_ip, unsigned short vlan_id)
+static void bond_arp_send(struct bonding *bond, struct net_device
*slave_dev, int arp_op, __be32 dest_ip, __be32 src_ip, unsigned short
vlan_id)
{
struct sk_buff *skb;
@@ -2683,6 +2683,7 @@ static void bond_arp_send(struct net_device
*slave_dev, int arp_op, __be32 dest_
}
}
arp_xmit(skb);
+ bond->arp_sent=true;
}
@@ -2700,7 +2701,7 @@ static void bond_arp_send_all(struct bonding
*bond, struct slave *slave)
pr_debug("basa: target %x\n", targets[i]);
if (!bond->vlgrp) {
pr_debug("basa: empty vlan: arp_send\n");
- bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
+ bond_arp_send(bond, slave->dev, ARPOP_REQUEST, targets[i],
bond->master_ip, 0);
continue;
}
@@ -2726,7 +2727,7 @@ static void bond_arp_send_all(struct bonding
*bond, struct slave *slave)
if (rt->dst.dev == bond->dev) {
ip_rt_put(rt);
pr_debug("basa: rtdev == bond->dev: arp_send\n");
- bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
+ bond_arp_send(bond, slave->dev, ARPOP_REQUEST, targets[i],
bond->master_ip, 0);
continue;
}
@@ -2744,7 +2745,7 @@ static void bond_arp_send_all(struct bonding
*bond, struct slave *slave)
if (vlan_id) {
ip_rt_put(rt);
- bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
+ bond_arp_send(bond, slave->dev, ARPOP_REQUEST, targets[i],
vlan->vlan_ip, vlan_id);
continue;
}
@@ -3206,7 +3207,7 @@ void bond_activebackup_arp_mon(struct work_struct
*work)
should_notify_peers = bond_should_notify_peers(bond);
- if (bond_ab_arp_inspect(bond, delta_in_ticks)) {
+ if (bond->arp_sent && bond_ab_arp_inspect(bond, delta_in_ticks)) {
read_unlock(&bond->lock);
rtnl_lock();
read_lock(&bond->lock);
@@ -3218,6 +3219,7 @@ void bond_activebackup_arp_mon(struct work_struct
*work)
read_lock(&bond->lock);
}
+ bond->arp_sent=false;
bond_ab_arp_probe(bond);
re_arm:
@@ -4425,6 +4427,7 @@ static void bond_setup(struct net_device *bond_dev)
bond_dev->hw_features &= ~(NETIF_F_ALL_CSUM & ~NETIF_F_NO_CSUM);
bond_dev->features |= bond_dev->hw_features;
+ bond->arp_sent=false;
}
static void bond_work_cancel_all(struct bonding *bond)
@@ -253,6 +253,7 @@ struct bonding {
/* debugging suport via debugfs */
struct dentry *debug_dir;
#endif /* CONFIG_DEBUG_FS */
+ bool arp_sent;
};
#define bond_slave_get_rcu(dev) \
--
1.8.2.1