ovs: discard link updates when deactivating

When the ovs interface gets deactivated, it is released from the
master port and we call nm_device_update_from_platform_link (dev,
NULL) to ignore any later event for the interface. This is important
especially because it sets a zero ifindex on the interface and so,
later when the link disappears, we don't unmanage the device but
directly remove it.

However, since ovs commands are queued, the link could appear during
the deactivation and we need to ignore such events. Add a new device
method can_update_from_platform_link() for such purpose.
This commit is contained in:
Beniamino Galvani 2020-02-14 17:46:31 +01:00
parent 9c49f8a879
commit e9fc1dea43
3 changed files with 25 additions and 0 deletions

View file

@ -4317,6 +4317,12 @@ nm_device_create_and_realize (NMDevice *self,
return TRUE;
}
static gboolean
can_update_from_platform_link (NMDevice *self, const NMPlatformLink *plink)
{
return TRUE;
}
void
nm_device_update_from_platform_link (NMDevice *self, const NMPlatformLink *plink)
{
@ -4325,6 +4331,9 @@ nm_device_update_from_platform_link (NMDevice *self, const NMPlatformLink *plink
int ifindex;
guint32 mtu;
if (!NM_DEVICE_GET_CLASS (self)->can_update_from_platform_link (self, plink))
return;
g_return_if_fail (plink == NULL || link_type_compatible (self, plink->type, NULL, NULL));
str = plink ? nm_platform_link_get_udi (nm_device_get_platform (self), plink->ifindex) : NULL;
@ -17688,6 +17697,7 @@ nm_device_class_init (NMDeviceClass *klass)
klass->get_type_description = get_type_description;
klass->can_auto_connect = can_auto_connect;
klass->can_update_from_platform_link = can_update_from_platform_link;
klass->check_connection_compatible = check_connection_compatible;
klass->check_connection_available = check_connection_available;
klass->can_unmanaged_external_down = can_unmanaged_external_down;

View file

@ -442,6 +442,8 @@ typedef struct _NMDeviceClass {
gboolean (* get_guessed_metered) (NMDevice *self);
gboolean (* can_update_from_platform_link) (NMDevice *self, const NMPlatformLink *plink);
/* Controls, whether to call act_stage2_config() callback also for assuming
* a device or for external activations. In this case, act_stage2_config() must
* take care not to touch the device's configuration. */

View file

@ -299,6 +299,18 @@ deactivate_async (NMDevice *device,
data);
}
static gboolean
can_update_from_platform_link (NMDevice *device, const NMPlatformLink *plink)
{
/* If the device is deactivating, we already sent the
* deletion command to ovsdb and we don't want to deal
* with any new link appearing from the previous
* activation.
*/
return !plink
|| nm_device_get_state (device) != NM_DEVICE_STATE_DEACTIVATING;
}
/*****************************************************************************/
static void
@ -328,6 +340,7 @@ nm_device_ovs_interface_class_init (NMDeviceOvsInterfaceClass *klass)
device_class->connection_type_check_compatible = NM_SETTING_OVS_INTERFACE_SETTING_NAME;
device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES (NM_LINK_TYPE_OPENVSWITCH);
device_class->can_update_from_platform_link = can_update_from_platform_link;
device_class->deactivate = deactivate;
device_class->deactivate_async = deactivate_async;
device_class->get_type_description = get_type_description;