devices: drop wrong assertion on parent when ifindex is not present

When creating a parent dependent device it can have software device as
parent without an ifindex. In that case, it will fail on an ssertion on
parent being missing.

In order to avoid this, we are handling the situation similar to what we
do for VLAN devices. NetworkManager will raise different error and block
the autoconnection instead of asserting.

This solves the assert error for the following commands:

```
nmcli connection add type macvlan ifname mv1 con-name mv1+ macvlan.parent dummy0 mode vepa
nmcli connection add type dummy ifname dummy0 con-name dummy0+ autoconnect no
```
This commit is contained in:
Fernando Fernandez Mancera
2023-03-06 17:57:16 +01:00
parent 5a9a7623c5
commit 7f96d4d2cd
2 changed files with 22 additions and 6 deletions

View File

@@ -72,14 +72,22 @@ create_and_realize(NMDevice *device,
s_6lowpan = NM_SETTING_6LOWPAN(nm_connection_get_setting(connection, NM_TYPE_SETTING_6LOWPAN));
g_return_val_if_fail(s_6lowpan, FALSE);
parent_ifindex = parent ? nm_device_get_ifindex(parent) : 0;
if (!parent) {
g_set_error(error,
NM_DEVICE_ERROR,
NM_DEVICE_ERROR_MISSING_DEPENDENCIES,
"6LoWPAN device can not be created without a parent interface");
return FALSE;
}
parent_ifindex = nm_device_get_ifindex(parent);
if (parent_ifindex <= 0) {
g_set_error(error,
NM_DEVICE_ERROR,
NM_DEVICE_ERROR_MISSING_DEPENDENCIES,
"6LoWPAN devices can not be created without a parent interface");
g_return_val_if_fail(!parent, FALSE);
"cannot retrieve ifindex of interface %s (%s)",
nm_device_get_iface(parent),
nm_device_get_type_desc(parent));
return FALSE;
}

View File

@@ -208,14 +208,22 @@ create_and_realize(NMDevice *device,
s_macvlan = nm_connection_get_setting_macvlan(connection);
g_return_val_if_fail(s_macvlan, FALSE);
parent_ifindex = parent ? nm_device_get_ifindex(parent) : 0;
if (!parent) {
g_set_error(error,
NM_DEVICE_ERROR,
NM_DEVICE_ERROR_MISSING_DEPENDENCIES,
"MACVLAN device can not be created without a parent interface");
return FALSE;
}
parent_ifindex = nm_device_get_ifindex(parent);
if (parent_ifindex <= 0) {
g_set_error(error,
NM_DEVICE_ERROR,
NM_DEVICE_ERROR_MISSING_DEPENDENCIES,
"MACVLAN devices can not be created without a parent interface");
g_return_val_if_fail(!parent, FALSE);
"cannot retrieve ifindex of interface %s (%s)",
nm_device_get_iface(parent),
nm_device_get_type_desc(parent));
return FALSE;
}