summaryrefslogtreecommitdiff
path: root/src/devices
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-11-07 10:48:55 +0100
committerThomas Haller <thaller@redhat.com>2017-11-08 12:35:10 +0100
commitf0731dc716f08d1187ff2c936a1fee0e8c4ab92f (patch)
tree05276ada369d166bd0017c9fb4e334aa38f9c771 /src/devices
parentf7e72d9d702ea78fe04b1a9000727da76a31b71b (diff)
downloadNetworkManager-f0731dc716f08d1187ff2c936a1fee0e8c4ab92f.tar.gz
device: refactor autoconnect blocking by introducing NMDeviceAutoconnectBlockedFlags enum
The flags allow for more then two reasons. Currently the only reasons for allowing or disallowing autoconnect are "user" and "intern". It's a bit odd, that NMDeviceAutoconnectBlockedFlags has a negative meaning. So nm_device_set_autoconnect_intern (device, FALSE); gets replaced by nm_device_set_autoconnect_blocked_set (device, NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN); and so on. However, it's chosen this way, because autoconnect shall be allowed, unless any blocked-reason is set. That is, to check whether autoconnect is allowed, we do if (!nm_device_get_autoconnect_blocked (device, NM_DEVICE_AUTOCONNECT_BLOCKED_ALL)) The alternative check would be if (nm_device_get_autoconnect_allowed (device, NM_DEVICE_AUTOCONNECT_ALLOWED_ALL) == NM_DEVICE_AUTOCONNECT_ALLOWED_ALL) which seems odd too. So, add the inverse flags to block autoconnect. Beside refactoring and inverting the meaning of the autoconnect settings, there is no change in behavior. (cherry picked from commit 5279ab5be6326b911682e53d8c29d20a501d61b8)
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/bluetooth/nm-device-bt.c2
-rw-r--r--src/devices/nm-device.c99
-rw-r--r--src/devices/nm-device.h27
-rw-r--r--src/devices/wwan/nm-device-modem.c2
4 files changed, 79 insertions, 51 deletions
diff --git a/src/devices/bluetooth/nm-device-bt.c b/src/devices/bluetooth/nm-device-bt.c
index 0d46be8fe7..d400bc8428 100644
--- a/src/devices/bluetooth/nm-device-bt.c
+++ b/src/devices/bluetooth/nm-device-bt.c
@@ -492,7 +492,7 @@ modem_prepare_result (NMModem *modem,
* the SIM if the incorrect PIN continues to be used.
*/
_LOGI (LOGD_MB, "disabling autoconnect due to failed SIM PIN");
- nm_device_set_autoconnect_intern (device, FALSE);
+ nm_device_autoconnect_blocked_set (device, NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN);
}
nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, reason);
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 23d8235fd0..a4460adc35 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -354,6 +354,8 @@ typedef struct _NMDevicePrivate {
bool v4_route_table_initalized:1;
bool v6_route_table_initalized:1;
+ NMDeviceAutoconnectBlockedFlags autoconnect_blocked_flags:4;
+
/* Generic DHCP stuff */
char * dhcp_anycast_address;
@@ -466,10 +468,6 @@ typedef struct _NMDevicePrivate {
gboolean needs_ip6_subnet;
- /* allow autoconnect feature */
- bool autoconnect_intern:1;
- bool autoconnect_user:1;
-
/* master interface for bridge/bond/team slave */
NMDevice * master;
bool is_enslaved;
@@ -533,9 +531,6 @@ static NMActStageReturn linklocal6_start (NMDevice *self);
static void _carrier_wait_check_queued_act_request (NMDevice *self);
-static void nm_device_set_autoconnect_both (NMDevice *self, gboolean autoconnect);
-static void nm_device_set_autoconnect_full (NMDevice *self, int autoconnect_intern, int autoconnect_user);
-
static const char *_activation_func_to_string (ActivationHandleFunc func);
static void activation_source_handle_cb (NMDevice *self, int addr_family);
@@ -3280,6 +3275,7 @@ realize_start_setup (NMDevice *self,
NMDeviceCapabilities capabilities = 0;
NMConfig *config;
guint real_rate;
+ NMDeviceAutoconnectBlockedFlags autoconnect_blocked_flags;
/* plink is a NMPlatformLink type, however, we require it to come from the platform
* cache (where else would it come from?). */
@@ -3392,7 +3388,12 @@ realize_start_setup (NMDevice *self,
if (real_rate)
priv->stats.timeout_id = g_timeout_add (real_rate, _stats_timeout_cb, self);
- nm_device_set_autoconnect_full (self, !!DEFAULT_AUTOCONNECT, TRUE);
+ autoconnect_blocked_flags = NM_DEVICE_AUTOCONNECT_BLOCKED_NONE;
+ if (!DEFAULT_AUTOCONNECT)
+ autoconnect_blocked_flags |= NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN;
+ nm_device_autoconnect_blocked_set_full (self,
+ NM_DEVICE_AUTOCONNECT_BLOCKED_ALL,
+ autoconnect_blocked_flags);
klass->realize_start_notify (self, plink);
@@ -3593,7 +3594,7 @@ nm_device_unrealize (NMDevice *self, gboolean remove_resources, GError **error)
priv->real = FALSE;
_notify (self, PROP_REAL);
- nm_device_set_autoconnect_both (self, FALSE);
+ nm_device_autoconnect_blocked_set (self, NM_DEVICE_AUTOCONNECT_BLOCKED_ALL);
g_object_thaw_notify (G_OBJECT (self));
@@ -4219,56 +4220,54 @@ nm_device_set_enabled (NMDevice *self, gboolean enabled)
NM_DEVICE_GET_CLASS (self)->set_enabled (self, enabled);
}
-/**
- * nm_device_get_autoconnect:
- * @self: the #NMDevice
- *
- * Returns: %TRUE if the device allows autoconnect connections, or %FALSE if the
- * device is explicitly blocking all autoconnect connections. Does not take
- * into account transient conditions like companion devices that may wish to
- * block the device.
- */
-gboolean
-nm_device_get_autoconnect (NMDevice *self)
+NM_UTILS_FLAGS2STR_DEFINE_STATIC (_autoconnect_blocked_flags_to_string, NMDeviceAutoconnectBlockedFlags,
+ NM_UTILS_FLAGS2STR (NM_DEVICE_AUTOCONNECT_BLOCKED_NONE, "none"),
+ NM_UTILS_FLAGS2STR (NM_DEVICE_AUTOCONNECT_BLOCKED_USER, "user"),
+ NM_UTILS_FLAGS2STR (NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN, "intern"),
+);
+
+NMDeviceAutoconnectBlockedFlags
+nm_device_autoconnect_blocked_get (NMDevice *self, NMDeviceAutoconnectBlockedFlags mask)
{
NMDevicePrivate *priv;
g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
+ if (mask == 0)
+ mask = NM_DEVICE_AUTOCONNECT_BLOCKED_ALL;
+
priv = NM_DEVICE_GET_PRIVATE (self);
- return priv->autoconnect_intern && priv->autoconnect_user;
+ return priv->autoconnect_blocked_flags & mask;
}
-static void
-nm_device_set_autoconnect_full (NMDevice *self, int autoconnect_intern, int autoconnect_user)
+void
+nm_device_autoconnect_blocked_set_full (NMDevice *self, NMDeviceAutoconnectBlockedFlags mask, NMDeviceAutoconnectBlockedFlags value)
{
NMDevicePrivate *priv;
- gboolean old_value;
+ gboolean changed;
+ char buf1[128], buf2[128];
g_return_if_fail (NM_IS_DEVICE (self));
+ nm_assert (mask);
+ nm_assert (!NM_FLAGS_ANY (mask, ~NM_DEVICE_AUTOCONNECT_BLOCKED_ALL));
+ nm_assert (!NM_FLAGS_ANY (value, ~mask));
priv = NM_DEVICE_GET_PRIVATE (self);
- old_value = nm_device_get_autoconnect (self);
- if (autoconnect_intern != -1)
- priv->autoconnect_intern = autoconnect_intern;
- if (autoconnect_user != -1)
- priv->autoconnect_user = autoconnect_user;
- if (old_value != nm_device_get_autoconnect (self))
- _notify (self, PROP_AUTOCONNECT);
-}
+ value = (priv->autoconnect_blocked_flags & ~mask) | (mask & value);
+ if (value == priv->autoconnect_blocked_flags)
+ return;
-void
-nm_device_set_autoconnect_intern (NMDevice *self, gboolean autoconnect)
-{
- nm_device_set_autoconnect_full (self, !!autoconnect, -1);
-}
+ changed = ((!value) != (!priv->autoconnect_blocked_flags));
-static void
-nm_device_set_autoconnect_both (NMDevice *self, gboolean autoconnect)
-{
- autoconnect = !!autoconnect;
- nm_device_set_autoconnect_full (self, autoconnect, autoconnect);
+ _LOGT (LOGD_DEVICE, "autoconnect-blocked: set \"%s\" (was \"%s\")",
+ _autoconnect_blocked_flags_to_string (value, buf1, sizeof (buf1)),
+ _autoconnect_blocked_flags_to_string (priv->autoconnect_blocked_flags, buf2, sizeof (buf2)));
+
+ priv->autoconnect_blocked_flags = value;
+ nm_assert (priv->autoconnect_blocked_flags == value);
+ if (changed)
+ _notify (self, PROP_AUTOCONNECT);
}
static gboolean
@@ -4297,7 +4296,7 @@ nm_device_autoconnect_allowed (NMDevice *self)
GValue instance = G_VALUE_INIT;
GValue retval = G_VALUE_INIT;
- if (!nm_device_get_autoconnect (self))
+ if (nm_device_autoconnect_blocked_get (self, NM_DEVICE_AUTOCONNECT_BLOCKED_ALL))
return FALSE;
if ( klass->get_autoconnect_allowed
@@ -9741,7 +9740,7 @@ disconnect_cb (NMDevice *self,
nm_audit_log_device_op (NM_AUDIT_OP_DEVICE_DISCONNECT, self, FALSE, NULL, subject, local->message);
g_dbus_method_invocation_take_error (context, local);
} else {
- nm_device_set_autoconnect_intern (self, FALSE);
+ nm_device_autoconnect_blocked_set (self, NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN);
nm_device_state_changed (self,
NM_DEVICE_STATE_DEACTIVATING,
@@ -13000,7 +12999,7 @@ _set_state_full (NMDevice *self,
/* Reset autoconnect flag when the device is activating or connected. */
if ( state >= NM_DEVICE_STATE_PREPARE
&& state <= NM_DEVICE_STATE_ACTIVATED)
- nm_device_set_autoconnect_intern (self, TRUE);
+ nm_device_autoconnect_blocked_unset (self, NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN);
_notify (self, PROP_STATE);
_notify (self, PROP_STATE_REASON);
@@ -14411,7 +14410,10 @@ set_property (GObject *object, guint prop_id,
}
break;
case PROP_AUTOCONNECT:
- nm_device_set_autoconnect_both (self, g_value_get_boolean (value));
+ if (g_value_get_boolean (value))
+ nm_device_autoconnect_blocked_unset (self, NM_DEVICE_AUTOCONNECT_BLOCKED_ALL);
+ else
+ nm_device_autoconnect_blocked_set (self, NM_DEVICE_AUTOCONNECT_BLOCKED_USER);
break;
case PROP_FIRMWARE_MISSING:
/* construct-only */
@@ -14548,7 +14550,10 @@ get_property (GObject *object, guint prop_id,
g_value_set_boolean (value, nm_device_get_state (self) > NM_DEVICE_STATE_UNMANAGED);
break;
case PROP_AUTOCONNECT:
- g_value_set_boolean (value, nm_device_get_autoconnect (self));
+ g_value_set_boolean (value,
+ nm_device_autoconnect_blocked_get (self, NM_DEVICE_AUTOCONNECT_BLOCKED_ALL)
+ ? FALSE
+ : TRUE);
break;
case PROP_FIRMWARE_MISSING:
g_value_set_boolean (value, priv->firmware_missing);
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index 350a17b2c1..c5d17f12b4 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -663,8 +663,31 @@ gboolean nm_device_unrealize (NMDevice *device,
void nm_device_update_from_platform_link (NMDevice *self,
const NMPlatformLink *plink);
-gboolean nm_device_get_autoconnect (NMDevice *device);
-void nm_device_set_autoconnect_intern (NMDevice *device, gboolean autoconnect);
+typedef enum {
+ NM_DEVICE_AUTOCONNECT_BLOCKED_NONE = 0,
+ NM_DEVICE_AUTOCONNECT_BLOCKED_USER = (1LL << 0),
+ NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN = (1LL << 1),
+
+ _NM_DEVICE_AUTOCONNECT_BLOCKED_LAST,
+ NM_DEVICE_AUTOCONNECT_BLOCKED_ALL = (((_NM_DEVICE_AUTOCONNECT_BLOCKED_LAST - 1) << 1) - 1),
+} NMDeviceAutoconnectBlockedFlags;
+
+NMDeviceAutoconnectBlockedFlags nm_device_autoconnect_blocked_get (NMDevice *device, NMDeviceAutoconnectBlockedFlags mask);
+
+void nm_device_autoconnect_blocked_set_full (NMDevice *device, NMDeviceAutoconnectBlockedFlags mask, NMDeviceAutoconnectBlockedFlags values);
+
+static inline void
+nm_device_autoconnect_blocked_set (NMDevice *device, NMDeviceAutoconnectBlockedFlags mask)
+{
+ nm_device_autoconnect_blocked_set_full (device, mask, mask);
+}
+
+static inline void
+nm_device_autoconnect_blocked_unset (NMDevice *device, NMDeviceAutoconnectBlockedFlags mask)
+{
+ nm_device_autoconnect_blocked_set_full (device, mask, NM_DEVICE_AUTOCONNECT_BLOCKED_NONE);
+}
+
void nm_device_emit_recheck_auto_activate (NMDevice *device);
NMDeviceSysIfaceState nm_device_sys_iface_state_get (NMDevice *device);
diff --git a/src/devices/wwan/nm-device-modem.c b/src/devices/wwan/nm-device-modem.c
index 22fb8c673d..26707c5152 100644
--- a/src/devices/wwan/nm-device-modem.c
+++ b/src/devices/wwan/nm-device-modem.c
@@ -132,7 +132,7 @@ modem_prepare_result (NMModem *modem,
* the device to be auto-activated anymore, which would risk locking
* the SIM if the incorrect PIN continues to be used.
*/
- nm_device_set_autoconnect_intern (device, FALSE);
+ nm_device_autoconnect_blocked_set (device, NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN);
_LOGI (LOGD_MB, "disabling autoconnect due to failed SIM PIN");
}