aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/bonding/bond_netlink.c14
-rw-r--r--drivers/net/bonding/bond_options.c11
-rw-r--r--drivers/net/bonding/bond_sysfs.c16
-rw-r--r--drivers/net/bonding/bonding.h1
-rw-r--r--include/uapi/linux/if_link.h1
5 files changed, 37 insertions, 6 deletions
diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c
index 8588cb91caa9..d7d84db9eed7 100644
--- a/drivers/net/bonding/bond_netlink.c
+++ b/drivers/net/bonding/bond_netlink.c
@@ -31,6 +31,7 @@ static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = {
31 [IFLA_BOND_ARP_INTERVAL] = { .type = NLA_U32 }, 31 [IFLA_BOND_ARP_INTERVAL] = { .type = NLA_U32 },
32 [IFLA_BOND_ARP_IP_TARGET] = { .type = NLA_NESTED }, 32 [IFLA_BOND_ARP_IP_TARGET] = { .type = NLA_NESTED },
33 [IFLA_BOND_ARP_VALIDATE] = { .type = NLA_U32 }, 33 [IFLA_BOND_ARP_VALIDATE] = { .type = NLA_U32 },
34 [IFLA_BOND_ARP_ALL_TARGETS] = { .type = NLA_U32 },
34}; 35};
35 36
36static int bond_validate(struct nlattr *tb[], struct nlattr *data[]) 37static int bond_validate(struct nlattr *tb[], struct nlattr *data[])
@@ -145,6 +146,14 @@ static int bond_changelink(struct net_device *bond_dev,
145 if (err) 146 if (err)
146 return err; 147 return err;
147 } 148 }
149 if (data[IFLA_BOND_ARP_ALL_TARGETS]) {
150 int arp_all_targets =
151 nla_get_u32(data[IFLA_BOND_ARP_ALL_TARGETS]);
152
153 err = bond_option_arp_all_targets_set(bond, arp_all_targets);
154 if (err)
155 return err;
156 }
148 return 0; 157 return 0;
149} 158}
150 159
@@ -172,6 +181,7 @@ static size_t bond_get_size(const struct net_device *bond_dev)
172 /* IFLA_BOND_ARP_IP_TARGET */ 181 /* IFLA_BOND_ARP_IP_TARGET */
173 nla_total_size(sizeof(u32)) * BOND_MAX_ARP_TARGETS + 182 nla_total_size(sizeof(u32)) * BOND_MAX_ARP_TARGETS +
174 nla_total_size(sizeof(u32)) + /* IFLA_BOND_ARP_VALIDATE */ 183 nla_total_size(sizeof(u32)) + /* IFLA_BOND_ARP_VALIDATE */
184 nla_total_size(sizeof(u32)) + /* IFLA_BOND_ARP_ALL_TARGETS */
175 0; 185 0;
176} 186}
177 187
@@ -227,6 +237,10 @@ static int bond_fill_info(struct sk_buff *skb,
227 if (nla_put_u32(skb, IFLA_BOND_ARP_VALIDATE, bond->params.arp_validate)) 237 if (nla_put_u32(skb, IFLA_BOND_ARP_VALIDATE, bond->params.arp_validate))
228 goto nla_put_failure; 238 goto nla_put_failure;
229 239
240 if (nla_put_u32(skb, IFLA_BOND_ARP_ALL_TARGETS,
241 bond->params.arp_all_targets))
242 goto nla_put_failure;
243
230 return 0; 244 return 0;
231 245
232nla_put_failure: 246nla_put_failure:
diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
index 698079e94e74..dfef673d53d1 100644
--- a/drivers/net/bonding/bond_options.c
+++ b/drivers/net/bonding/bond_options.c
@@ -458,3 +458,14 @@ int bond_option_arp_validate_set(struct bonding *bond, int arp_validate)
458 458
459 return 0; 459 return 0;
460} 460}
461
462int bond_option_arp_all_targets_set(struct bonding *bond, int arp_all_targets)
463{
464 pr_info("%s: setting arp_all_targets to %s (%d).\n",
465 bond->dev->name, arp_all_targets_tbl[arp_all_targets].modename,
466 arp_all_targets);
467
468 bond->params.arp_all_targets = arp_all_targets;
469
470 return 0;
471}
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
index bda00a01393a..dad9bea95122 100644
--- a/drivers/net/bonding/bond_sysfs.c
+++ b/drivers/net/bonding/bond_sysfs.c
@@ -399,7 +399,7 @@ static ssize_t bonding_store_arp_all_targets(struct device *d,
399 const char *buf, size_t count) 399 const char *buf, size_t count)
400{ 400{
401 struct bonding *bond = to_bond(d); 401 struct bonding *bond = to_bond(d);
402 int new_value; 402 int new_value, ret;
403 403
404 new_value = bond_parse_parm(buf, arp_all_targets_tbl); 404 new_value = bond_parse_parm(buf, arp_all_targets_tbl);
405 if (new_value < 0) { 405 if (new_value < 0) {
@@ -407,13 +407,17 @@ static ssize_t bonding_store_arp_all_targets(struct device *d,
407 bond->dev->name, buf); 407 bond->dev->name, buf);
408 return -EINVAL; 408 return -EINVAL;
409 } 409 }
410 pr_info("%s: setting arp_all_targets to %s (%d).\n",
411 bond->dev->name, arp_all_targets_tbl[new_value].modename,
412 new_value);
413 410
414 bond->params.arp_all_targets = new_value; 411 if (!rtnl_trylock())
412 return restart_syscall();
415 413
416 return count; 414 ret = bond_option_arp_all_targets_set(bond, new_value);
415 if (!ret)
416 ret = count;
417
418 rtnl_unlock();
419
420 return ret;
417} 421}
418 422
419static DEVICE_ATTR(arp_all_targets, S_IRUGO | S_IWUSR, 423static DEVICE_ATTR(arp_all_targets, S_IRUGO | S_IWUSR,
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index cef10adac6e6..8283cbdec50a 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -449,6 +449,7 @@ int bond_option_arp_ip_targets_set(struct bonding *bond, __be32 *targets,
449int bond_option_arp_ip_target_add(struct bonding *bond, __be32 target); 449int bond_option_arp_ip_target_add(struct bonding *bond, __be32 target);
450int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target); 450int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target);
451int bond_option_arp_validate_set(struct bonding *bond, int arp_validate); 451int bond_option_arp_validate_set(struct bonding *bond, int arp_validate);
452int bond_option_arp_all_targets_set(struct bonding *bond, int arp_all_targets);
452struct net_device *bond_option_active_slave_get_rcu(struct bonding *bond); 453struct net_device *bond_option_active_slave_get_rcu(struct bonding *bond);
453struct net_device *bond_option_active_slave_get(struct bonding *bond); 454struct net_device *bond_option_active_slave_get(struct bonding *bond);
454 455
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
index 3ba16fa9ad6c..a897b7e22541 100644
--- a/include/uapi/linux/if_link.h
+++ b/include/uapi/linux/if_link.h
@@ -338,6 +338,7 @@ enum {
338 IFLA_BOND_ARP_INTERVAL, 338 IFLA_BOND_ARP_INTERVAL,
339 IFLA_BOND_ARP_IP_TARGET, 339 IFLA_BOND_ARP_IP_TARGET,
340 IFLA_BOND_ARP_VALIDATE, 340 IFLA_BOND_ARP_VALIDATE,
341 IFLA_BOND_ARP_ALL_TARGETS,
341 __IFLA_BOND_MAX, 342 __IFLA_BOND_MAX,
342}; 343};
343 344