From 7346c5b556d239b4e7bb17014fae5e6586f88603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8D=C3=B1igo=20Huguet?= Date: Fri, 16 Feb 2024 13:47:38 +0100 Subject: [PATCH] sriov: allow reading empty eswitch paramaters via Devlink Probably not all drivers and devices return all parameters. Set them to "unknown" if they are missing and let the caller to decide what to do. In our case, if the sriov setting has a value different to "preserve" it will try to set it (and will probably fail). But if the missing parameter is set to "preserve" in the sriov setting we can continue, just ignoring it. --- src/libnm-base/nm-base.h | 3 +++ src/libnm-core-public/nm-setting-sriov.h | 3 +++ src/libnm-platform/devlink/nm-devlink.c | 16 ++++++++++------ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/libnm-base/nm-base.h b/src/libnm-base/nm-base.h index d77ff9ec1e..e1cc27332e 100644 --- a/src/libnm-base/nm-base.h +++ b/src/libnm-base/nm-base.h @@ -281,6 +281,7 @@ typedef enum { /* Mirrors libnm's NMSriovEswitchMode. * Values >= 0 mirror kernel's enum devlink_eswitch_mode. */ _NM_SRIOV_ESWITCH_MODE_PRESERVE = -1, + _NM_SRIOV_ESWITCH_MODE_UNKNOWN = -1, /*< skip >*/ _NM_SRIOV_ESWITCH_MODE_LEGACY = 0, _NM_SRIOV_ESWITCH_MODE_SWITCHDEV = 1, } _NMSriovEswitchMode; @@ -289,6 +290,7 @@ typedef enum { /* Mirrors libnm's NMSriovEswitchInlineMode. * Values >= 0 mirror kernel's enum devlink_eswitch_inline_mode. */ _NM_SRIOV_ESWITCH_INLINE_MODE_PRESERVE = -1, + _NM_SRIOV_ESWITCH_INLINE_MODE_UNKNOWN = -1, /*< skip >*/ _NM_SRIOV_ESWITCH_INLINE_MODE_NONE = 0, _NM_SRIOV_ESWITCH_INLINE_MODE_LINK = 1, _NM_SRIOV_ESWITCH_INLINE_MODE_NETWORK = 2, @@ -299,6 +301,7 @@ typedef enum { /* Mirrors libnm's NMSriovEswitchEncapMode. * Values >= 0 mirror kernel's enum devlink_eswitch_encap_mode. */ _NM_SRIOV_ESWITCH_ENCAP_MODE_PRESERVE = -1, + _NM_SRIOV_ESWITCH_ENCAP_MODE_UNKNOWN = -1, /*< skip >*/ _NM_SRIOV_ESWITCH_ENCAP_MODE_NONE = 0, _NM_SRIOV_ESWITCH_ENCAP_MODE_BASIC = 1, } _NMSriovEswitchEncapMode; diff --git a/src/libnm-core-public/nm-setting-sriov.h b/src/libnm-core-public/nm-setting-sriov.h index e210ccbdc4..affccc4892 100644 --- a/src/libnm-core-public/nm-setting-sriov.h +++ b/src/libnm-core-public/nm-setting-sriov.h @@ -66,6 +66,7 @@ typedef enum { */ typedef enum { NM_SRIOV_ESWITCH_MODE_PRESERVE = -1, + NM_SRIOV_ESWITCH_MODE_UNKNOWN = -1, /*< skip >*/ NM_SRIOV_ESWITCH_MODE_LEGACY = 0, NM_SRIOV_ESWITCH_MODE_SWITCHDEV = 1, } NMSriovEswitchMode; @@ -82,6 +83,7 @@ typedef enum { */ typedef enum { NM_SRIOV_ESWITCH_INLINE_MODE_PRESERVE = -1, + NM_SRIOV_ESWITCH_INLINE_MODE_UNKNOWN = -1, /*< skip >*/ NM_SRIOV_ESWITCH_INLINE_MODE_NONE = 0, NM_SRIOV_ESWITCH_INLINE_MODE_LINK = 1, NM_SRIOV_ESWITCH_INLINE_MODE_NETWORK = 2, @@ -98,6 +100,7 @@ typedef enum { */ typedef enum { NM_SRIOV_ESWITCH_ENCAP_MODE_PRESERVE = -1, + NM_SRIOV_ESWITCH_ENCAP_MODE_UNKNOWN = -1, /*< skip >*/ NM_SRIOV_ESWITCH_ENCAP_MODE_NONE = 0, NM_SRIOV_ESWITCH_ENCAP_MODE_BASIC = 1, } NMSriovEswitchEncapMode; diff --git a/src/libnm-platform/devlink/nm-devlink.c b/src/libnm-platform/devlink/nm-devlink.c index dbd8563850..f06697cf59 100644 --- a/src/libnm-platform/devlink/nm-devlink.c +++ b/src/libnm-platform/devlink/nm-devlink.c @@ -237,18 +237,22 @@ devlink_parse_eswitch_mode(const struct nl_msg *msg, void *data) NMDevlinkEswitchParams *params = data; struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); struct nlattr *tb[G_N_ELEMENTS(eswitch_policy)]; + struct nlattr *nla; if (nla_parse_arr(tb, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), eswitch_policy) < 0) return NL_SKIP; - if (!tb[DEVLINK_ATTR_ESWITCH_MODE] || !tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE] - || !tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]) - return NL_SKIP; + nla = tb[DEVLINK_ATTR_ESWITCH_MODE]; + params->mode = nla ? (_NMSriovEswitchMode) nla_get_u16(nla) : _NM_SRIOV_ESWITCH_MODE_UNKNOWN; - params->mode = (_NMSriovEswitchMode) nla_get_u16(tb[DEVLINK_ATTR_ESWITCH_MODE]); - params->encap_mode = (_NMSriovEswitchEncapMode) nla_get_u8(tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]); + nla = tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE]; params->inline_mode = - (_NMSriovEswitchInlineMode) nla_get_u8(tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE]); + nla ? (_NMSriovEswitchInlineMode) nla_get_u8(nla) : _NM_SRIOV_ESWITCH_INLINE_MODE_UNKNOWN; + + nla = tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]; + params->encap_mode = + nla ? (_NMSriovEswitchEncapMode) nla_get_u8(nla) : _NM_SRIOV_ESWITCH_ENCAP_MODE_UNKNOWN; + return NL_OK; }