From 3df94a4f2ef4d622da4e27c400c38535a510683c 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. (cherry picked from commit 7346c5b556d239b4e7bb17014fae5e6586f88603) --- 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 d77ff9ec1..e1cc27332 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 e210ccbdc..affccc489 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 dbd856385..f06697cf5 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; }