aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r--drivers/net/bonding/bond_main.c42
-rw-r--r--drivers/net/bonding/bonding.h4
2 files changed, 24 insertions, 22 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 925402bcdf4d..3b6d66a8ab98 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1195,14 +1195,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
1195 old_active); 1195 old_active);
1196 1196
1197 bond->send_grat_arp = bond->params.num_grat_arp; 1197 bond->send_grat_arp = bond->params.num_grat_arp;
1198 if (!test_bit(__LINK_STATE_LINKWATCH_PENDING, 1198 bond_send_gratuitous_arp(bond);
1199 &bond->curr_active_slave->dev->state)) {
1200 bond_send_gratuitous_arp(bond);
1201 bond->send_grat_arp--;
1202 } else {
1203 dprintk("delaying gratuitous arp on %s\n",
1204 bond->curr_active_slave->dev->name);
1205 }
1206 1199
1207 write_unlock_bh(&bond->curr_slave_lock); 1200 write_unlock_bh(&bond->curr_slave_lock);
1208 read_unlock(&bond->lock); 1201 read_unlock(&bond->lock);
@@ -2241,17 +2234,6 @@ static int __bond_mii_monitor(struct bonding *bond, int have_locks)
2241 * program could monitor the link itself if needed. 2234 * program could monitor the link itself if needed.
2242 */ 2235 */
2243 2236
2244 if (bond->send_grat_arp) {
2245 if (bond->curr_active_slave && test_bit(__LINK_STATE_LINKWATCH_PENDING,
2246 &bond->curr_active_slave->dev->state))
2247 dprintk("Needs to send gratuitous arp but not yet\n");
2248 else {
2249 dprintk("sending delayed gratuitous arp on on %s\n",
2250 bond->curr_active_slave->dev->name);
2251 bond_send_gratuitous_arp(bond);
2252 bond->send_grat_arp--;
2253 }
2254 }
2255 read_lock(&bond->curr_slave_lock); 2237 read_lock(&bond->curr_slave_lock);
2256 oldcurrent = bond->curr_active_slave; 2238 oldcurrent = bond->curr_active_slave;
2257 read_unlock(&bond->curr_slave_lock); 2239 read_unlock(&bond->curr_slave_lock);
@@ -2492,6 +2474,13 @@ void bond_mii_monitor(struct work_struct *work)
2492 read_unlock(&bond->lock); 2474 read_unlock(&bond->lock);
2493 return; 2475 return;
2494 } 2476 }
2477
2478 if (bond->send_grat_arp) {
2479 read_lock(&bond->curr_slave_lock);
2480 bond_send_gratuitous_arp(bond);
2481 read_unlock(&bond->curr_slave_lock);
2482 }
2483
2495 if (__bond_mii_monitor(bond, 0)) { 2484 if (__bond_mii_monitor(bond, 0)) {
2496 read_unlock(&bond->lock); 2485 read_unlock(&bond->lock);
2497 rtnl_lock(); 2486 rtnl_lock();
@@ -2657,6 +2646,8 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
2657/* 2646/*
2658 * Kick out a gratuitous ARP for an IP on the bonding master plus one 2647 * Kick out a gratuitous ARP for an IP on the bonding master plus one
2659 * for each VLAN above us. 2648 * for each VLAN above us.
2649 *
2650 * Caller must hold curr_slave_lock for read or better
2660 */ 2651 */
2661static void bond_send_gratuitous_arp(struct bonding *bond) 2652static void bond_send_gratuitous_arp(struct bonding *bond)
2662{ 2653{
@@ -2666,9 +2657,13 @@ static void bond_send_gratuitous_arp(struct bonding *bond)
2666 2657
2667 dprintk("bond_send_grat_arp: bond %s slave %s\n", bond->dev->name, 2658 dprintk("bond_send_grat_arp: bond %s slave %s\n", bond->dev->name,
2668 slave ? slave->dev->name : "NULL"); 2659 slave ? slave->dev->name : "NULL");
2669 if (!slave) 2660
2661 if (!slave || !bond->send_grat_arp ||
2662 test_bit(__LINK_STATE_LINKWATCH_PENDING, &slave->dev->state))
2670 return; 2663 return;
2671 2664
2665 bond->send_grat_arp--;
2666
2672 if (bond->master_ip) { 2667 if (bond->master_ip) {
2673 bond_arp_send(slave->dev, ARPOP_REPLY, bond->master_ip, 2668 bond_arp_send(slave->dev, ARPOP_REPLY, bond->master_ip,
2674 bond->master_ip, 0); 2669 bond->master_ip, 0);
@@ -3172,6 +3167,12 @@ void bond_activebackup_arp_mon(struct work_struct *work)
3172 if (bond->slave_cnt == 0) 3167 if (bond->slave_cnt == 0)
3173 goto re_arm; 3168 goto re_arm;
3174 3169
3170 if (bond->send_grat_arp) {
3171 read_lock(&bond->curr_slave_lock);
3172 bond_send_gratuitous_arp(bond);
3173 read_unlock(&bond->curr_slave_lock);
3174 }
3175
3175 if (bond_ab_arp_inspect(bond, delta_in_ticks)) { 3176 if (bond_ab_arp_inspect(bond, delta_in_ticks)) {
3176 read_unlock(&bond->lock); 3177 read_unlock(&bond->lock);
3177 rtnl_lock(); 3178 rtnl_lock();
@@ -3846,6 +3847,7 @@ static int bond_close(struct net_device *bond_dev)
3846 3847
3847 write_lock_bh(&bond->lock); 3848 write_lock_bh(&bond->lock);
3848 3849
3850 bond->send_grat_arp = 0;
3849 3851
3850 /* signal timers not to re-arm */ 3852 /* signal timers not to re-arm */
3851 bond->kill_timers = 1; 3853 bond->kill_timers = 1;
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index 89fd9963db7a..fb730ec0396f 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -22,8 +22,8 @@
22#include "bond_3ad.h" 22#include "bond_3ad.h"
23#include "bond_alb.h" 23#include "bond_alb.h"
24 24
25#define DRV_VERSION "3.2.5" 25#define DRV_VERSION "3.3.0"
26#define DRV_RELDATE "March 21, 2008" 26#define DRV_RELDATE "June 10, 2008"
27#define DRV_NAME "bonding" 27#define DRV_NAME "bonding"
28#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" 28#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
29 29