Blame SOURCES/0024-fix-delayed-assume-master-rh1452062.patch

fc9aca
From 72e544c7eca495d0857d0710cc77161cd3b145d0 Mon Sep 17 00:00:00 2001
fc9aca
From: Thomas Haller <thaller@redhat.com>
fc9aca
Date: Wed, 7 Jun 2017 17:34:47 +0200
fc9aca
Subject: [PATCH 1/1] manager: fix preserving assume state during activation
fc9aca
fc9aca
Originally 850c977 "device: track system interface state in NMDevice",
fc9aca
intended that a connection can only be assumed initially when seeing
fc9aca
a device for the first time. Assuming a connection later was to be
fc9aca
prevented by setting device's sys-iface-state to MANAGED.
fc9aca
fc9aca
That changed too much in behavior, because we used to assume external
fc9aca
connections also when they are activated later on. So this was attempted
fc9aca
to get fixed by
fc9aca
  - acf1067 nm-manager: try assuming connections on managed devices
fc9aca
  - b6b7d90 manager: avoid generating in memory connections during startup for managed devices
fc9aca
fc9aca
It's probably just wrong to prevent assuming connections based on the
fc9aca
sys-iface-state. So drop the check for sys-iface-state from
fc9aca
recheck_assume_connection(). Now, we can assume anytime on managed,
fc9aca
disconnected interfaces, like previously.
fc9aca
Btw, note that priv->startup is totally wrong to check there, because
fc9aca
priv->startup has the sole purpose of tracking startup-complete property.
fc9aca
Startup, as far as NMManager is concerned, is platform_query_devices().
fc9aca
fc9aca
However, the problem is that we only assume connections (contrary to
fc9aca
doing external activation) when we have a connection-uuid from the state
fc9aca
file or with guess-assume during startup.
fc9aca
fc9aca
When assuming a master device, it can fail with
fc9aca
fc9aca
  (nm-bond): ignoring generated connection (IPv6LL-only and not in master-slave relationship)
fc9aca
fc9aca
thus, for internal reason the device cannot be assumed yet.
fc9aca
fc9aca
Fix that by attatching the assume-state to the device, so that on multiple
fc9aca
recheck_assume_connection() calls we still try to assume. Whenever we try
fc9aca
to assume the connection and it fails due to external reasons (like, the connection
fc9aca
no longer matching), we clear the assume state, so that we only try as
fc9aca
long as there are internal reasons why assuming fails.
fc9aca
fc9aca
https://bugzilla.redhat.com/show_bug.cgi?id=1452062
fc9aca
(cherry picked from commit 729de7d7f09c3ad813477b7a822155b4b95dc682)
fc9aca
(cherry picked from commit 06db38b91d627f897b5bdd0de4a06f7b8a220902)
fc9aca
---
fc9aca
 src/devices/nm-device.c | 86 ++++++++++++++++++++++++++++++++++++++++++---
fc9aca
 src/devices/nm-device.h | 15 +++++++-
fc9aca
 src/nm-manager.c        | 93 +++++++++++++++++++++++++------------------------
fc9aca
 3 files changed, 144 insertions(+), 50 deletions(-)
