Commit 5a5c5fd4 authored by nikolay@redhat.com's avatar nikolay@redhat.com Committed by David S. Miller

bonding: arp_ip_count and arp_targets can be wrong

When getting arp_ip_targets if we encounter a bad IP, arp_ip_count still
gets increased and all the targets after the wrong one will not be probed
if arp_interval is enabled after that (unless a new IP target is added
through sysfs) because of the zero entry, in this case reading
arp_ip_target through sysfs will show valid targets even if there's a
zero entry.
Example: 1.2.3.4,4.5.6.7,blah,5.6.7.8
When retrieving the list from arp_ip_target the output would be:
1.2.3.4,4.5.6.7,5.6.7.8
but there will be a 0 entry between 4.5.6.7 and 5.6.7.8. If arp_interval
is enabled after that 5.6.7.8 will never be checked because of that.
Signed-off-by: default avatarNikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent acca2674
...@@ -4471,7 +4471,7 @@ int bond_parse_parm(const char *buf, const struct bond_parm_tbl *tbl) ...@@ -4471,7 +4471,7 @@ int bond_parse_parm(const char *buf, const struct bond_parm_tbl *tbl)
static int bond_check_params(struct bond_params *params) static int bond_check_params(struct bond_params *params)
{ {
int arp_validate_value, fail_over_mac_value, primary_reselect_value; int arp_validate_value, fail_over_mac_value, primary_reselect_value, i;
/* /*
* Convert string parameters. * Convert string parameters.
...@@ -4651,19 +4651,18 @@ static int bond_check_params(struct bond_params *params) ...@@ -4651,19 +4651,18 @@ static int bond_check_params(struct bond_params *params)
arp_interval = BOND_LINK_ARP_INTERV; arp_interval = BOND_LINK_ARP_INTERV;
} }
for (arp_ip_count = 0; for (arp_ip_count = 0, i = 0;
(arp_ip_count < BOND_MAX_ARP_TARGETS) && arp_ip_target[arp_ip_count]; (arp_ip_count < BOND_MAX_ARP_TARGETS) && arp_ip_target[i]; i++) {
arp_ip_count++) {
/* not complete check, but should be good enough to /* not complete check, but should be good enough to
catch mistakes */ catch mistakes */
__be32 ip = in_aton(arp_ip_target[arp_ip_count]); __be32 ip = in_aton(arp_ip_target[i]);
if (!isdigit(arp_ip_target[arp_ip_count][0]) || if (!isdigit(arp_ip_target[i][0]) || ip == 0 ||
ip == 0 || ip == htonl(INADDR_BROADCAST)) { ip == htonl(INADDR_BROADCAST)) {
pr_warning("Warning: bad arp_ip_target module parameter (%s), ARP monitoring will not be performed\n", pr_warning("Warning: bad arp_ip_target module parameter (%s), ARP monitoring will not be performed\n",
arp_ip_target[arp_ip_count]); arp_ip_target[i]);
arp_interval = 0; arp_interval = 0;
} else { } else {
arp_target[arp_ip_count] = ip; arp_target[arp_ip_count++] = ip;
} }
} }
...@@ -4697,8 +4696,6 @@ static int bond_check_params(struct bond_params *params) ...@@ -4697,8 +4696,6 @@ static int bond_check_params(struct bond_params *params)
if (miimon) { if (miimon) {
pr_info("MII link monitoring set to %d ms\n", miimon); pr_info("MII link monitoring set to %d ms\n", miimon);
} else if (arp_interval) { } else if (arp_interval) {
int i;
pr_info("ARP monitoring set to %d ms, validate %s, with %d target(s):", pr_info("ARP monitoring set to %d ms, validate %s, with %d target(s):",
arp_interval, arp_interval,
arp_validate_tbl[arp_validate_value].modename, arp_validate_tbl[arp_validate_value].modename,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment