aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWeiping Pan <wpan@redhat.com>2012-03-27 15:18:24 -0400
committerDavid S. Miller <davem@davemloft.net>2012-03-29 18:11:57 -0400
commit7d26bb103c4162003bfdf1d63aaa32b548ad0e9a (patch)
tree010e8c9e49ed2700ad2bd726cb5835392058b610
parent3b9785c6b0ff37ac4ef5085b38756283da84dceb (diff)
bonding: emit event when bonding changes MAC
When a bonding device is configured with fail_over_mac=active, we expect to see the MAC address of the new active slave as the source MAC address after failover. But we see that the source MAC address is the MAC address of previous active slave. Emit NETDEV_CHANGEADDR event when bonding changes its MAC address, in order to let arp_netdev_event flush neighbour cache and route cache. How to reproduce this bug ? -----------hostB---------------- hostA ----- switch ---|-- eth0--bond0(192.168.100.2/24)| (192.168.100.1/24 \--|-- eth1-/ | -------------------------------- 1 on hostB, modprobe bonding mode=1 miimon=500 fail_over_mac=active downdelay=1000 num_grat_arp=1 ifconfig bond0 192.168.100.2/24 up ifenslave bond0 eth0 ifenslave bond0 eth1 then eth0 is the active slave, and MAC of bond0 is MAC of eth0. 2 on hostA, ping 192.168.100.2 3 on hostB, tcpdump -i bond0 -p icmp -XXX you will see bond0 uses MAC of eth0 as source MAC in icmp reply. 4 on hostB, ifconfig eth0 down tcpdump -i bond0 -p icmp -XXX (just keep it running in step 3) you will see first bond0 uses MAC of eth1 as source MAC in icmp reply, then it will use MAC of eth0 as source MAC. Signed-off-by: Weiping Pan <wpan@redhat.com> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/bonding/bond_main.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index b920d829692a..a20b5850e7ce 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -892,9 +892,15 @@ static void bond_do_fail_over_mac(struct bonding *bond,
892 892
893 switch (bond->params.fail_over_mac) { 893 switch (bond->params.fail_over_mac) {
894 case BOND_FOM_ACTIVE: 894 case BOND_FOM_ACTIVE:
895 if (new_active) 895 if (new_active) {
896 memcpy(bond->dev->dev_addr, new_active->dev->dev_addr, 896 memcpy(bond->dev->dev_addr, new_active->dev->dev_addr,
897 new_active->dev->addr_len); 897 new_active->dev->addr_len);
898 write_unlock_bh(&bond->curr_slave_lock);
899 read_unlock(&bond->lock);
900 call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev);
901 read_lock(&bond->lock);
902 write_lock_bh(&bond->curr_slave_lock);
903 }
898 break; 904 break;
899 case BOND_FOM_FOLLOW: 905 case BOND_FOM_FOLLOW:
900 /* 906 /*