From: Saeed Mahameed In cmd_{dev,port}_param_set, we compare the kernel param values with the user input, fold this code into a helper function. Signed-off-by: Saeed Mahameed --- devlink/devlink.c | 62 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/devlink/devlink.c b/devlink/devlink.c index 95302308..d1b2caa1 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -3711,6 +3711,36 @@ static int dl_param_opts_get(struct dl *dl, enum devlink_var_attr_type type, return err; } +/* dl_param_cmp: compare two dl_param structs + * @p1: first dl_param struct + * @p2: second dl_param struct + * Returns: 0 if the two structs are equal, 1 when different, + * -errno on validation error + */ +static int dl_param_cmp(struct dl_param *p1, struct dl_param *p2) +{ + if (p1->type != p2->type) + return -EINVAL; + + switch (p1->type) { + case DEVLINK_VAR_ATTR_TYPE_U8: + return p1->value.vu8 != p2->value.vu8; + case DEVLINK_VAR_ATTR_TYPE_U16: + return p1->value.vu16 != p2->value.vu16; + case DEVLINK_VAR_ATTR_TYPE_U32: + return p1->value.vu32 != p2->value.vu32; + case DEVLINK_VAR_ATTR_TYPE_FLAG: + return p1->value.vbool != p2->value.vbool; + case DEVLINK_VAR_ATTR_TYPE_STRING: + if (strcmp(p1->value.vstr, p2->value.vstr)) + return 1; + break; + default: + return -EINVAL; + } + return 0; +} + static int cmd_param_set_cb(const struct nlmsghdr *nlh, void *data) { struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); @@ -3821,26 +3851,24 @@ static int cmd_dev_param_set(struct dl *dl) if (err) goto err_param_value_parse; + err = dl_param_cmp(&uparam, &kparam); + if (err < 0) + goto err_param_value_parse; + 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: - if (uparam.value.vu8 == kparam.value.vu8) - return 0; mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu8); break; case DEVLINK_VAR_ATTR_TYPE_U16: - if (uparam.value.vu16 == kparam.value.vu16) - return 0; mnl_attr_put_u16(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu16); break; case DEVLINK_VAR_ATTR_TYPE_U32: - if (uparam.value.vu32 == kparam.value.vu32) - return 0; mnl_attr_put_u32(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu32); break; case DEVLINK_VAR_ATTR_TYPE_FLAG: - if (uparam.value.vbool == kparam.value.vbool) - return 0; if (uparam.value.vbool) mnl_attr_put(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, 0, NULL); @@ -3848,8 +3876,6 @@ static int cmd_dev_param_set(struct dl *dl) case DEVLINK_VAR_ATTR_TYPE_STRING: mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vstr); - if (!strcmp(uparam.value.vstr, kparam.value.vstr)) - return 0; break; default: printf("Value type not supported\n"); @@ -5285,26 +5311,24 @@ static int cmd_port_param_set(struct dl *dl) if (err) goto err_param_value_parse; + err = dl_param_cmp(&uparam, &kparam); + if (err < 0) + goto err_param_value_parse; + 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: - if (uparam.value.vu8 == kparam.value.vu8) - return 0; mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu8); break; case DEVLINK_VAR_ATTR_TYPE_U16: - if (uparam.value.vu16 == kparam.value.vu16) - return 0; mnl_attr_put_u16(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu16); break; case DEVLINK_VAR_ATTR_TYPE_U32: - if (uparam.value.vu32 == kparam.value.vu32) - return 0; mnl_attr_put_u32(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vu32); break; case DEVLINK_VAR_ATTR_TYPE_FLAG: - if (uparam.value.vbool == kparam.value.vbool) - return 0; if (uparam.value.vbool) mnl_attr_put(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, 0, NULL); @@ -5312,8 +5336,6 @@ static int cmd_port_param_set(struct dl *dl) case DEVLINK_VAR_ATTR_TYPE_STRING: mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, uparam.value.vstr); - if (!strcmp(uparam.value.vstr, kparam.value.vstr)) - return 0; break; default: printf("Value type not supported\n"); -- 2.50.0