diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 50858333aa..bf7e814739 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2570,6 +2570,7 @@ void nm_device_removed (NMDevice *self) { NMDevicePrivate *priv; + NMDeviceStateReason ignored = NM_DEVICE_STATE_REASON_NONE; g_return_if_fail (NM_IS_DEVICE (self)); @@ -2579,6 +2580,13 @@ nm_device_removed (NMDevice *self) * Release the slave from master, but don't touch the device. */ nm_device_master_release_one_slave (priv->master, self, FALSE, NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED); } + + /* Clean up IP configs; this does not actually deconfigure the + * interface, it just disowns the configuration so that policy + * unregisters it from the dns manager before the device itself + * is gone from manager. */ + nm_device_set_ip4_config (self, NULL, 0, TRUE, TRUE, &ignored); + nm_device_set_ip6_config (self, NULL, TRUE, TRUE, &ignored); } static gboolean @@ -9971,7 +9979,6 @@ static void _cleanup_generic_post (NMDevice *self, CleanupType cleanup_type) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); - NMDeviceStateReason ignored = NM_DEVICE_STATE_REASON_NONE; priv->default_route.v4_has = FALSE; priv->default_route.v6_has = FALSE; @@ -9993,11 +10000,6 @@ _cleanup_generic_post (NMDevice *self, CleanupType cleanup_type) priv->linklocal6_dad_counter = 0; - /* Clean up IP configs; this does not actually deconfigure the - * interface; the caller must flush routes and addresses explicitly. - */ - nm_device_set_ip4_config (self, NULL, 0, TRUE, TRUE, &ignored); - nm_device_set_ip6_config (self, NULL, TRUE, TRUE, &ignored); g_clear_object (&priv->con_ip4_config); g_clear_object (&priv->dev_ip4_config); g_clear_object (&priv->ext_ip4_config); diff --git a/src/nm-default-route-manager.c b/src/nm-default-route-manager.c index 3ee634a7b7..8c466d9822 100644 --- a/src/nm-default-route-manager.c +++ b/src/nm-default-route-manager.c @@ -1175,7 +1175,9 @@ _ipx_get_best_config (const VTableIP *vtable, config_result = nm_device_get_ip4_config (device); else config_result = nm_device_get_ip6_config (device); - g_assert (config_result); + if (!config_result) + continue; + req = nm_device_get_act_request (device); g_assert (req); diff --git a/src/nm-manager.c b/src/nm-manager.c index a509c77a78..ffed8ba637 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -872,8 +872,8 @@ remove_device (NMManager *self, if (nm_device_is_real (device)) { g_signal_emit (self, signals[DEVICE_REMOVED], 0, device); _notify (self, PROP_DEVICES); - nm_device_removed (device); } + nm_device_removed (device); g_signal_emit (self, signals[INTERNAL_DEVICE_REMOVED], 0, device); _notify (self, PROP_ALL_DEVICES);