@@ -3711,6 +3711,36 @@ static int dl_param_opts_get(struct dl *dl, enum devlink_dyn_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_DYN_ATTR_TYPE_U8:
+ return p1->value.vu8 != p2->value.vu8;
+ case DEVLINK_DYN_ATTR_TYPE_U16:
+ return p1->value.vu16 != p2->value.vu16;
+ case DEVLINK_DYN_ATTR_TYPE_U32:
+ return p1->value.vu32 != p2->value.vu32;
+ case DEVLINK_DYN_ATTR_TYPE_FLAG:
+ return p1->value.vbool != p2->value.vbool;
+ case DEVLINK_DYN_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_DYN_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_DYN_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_DYN_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_DYN_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_DYN_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_DYN_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_DYN_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_DYN_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_DYN_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_DYN_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");