From: Saeed Mahameed Introduce a helper function that takes a dl_param and calls the type corresponding mnl_attr_put_() equivalent to populate the nlmmsg with the parameter value. Signed-off-by: Saeed Mahameed --- devlink/devlink.c | 88 +++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 48 deletions(-) diff --git a/devlink/devlink.c b/devlink/devlink.c index d1b2caa1..9a6adf06 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -3741,6 +3741,38 @@ static int dl_param_cmp(struct dl_param *p1, struct dl_param *p2) return 0; } +/* dl_param_mnl_put: put the value in the netlink message + * @nlh: netlink message + * @param: dl_param struct containing the value + * Returns: 0 on success, -errno on failure + */ +static int dl_param_mnl_put(struct nlmsghdr *nlh, struct dl_param *param) +{ + mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_TYPE, param->type); + switch (param->type) { + case DEVLINK_VAR_ATTR_TYPE_U8: + mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, param->value.vu8); + break; + case DEVLINK_VAR_ATTR_TYPE_U16: + mnl_attr_put_u16(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, param->value.vu16); + break; + case DEVLINK_VAR_ATTR_TYPE_U32: + mnl_attr_put_u32(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, param->value.vu32); + break; + case DEVLINK_VAR_ATTR_TYPE_FLAG: + if (param->value.vbool) + mnl_attr_put(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, 0, NULL); + break; + case DEVLINK_VAR_ATTR_TYPE_STRING: + mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, param->value.vstr); + break; + default: + pr_err("Value type(%d) not supported\n", param->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); @@ -3857,30 +3889,10 @@ static int cmd_dev_param_set(struct dl *dl) if (!err) /* Value is the same */ return 0; - mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_TYPE, kparam.type); - switch (kparam.type) { - case DEVLINK_VAR_ATTR_TYPE_U8: - mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu8); - break; - case DEVLINK_VAR_ATTR_TYPE_U16: - mnl_attr_put_u16(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu16); - break; - case DEVLINK_VAR_ATTR_TYPE_U32: - mnl_attr_put_u32(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu32); - break; - case DEVLINK_VAR_ATTR_TYPE_FLAG: - if (uparam.value.vbool) - mnl_attr_put(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, - 0, NULL); - break; - case DEVLINK_VAR_ATTR_TYPE_STRING: - mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, - uparam.value.vstr); - break; - default: - printf("Value type not supported\n"); - return -ENOTSUP; - } + err = dl_param_mnl_put(nlh, &uparam); + if (err) + return err; + return mnlu_gen_socket_sndrcv(&dl->nlg, nlh, NULL, NULL); err_param_value_parse: @@ -5317,30 +5329,10 @@ static int cmd_port_param_set(struct dl *dl) if (!err) /* Value is the same */ return 0; - mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_TYPE, kparam.type); - switch (kparam.type) { - case DEVLINK_VAR_ATTR_TYPE_U8: - mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu8); - break; - case DEVLINK_VAR_ATTR_TYPE_U16: - mnl_attr_put_u16(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu16); - break; - case DEVLINK_VAR_ATTR_TYPE_U32: - mnl_attr_put_u32(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu32); - break; - case DEVLINK_VAR_ATTR_TYPE_FLAG: - if (uparam.value.vbool) - mnl_attr_put(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, - 0, NULL); - break; - case DEVLINK_VAR_ATTR_TYPE_STRING: - mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, - uparam.value.vstr); - break; - default: - printf("Value type not supported\n"); - return -ENOTSUP; - } + err = dl_param_mnl_put(nlh, &uparam); + if (err) + return err; + return mnlu_gen_socket_sndrcv(&dl->nlg, nlh, NULL, NULL); err_param_value_parse: -- 2.50.0