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; }