|
@@ -89,6 +89,7 @@
|
|
|
|
|
|
static int max_bonds = BOND_DEFAULT_MAX_BONDS;
|
|
static int max_bonds = BOND_DEFAULT_MAX_BONDS;
|
|
static int num_grat_arp = 1;
|
|
static int num_grat_arp = 1;
|
|
|
|
+static int num_unsol_na = 1;
|
|
static int miimon = BOND_LINK_MON_INTERV;
|
|
static int miimon = BOND_LINK_MON_INTERV;
|
|
static int updelay = 0;
|
|
static int updelay = 0;
|
|
static int downdelay = 0;
|
|
static int downdelay = 0;
|
|
@@ -107,6 +108,8 @@ module_param(max_bonds, int, 0);
|
|
MODULE_PARM_DESC(max_bonds, "Max number of bonded devices");
|
|
MODULE_PARM_DESC(max_bonds, "Max number of bonded devices");
|
|
module_param(num_grat_arp, int, 0644);
|
|
module_param(num_grat_arp, int, 0644);
|
|
MODULE_PARM_DESC(num_grat_arp, "Number of gratuitous ARP packets to send on failover event");
|
|
MODULE_PARM_DESC(num_grat_arp, "Number of gratuitous ARP packets to send on failover event");
|
|
|
|
+module_param(num_unsol_na, int, 0644);
|
|
|
|
+MODULE_PARM_DESC(num_unsol_na, "Number of unsolicited IPv6 Neighbor Advertisements packets to send on failover event");
|
|
module_param(miimon, int, 0);
|
|
module_param(miimon, int, 0);
|
|
MODULE_PARM_DESC(miimon, "Link check interval in milliseconds");
|
|
MODULE_PARM_DESC(miimon, "Link check interval in milliseconds");
|
|
module_param(updelay, int, 0);
|
|
module_param(updelay, int, 0);
|
|
@@ -242,14 +245,13 @@ static int bond_add_vlan(struct bonding *bond, unsigned short vlan_id)
|
|
dprintk("bond: %s, vlan id %d\n",
|
|
dprintk("bond: %s, vlan id %d\n",
|
|
(bond ? bond->dev->name: "None"), vlan_id);
|
|
(bond ? bond->dev->name: "None"), vlan_id);
|
|
|
|
|
|
- vlan = kmalloc(sizeof(struct vlan_entry), GFP_KERNEL);
|
|
|
|
|
|
+ vlan = kzalloc(sizeof(struct vlan_entry), GFP_KERNEL);
|
|
if (!vlan) {
|
|
if (!vlan) {
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
INIT_LIST_HEAD(&vlan->vlan_list);
|
|
INIT_LIST_HEAD(&vlan->vlan_list);
|
|
vlan->vlan_id = vlan_id;
|
|
vlan->vlan_id = vlan_id;
|
|
- vlan->vlan_ip = 0;
|
|
|
|
|
|
|
|
write_lock_bh(&bond->lock);
|
|
write_lock_bh(&bond->lock);
|
|
|
|
|
|
@@ -1208,6 +1210,9 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
|
bond->send_grat_arp = bond->params.num_grat_arp;
|
|
bond->send_grat_arp = bond->params.num_grat_arp;
|
|
bond_send_gratuitous_arp(bond);
|
|
bond_send_gratuitous_arp(bond);
|
|
|
|
|
|
|
|
+ bond->send_unsol_na = bond->params.num_unsol_na;
|
|
|
|
+ bond_send_unsolicited_na(bond);
|
|
|
|
+
|
|
write_unlock_bh(&bond->curr_slave_lock);
|
|
write_unlock_bh(&bond->curr_slave_lock);
|
|
read_unlock(&bond->lock);
|
|
read_unlock(&bond->lock);
|
|
|
|
|
|
@@ -2463,6 +2468,12 @@ void bond_mii_monitor(struct work_struct *work)
|
|
read_unlock(&bond->curr_slave_lock);
|
|
read_unlock(&bond->curr_slave_lock);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (bond->send_unsol_na) {
|
|
|
|
+ read_lock(&bond->curr_slave_lock);
|
|
|
|
+ bond_send_unsolicited_na(bond);
|
|
|
|
+ read_unlock(&bond->curr_slave_lock);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (bond_miimon_inspect(bond)) {
|
|
if (bond_miimon_inspect(bond)) {
|
|
read_unlock(&bond->lock);
|
|
read_unlock(&bond->lock);
|
|
rtnl_lock();
|
|
rtnl_lock();
|
|
@@ -3158,6 +3169,12 @@ void bond_activebackup_arp_mon(struct work_struct *work)
|
|
read_unlock(&bond->curr_slave_lock);
|
|
read_unlock(&bond->curr_slave_lock);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (bond->send_unsol_na) {
|
|
|
|
+ read_lock(&bond->curr_slave_lock);
|
|
|
|
+ bond_send_unsolicited_na(bond);
|
|
|
|
+ read_unlock(&bond->curr_slave_lock);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (bond_ab_arp_inspect(bond, delta_in_ticks)) {
|
|
if (bond_ab_arp_inspect(bond, delta_in_ticks)) {
|
|
read_unlock(&bond->lock);
|
|
read_unlock(&bond->lock);
|
|
rtnl_lock();
|
|
rtnl_lock();
|
|
@@ -3827,6 +3844,7 @@ static int bond_close(struct net_device *bond_dev)
|
|
write_lock_bh(&bond->lock);
|
|
write_lock_bh(&bond->lock);
|
|
|
|
|
|
bond->send_grat_arp = 0;
|
|
bond->send_grat_arp = 0;
|
|
|
|
+ bond->send_unsol_na = 0;
|
|
|
|
|
|
/* signal timers not to re-arm */
|
|
/* signal timers not to re-arm */
|
|
bond->kill_timers = 1;
|
|
bond->kill_timers = 1;
|
|
@@ -4542,6 +4560,7 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
|
|
bond->primary_slave = NULL;
|
|
bond->primary_slave = NULL;
|
|
bond->dev = bond_dev;
|
|
bond->dev = bond_dev;
|
|
bond->send_grat_arp = 0;
|
|
bond->send_grat_arp = 0;
|
|
|
|
+ bond->send_unsol_na = 0;
|
|
bond->setup_by_slave = 0;
|
|
bond->setup_by_slave = 0;
|
|
INIT_LIST_HEAD(&bond->vlan_list);
|
|
INIT_LIST_HEAD(&bond->vlan_list);
|
|
|
|
|
|
@@ -4791,6 +4810,13 @@ static int bond_check_params(struct bond_params *params)
|
|
num_grat_arp = 1;
|
|
num_grat_arp = 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (num_unsol_na < 0 || num_unsol_na > 255) {
|
|
|
|
+ printk(KERN_WARNING DRV_NAME
|
|
|
|
+ ": Warning: num_unsol_na (%d) not in range 0-255 so it "
|
|
|
|
+ "was reset to 1 \n", num_unsol_na);
|
|
|
|
+ num_unsol_na = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* reset values for 802.3ad */
|
|
/* reset values for 802.3ad */
|
|
if (bond_mode == BOND_MODE_8023AD) {
|
|
if (bond_mode == BOND_MODE_8023AD) {
|
|
if (!miimon) {
|
|
if (!miimon) {
|
|
@@ -4992,6 +5018,7 @@ static int bond_check_params(struct bond_params *params)
|
|
params->xmit_policy = xmit_hashtype;
|
|
params->xmit_policy = xmit_hashtype;
|
|
params->miimon = miimon;
|
|
params->miimon = miimon;
|
|
params->num_grat_arp = num_grat_arp;
|
|
params->num_grat_arp = num_grat_arp;
|
|
|
|
+ params->num_unsol_na = num_unsol_na;
|
|
params->arp_interval = arp_interval;
|
|
params->arp_interval = arp_interval;
|
|
params->arp_validate = arp_validate_value;
|
|
params->arp_validate = arp_validate_value;
|
|
params->updelay = updelay;
|
|
params->updelay = updelay;
|
|
@@ -5144,6 +5171,7 @@ static int __init bonding_init(void)
|
|
|
|
|
|
register_netdevice_notifier(&bond_netdev_notifier);
|
|
register_netdevice_notifier(&bond_netdev_notifier);
|
|
register_inetaddr_notifier(&bond_inetaddr_notifier);
|
|
register_inetaddr_notifier(&bond_inetaddr_notifier);
|
|
|
|
+ bond_register_ipv6_notifier();
|
|
|
|
|
|
goto out;
|
|
goto out;
|
|
err:
|
|
err:
|
|
@@ -5166,6 +5194,7 @@ static void __exit bonding_exit(void)
|
|
{
|
|
{
|
|
unregister_netdevice_notifier(&bond_netdev_notifier);
|
|
unregister_netdevice_notifier(&bond_netdev_notifier);
|
|
unregister_inetaddr_notifier(&bond_inetaddr_notifier);
|
|
unregister_inetaddr_notifier(&bond_inetaddr_notifier);
|
|
|
|
+ bond_unregister_ipv6_notifier();
|
|
|
|
|
|
bond_destroy_sysfs();
|
|
bond_destroy_sysfs();
|
|
|
|
|