[PATCH net-next 09/14] devlink: Implement set netlink command for port params

Saeed Mahameed
2025-02-28T02:13:32Z

From: Saeed Mahameed <saeedm@nvidia.com>

Add missing port-params netlink attributes and policies to devlink's
spec, reuse existing set_doit of the devlink dev params.

This implements:
devlink port param set <device>/<port> name <param_name> value <val> \
cmode <cmode>

Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
---
Documentation/netlink/specs/devlink.yaml | 9 ++++++++-
net/devlink/netlink_gen.c | 7 +++++--
net/devlink/param.c | 16 ++++++++++++----
3 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/Documentation/netlink/specs/devlink.yaml b/Documentation/netlink/specs/devlink.yaml
index fb3b2bea0ac3..aca4d0557944 100644
--- a/Documentation/netlink/specs/devlink.yaml
+++ b/Documentation/netlink/specs/devlink.yaml
@@ -1873,7 +1873,14 @@ operations:
pre: devlink-nl-pre-doit-port
post: devlink-nl-post-doit
request:
- attributes: *port-id-attrs
+ attributes:
+ - bus-name
+ - dev-name
+ - port-index
+ - param-name
+ - param-type
+ # param-value-data is missing here as the type is variable
+ - param-value-cmode

-
name: info-get
diff --git a/net/devlink/netlink_gen.c b/net/devlink/netlink_gen.c
index d4876cf0f049..bb1a916c8764 100644
--- a/net/devlink/netlink_gen.c
+++ b/net/devlink/netlink_gen.c
@@ -337,10 +337,13 @@ static const struct nla_policy devlink_port_param_get_dump_nl_policy[DEVLINK_ATT
};

/* DEVLINK_CMD_PORT_PARAM_SET - do */
-static const struct nla_policy devlink_port_param_set_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
+static const struct nla_policy devlink_port_param_set_nl_policy[DEVLINK_ATTR_PARAM_VALUE_CMODE + 1] = {
[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
+ [DEVLINK_ATTR_PARAM_NAME] = { .type = NLA_NUL_STRING, },
+ [DEVLINK_ATTR_PARAM_TYPE] = { .type = NLA_U8, },
+ [DEVLINK_ATTR_PARAM_VALUE_CMODE] = NLA_POLICY_MAX(NLA_U8, 2),
};

/* DEVLINK_CMD_INFO_GET - do */
@@ -965,7 +968,7 @@ const struct genl_split_ops devlink_nl_ops[74] = {
.doit = devlink_nl_port_param_set_doit,
.post_doit = devlink_nl_post_doit,
.policy = devlink_port_param_set_nl_policy,
- .maxattr = DEVLINK_ATTR_PORT_INDEX,
+ .maxattr = DEVLINK_ATTR_PARAM_VALUE_CMODE,
.flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
},
{
diff --git a/net/devlink/param.c b/net/devlink/param.c
index 45f1847f9435..c3d39817a908 100644
--- a/net/devlink/param.c
+++ b/net/devlink/param.c
@@ -165,12 +165,15 @@ static int devlink_param_get(struct devlink *devlink,
}

static int devlink_param_set(struct devlink *devlink,
+ struct devlink_port *devlink_port,
const struct devlink_param *param,
struct devlink_param_gset_ctx *ctx,
struct netlink_ext_ack *extack)
{
if (!param->set)
return -EOPNOTSUPP;
+
+ ctx->devlink_port = devlink_port;
return param->set(devlink, param->id, ctx, extack);
}

@@ -550,8 +553,8 @@ static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
struct genl_info *info,
enum devlink_command cmd)
{
+ struct devlink_param_gset_ctx ctx = {};
enum devlink_param_type param_type;
- struct devlink_param_gset_ctx ctx;
enum devlink_param_cmode cmode;
struct devlink_param_item *param_item;
const struct devlink_param *param;
@@ -590,7 +593,8 @@ static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
return -EOPNOTSUPP;
ctx.val = value;
ctx.cmode = cmode;
- err = devlink_param_set(devlink, param, &ctx, info->extack);
+ err = devlink_param_set(devlink, devlink_port, param,
+ &ctx, info->extack);
if (err)
return err;
}
@@ -676,8 +680,12 @@ int devlink_nl_port_param_get_doit(struct sk_buff *skb,
int devlink_nl_port_param_set_doit(struct sk_buff *skb,
struct genl_info *info)
{
- NL_SET_ERR_MSG(info->extack, "Port params are not supported");
- return -EINVAL;
+ struct devlink_port *devlink_port = info->user_ptr[1];
+ struct devlink *devlink = info->user_ptr[0];
+
+ return __devlink_nl_cmd_param_set_doit(devlink, devlink_port,
+ &devlink_port->params, info,
+ DEVLINK_CMD_PORT_PARAM_NEW);
}

static int devlink_param_verify(const struct devlink_param *param)
--
2.48.1