diff options
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 42 | ||||
-rw-r--r-- | drivers/net/bonding/bonding.h | 4 |
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 | */ |
2661 | static void bond_send_gratuitous_arp(struct bonding *bond) | 2652 | static 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 | ||