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 7346c5b556)
This commit is contained in:
Íñigo Huguet 2024-02-16 13:47:38 +01:00
parent dda94d6f66
commit 3df94a4f2e
3 changed files with 16 additions and 6 deletions

View file

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

View file

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

View file

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