mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-10-15 12:34:55 +00:00
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:
parent
dda94d6f66
commit
3df94a4f2e
|
@ -281,6 +281,7 @@ typedef enum {
|
||||||
/* Mirrors libnm's NMSriovEswitchMode.
|
/* Mirrors libnm's NMSriovEswitchMode.
|
||||||
* Values >= 0 mirror kernel's enum devlink_eswitch_mode. */
|
* Values >= 0 mirror kernel's enum devlink_eswitch_mode. */
|
||||||
_NM_SRIOV_ESWITCH_MODE_PRESERVE = -1,
|
_NM_SRIOV_ESWITCH_MODE_PRESERVE = -1,
|
||||||
|
_NM_SRIOV_ESWITCH_MODE_UNKNOWN = -1, /*< skip >*/
|
||||||
_NM_SRIOV_ESWITCH_MODE_LEGACY = 0,
|
_NM_SRIOV_ESWITCH_MODE_LEGACY = 0,
|
||||||
_NM_SRIOV_ESWITCH_MODE_SWITCHDEV = 1,
|
_NM_SRIOV_ESWITCH_MODE_SWITCHDEV = 1,
|
||||||
} _NMSriovEswitchMode;
|
} _NMSriovEswitchMode;
|
||||||
|
@ -289,6 +290,7 @@ typedef enum {
|
||||||
/* Mirrors libnm's NMSriovEswitchInlineMode.
|
/* Mirrors libnm's NMSriovEswitchInlineMode.
|
||||||
* Values >= 0 mirror kernel's enum devlink_eswitch_inline_mode. */
|
* Values >= 0 mirror kernel's enum devlink_eswitch_inline_mode. */
|
||||||
_NM_SRIOV_ESWITCH_INLINE_MODE_PRESERVE = -1,
|
_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_NONE = 0,
|
||||||
_NM_SRIOV_ESWITCH_INLINE_MODE_LINK = 1,
|
_NM_SRIOV_ESWITCH_INLINE_MODE_LINK = 1,
|
||||||
_NM_SRIOV_ESWITCH_INLINE_MODE_NETWORK = 2,
|
_NM_SRIOV_ESWITCH_INLINE_MODE_NETWORK = 2,
|
||||||
|
@ -299,6 +301,7 @@ typedef enum {
|
||||||
/* Mirrors libnm's NMSriovEswitchEncapMode.
|
/* Mirrors libnm's NMSriovEswitchEncapMode.
|
||||||
* Values >= 0 mirror kernel's enum devlink_eswitch_encap_mode. */
|
* Values >= 0 mirror kernel's enum devlink_eswitch_encap_mode. */
|
||||||
_NM_SRIOV_ESWITCH_ENCAP_MODE_PRESERVE = -1,
|
_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_NONE = 0,
|
||||||
_NM_SRIOV_ESWITCH_ENCAP_MODE_BASIC = 1,
|
_NM_SRIOV_ESWITCH_ENCAP_MODE_BASIC = 1,
|
||||||
} _NMSriovEswitchEncapMode;
|
} _NMSriovEswitchEncapMode;
|
||||||
|
|
|
@ -66,6 +66,7 @@ typedef enum {
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NM_SRIOV_ESWITCH_MODE_PRESERVE = -1,
|
NM_SRIOV_ESWITCH_MODE_PRESERVE = -1,
|
||||||
|
NM_SRIOV_ESWITCH_MODE_UNKNOWN = -1, /*< skip >*/
|
||||||
NM_SRIOV_ESWITCH_MODE_LEGACY = 0,
|
NM_SRIOV_ESWITCH_MODE_LEGACY = 0,
|
||||||
NM_SRIOV_ESWITCH_MODE_SWITCHDEV = 1,
|
NM_SRIOV_ESWITCH_MODE_SWITCHDEV = 1,
|
||||||
} NMSriovEswitchMode;
|
} NMSriovEswitchMode;
|
||||||
|
@ -82,6 +83,7 @@ typedef enum {
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NM_SRIOV_ESWITCH_INLINE_MODE_PRESERVE = -1,
|
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_NONE = 0,
|
||||||
NM_SRIOV_ESWITCH_INLINE_MODE_LINK = 1,
|
NM_SRIOV_ESWITCH_INLINE_MODE_LINK = 1,
|
||||||
NM_SRIOV_ESWITCH_INLINE_MODE_NETWORK = 2,
|
NM_SRIOV_ESWITCH_INLINE_MODE_NETWORK = 2,
|
||||||
|
@ -98,6 +100,7 @@ typedef enum {
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NM_SRIOV_ESWITCH_ENCAP_MODE_PRESERVE = -1,
|
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_NONE = 0,
|
||||||
NM_SRIOV_ESWITCH_ENCAP_MODE_BASIC = 1,
|
NM_SRIOV_ESWITCH_ENCAP_MODE_BASIC = 1,
|
||||||
} NMSriovEswitchEncapMode;
|
} NMSriovEswitchEncapMode;
|
||||||
|
|
|
@ -237,18 +237,22 @@ devlink_parse_eswitch_mode(const struct nl_msg *msg, void *data)
|
||||||
NMDevlinkEswitchParams *params = data;
|
NMDevlinkEswitchParams *params = data;
|
||||||
struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
|
struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
|
||||||
struct nlattr *tb[G_N_ELEMENTS(eswitch_policy)];
|
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)
|
if (nla_parse_arr(tb, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), eswitch_policy) < 0)
|
||||||
return NL_SKIP;
|
return NL_SKIP;
|
||||||
|
|
||||||
if (!tb[DEVLINK_ATTR_ESWITCH_MODE] || !tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE]
|
nla = tb[DEVLINK_ATTR_ESWITCH_MODE];
|
||||||
|| !tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE])
|
params->mode = nla ? (_NMSriovEswitchMode) nla_get_u16(nla) : _NM_SRIOV_ESWITCH_MODE_UNKNOWN;
|
||||||
return NL_SKIP;
|
|
||||||
|
|
||||||
params->mode = (_NMSriovEswitchMode) nla_get_u16(tb[DEVLINK_ATTR_ESWITCH_MODE]);
|
nla = tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE];
|
||||||
params->encap_mode = (_NMSriovEswitchEncapMode) nla_get_u8(tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]);
|
|
||||||
params->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;
|
return NL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue