diff options
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r-- | drivers/net/bonding/bond_3ad.c | 11 | ||||
-rw-r--r-- | drivers/net/bonding/bond_main.c | 88 | ||||
-rw-r--r-- | drivers/net/bonding/bond_sysfs.c | 53 | ||||
-rw-r--r-- | drivers/net/bonding/bonding.h | 14 |
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; | |||
94 | static int use_carrier = 1; | 94 | static int use_carrier = 1; |
95 | static char *mode; | 95 | static char *mode; |
96 | static char *primary; | 96 | static char *primary; |
97 | static char *primary_reselect; | ||
97 | static char *lacp_rate; | 98 | static char *lacp_rate; |
98 | static char *ad_select; | 99 | static char *ad_select; |
99 | static char *xmit_hash_policy; | 100 | static 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"); |
127 | module_param(primary, charp, 0); | 128 | module_param(primary, charp, 0); |
128 | MODULE_PARM_DESC(primary, "Primary network device to use"); | 129 | MODULE_PARM_DESC(primary, "Primary network device to use"); |
130 | module_param(primary_reselect, charp, 0); | ||
131 | MODULE_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"); | ||
129 | module_param(lacp_rate, charp, 0); | 138 | module_param(lacp_rate, charp, 0); |
130 | MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner " | 139 | MODULE_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 | ||
212 | const 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 | |||
203 | struct bond_parm_tbl ad_select_tbl[] = { | 219 | struct 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 | ||
1089 | static 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 | ||
3337 | static int bond_create_proc_entry(struct bonding *bond) | 3378 | static 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 | ||
3356 | static void bond_remove_proc_entry(struct bonding *bond) | 3395 | static 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 | ||
3392 | static int bond_create_proc_entry(struct bonding *bond) | 3431 | static 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 | */ |
3660 | static int bond_xmit_hash_policy_l23(struct sk_buff *skb, | 3699 | static 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 | */ |
3679 | static int bond_xmit_hash_policy_l34(struct sk_buff *skb, | 3717 | static 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 | */ |
3704 | static int bond_xmit_hash_policy_l2(struct sk_buff *skb, | 3741 | static 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 | ||
4647 | static int bond_check_params(struct bond_params *params) | 4683 | static 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 | */ | ||
1218 | static 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 | |||
1229 | static 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); | ||
1259 | out: | ||
1260 | rtnl_unlock(); | ||
1261 | return ret; | ||
1262 | } | ||
1263 | static 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 | */ |
1218 | static ssize_t bonding_show_carrier(struct device *d, | 1270 | static 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[]; | |||
348 | extern const struct bond_parm_tbl xmit_hashtype_tbl[]; | 354 | extern const struct bond_parm_tbl xmit_hashtype_tbl[]; |
349 | extern const struct bond_parm_tbl arp_validate_tbl[]; | 355 | extern const struct bond_parm_tbl arp_validate_tbl[]; |
350 | extern const struct bond_parm_tbl fail_over_mac_tbl[]; | 356 | extern const struct bond_parm_tbl fail_over_mac_tbl[]; |
357 | extern const struct bond_parm_tbl pri_reselect_tbl[]; | ||
351 | extern struct bond_parm_tbl ad_select_tbl[]; | 358 | extern 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 | |||