From: Saeed Mahameed 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 --- devlink/devlink.c | 68 ++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/devlink/devlink.c b/devlink/devlink.c index 9a6adf06..fe64f2dc 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_var_attr_type type, + struct dl_param *param) +{ + switch (type) { + case DEVLINK_VAR_ATTR_TYPE_U8: + param->value.vu8 = mnl_attr_get_u8(data_attr); + break; + case DEVLINK_VAR_ATTR_TYPE_U16: + param->value.vu16 = mnl_attr_get_u16(data_attr); + break; + case DEVLINK_VAR_ATTR_TYPE_U32: + param->value.vu32 = mnl_attr_get_u32(data_attr); + break; + case DEVLINK_VAR_ATTR_TYPE_STRING: + param->value.vstr = mnl_attr_get_str(data_attr); + break; + case DEVLINK_VAR_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_VAR_ATTR_TYPE_U8: - param->value.vu8 = mnl_attr_get_u8(val_attr); - break; - case DEVLINK_VAR_ATTR_TYPE_U16: - param->value.vu16 = mnl_attr_get_u16(val_attr); - break; - case DEVLINK_VAR_ATTR_TYPE_U32: - param->value.vu32 = mnl_attr_get_u32(val_attr); - break; - case DEVLINK_VAR_ATTR_TYPE_STRING: - param->value.vstr = mnl_attr_get_str(val_attr); - break; - case DEVLINK_VAR_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.50.0