Allow privileged user to set the HW address of a vdev. Example:
$ devlink vdev set pci/0000:03:00.0/1 hw_addr 00:23:35:af:35:34 $ devlink vdev show pci/0000:03:00.0/1 pci/0000:03:00.0/1: flavour pcivf pf 0 vf 0 port_index 1 hw_addr 00:23:35:af:35:34 $ devlink vdev show pci/0000:03:00.0/1 -pj { "vdev": { "pci/0000:03:00.0/1": { "flavour": "pcivf", "pf": 0, "vf": 0, "port_index": 1, "hw_addr": "00:23:35:af:35:34" } } } Signed-off-by: Yuval Avnery <yuva...@mellanox.com> Acked-by: Jiri Pirko <j...@mellanox.com> --- include/net/devlink.h | 2 ++ net/core/devlink.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/net/devlink.h b/include/net/devlink.h index 12550cc92e9d..5ae329813ec8 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -765,6 +765,8 @@ struct devlink_ops { }; struct devlink_vdev_ops { + int (*hw_addr_set)(struct devlink_vdev *vdev, + u8 *hw_addr, struct netlink_ext_ack *extack); int (*hw_addr_get)(struct devlink_vdev *vdev, u8 *hw_addr, struct netlink_ext_ack *extack); unsigned int hw_addr_len; diff --git a/net/core/devlink.c b/net/core/devlink.c index 94599409f12c..15cc674b05ce 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -1063,6 +1063,23 @@ static int devlink_nl_cmd_vdev_get_dumpit(struct sk_buff *msg, static int devlink_nl_cmd_vdev_set_doit(struct sk_buff *skb, struct genl_info *info) { + struct nlattr *nla_hw_addr = info->attrs[DEVLINK_ATTR_VDEV_HW_ADDR]; + struct devlink_vdev *devlink_vdev = info->user_ptr[0]; + const struct devlink_vdev_ops *ops; + int err; + + ops = devlink_vdev->ops; + if (nla_hw_addr) { + u8 *hw_addr; + + if (!ops || !ops->hw_addr_set) + return -EOPNOTSUPP; + + hw_addr = nla_data(nla_hw_addr); + err = ops->hw_addr_set(devlink_vdev, hw_addr, info->extack); + if (err) + return err; + } return 0; } -- 2.17.1