aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r--drivers/net/bonding/bond_3ad.c11
-rw-r--r--drivers/net/bonding/bond_main.c88
-rw-r--r--drivers/net/bonding/bond_sysfs.c53
-rw-r--r--drivers/net/bonding/bonding.h14
4 files changed, 138 insertions, 28 deletions
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index c3fa31c9f2a7..3cd8153b906c 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -1956,7 +1956,7 @@ void bond_3ad_unbind_slave(struct slave *slave)
1956 struct port *port, *prev_port, *temp_port; 1956 struct port *port, *prev_port, *temp_port;
1957 struct aggregator *aggregator, *new_aggregator, *temp_aggregator; 1957 struct aggregator *aggregator, *new_aggregator, *temp_aggregator;
1958 int select_new_active_agg = 0; 1958 int select_new_active_agg = 0;
1959 1959
1960 // find the aggregator related to this slave 1960 // find the aggregator related to this slave
1961 aggregator = &(SLAVE_AD_INFO(slave).aggregator); 1961 aggregator = &(SLAVE_AD_INFO(slave).aggregator);
1962 1962
@@ -2024,7 +2024,7 @@ void bond_3ad_unbind_slave(struct slave *slave)
2024 2024
2025 // clear the aggregator 2025 // clear the aggregator
2026 ad_clear_agg(aggregator); 2026 ad_clear_agg(aggregator);
2027 2027
2028 if (select_new_active_agg) { 2028 if (select_new_active_agg) {
2029 ad_agg_selection_logic(__get_first_agg(port)); 2029 ad_agg_selection_logic(__get_first_agg(port));
2030 } 2030 }
@@ -2075,7 +2075,7 @@ void bond_3ad_unbind_slave(struct slave *slave)
2075 } 2075 }
2076 } 2076 }
2077 } 2077 }
2078 port->slave=NULL; 2078 port->slave=NULL;
2079} 2079}
2080 2080
2081/** 2081/**
@@ -2301,7 +2301,7 @@ void bond_3ad_handle_link_change(struct slave *slave, char link)
2301} 2301}
2302 2302
2303/* 2303/*
2304 * set link state for bonding master: if we have an active 2304 * set link state for bonding master: if we have an active
2305 * aggregator, we're up, if not, we're down. Presumes that we cannot 2305 * aggregator, we're up, if not, we're down. Presumes that we cannot
2306 * have an active aggregator if there are no slaves with link up. 2306 * have an active aggregator if there are no slaves with link up.
2307 * 2307 *
@@ -2395,7 +2395,7 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
2395 goto out; 2395 goto out;
2396 } 2396 }
2397 2397
2398 slave_agg_no = bond->xmit_hash_policy(skb, dev, slaves_in_agg); 2398 slave_agg_no = bond->xmit_hash_policy(skb, slaves_in_agg);
2399 2399
2400 bond_for_each_slave(bond, slave, i) { 2400 bond_for_each_slave(bond, slave, i) {
2401 struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator; 2401 struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator;
@@ -2468,4 +2468,3 @@ out:
2468 2468
2469 return ret; 2469 return ret;
2470} 2470}
2471
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 40fb5eefc72e..db82876ceb28 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -94,6 +94,7 @@ static int downdelay;
94static int use_carrier = 1; 94static int use_carrier = 1;
95static char *mode; 95static char *mode;
96static char *primary; 96static char *primary;
97static char *primary_reselect;
97static char *lacp_rate; 98static char *lacp_rate;
98static char *ad_select; 99static char *ad_select;
99static char *xmit_hash_policy; 100static char *xmit_hash_policy;
@@ -126,6 +127,14 @@ MODULE_PARM_DESC(mode, "Mode of operation : 0 for balance-rr, "
126 "6 for balance-alb"); 127 "6 for balance-alb");
127module_param(primary, charp, 0); 128module_param(primary, charp, 0);
128MODULE_PARM_DESC(primary, "Primary network device to use"); 129MODULE_PARM_DESC(primary, "Primary network device to use");
130module_param(primary_reselect, charp, 0);
131MODULE_PARM_DESC(primary_reselect, "Reselect primary slave "
132 "once it comes up; "
133 "0 for always (default), "
134 "1 for only if speed of primary is "
135 "better, "
136 "2 for only on active slave "
137 "failure");
129module_param(lacp_rate, charp, 0); 138module_param(lacp_rate, charp, 0);
130MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner " 139MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner "
131 "(slow/fast)"); 140 "(slow/fast)");
@@ -200,6 +209,13 @@ const struct bond_parm_tbl fail_over_mac_tbl[] = {
200{ NULL, -1}, 209{ NULL, -1},
201}; 210};
202 211
212const struct bond_parm_tbl pri_reselect_tbl[] = {
213{ "always", BOND_PRI_RESELECT_ALWAYS},
214{ "better", BOND_PRI_RESELECT_BETTER},
215{ "failure", BOND_PRI_RESELECT_FAILURE},
216{ NULL, -1},
217};
218
203struct bond_parm_tbl ad_select_tbl[] = { 219struct bond_parm_tbl ad_select_tbl[] = {
204{ "stable", BOND_AD_STABLE}, 220{ "stable", BOND_AD_STABLE},
205{ "bandwidth", BOND_AD_BANDWIDTH}, 221{ "bandwidth", BOND_AD_BANDWIDTH},
@@ -1070,6 +1086,25 @@ out:
1070 1086
1071} 1087}
1072 1088
1089static bool bond_should_change_active(struct bonding *bond)
1090{
1091 struct slave *prim = bond->primary_slave;
1092 struct slave *curr = bond->curr_active_slave;
1093
1094 if (!prim || !curr || curr->link != BOND_LINK_UP)
1095 return true;
1096 if (bond->force_primary) {
1097 bond->force_primary = false;
1098 return true;
1099 }
1100 if (bond->params.primary_reselect == BOND_PRI_RESELECT_BETTER &&
1101 (prim->speed < curr->speed ||
1102 (prim->speed == curr->speed && prim->duplex <= curr->duplex)))
1103 return false;
1104 if (bond->params.primary_reselect == BOND_PRI_RESELECT_FAILURE)
1105 return false;
1106 return true;
1107}
1073 1108
1074/** 1109/**
1075 * find_best_interface - select the best available slave to be the active one 1110 * find_best_interface - select the best available slave to be the active one
@@ -1084,7 +1119,7 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
1084 int mintime = bond->params.updelay; 1119 int mintime = bond->params.updelay;
1085 int i; 1120 int i;
1086 1121
1087 new_active = old_active = bond->curr_active_slave; 1122 new_active = bond->curr_active_slave;
1088 1123
1089 if (!new_active) { /* there were no active slaves left */ 1124 if (!new_active) { /* there were no active slaves left */
1090 if (bond->slave_cnt > 0) /* found one slave */ 1125 if (bond->slave_cnt > 0) /* found one slave */
@@ -1094,7 +1129,8 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
1094 } 1129 }
1095 1130
1096 if ((bond->primary_slave) && 1131 if ((bond->primary_slave) &&
1097 bond->primary_slave->link == BOND_LINK_UP) { 1132 bond->primary_slave->link == BOND_LINK_UP &&
1133 bond_should_change_active(bond)) {
1098 new_active = bond->primary_slave; 1134 new_active = bond->primary_slave;
1099 } 1135 }
1100 1136
@@ -1678,8 +1714,10 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1678 1714
1679 if (USES_PRIMARY(bond->params.mode) && bond->params.primary[0]) { 1715 if (USES_PRIMARY(bond->params.mode) && bond->params.primary[0]) {
1680 /* if there is a primary slave, remember it */ 1716 /* if there is a primary slave, remember it */
1681 if (strcmp(bond->params.primary, new_slave->dev->name) == 0) 1717 if (strcmp(bond->params.primary, new_slave->dev->name) == 0) {
1682 bond->primary_slave = new_slave; 1718 bond->primary_slave = new_slave;
1719 bond->force_primary = true;
1720 }
1683 } 1721 }
1684 1722
1685 write_lock_bh(&bond->curr_slave_lock); 1723 write_lock_bh(&bond->curr_slave_lock);
@@ -3201,11 +3239,14 @@ static void bond_info_show_master(struct seq_file *seq)
3201 } 3239 }
3202 3240
3203 if (USES_PRIMARY(bond->params.mode)) { 3241 if (USES_PRIMARY(bond->params.mode)) {
3204 seq_printf(seq, "Primary Slave: %s\n", 3242 seq_printf(seq, "Primary Slave: %s",
3205 (bond->primary_slave) ? 3243 (bond->primary_slave) ?
3206 bond->primary_slave->dev->name : "None"); 3244 bond->primary_slave->dev->name : "None");
3245 if (bond->primary_slave)
3246 seq_printf(seq, " (primary_reselect %s)",
3247 pri_reselect_tbl[bond->params.primary_reselect].modename);
3207 3248
3208 seq_printf(seq, "Currently Active Slave: %s\n", 3249 seq_printf(seq, "\nCurrently Active Slave: %s\n",
3209 (curr) ? curr->dev->name : "None"); 3250 (curr) ? curr->dev->name : "None");
3210 } 3251 }
3211 3252
@@ -3334,7 +3375,7 @@ static const struct file_operations bond_info_fops = {
3334 .release = seq_release, 3375 .release = seq_release,
3335}; 3376};
3336 3377
3337static int bond_create_proc_entry(struct bonding *bond) 3378static void bond_create_proc_entry(struct bonding *bond)
3338{ 3379{
3339 struct net_device *bond_dev = bond->dev; 3380 struct net_device *bond_dev = bond->dev;
3340 3381
@@ -3349,8 +3390,6 @@ static int bond_create_proc_entry(struct bonding *bond)
3349 else 3390 else
3350 memcpy(bond->proc_file_name, bond_dev->name, IFNAMSIZ); 3391 memcpy(bond->proc_file_name, bond_dev->name, IFNAMSIZ);
3351 } 3392 }
3352
3353 return 0;
3354} 3393}
3355 3394
3356static void bond_remove_proc_entry(struct bonding *bond) 3395static void bond_remove_proc_entry(struct bonding *bond)
@@ -3389,7 +3428,7 @@ static void bond_destroy_proc_dir(void)
3389 3428
3390#else /* !CONFIG_PROC_FS */ 3429#else /* !CONFIG_PROC_FS */
3391 3430
3392static int bond_create_proc_entry(struct bonding *bond) 3431static void bond_create_proc_entry(struct bonding *bond)
3393{ 3432{
3394} 3433}
3395 3434
@@ -3657,8 +3696,7 @@ void bond_unregister_arp(struct bonding *bond)
3657 * Hash for the output device based upon layer 2 and layer 3 data. If 3696 * Hash for the output device based upon layer 2 and layer 3 data. If
3658 * the packet is not IP mimic bond_xmit_hash_policy_l2() 3697 * the packet is not IP mimic bond_xmit_hash_policy_l2()
3659 */ 3698 */
3660static int bond_xmit_hash_policy_l23(struct sk_buff *skb, 3699static int bond_xmit_hash_policy_l23(struct sk_buff *skb, int count)
3661 struct net_device *bond_dev, int count)
3662{ 3700{
3663 struct ethhdr *data = (struct ethhdr *)skb->data; 3701 struct ethhdr *data = (struct ethhdr *)skb->data;
3664 struct iphdr *iph = ip_hdr(skb); 3702 struct iphdr *iph = ip_hdr(skb);
@@ -3676,8 +3714,7 @@ static int bond_xmit_hash_policy_l23(struct sk_buff *skb,
3676 * the packet is a frag or not TCP or UDP, just use layer 3 data. If it is 3714 * the packet is a frag or not TCP or UDP, just use layer 3 data. If it is
3677 * altogether not IP, mimic bond_xmit_hash_policy_l2() 3715 * altogether not IP, mimic bond_xmit_hash_policy_l2()
3678 */ 3716 */
3679static int bond_xmit_hash_policy_l34(struct sk_buff *skb, 3717static int bond_xmit_hash_policy_l34(struct sk_buff *skb, int count)
3680 struct net_device *bond_dev, int count)
3681{ 3718{
3682 struct ethhdr *data = (struct ethhdr *)skb->data; 3719 struct ethhdr *data = (struct ethhdr *)skb->data;
3683 struct iphdr *iph = ip_hdr(skb); 3720 struct iphdr *iph = ip_hdr(skb);
@@ -3701,8 +3738,7 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb,
3701/* 3738/*
3702 * Hash for the output device based upon layer 2 data 3739 * Hash for the output device based upon layer 2 data
3703 */ 3740 */
3704static int bond_xmit_hash_policy_l2(struct sk_buff *skb, 3741static int bond_xmit_hash_policy_l2(struct sk_buff *skb, int count)
3705 struct net_device *bond_dev, int count)
3706{ 3742{
3707 struct ethhdr *data = (struct ethhdr *)skb->data; 3743 struct ethhdr *data = (struct ethhdr *)skb->data;
3708 3744
@@ -4295,7 +4331,7 @@ static int bond_xmit_xor(struct sk_buff *skb, struct net_device *bond_dev)
4295 if (!BOND_IS_OK(bond)) 4331 if (!BOND_IS_OK(bond))
4296 goto out; 4332 goto out;
4297 4333
4298 slave_no = bond->xmit_hash_policy(skb, bond_dev, bond->slave_cnt); 4334 slave_no = bond->xmit_hash_policy(skb, bond->slave_cnt);
4299 4335
4300 bond_for_each_slave(bond, slave, i) { 4336 bond_for_each_slave(bond, slave, i) {
4301 slave_no--; 4337 slave_no--;
@@ -4646,7 +4682,7 @@ int bond_parse_parm(const char *buf, const struct bond_parm_tbl *tbl)
4646 4682
4647static int bond_check_params(struct bond_params *params) 4683static int bond_check_params(struct bond_params *params)
4648{ 4684{
4649 int arp_validate_value, fail_over_mac_value; 4685 int arp_validate_value, fail_over_mac_value, primary_reselect_value;
4650 4686
4651 /* 4687 /*
4652 * Convert string parameters. 4688 * Convert string parameters.
@@ -4665,7 +4701,8 @@ static int bond_check_params(struct bond_params *params)
4665 if ((bond_mode != BOND_MODE_XOR) && 4701 if ((bond_mode != BOND_MODE_XOR) &&
4666 (bond_mode != BOND_MODE_8023AD)) { 4702 (bond_mode != BOND_MODE_8023AD)) {
4667 pr_info(DRV_NAME 4703 pr_info(DRV_NAME
4668 ": xor_mode param is irrelevant in mode %s\n", 4704 ": xmit_hash_policy param is irrelevant in"
4705 " mode %s\n",
4669 bond_mode_name(bond_mode)); 4706 bond_mode_name(bond_mode));
4670 } else { 4707 } else {
4671 xmit_hashtype = bond_parse_parm(xmit_hash_policy, 4708 xmit_hashtype = bond_parse_parm(xmit_hash_policy,
@@ -4945,6 +4982,20 @@ static int bond_check_params(struct bond_params *params)
4945 primary = NULL; 4982 primary = NULL;
4946 } 4983 }
4947 4984
4985 if (primary && primary_reselect) {
4986 primary_reselect_value = bond_parse_parm(primary_reselect,
4987 pri_reselect_tbl);
4988 if (primary_reselect_value == -1) {
4989 pr_err(DRV_NAME
4990 ": Error: Invalid primary_reselect \"%s\"\n",
4991 primary_reselect ==
4992 NULL ? "NULL" : primary_reselect);
4993 return -EINVAL;
4994 }
4995 } else {
4996 primary_reselect_value = BOND_PRI_RESELECT_ALWAYS;
4997 }
4998
4948 if (fail_over_mac) { 4999 if (fail_over_mac) {
4949 fail_over_mac_value = bond_parse_parm(fail_over_mac, 5000 fail_over_mac_value = bond_parse_parm(fail_over_mac,
4950 fail_over_mac_tbl); 5001 fail_over_mac_tbl);
@@ -4976,6 +5027,7 @@ static int bond_check_params(struct bond_params *params)
4976 params->use_carrier = use_carrier; 5027 params->use_carrier = use_carrier;
4977 params->lacp_fast = lacp_fast; 5028 params->lacp_fast = lacp_fast;
4978 params->primary[0] = 0; 5029 params->primary[0] = 0;
5030 params->primary_reselect = primary_reselect_value;
4979 params->fail_over_mac = fail_over_mac_value; 5031 params->fail_over_mac = fail_over_mac_value;
4980 5032
4981 if (primary) { 5033 if (primary) {
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
index ff449de6f3c0..dca7d82f7b97 100644
--- a/drivers/net/bonding/bond_sysfs.c
+++ b/drivers/net/bonding/bond_sysfs.c
@@ -1213,6 +1213,58 @@ static DEVICE_ATTR(primary, S_IRUGO | S_IWUSR,
1213 bonding_show_primary, bonding_store_primary); 1213 bonding_show_primary, bonding_store_primary);
1214 1214
1215/* 1215/*
1216 * Show and set the primary_reselect flag.
1217 */
1218static ssize_t bonding_show_primary_reselect(struct device *d,
1219 struct device_attribute *attr,
1220 char *buf)
1221{
1222 struct bonding *bond = to_bond(d);
1223
1224 return sprintf(buf, "%s %d\n",
1225 pri_reselect_tbl[bond->params.primary_reselect].modename,
1226 bond->params.primary_reselect);
1227}
1228
1229static ssize_t bonding_store_primary_reselect(struct device *d,
1230 struct device_attribute *attr,
1231 const char *buf, size_t count)
1232{
1233 int new_value, ret = count;
1234 struct bonding *bond = to_bond(d);
1235
1236 if (!rtnl_trylock())
1237 return restart_syscall();
1238
1239 new_value = bond_parse_parm(buf, pri_reselect_tbl);
1240 if (new_value < 0) {
1241 pr_err(DRV_NAME
1242 ": %s: Ignoring invalid primary_reselect value %.*s.\n",
1243 bond->dev->name,
1244 (int) strlen(buf) - 1, buf);
1245 ret = -EINVAL;
1246 goto out;
1247 }
1248
1249 bond->params.primary_reselect = new_value;
1250 pr_info(DRV_NAME ": %s: setting primary_reselect to %s (%d).\n",
1251 bond->dev->name, pri_reselect_tbl[new_value].modename,
1252 new_value);
1253
1254 read_lock(&bond->lock);
1255 write_lock_bh(&bond->curr_slave_lock);
1256 bond_select_active_slave(bond);
1257 write_unlock_bh(&bond->curr_slave_lock);
1258 read_unlock(&bond->lock);
1259out:
1260 rtnl_unlock();
1261 return ret;
1262}
1263static DEVICE_ATTR(primary_reselect, S_IRUGO | S_IWUSR,
1264 bonding_show_primary_reselect,
1265 bonding_store_primary_reselect);
1266
1267/*
1216 * Show and set the use_carrier flag. 1268 * Show and set the use_carrier flag.
1217 */ 1269 */
1218static ssize_t bonding_show_carrier(struct device *d, 1270static ssize_t bonding_show_carrier(struct device *d,
@@ -1501,6 +1553,7 @@ static struct attribute *per_bond_attrs[] = {
1501 &dev_attr_num_unsol_na.attr, 1553 &dev_attr_num_unsol_na.attr,
1502 &dev_attr_miimon.attr, 1554 &dev_attr_miimon.attr,
1503 &dev_attr_primary.attr, 1555 &dev_attr_primary.attr,
1556 &dev_attr_primary_reselect.attr,
1504 &dev_attr_use_carrier.attr, 1557 &dev_attr_use_carrier.attr,
1505 &dev_attr_active_slave.attr, 1558 &dev_attr_active_slave.attr,
1506 &dev_attr_mii_status.attr, 1559 &dev_attr_mii_status.attr,
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index 68247714466f..9b520b05fbac 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -23,8 +23,8 @@
23#include "bond_3ad.h" 23#include "bond_3ad.h"
24#include "bond_alb.h" 24#include "bond_alb.h"
25 25
26#define DRV_VERSION "3.5.0" 26#define DRV_VERSION "3.6.0"
27#define DRV_RELDATE "November 4, 2008" 27#define DRV_RELDATE "September 26, 2009"
28#define DRV_NAME "bonding" 28#define DRV_NAME "bonding"
29#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" 29#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
30 30
@@ -131,6 +131,7 @@ struct bond_params {
131 int lacp_fast; 131 int lacp_fast;
132 int ad_select; 132 int ad_select;
133 char primary[IFNAMSIZ]; 133 char primary[IFNAMSIZ];
134 int primary_reselect;
134 __be32 arp_targets[BOND_MAX_ARP_TARGETS]; 135 __be32 arp_targets[BOND_MAX_ARP_TARGETS];
135}; 136};
136 137
@@ -190,6 +191,7 @@ struct bonding {
190 struct slave *curr_active_slave; 191 struct slave *curr_active_slave;
191 struct slave *current_arp_slave; 192 struct slave *current_arp_slave;
192 struct slave *primary_slave; 193 struct slave *primary_slave;
194 bool force_primary;
193 s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ 195 s32 slave_cnt; /* never change this value outside the attach/detach wrappers */
194 rwlock_t lock; 196 rwlock_t lock;
195 rwlock_t curr_slave_lock; 197 rwlock_t curr_slave_lock;
@@ -204,7 +206,7 @@ struct bonding {
204#endif /* CONFIG_PROC_FS */ 206#endif /* CONFIG_PROC_FS */
205 struct list_head bond_list; 207 struct list_head bond_list;
206 struct dev_mc_list *mc_list; 208 struct dev_mc_list *mc_list;
207 int (*xmit_hash_policy)(struct sk_buff *, struct net_device *, int); 209 int (*xmit_hash_policy)(struct sk_buff *, int);
208 __be32 master_ip; 210 __be32 master_ip;
209 u16 flags; 211 u16 flags;
210 u16 rr_tx_counter; 212 u16 rr_tx_counter;
@@ -258,6 +260,10 @@ static inline bool bond_is_lb(const struct bonding *bond)
258 || bond->params.mode == BOND_MODE_ALB; 260 || bond->params.mode == BOND_MODE_ALB;
259} 261}
260 262
263#define BOND_PRI_RESELECT_ALWAYS 0
264#define BOND_PRI_RESELECT_BETTER 1
265#define BOND_PRI_RESELECT_FAILURE 2
266
261#define BOND_FOM_NONE 0 267#define BOND_FOM_NONE 0
262#define BOND_FOM_ACTIVE 1 268#define BOND_FOM_ACTIVE 1
263#define BOND_FOM_FOLLOW 2 269#define BOND_FOM_FOLLOW 2
@@ -348,6 +354,7 @@ extern const struct bond_parm_tbl bond_mode_tbl[];
348extern const struct bond_parm_tbl xmit_hashtype_tbl[]; 354extern const struct bond_parm_tbl xmit_hashtype_tbl[];
349extern const struct bond_parm_tbl arp_validate_tbl[]; 355extern const struct bond_parm_tbl arp_validate_tbl[];
350extern const struct bond_parm_tbl fail_over_mac_tbl[]; 356extern const struct bond_parm_tbl fail_over_mac_tbl[];
357extern const struct bond_parm_tbl pri_reselect_tbl[];
351extern struct bond_parm_tbl ad_select_tbl[]; 358extern struct bond_parm_tbl ad_select_tbl[];
352 359
353#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 360#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
@@ -370,4 +377,3 @@ static inline void bond_unregister_ipv6_notifier(void)
370#endif 377#endif
371 378
372#endif /* _LINUX_BONDING_H */ 379#endif /* _LINUX_BONDING_H */
373