Introduced in v3.8.0-rc1~96, the virNetDevGetFamilyId() gets netlink family ID for passed family name (even though it's used only for getting "devlink" ID). Nevertheless, the function returns 0 on an error or if no family ID was found. This makes it harder for a caller to distinguish these two. Change the retval so that a negative value is returned upon error, zero is no ID found (but no error encountered) and a positive value is returned on successful translation. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- src/util/virnetdev.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index b465bdac2e..8c149c5fc5 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -3057,11 +3057,15 @@ virNetDevGetEthtoolFeatures(virBitmapPtr bitmap, * This function supplies the devlink family id * * @family_name: the name of the family to query + * @family_id: family ID * - * Returns family id or 0 on failure. + * Returns: 0 if no family was found, + * 1 if family was found (@family_id is set), + * -1 othewise. */ -static uint32_t -virNetDevGetFamilyId(const char *family_name) +static int +virNetDevGetFamilyId(const char *family_name, + uint32_t *family_id) { struct nl_msg *nl_msg = NULL; struct nlmsghdr *resp = NULL; @@ -3072,7 +3076,7 @@ virNetDevGetFamilyId(const char *family_name) }; struct nlattr *tb[CTRL_ATTR_MAX + 1] = {NULL, }; unsigned int recvbuflen; - uint32_t family_id = 0; + int ret = -1; if (!(nl_msg = nlmsg_alloc_simple(GENL_ID_CTRL, NLM_F_REQUEST | NLM_F_ACK))) { @@ -3098,15 +3102,18 @@ virNetDevGetFamilyId(const char *family_name) goto cleanup; } - if (tb[CTRL_ATTR_FAMILY_ID] == NULL) + if (tb[CTRL_ATTR_FAMILY_ID] == NULL) { + ret = 0; goto cleanup; + } - family_id = *(uint32_t *)RTA_DATA(tb[CTRL_ATTR_FAMILY_ID]); + *family_id = *(uint32_t *)RTA_DATA(tb[CTRL_ATTR_FAMILY_ID]); + ret = 1; cleanup: nlmsg_free(nl_msg); VIR_FREE(resp); - return family_id; + return ret; } @@ -3140,7 +3147,7 @@ virNetDevSwitchdevFeature(const char *ifname, int ret = -1; uint32_t family_id; - if ((family_id = virNetDevGetFamilyId(DEVLINK_GENL_NAME)) <= 0) + if (virNetDevGetFamilyId(DEVLINK_GENL_NAME, &family_id) <= 0) return ret; if ((is_vf = virNetDevIsVirtualFunction(ifname)) < 0) -- 2.25.3