Skip to content

Commit

Permalink
bonding: convert bond_has_this_ip() to use upper devices
Browse files Browse the repository at this point in the history
Currently, bond_has_this_ip() is aware only of vlan upper devices, and thus
will return false if the address is associated with the upper bridge or any
other device, and thus will break the arp logic.

Fix this by using the upper device list. For every upper device we verify
if the address associated with it is our address, and if yes - return true.

CC: Jay Vosburgh <fubar@us.ibm.com>
CC: Andy Gospodarek <andy@greyhouse.net>
Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Veaceslav Falico authored and David S. Miller committed Aug 29, 2013
1 parent 27bc11e commit 50223ce
Showing 1 changed file with 13 additions and 12 deletions.
25 changes: 13 additions & 12 deletions drivers/net/bonding/bond_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2392,24 +2392,25 @@ void bond_mii_monitor(struct work_struct *work)
}
}

static int bond_has_this_ip(struct bonding *bond, __be32 ip)
static bool bond_has_this_ip(struct bonding *bond, __be32 ip)
{
struct vlan_entry *vlan;
struct net_device *vlan_dev;
struct net_device *upper;
struct list_head *iter;
bool ret = false;

if (ip == bond_confirm_addr(bond->dev, 0, ip))
return 1;
return true;

list_for_each_entry(vlan, &bond->vlan_list, vlan_list) {
rcu_read_lock();
vlan_dev = __vlan_find_dev_deep(bond->dev, htons(ETH_P_8021Q),
vlan->vlan_id);
rcu_read_unlock();
if (vlan_dev && ip == bond_confirm_addr(vlan_dev, 0, ip))
return 1;
rcu_read_lock();
netdev_for_each_upper_dev_rcu(bond->dev, upper, iter) {
if (ip == bond_confirm_addr(upper, 0, ip)) {
ret = true;
break;
}
}
rcu_read_unlock();

return 0;
return ret;
}

/*
Expand Down

0 comments on commit 50223ce

Please sign in to comment.