+++ /dev/null
-From foo@baz Sat Sep 26 11:20:32 PDT 2015
-From: dingtianhong <dingtianhong@huawei.com>
-Date: Thu, 16 Jul 2015 16:30:02 +0800
-Subject: bonding: correct the MAC address for "follow" fail_over_mac policy
-
-From: dingtianhong <dingtianhong@huawei.com>
-
-[ Upstream commit a951bc1e6ba58f11df5ed5ddc41311e10f5fd20b ]
-
-The "follow" fail_over_mac policy is useful for multiport devices that
-either become confused or incur a performance penalty when multiple
-ports are programmed with the same MAC address, but the same MAC
-address still may happened by this steps for this policy:
-
-1) echo +eth0 > /sys/class/net/bond0/bonding/slaves
- bond0 has the same mac address with eth0, it is MAC1.
-
-2) echo +eth1 > /sys/class/net/bond0/bonding/slaves
- eth1 is backup, eth1 has MAC2.
-
-3) ifconfig eth0 down
- eth1 became active slave, bond will swap MAC for eth0 and eth1,
- so eth1 has MAC1, and eth0 has MAC2.
-
-4) ifconfig eth1 down
- there is no active slave, and eth1 still has MAC1, eth2 has MAC2.
-
-5) ifconfig eth0 up
- the eth0 became active slave again, the bond set eth0 to MAC1.
-
-Something wrong here, then if you set eth1 up, the eth0 and eth1 will have the same
-MAC address, it will break this policy for ACTIVE_BACKUP mode.
-
-This patch will fix this problem by finding the old active slave and
-swap them MAC address before change active slave.
-
-Signed-off-by: Ding Tianhong <dingtianhong@huawei.com>
-Tested-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/net/bonding/bond_main.c | 19 +++++++++++++++++++
- 1 file changed, 19 insertions(+)
-
---- a/drivers/net/bonding/bond_main.c
-+++ b/drivers/net/bonding/bond_main.c
-@@ -876,6 +876,22 @@ static void bond_mc_swap(struct bonding
- }
- }
-
-+static struct slave *bond_get_old_active(struct bonding *bond,
-+ struct slave *new_active)
-+{
-+ struct slave *slave;
-+
-+ bond_for_each_slave(bond, slave) {
-+ if (slave == new_active)
-+ continue;
-+
-+ if (ether_addr_equal(bond->dev->dev_addr, slave->dev->dev_addr))
-+ return slave;
-+ }
-+
-+ return NULL;
-+}
-+
- /*
- * bond_do_fail_over_mac
- *
-@@ -919,6 +935,9 @@ static void bond_do_fail_over_mac(struct
- write_unlock_bh(&bond->curr_slave_lock);
- read_unlock(&bond->lock);
-
-+ if (!old_active)
-+ old_active = bond_get_old_active(bond, new_active);
-+
- if (old_active) {
- memcpy(tmp_mac, new_active->dev->dev_addr, ETH_ALEN);
- memcpy(saddr.sa_data, old_active->dev->dev_addr,