summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-03-31 22:50:34 -0500
committerDan Williams <dcbw@redhat.com>2014-03-31 22:52:29 -0500
commit06412329ae92f0f6a3cf103150561fbeb2f8c69e (patch)
tree8f43c4b42c10d64bfb76f7951033963c0104b453
parentbbe8dac69c9183e924e440fb95e2a1c56991e05f (diff)
downloadNetworkManager-06412329ae92f0f6a3cf103150561fbeb2f8c69e.tar.gz
core: split user managed preference (unmanaged specs) out from internal management
We'll want to track internal management separately in the future, so split out user management (eg, whether the device has been explicitly marked unmanaged by the user).
-rw-r--r--src/devices/nm-device.c2
-rw-r--r--src/devices/nm-device.h10
-rw-r--r--src/nm-manager.c35
3 files changed, 28 insertions, 19 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 127a06c0b5..430363495f 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -7163,6 +7163,8 @@ nm_device_get_managed_flag (NMDevice *device, NMManagedFlags flag)
/* Return the composite of all managed flags */
if (!(priv->managed_flags & NM_MANAGED_INTERNAL))
return FALSE;
+ else if (!(priv->managed_flags & NM_MANAGED_USER))
+ return FALSE;
else if (!(priv->managed_flags & NM_MANAGED_DEFAULT))
return (priv->state != NM_DEVICE_STATE_UNMANAGED);
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index eab2964e56..35f0f49240 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -300,18 +300,20 @@ RfKillType nm_device_get_rfkill_type (NMDevice *device);
* @NM_MANAGED_UNKNOWN: placeholder value
* @NM_MANAGED_COMPOSITE: same as %NM_MANAGED_UNKNOWN, used for readability
* @NM_MANAGED_DEFAULT: whether managed by default (ie, not set for Generic devices)
- * @NM_MANAGED_INTERNAL: whether managed by internal decision (ie, not set for
- * devices in unmanaged specs, or because NM is sleeping)
+ * @NM_MANAGED_INTERNAL: whether managed by internal decision (ie, because NM
+ * is sleeping or not managed the device for some other reason)
+ * @NM_MANAGED_USER: whether managed by user decision (ie, not in unmanaged-specs)
*/
typedef enum {
NM_MANAGED_UNKNOWN = 0x00,
NM_MANAGED_COMPOSITE = NM_MANAGED_UNKNOWN,
NM_MANAGED_DEFAULT = 0x01,
NM_MANAGED_INTERNAL = 0x02,
+ NM_MANAGED_USER = 0x04,
/* Boundary values */
- NM_MANAGED_LAST = NM_MANAGED_INTERNAL,
- NM_MANAGED_ALL = NM_MANAGED_DEFAULT | NM_MANAGED_INTERNAL,
+ NM_MANAGED_LAST = NM_MANAGED_USER,
+ NM_MANAGED_ALL = NM_MANAGED_DEFAULT | NM_MANAGED_INTERNAL | NM_MANAGED_USER,
} NMManagedFlags;
gboolean nm_device_get_managed (NMDevice *device);
diff --git a/src/nm-manager.c b/src/nm-manager.c
index fd23b5e802..a92aa34dec 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -1203,7 +1203,7 @@ system_unmanaged_devices_changed_cb (NMSettings *settings,
managed = !nm_device_spec_match_list (device, unmanaged_specs);
nm_device_set_managed (device,
- NM_MANAGED_INTERNAL,
+ NM_MANAGED_USER,
managed,
managed ? NM_DEVICE_STATE_REASON_NOW_MANAGED :
NM_DEVICE_STATE_REASON_NOW_UNMANAGED);
@@ -1752,7 +1752,7 @@ add_device (NMManager *self, NMDevice *device, gboolean generate_con)
char *path;
static guint32 devcount = 0;
const GSList *unmanaged_specs;
- gboolean unmanaged = FALSE;
+ gboolean user_unmanaged, sleeping;
NMConnection *connection = NULL;
gboolean enabled = FALSE;
RfKillType rtype;
@@ -1843,28 +1843,33 @@ add_device (NMManager *self, NMDevice *device, gboolean generate_con)
nm_log_info (LOGD_HW, "(%s): new %s device (driver: '%s' ifindex: %d)",
iface, type_desc, driver, nm_device_get_ifindex (device));
+ unmanaged_specs = nm_settings_get_unmanaged_specs (priv->settings);
+ user_unmanaged = nm_device_spec_match_list (device, unmanaged_specs);
+ sleeping = manager_sleeping (self);
+ nm_device_set_initial_managed_flags (device,
+ NM_MANAGED_USER, !user_unmanaged,
+ NM_MANAGED_INTERNAL, !sleeping,
+ NM_MANAGED_UNKNOWN);
+
path = g_strdup_printf ("/org/freedesktop/NetworkManager/Devices/%d", devcount++);
nm_device_set_path (device, path);
nm_dbus_manager_register_object (priv->dbus_mgr, path, device);
nm_log_info (LOGD_CORE, "(%s): exported as %s", iface, path);
g_free (path);
- unmanaged_specs = nm_settings_get_unmanaged_specs (priv->settings);
- unmanaged = nm_device_spec_match_list (device, unmanaged_specs);
-
/* Don't generate a connection e.g. for devices NM just created, or
- * for the loopback */
- if (generate_con && !unmanaged)
+ * for the loopback, or when we're sleeping. */
+ if (generate_con && !user_unmanaged && !sleeping)
connection = get_existing_connection (self, device);
- /* Start the device if it's supposed to be managed */
- if ( !manager_sleeping (self)
- && !unmanaged) {
- nm_device_set_managed (device,
- NM_MANAGED_INTERNAL,
- TRUE,
- connection ? NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED :
- NM_DEVICE_STATE_REASON_NOW_MANAGED);
+ /* Start the device if it'supposed to be managed. Note that this will
+ * manage default-unmanaged devices if they have a generated connection.
+ */
+ if (nm_device_get_managed (device) || connection) {
+ nm_device_state_changed (device,
+ NM_DEVICE_STATE_UNAVAILABLE,
+ connection ? NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED :
+ NM_DEVICE_STATE_REASON_NOW_MANAGED);
}
nm_settings_device_added (priv->settings, device);