|
@@ -109,6 +109,7 @@ static char *arp_validate;
|
|
|
static char *fail_over_mac;
|
|
|
static int all_slaves_active = 0;
|
|
|
static struct bond_params bonding_defaults;
|
|
|
+static int resend_igmp = BOND_DEFAULT_RESEND_IGMP;
|
|
|
|
|
|
module_param(max_bonds, int, 0);
|
|
|
MODULE_PARM_DESC(max_bonds, "Max number of bonded devices");
|
|
@@ -163,6 +164,8 @@ module_param(all_slaves_active, int, 0);
|
|
|
MODULE_PARM_DESC(all_slaves_active, "Keep all frames received on an interface"
|
|
|
"by setting active flag for all slaves. "
|
|
|
"0 for never (default), 1 for always.");
|
|
|
+module_param(resend_igmp, int, 0);
|
|
|
+MODULE_PARM_DESC(resend_igmp, "Number of IGMP membership reports to send on link failure");
|
|
|
|
|
|
/*----------------------------- Global variables ----------------------------*/
|
|
|
|
|
@@ -905,6 +908,9 @@ static void bond_resend_igmp_join_requests(struct bonding *bond)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (--bond->igmp_retrans > 0)
|
|
|
+ queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5);
|
|
|
+
|
|
|
read_unlock(&bond->lock);
|
|
|
}
|
|
|
|
|
@@ -1213,6 +1219,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|
|
* all were sent on curr_active_slave */
|
|
|
if ((USES_PRIMARY(bond->params.mode) && new_active) ||
|
|
|
bond->params.mode == BOND_MODE_ROUNDROBIN) {
|
|
|
+ bond->igmp_retrans = bond->params.resend_igmp;
|
|
|
queue_delayed_work(bond->wq, &bond->mcast_work, 0);
|
|
|
}
|
|
|
}
|
|
@@ -4933,6 +4940,13 @@ static int bond_check_params(struct bond_params *params)
|
|
|
all_slaves_active = 0;
|
|
|
}
|
|
|
|
|
|
+ if (resend_igmp < 0 || resend_igmp > 255) {
|
|
|
+ pr_warning("Warning: resend_igmp (%d) should be between "
|
|
|
+ "0 and 255, resetting to %d\n",
|
|
|
+ resend_igmp, BOND_DEFAULT_RESEND_IGMP);
|
|
|
+ resend_igmp = BOND_DEFAULT_RESEND_IGMP;
|
|
|
+ }
|
|
|
+
|
|
|
/* reset values for TLB/ALB */
|
|
|
if ((bond_mode == BOND_MODE_TLB) ||
|
|
|
(bond_mode == BOND_MODE_ALB)) {
|
|
@@ -5105,6 +5119,7 @@ static int bond_check_params(struct bond_params *params)
|
|
|
params->fail_over_mac = fail_over_mac_value;
|
|
|
params->tx_queues = tx_queues;
|
|
|
params->all_slaves_active = all_slaves_active;
|
|
|
+ params->resend_igmp = resend_igmp;
|
|
|
|
|
|
if (primary) {
|
|
|
strncpy(params->primary, primary, IFNAMSIZ);
|