aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Vosburgh <fubar@us.ibm.com>2008-06-13 21:12:03 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-06-18 00:00:04 -0400
commitb59f9f74c4c0a569398f08c34a877f1b7b457496 (patch)
tree714ec0e4840f1eaf9468f63c326203afee0b2d69
parent01f3109de49a889db8adf9116449727547ee497e (diff)
bonding: Rework / fix multiple gratuitous ARP support
Support for sending multiple gratuitous ARPs during failovers was added by commit: commit 7893b2491a2d5f716540ac5643d78d37a7f6628b Author: Moni Shoua <monis@voltaire.com> Date: Sat May 17 21:10:12 2008 -0700 bonding: Send more than one gratuitous ARP when slave takes over This change modifies that support to remove duplicated code, add support for ARP monitor (the original only supported miimon), clear the grat ARP counter in bond_close (lest a later "ifconfig up" immediately start spewing ARPs), and add documentation for the module parameter. Also updated driver version to 3.3.0. Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-rw-r--r--Documentation/networking/bonding.txt11
-rw-r--r--drivers/net/bonding/bond_main.c42
-rw-r--r--drivers/net/bonding/bonding.h4
3 files changed, 35 insertions, 22 deletions
diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt
index 8e6b8d3c7410..370b7da73ab4 100644
--- a/Documentation/networking/bonding.txt
+++ b/Documentation/networking/bonding.txt
@@ -539,6 +539,17 @@ mode
539 swapped with the new curr_active_slave that was 539 swapped with the new curr_active_slave that was
540 chosen. 540 chosen.
541 541
542num_grat_arp
543
544 Specifies the number of gratuitous ARPs to be issued after a
545 failover event. One gratuitous ARP is issued immediately after
546 the failover, subsequent ARPs are sent at a rate of one per link
547 monitor interval (arp_interval or miimon, whichever is active).
548
549 The valid range is 0 - 255; the default value is 1. This option
550 affects only the active-backup mode. This option was added for
551 bonding version 3.3.0.
552
542primary 553primary
543 554
544 A string (eth0, eth2, etc) specifying which slave is the 555 A string (eth0, eth2, etc) specifying which slave is the
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