diff options
author | Thomas Haller <thaller@redhat.com> | 2018-04-19 15:42:27 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2018-04-30 16:36:30 +0200 |
commit | 3a2fbab09b15e7c21abb3e7828acb613cb3dffb7 (patch) | |
tree | 928192a48eeca827ef88f717163c295f66da5c8e | |
parent | 36ed7ef0845410bd25afd4b3abd86410af02422b (diff) | |
download | NetworkManager-3a2fbab09b15e7c21abb3e7828acb613cb3dffb7.tar.gz |
core: don't consider deactivating active-connection when checking for concurrent activations
At various places we check whether we have an active-connection already.
For example, when activating a new connection in _internal_activate_device(),
we might want to "nm_device_steal_connection()" if the same profile is
already active.
However, the max-state argument was not accurate in several cases. For
the purpose of finding concurrent activations, we don't care about
active-connections that are already in state DEACTIVATING. Only those
that are ACTIVATED or before.
-rw-r--r-- | src/nm-manager.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c index c8813fce36..dc1f229b43 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -949,7 +949,7 @@ static NMActiveConnection * active_connection_find (NMManager *self, NMSettingsConnection *settings_connection, const char *uuid, - NMActiveConnectionState max_state, + NMActiveConnectionState max_state /* candidates in state @max_state will be found */, GPtrArray **out_all_matching) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); @@ -1032,7 +1032,10 @@ _get_activatable_connections_filter (NMSettings *settings, if (NM_FLAGS_HAS (nm_settings_connection_get_flags (connection), NM_SETTINGS_CONNECTION_INT_FLAGS_VOLATILE)) return FALSE; - return !active_connection_find (user_data, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, NULL); + + /* the connection is activatable, if it has no active-connections that are in state + * activated, activating, or waiting to be activated. */ + return !active_connection_find (user_data, connection, NULL, NM_ACTIVE_CONNECTION_STATE_ACTIVATED, NULL); } NMSettingsConnection ** @@ -2068,7 +2071,7 @@ connection_flags_changed (NMSettings *settings, return; if (active_connection_find (self, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATED, NULL)) { - /* the connection still have an active-connection. It will be purged + /* the connection still has an active-connection. It will be purged * when the active connection(s) get(s) removed. */ return; } @@ -2442,7 +2445,7 @@ get_existing_connection (NMManager *self, if ( assume_state_connection_uuid && (connection_checked = nm_settings_get_connection_by_uuid (priv->settings, assume_state_connection_uuid)) && !active_connection_find (self, connection_checked, NULL, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, + NM_ACTIVE_CONNECTION_STATE_ACTIVATED, NULL) && nm_device_check_connection_compatible (device, NM_CONNECTION (connection_checked))) { @@ -4117,7 +4120,7 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError * autoconnect_slaves (self, connection, device, nm_active_connection_get_subject (active)); /* Disconnect the connection if connected or queued on another device */ - existing_ac = active_connection_find (self, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, NULL); + existing_ac = active_connection_find (self, connection, NULL, NM_ACTIVE_CONNECTION_STATE_ACTIVATED, NULL); if (existing_ac) { existing = nm_active_connection_get_device (existing_ac); if (existing) @@ -4213,7 +4216,7 @@ _new_active_connection (NMManager *self, /* FIXME: for VPN connections, we don't allow re-activating an * already active connection. It's a bug, and should be fixed together * when reworking VPN handling. */ - if (active_connection_find_by_connection (self, connection, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, NULL)) { + if (active_connection_find_by_connection (self, connection, NM_ACTIVE_CONNECTION_STATE_ACTIVATED, NULL)) { g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_CONNECTION_ALREADY_ACTIVE, "Connection '%s' is already active", nm_connection_get_id (connection)); |