[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250228021837.880041-10-saeed@kernel.org>
Date: Thu, 27 Feb 2025 18:18:36 -0800
From: Saeed Mahameed <saeed@...nel.org>
To: stephen@...workplumber.org,
dsahern@...il.com,
Jiri Pirko <jiri@...dia.com>,
jiri@...nulli.us
Cc: netdev@...r.kernel.org,
Saeed Mahameed <saeedm@...dia.com>
Subject: [PATCH iproute2 09/10] devlink: helper function to parse param vlaue attributes into dl_param
From: Saeed Mahameed <saeedm@...dia.com>
Centralized location to parse different types of param values.
This is useful for upcoming new type of parameters support to be added
to dl_param related functions.
Signed-off-by: Saeed Mahameed <saeedm@...dia.com>
---
devlink/devlink.c | 68 ++++++++++++++++++++++++++++++-----------------
1 file changed, 43 insertions(+), 25 deletions(-)
diff --git a/devlink/devlink.c b/devlink/devlink.c
index 3ecf8d9a..2ad15b45 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -3773,6 +3773,40 @@ static int dl_param_mnl_put(struct nlmsghdr *nlh, struct dl_param *param)
return 0;
}
+/* dl_param_val_attr_parse: parse the value attribute and store the value
+ * in the dl_param struct
+ * @data_attr: value data attribute
+ * @nla_type: type of the value attribute
+ * @param: dl_param struct to store the value
+ */
+static int
+dl_param_val_attr_parse(struct nlattr *data_attr,
+ enum devlink_dyn_attr_type type,
+ struct dl_param *param)
+{
+ switch (type) {
+ case DEVLINK_DYN_ATTR_TYPE_U8:
+ param->value.vu8 = mnl_attr_get_u8(data_attr);
+ break;
+ case DEVLINK_DYN_ATTR_TYPE_U16:
+ param->value.vu16 = mnl_attr_get_u16(data_attr);
+ break;
+ case DEVLINK_DYN_ATTR_TYPE_U32:
+ param->value.vu32 = mnl_attr_get_u32(data_attr);
+ break;
+ case DEVLINK_DYN_ATTR_TYPE_STRING:
+ param->value.vstr = mnl_attr_get_str(data_attr);
+ break;
+ case DEVLINK_DYN_ATTR_TYPE_FLAG:
+ param->value.vbool = data_attr ? true : false;
+ break;
+ default:
+ pr_err("Value type(%d) not supported\n", type);
+ return -ENOTSUP;
+ }
+ return 0;
+}
+
static int cmd_param_set_cb(const struct nlmsghdr *nlh, void *data)
{
struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
@@ -3805,7 +3839,7 @@ static int cmd_param_set_cb(const struct nlmsghdr *nlh, void *data)
mnl_attr_for_each_nested(param_value_attr,
nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST]) {
struct nlattr *nla_value[DEVLINK_ATTR_MAX + 1] = {};
- struct nlattr *val_attr;
+ struct nlattr *data_attr;
err = mnl_attr_parse_nested(param_value_attr,
attr_cb, nla_value);
@@ -3818,30 +3852,14 @@ static int cmd_param_set_cb(const struct nlmsghdr *nlh, void *data)
return MNL_CB_ERROR;
cmode = mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE]);
- if (cmode == dl->opts.cmode) {
- param->cmode_found = true;
- val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA];
- switch (type) {
- case DEVLINK_DYN_ATTR_TYPE_U8:
- param->value.vu8 = mnl_attr_get_u8(val_attr);
- break;
- case DEVLINK_DYN_ATTR_TYPE_U16:
- param->value.vu16 = mnl_attr_get_u16(val_attr);
- break;
- case DEVLINK_DYN_ATTR_TYPE_U32:
- param->value.vu32 = mnl_attr_get_u32(val_attr);
- break;
- case DEVLINK_DYN_ATTR_TYPE_STRING:
- param->value.vstr = mnl_attr_get_str(val_attr);
- break;
- case DEVLINK_DYN_ATTR_TYPE_FLAG:
- param->value.vbool = val_attr ? true : false;
- break;
- default:
- break;
- }
- break;
- }
+ if (cmode != dl->opts.cmode)
+ continue;
+
+ param->cmode_found = true;
+ data_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA];
+ if (dl_param_val_attr_parse(data_attr, type, param))
+ return MNL_CB_ERROR;
+ break;
}
param->type = type;
return MNL_CB_OK;
--
2.48.1
Powered by blists - more mailing lists