git.kernel.org

bonding: add downdelay netlink support - kernel/git/torvalds/linux.git - Linux kernel source tree

  • ️Thu Dec 12 2013
authorsfeldma@cumulusnetworks.com <sfeldma@cumulusnetworks.com>2013-12-12 14:10:09 -0800
committerDavid S. Miller <davem@davemloft.net>2013-12-14 01:07:31 -0500
commitc7461f9bf5a11bf88fdbd05b26c6d55b77dcd46d (patch)
tree2c80c47d2ef00b0c4cdf64835865612c73682cfb
parent25852e29dfc58d249ad0db235996b36c33db6d61 (diff)
downloadlinux-c7461f9bf5a11bf88fdbd05b26c6d55b77dcd46d.tar.gz

bonding: add downdelay netlink support

Add IFLA_BOND_DOWNDELAY to allow get/set of bonding parameter downdelay via netlink. Signed-off-by: Scott Feldman <sfeldma@cumulusnetworks.com> Signed-off-by: Jiri Pirko <jiri@resnulli.us> Signed-off-by: David S. Miller <davem@davemloft.net>

-rw-r--r--drivers/net/bonding/bond_netlink.c13
-rw-r--r--drivers/net/bonding/bond_options.c29
-rw-r--r--drivers/net/bonding/bond_sysfs.c39
-rw-r--r--drivers/net/bonding/bonding.h1
-rw-r--r--include/uapi/linux/if_link.h1

5 files changed, 52 insertions, 31 deletions

diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c
index 086cf4f5f0a6ec..a0a2e8c32fe533 100644
--- a/drivers/net/bonding/bond_netlink.c
+++ b/drivers/net/bonding/bond_netlink.c

@@ -26,6 +26,7 @@ static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = {

[IFLA_BOND_ACTIVE_SLAVE] = { .type = NLA_U32 },

[IFLA_BOND_MIIMON] = { .type = NLA_U32 },

[IFLA_BOND_UPDELAY] = { .type = NLA_U32 },

+ [IFLA_BOND_DOWNDELAY] = { .type = NLA_U32 },

};

static int bond_validate(struct nlattr *tb[], struct nlattr *data[])

@@ -85,6 +86,13 @@ static int bond_changelink(struct net_device *bond_dev,

if (err)

return err;

}

+ if (data[IFLA_BOND_DOWNDELAY]) {

+ int downdelay = nla_get_u32(data[IFLA_BOND_DOWNDELAY]);

+

+ err = bond_option_downdelay_set(bond, downdelay);

+ if (err)

+ return err;

+ }

return 0;

}

@@ -106,6 +114,7 @@ static size_t bond_get_size(const struct net_device *bond_dev)

nla_total_size(sizeof(u32)) + /* IFLA_BOND_ACTIVE_SLAVE */

nla_total_size(sizeof(u32)) + /* IFLA_BOND_MIIMON */

nla_total_size(sizeof(u32)) + /* IFLA_BOND_UPDELAY */

+ nla_total_size(sizeof(u32)) + /* IFLA_BOND_DOWNDELAY */

0;

}

@@ -129,6 +138,10 @@ static int bond_fill_info(struct sk_buff *skb,

bond->params.updelay * bond->params.miimon))

goto nla_put_failure;

+ if (nla_put_u32(skb, IFLA_BOND_DOWNDELAY,

+ bond->params.downdelay * bond->params.miimon))

+ goto nla_put_failure;

+

return 0;

nla_put_failure:

diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
index ae94b847ffcc40..2914d649ee3484 100644
--- a/drivers/net/bonding/bond_options.c
+++ b/drivers/net/bonding/bond_options.c

@@ -216,3 +216,32 @@ int bond_option_updelay_set(struct bonding *bond, int updelay)

return 0;

}

+

+int bond_option_downdelay_set(struct bonding *bond, int downdelay)