fc9aca
fc9aca
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
fc9aca
index 1aea8cb..404dcf7 100644
fc9aca
--- a/src/devices/nm-device.c
fc9aca
+++ b/src/devices/nm-device.c
fc9aca
@@ -264,6 +264,9 @@ typedef struct _NMDevicePrivate {
fc9aca
 
fc9aca
 	bool          nm_owned:1; /* whether the device is a device owned and created by NM */
fc9aca
 
fc9aca
+	bool          assume_state_guess_assume:1;
fc9aca
+	char *        assume_state_connection_uuid;
fc9aca
+
fc9aca
 	GHashTable *  available_connections;
fc9aca
 	char *        hw_addr;
fc9aca
 	char *        hw_addr_perm;
fc9aca
@@ -527,6 +530,8 @@ static gboolean dhcp6_start (NMDevice *self, gboolean wait_for_ll);
fc9aca
 static void nm_device_start_ip_check (NMDevice *self);
fc9aca
 static void realize_start_setup (NMDevice *self,
fc9aca
                                  const NMPlatformLink *plink,
fc9aca
+                                 gboolean assume_state_guess_assume,
fc9aca
+                                 const char *assume_state_connection_uuid,
fc9aca
                                  gboolean set_nm_owned,
fc9aca
                                  NMUnmanFlagOp unmanaged_user_explicit);
fc9aca
 static void _commit_mtu (NMDevice *self, const NMIP4Config *config);
fc9aca
@@ -711,6 +716,52 @@ nm_device_sys_iface_state_set (NMDevice *self,
fc9aca
 
fc9aca
 /*****************************************************************************/
fc9aca
 
fc9aca
+void
fc9aca
+nm_device_assume_state_get (NMDevice *self,
fc9aca
+                            gboolean *out_assume_state_guess_assume,
fc9aca
+                            const char **out_assume_state_connection_uuid)
fc9aca
+{
fc9aca
+	NMDevicePrivate *priv;
fc9aca
+
fc9aca
+	g_return_if_fail (NM_IS_DEVICE (self));
fc9aca
+
fc9aca
+	priv = NM_DEVICE_GET_PRIVATE (self);
fc9aca
+	NM_SET_OUT (out_assume_state_guess_assume, priv->assume_state_guess_assume);
fc9aca
+	NM_SET_OUT (out_assume_state_connection_uuid, priv->assume_state_connection_uuid);
fc9aca
+}
fc9aca
+
fc9aca
+static void
fc9aca
+_assume_state_set (NMDevice *self,
fc9aca
+                   gboolean assume_state_guess_assume,
fc9aca
+                   const char *assume_state_connection_uuid)
fc9aca
+{
fc9aca
+	NMDevicePrivate *priv;
fc9aca
+
fc9aca
+	nm_assert (NM_IS_DEVICE (self));
fc9aca
+
fc9aca
+	priv = NM_DEVICE_GET_PRIVATE (self);
fc9aca
+	if (   priv->assume_state_guess_assume == !!assume_state_guess_assume
fc9aca
+	    && nm_streq0 (priv->assume_state_connection_uuid, assume_state_connection_uuid))
fc9aca
+		return;
fc9aca
+
fc9aca
+	_LOGD (LOGD_DEVICE, "assume-state: set guess-assume=%c, connection=%s%s%s",
fc9aca
+	       assume_state_guess_assume ? '1' : '0',
fc9aca
+	       NM_PRINT_FMT_QUOTE_STRING (assume_state_connection_uuid));
fc9aca
+	priv->assume_state_guess_assume = assume_state_guess_assume;
fc9aca
+	g_free (priv->assume_state_connection_uuid);
fc9aca
+	priv->assume_state_connection_uuid = g_strdup (assume_state_connection_uuid);
fc9aca
+}
fc9aca
+
fc9aca
+void
fc9aca
+nm_device_assume_state_reset (NMDevice *self)
fc9aca
+{
fc9aca
+	g_return_if_fail (NM_IS_DEVICE (self));
fc9aca
+
fc9aca
+	_assume_state_set (self, FALSE, NULL);
fc9aca
+}
fc9aca
+
fc9aca
+/*****************************************************************************/
fc9aca
+
fc9aca
 static void
fc9aca
 init_ip4_config_dns_priority (NMDevice *self, NMIP4Config *config)
fc9aca
 {
fc9aca
@@ -2741,6 +2792,8 @@ link_type_compatible (NMDevice *self,
fc9aca
  * nm_device_realize_start():
fc9aca
  * @self: the #NMDevice
fc9aca
  * @plink: an existing platform link or %NULL
fc9aca
+ * @assume_state_guess_assume: set the guess_assume state.
fc9aca
+ * @assume_state_connection_uuid: set the connection uuid to assume.
fc9aca
  * @set_nm_owned: for software device, if TRUE set nm-owned.
fc9aca
  * @unmanaged_user_explicit: the user-explicit unmanaged flag to apply
fc9aca
  *   on the device initially.
fc9aca
@@ -2759,6 +2812,8 @@ link_type_compatible (NMDevice *self,
fc9aca
 gboolean
fc9aca
 nm_device_realize_start (NMDevice *self,
fc9aca
                          const NMPlatformLink *plink,
fc9aca
+                         gboolean assume_state_guess_assume,
fc9aca
+                         const char *assume_state_connection_uuid,
fc9aca
                          gboolean set_nm_owned,
fc9aca
                          NMUnmanFlagOp unmanaged_user_explicit,
fc9aca
                          gboolean *out_compatible,
fc9aca
@@ -2784,8 +2839,11 @@ nm_device_realize_start (NMDevice *self,
fc9aca
 		plink_copy = *plink;
fc9aca
 		plink = &plink_copy;
fc9aca
 	}
fc9aca
-	realize_start_setup (self, plink, set_nm_owned, unmanaged_user_explicit);
fc9aca
-
fc9aca
+	realize_start_setup (self, plink,
fc9aca
+	                     assume_state_guess_assume,
fc9aca
+	                     assume_state_connection_uuid,
fc9aca
+	                     set_nm_owned,
fc9aca
+	                     unmanaged_user_explicit);
fc9aca
 	return TRUE;
fc9aca
 }
fc9aca
 
fc9aca
@@ -2824,7 +2882,10 @@ nm_device_create_and_realize (NMDevice *self,
fc9aca
 		plink = &plink_copy;
fc9aca
 	}
fc9aca
 
fc9aca
-	realize_start_setup (self, plink, FALSE, NM_UNMAN_FLAG_OP_FORGET);
fc9aca
+	realize_start_setup (self, plink,
fc9aca
+	                     FALSE, /* assume_state_guess_assume */
fc9aca
+	                     NULL,  /* assume_state_connection_uuid */
fc9aca
+	                     FALSE, NM_UNMAN_FLAG_OP_FORGET);
fc9aca
 	nm_device_realize_finish (self, plink);
fc9aca
 
fc9aca
 	if (nm_device_get_managed (self, FALSE)) {
fc9aca
@@ -2920,6 +2981,8 @@ realize_start_notify (NMDevice *self,
fc9aca
  * realize_start_setup():
fc9aca
  * @self: the #NMDevice
fc9aca
  * @plink: the #NMPlatformLink if backed by a kernel netdevice
fc9aca
+ * @assume_state_guess_assume: set the guess_assume state.
fc9aca
+ * @assume_state_connection_uuid: set the connection uuid to assume.
fc9aca
  * @set_nm_owned: if TRUE and device is a software-device, set nm-owned.
fc9aca
  *    TRUE.
fc9aca
  * @unmanaged_user_explicit: the user-explict unmanaged flag to set.
fc9aca
@@ -2933,6 +2996,8 @@ realize_start_notify (NMDevice *self,
fc9aca
 static void
fc9aca
 realize_start_setup (NMDevice *self,
fc9aca
                      const NMPlatformLink *plink,
fc9aca
+                     gboolean assume_state_guess_assume,
fc9aca
+                     const char *assume_state_connection_uuid,
fc9aca
                      gboolean set_nm_owned,
fc9aca
                      NMUnmanFlagOp unmanaged_user_explicit)
fc9aca
 {
fc9aca
@@ -2972,6 +3037,8 @@ realize_start_setup (NMDevice *self,
fc9aca
 		_notify (self, PROP_MTU);
fc9aca
 	}
fc9aca
 
fc9aca
+	_assume_state_set (self, assume_state_guess_assume, assume_state_connection_uuid);
fc9aca
+
fc9aca
 	nm_device_sys_iface_state_set (self, NM_DEVICE_SYS_IFACE_STATE_EXTERNAL);
fc9aca
 
fc9aca
 	if (plink) {
fc9aca
@@ -3193,6 +3260,8 @@ nm_device_unrealize (NMDevice *self, gboolean remove_resources, GError **error)
fc9aca
 
fc9aca
 	_LOGD (LOGD_DEVICE, "unrealize (ifindex %d)", ifindex > 0 ? ifindex : 0);
fc9aca
 
fc9aca
+	nm_device_assume_state_reset (self);
fc9aca
+
fc9aca
 	if (remove_resources) {
fc9aca
 		if (NM_DEVICE_GET_CLASS (self)->unrealize) {
fc9aca
 			if (!NM_DEVICE_GET_CLASS (self)->unrealize (self, error))
fc9aca
@@ -4042,7 +4111,7 @@ nm_device_master_update_slave_connection (NMDevice *self,
fc9aca
 }
fc9aca
 
fc9aca
 NMConnection *
fc9aca
-nm_device_generate_connection (NMDevice *self, NMDevice *master)
fc9aca
+nm_device_generate_connection (NMDevice *self, NMDevice *master, gboolean *out_maybe_later)
fc9aca
 {
fc9aca
 	NMDeviceClass *klass = NM_DEVICE_GET_CLASS (self);
fc9aca
 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
fc9aca
@@ -4056,6 +4125,8 @@ nm_device_generate_connection (NMDevice *self, NMDevice *master)
fc9aca
 	GError *error = NULL;
fc9aca
 	const NMPlatformLink *pllink;
fc9aca
 
fc9aca
+	NM_SET_OUT (out_maybe_later, FALSE);
fc9aca
+
fc9aca
 	/* If update_connection() is not implemented, just fail. */
fc9aca
 	if (!klass->update_connection)
fc9aca
 		return NULL;
fc9aca
@@ -4131,6 +4202,7 @@ nm_device_generate_connection (NMDevice *self, NMDevice *master)
fc9aca
 	    && !nm_setting_connection_get_master (NM_SETTING_CONNECTION (s_con))
fc9aca
 	    && !priv->slaves) {
fc9aca
 		_LOGD (LOGD_DEVICE, "ignoring generated connection (no IP and not in master-slave relationship)");
fc9aca
+		NM_SET_OUT (out_maybe_later, TRUE);
fc9aca
 		g_object_unref (connection);
fc9aca
 		connection = NULL;
fc9aca
 	}
fc9aca
@@ -4145,6 +4217,7 @@ nm_device_generate_connection (NMDevice *self, NMDevice *master)
fc9aca
 	    && !priv->slaves
fc9aca
 	    && !nm_config_data_get_assume_ipv6ll_only (NM_CONFIG_GET_DATA, self)) {
fc9aca
 		_LOGD (LOGD_DEVICE, "ignoring generated connection (IPv6LL-only and not in master-slave relationship)");
fc9aca
+		NM_SET_OUT (out_maybe_later, TRUE);
fc9aca
 		g_object_unref (connection);
fc9aca
 		connection = NULL;
fc9aca
 	}
fc9aca
@@ -12504,6 +12577,9 @@ _set_state_full (NMDevice *self,
fc9aca
 	                        NM_DEVICE_SYS_IFACE_STATE_ASSUME))
fc9aca
 		nm_device_sys_iface_state_set (self, NM_DEVICE_SYS_IFACE_STATE_MANAGED);
fc9aca
 
fc9aca
+	if (state > NM_DEVICE_STATE_DISCONNECTED)
fc9aca
+		nm_device_assume_state_reset (self);
fc9aca
+
fc9aca
 	if (state <= NM_DEVICE_STATE_UNAVAILABLE) {
fc9aca
 		if (available_connections_del_all (self))
fc9aca
 			_notify (self, PROP_AVAILABLE_CONNECTIONS);
fc9aca
@@ -13778,6 +13854,8 @@ dispose (GObject *object)
fc9aca
 
fc9aca
 	nm_clear_g_cancellable (&priv->deactivating_cancellable);
fc9aca
 
fc9aca
+	nm_device_assume_state_reset (self);
fc9aca
+
fc9aca
 	_parent_set_ifindex (self, 0, FALSE);
fc9aca
 
fc9aca
 	platform = nm_device_get_platform (self);
fc9aca
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
fc9aca
index 74cc230..01e3938 100644
fc9aca
--- a/src/devices/nm-device.h
fc9aca
+++ b/src/devices/nm-device.h
fc9aca
@@ -487,7 +487,9 @@ void            nm_device_removed               (NMDevice *self, gboolean unconf
fc9aca
 gboolean        nm_device_is_available          (NMDevice *dev, NMDeviceCheckDevAvailableFlags flags);
fc9aca
 gboolean        nm_device_has_carrier           (NMDevice *dev);
fc9aca
 
fc9aca
-NMConnection * nm_device_generate_connection (NMDevice *self, NMDevice *master);
fc9aca
+NMConnection * nm_device_generate_connection (NMDevice *self,
fc9aca
+                                              NMDevice *master,
fc9aca
+                                              gboolean *out_maybe_later);
fc9aca
 
fc9aca
 gboolean nm_device_master_update_slave_connection (NMDevice *master,
fc9aca
                                                    NMDevice *slave,
fc9aca
@@ -609,8 +611,19 @@ gboolean nm_device_is_nm_owned (NMDevice *device);
fc9aca
 
fc9aca
 gboolean nm_device_has_capability (NMDevice *self, NMDeviceCapabilities caps);
fc9aca
 
fc9aca
+/*****************************************************************************/
fc9aca
+
fc9aca
+void nm_device_assume_state_get (NMDevice *self,
fc9aca
+                                 gboolean *out_assume_state_guess_assume,
fc9aca
+                                 const char **out_assume_state_connection_uuid);
fc9aca
+void nm_device_assume_state_reset (NMDevice *self);
fc9aca
+
fc9aca
+/*****************************************************************************/
fc9aca
+
fc9aca
 gboolean nm_device_realize_start      (NMDevice *device,
fc9aca
                                        const NMPlatformLink *plink,
fc9aca
+                                       gboolean assume_state_guess_assume,
fc9aca
+                                       const char *assume_state_connection_uuid,
fc9aca
                                        gboolean set_nm_owned,
fc9aca
                                        NMUnmanFlagOp unmanaged_user_explicit,
fc9aca
                                        gboolean *out_compatible,
fc9aca
diff --git a/src/nm-manager.c b/src/nm-manager.c
fc9aca
index 1daf633..9a7b123 100644
fc9aca
--- a/src/nm-manager.c
fc9aca
+++ b/src/nm-manager.c
fc9aca
@@ -1691,11 +1691,6 @@ done:
fc9aca
  * get_existing_connection:
fc9aca
  * @manager: #NMManager instance
fc9aca
  * @device: #NMDevice instance
fc9aca
- * @guess_assume: whether to employ a heuristic to search for a matching
fc9aca
- *   connection to assume.
fc9aca
- * @assume_connection_uuid: if present, try to assume a connection with this
fc9aca
- *   UUID. If no uuid is given or no matching connection is found, we
fc9aca
- *   only do external activation.
fc9aca
  * @out_generated: (allow-none): return TRUE, if the connection was generated.
fc9aca
  *
fc9aca
  * Returns: a #NMSettingsConnection to be assumed by the device, or %NULL if
fc9aca
@@ -1704,8 +1699,6 @@ done:
fc9aca
 static NMSettingsConnection *
fc9aca
 get_existing_connection (NMManager *self,
fc9aca
                          NMDevice *device,
fc9aca
-                         gboolean guess_assume,
fc9aca
-                         const char *assume_connection_uuid,
fc9aca
                          gboolean *out_generated)
fc9aca
 {
fc9aca
 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
fc9aca
@@ -1716,6 +1709,9 @@ get_existing_connection (NMManager *self,
fc9aca
 	int ifindex = nm_device_get_ifindex (device);
fc9aca
 	NMSettingsConnection *matched;
fc9aca
 	NMSettingsConnection *connection_checked = NULL;
fc9aca
+	gboolean assume_state_guess_assume = FALSE;
fc9aca
+	const char *assume_state_connection_uuid = NULL;
fc9aca
+	gboolean maybe_later;
fc9aca
 
fc9aca
 	if (out_generated)
fc9aca
 		*out_generated = FALSE;
fc9aca
@@ -1746,9 +1742,16 @@ get_existing_connection (NMManager *self,
fc9aca
 	 * update_connection() implemented, otherwise nm_device_generate_connection()
fc9aca
 	 * returns NULL.
fc9aca
 	 */
fc9aca
-	connection = nm_device_generate_connection (device, master);
fc9aca
-	if (!connection)
fc9aca
+	connection = nm_device_generate_connection (device, master, &maybe_later);
fc9aca
+	if (!connection) {
fc9aca
+		if (!maybe_later)
fc9aca
+			nm_device_assume_state_reset (device);
fc9aca
 		return NULL;
fc9aca
+	}
fc9aca
+
fc9aca
+	nm_device_assume_state_get (device,
fc9aca
+	                            &assume_state_guess_assume,
fc9aca
+	                            &assume_state_connection_uuid);
fc9aca
 
fc9aca
 	/* Now we need to compare the generated connection to each configured
fc9aca
 	 * connection. The comparison function is the heart of the connection
fc9aca
@@ -1759,8 +1762,8 @@ get_existing_connection (NMManager *self,
fc9aca
 	 * When no configured connection matches the generated connection, we keep
fc9aca
 	 * the generated connection instead.
fc9aca
 	 */
fc9aca
-	if (   assume_connection_uuid
fc9aca
-	    && (connection_checked = nm_settings_get_connection_by_uuid (priv->settings, assume_connection_uuid))
fc9aca
+	if (   assume_state_connection_uuid
fc9aca
+	    && (connection_checked = nm_settings_get_connection_by_uuid (priv->settings, assume_state_connection_uuid))
fc9aca
 	    && !active_connection_find_first (self, connection_checked, NULL,
fc9aca
 	                                      NM_ACTIVE_CONNECTION_STATE_DEACTIVATING)
fc9aca
 	    && nm_device_check_connection_compatible (device, NM_CONNECTION (connection_checked))) {
fc9aca
@@ -1778,7 +1781,7 @@ get_existing_connection (NMManager *self,
fc9aca
 	} else
fc9aca
 		matched = NULL;
fc9aca
 
fc9aca
-	if (!matched && guess_assume) {
fc9aca
+	if (!matched && assume_state_guess_assume) {
fc9aca
 		gs_free NMSettingsConnection **connections = NULL;
fc9aca
 		guint len, i, j;
fc9aca
 
fc9aca
@@ -1812,9 +1815,10 @@ get_existing_connection (NMManager *self,
fc9aca
 		       nm_device_get_iface (device),
fc9aca
 		       nm_settings_connection_get_id (matched),
fc9aca
 		       nm_settings_connection_get_uuid (matched),
fc9aca
-		       assume_connection_uuid && nm_streq (assume_connection_uuid, nm_settings_connection_get_uuid (matched))
fc9aca
+		       assume_state_connection_uuid && nm_streq (assume_state_connection_uuid, nm_settings_connection_get_uuid (matched))
fc9aca
 		           ? " (indicated)" : " (guessed)");
fc9aca
 		g_object_unref (connection);
fc9aca
+		nm_device_assume_state_reset (device);
fc9aca
 		return matched;
fc9aca
 	}
fc9aca
 
fc9aca
@@ -1822,6 +1826,8 @@ get_existing_connection (NMManager *self,
fc9aca
 	       nm_device_get_iface (device),
fc9aca
 	       nm_connection_get_id (connection));
fc9aca
 
fc9aca
+	nm_device_assume_state_reset (device);
fc9aca
+
fc9aca
 	added = nm_settings_add_connection (priv->settings, connection, FALSE, &error);
fc9aca
 	if (added) {
fc9aca
 		nm_settings_connection_set_flags (NM_SETTINGS_CONNECTION (added),
fc9aca
@@ -1844,34 +1850,28 @@ get_existing_connection (NMManager *self,
fc9aca
 
fc9aca
 static gboolean
fc9aca
 recheck_assume_connection (NMManager *self,
fc9aca
-                           NMDevice *device,
fc9aca
-                           gboolean guess_assume,
fc9aca
-                           const char *assume_connection_uuid)
fc9aca
+                           NMDevice *device)
fc9aca
 {
fc9aca
 	NMSettingsConnection *connection;
fc9aca
 	gboolean was_unmanaged = FALSE;
fc9aca
 	gboolean generated = FALSE;
fc9aca
 	NMDeviceState state;
fc9aca
-	NMDeviceSysIfaceState if_state;
fc9aca
-	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
fc9aca
 
fc9aca
 	g_return_val_if_fail (NM_IS_MANAGER (self), FALSE);
fc9aca
 	g_return_val_if_fail (NM_IS_DEVICE (device), FALSE);
fc9aca
 
fc9aca
-	if (!nm_device_get_managed (device, FALSE))
fc9aca
+	if (!nm_device_get_managed (device, FALSE)) {
fc9aca
+		nm_device_assume_state_reset (device);
fc9aca
 		return FALSE;
fc9aca
+	}
fc9aca
 
fc9aca
 	state = nm_device_get_state (device);
fc9aca
-	if (state > NM_DEVICE_STATE_DISCONNECTED)
fc9aca
-		return FALSE;
fc9aca
-
fc9aca
-	if_state = nm_device_sys_iface_state_get (device);
fc9aca
-	if (!priv->startup  && (if_state == NM_DEVICE_SYS_IFACE_STATE_MANAGED))
fc9aca
-		nm_assert (!guess_assume && (assume_connection_uuid == NULL));
fc9aca
-	else if (if_state != NM_DEVICE_SYS_IFACE_STATE_EXTERNAL)
fc9aca
+	if (state > NM_DEVICE_STATE_DISCONNECTED) {
fc9aca
+		nm_device_assume_state_reset (device);
fc9aca
 		return FALSE;
fc9aca
+	}
fc9aca
 
fc9aca
-	connection = get_existing_connection (self, device, guess_assume, assume_connection_uuid, &generated);
fc9aca
+	connection = get_existing_connection (self, device, &generated);
fc9aca
 	if (!connection) {
fc9aca
 		_LOGD (LOGD_DEVICE, "(%s): can't assume; no connection",
fc9aca
 		       nm_device_get_iface (device));
fc9aca
@@ -1951,9 +1951,9 @@ recheck_assume_connection (NMManager *self,
fc9aca
 }
fc9aca
 
fc9aca
 static void
fc9aca
-recheck_assume_connection_cb (NMDevice *device, gpointer user_data)
fc9aca
+recheck_assume_connection_cb (NMManager *self, NMDevice *device)
fc9aca
 {
fc9aca
-	recheck_assume_connection (user_data, device, FALSE, NULL);
fc9aca
+	recheck_assume_connection (self, device);
fc9aca
 }
fc9aca
 
fc9aca
 static void
fc9aca
@@ -2046,19 +2046,19 @@ device_connectivity_changed (NMDevice *device,
fc9aca
 static void
fc9aca
 _device_realize_finish (NMManager *self,
fc9aca
                         NMDevice *device,
fc9aca
-                        const NMPlatformLink *plink,
fc9aca
-                        gboolean guess_assume,
fc9aca
-                        const char *connection_uuid_to_assume)
fc9aca
+                        const NMPlatformLink *plink)
fc9aca
 {
fc9aca
 	g_return_if_fail (NM_IS_MANAGER (self));
fc9aca
 	g_return_if_fail (NM_IS_DEVICE (device));
fc9aca
 
fc9aca
 	nm_device_realize_finish (device, plink);
fc9aca
 
fc9aca
-	if (!nm_device_get_managed (device, FALSE))
fc9aca
+	if (!nm_device_get_managed (device, FALSE)) {
fc9aca
+		nm_device_assume_state_reset (device);
fc9aca
 		return;
fc9aca
+	}
fc9aca
 
fc9aca
-	if (recheck_assume_connection (self, device, guess_assume, connection_uuid_to_assume))
fc9aca
+	if (recheck_assume_connection (self, device))
fc9aca
 		return;
fc9aca
 
fc9aca
 	/* if we failed to assume a connection for the managed device, but the device
fc9aca
@@ -2128,9 +2128,9 @@ add_device (NMManager *self, NMDevice *device, GError **error)
fc9aca
 	                  G_CALLBACK (device_removed_cb),
fc9aca
 	                  self);
fc9aca
 
fc9aca
-	g_signal_connect (device, NM_DEVICE_RECHECK_ASSUME,
fc9aca
-	                  G_CALLBACK (recheck_assume_connection_cb),
fc9aca
-	                  self);
fc9aca
+	g_signal_connect_data (device, NM_DEVICE_RECHECK_ASSUME,
fc9aca
+	                       G_CALLBACK (recheck_assume_connection_cb),
fc9aca
+	                       self, NULL, G_CONNECT_SWAPPED);
fc9aca
 
fc9aca
 	g_signal_connect (device, "notify::" NM_DEVICE_IP_IFACE,
fc9aca
 	                  G_CALLBACK (device_ip_iface_changed),
fc9aca
@@ -2212,12 +2212,14 @@ factory_device_added_cb (NMDeviceFactory *factory,
fc9aca
 
fc9aca
 	if (nm_device_realize_start (device,
fc9aca
 	                             NULL,
fc9aca
-	                             FALSE,
fc9aca
+	                             FALSE, /* assume_state_guess_assume */
fc9aca
+	                             NULL,  /* assume_state_connection_uuid */
fc9aca
+	                             FALSE, /* set_nm_owned */
fc9aca
 	                             NM_UNMAN_FLAG_OP_FORGET,
fc9aca
 	                             NULL,
fc9aca
 	                             &error)) {
fc9aca
 		add_device (self, device, NULL);
fc9aca
-		_device_realize_finish (self, device, NULL, FALSE, NULL);
fc9aca
+		_device_realize_finish (self, device, NULL);
fc9aca
 	} else {
fc9aca
 		_LOGW (LOGD_DEVICE, "(%s): failed to realize device: %s",
fc9aca
 		       nm_device_get_iface (device), error->message);
fc9aca
@@ -2291,12 +2293,13 @@ platform_link_added (NMManager *self,
fc9aca
 			return;
fc9aca
 		} else if (nm_device_realize_start (candidate,
fc9aca
 		                                    plink,
fc9aca
-		                                    FALSE,
fc9aca
+		                                    FALSE, /* assume_state_guess_assume */
fc9aca
+		                                    NULL,  /* assume_state_connection_uuid */
fc9aca
+		                                    FALSE, /* set_nm_owned */
fc9aca
 		                                    NM_UNMAN_FLAG_OP_FORGET,
fc9aca
 		                                    &compatible,
fc9aca
 		                                    &error)) {
fc9aca
-			/* Success */
fc9aca
-			_device_realize_finish (self, candidate, plink, FALSE, NULL);
fc9aca
+			_device_realize_finish (self, candidate, plink);
fc9aca
 			return;
fc9aca
 		}
fc9aca
 
fc9aca
@@ -2363,14 +2366,14 @@ platform_link_added (NMManager *self,
fc9aca
 
fc9aca
 		if (nm_device_realize_start (device,
fc9aca
 		                             plink,
fc9aca
+		                             guess_assume,
fc9aca
+		                             dev_state ? dev_state->connection_uuid : NULL,
fc9aca
 		                             dev_state ? (dev_state->nm_owned == 1) : FALSE,
fc9aca
 		                             unmanaged_user_explicit,
fc9aca
 		                             NULL,
fc9aca
 		                             &error)) {
fc9aca
 			add_device (self, device, NULL);
fc9aca
-			_device_realize_finish (self, device, plink,
fc9aca
-			                        guess_assume,
fc9aca
-			                        dev_state ? dev_state->connection_uuid : NULL);
fc9aca
+			_device_realize_finish (self, device, plink);
fc9aca
 		} else {
fc9aca
 			_LOGW (LOGD_DEVICE, "%s: failed to realize device: %s",
fc9aca
 			       plink->name, error->message);
fc9aca
-- 
fc9aca
2.9.4
fc9aca