+{

+ if (!(bond->params.miimon)) {

+ pr_err("%s: Unable to set down delay as MII monitoring is disabled\n",

+ bond->dev->name);

+ return -EPERM;

+ }

+

+ if (downdelay < 0) {

+ pr_err("%s: Invalid down delay value %d not in range %d-%d; rejected.\n",

+ bond->dev->name, downdelay, 0, INT_MAX);

+ return -EINVAL;

+ } else {

+ if ((downdelay % bond->params.miimon) != 0) {

+ pr_warn("%s: Warning: down delay (%d) is not a multiple of miimon (%d), delay rounded to %d ms\n",

+ bond->dev->name, downdelay,

+ bond->params.miimon,

+ (downdelay / bond->params.miimon) *

+ bond->params.miimon);

+ }

+ bond->params.downdelay = downdelay / bond->params.miimon;

+ pr_info("%s: Setting down delay to %d.\n",

+ bond->dev->name,

+ bond->params.downdelay * bond->params.miimon);

+ }

+

+ return 0;

+}

diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
index 4dcbec4e07c023..bec20bc08d31ba 100644
--- a/drivers/net/bonding/bond_sysfs.c
+++ b/drivers/net/bonding/bond_sysfs.c

@@ -689,44 +689,21 @@ static ssize_t bonding_store_downdelay(struct device *d,

struct device_attribute *attr,

const char *buf, size_t count)

{

- int new_value, ret = count;

+ int new_value, ret;

struct bonding *bond = to_bond(d);

- if (!rtnl_trylock())

- return restart_syscall();

- if (!(bond->params.miimon)) {

- pr_err("%s: Unable to set down delay as MII monitoring is disabled\n",

- bond->dev->name);

- ret = -EPERM;

- goto out;

- }

-

if (sscanf(buf, "%d", &new_value) != 1) {

pr_err("%s: no down delay value specified.\n", bond->dev->name);

- ret = -EINVAL;

- goto out;

+ return -EINVAL;

}

- if (new_value < 0) {

- pr_err("%s: Invalid down delay value %d not in range %d-%d; rejected.\n",

- bond->dev->name, new_value, 0, INT_MAX);

- ret = -EINVAL;

- goto out;

- } else {

- if ((new_value % bond->params.miimon) != 0) {

- pr_warning("%s: Warning: down delay (%d) is not a multiple of miimon (%d), delay rounded to %d ms\n",

- bond->dev->name, new_value,

- bond->params.miimon,

- (new_value / bond->params.miimon) *

- bond->params.miimon);

- }

- bond->params.downdelay = new_value / bond->params.miimon;

- pr_info("%s: Setting down delay to %d.\n",

- bond->dev->name,

- bond->params.downdelay * bond->params.miimon);

- }

+ if (!rtnl_trylock())

+ return restart_syscall();

+

+ ret = bond_option_downdelay_set(bond, new_value);

+ if (!ret)

+ ret = count;

-out:

rtnl_unlock();

return ret;

}

diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index 8a91f7187e51e4..f5749b18d16812 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h

@@ -441,6 +441,7 @@ int bond_option_mode_set(struct bonding *bond, int mode);

int bond_option_active_slave_set(struct bonding *bond, struct net_device *slave_dev);

int bond_option_miimon_set(struct bonding *bond, int miimon);

int bond_option_updelay_set(struct bonding *bond, int updelay);

+int bond_option_downdelay_set(struct bonding *bond, int downdelay);

struct net_device *bond_option_active_slave_get_rcu(struct bonding *bond);

struct net_device *bond_option_active_slave_get(struct bonding *bond);

diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
index 7588c8120e7ff0..f955067777101a 100644
--- a/include/uapi/linux/if_link.h
+++ b/include/uapi/linux/if_link.h

@@ -333,6 +333,7 @@ enum {

IFLA_BOND_ACTIVE_SLAVE,

IFLA_BOND_MIIMON,

IFLA_BOND_UPDELAY,

+ IFLA_BOND_DOWNDELAY,

__IFLA_BOND_MAX,

};