diff options
author | Thomas Haller <thaller@redhat.com> | 2018-04-18 11:08:05 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2018-04-25 08:28:19 +0200 |
commit | 75cd1b1d1a215442c274a756f77aa8b6de0d0241 (patch) | |
tree | 138d725b1fdd27594b4f6bc82a0482c0160b2204 | |
parent | a9c99c77bd2bb31b88b4047b966b67877760c1ed (diff) | |
download | NetworkManager-th/connection-cardinality-rh1555012.tar.gz |
core: implement connection.cardinality to activate profiles multiple timesth/connection-cardinality-rh1555012
See parent commit for the reasons why.
Make use of the new property, and implement it.
https://bugzilla.redhat.com/show_bug.cgi?id=1555012
-rw-r--r-- | src/nm-manager.c | 44 | ||||
-rw-r--r-- | src/nm-manager.h | 5 | ||||
-rw-r--r-- | src/nm-policy.c | 2 |
3 files changed, 42 insertions, 9 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c index 225c5cdf5d..e3bc314426 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -1024,28 +1024,53 @@ active_connection_find_by_connection (NMManager *self, out_all_matching); } +typedef struct { + NMManager *self; + gboolean for_auto_activation; +} GetActivatableConnectionsFilterData; + static gboolean _get_activatable_connections_filter (NMSettings *settings, NMSettingsConnection *connection, gpointer user_data) { + GetActivatableConnectionsFilterData *d = user_data; + NMConnectionCardinality cardinality; + if (NM_FLAGS_HAS (nm_settings_connection_get_flags (connection), NM_SETTINGS_CONNECTION_INT_FLAGS_VOLATILE)) return FALSE; + cardinality = _nm_connection_get_cardinality (NM_CONNECTION (connection)); + if ( cardinality == NM_CONNECTION_CARDINALITY_MULTIPLE + || ( cardinality == NM_CONNECTION_CARDINALITY_MANUAL_MULTIPLE + && !d->for_auto_activation)) + return TRUE; + /* 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); + return !active_connection_find (d->self, + connection, + NULL, + NM_ACTIVE_CONNECTION_STATE_ACTIVATED, + NULL); } NMSettingsConnection ** -nm_manager_get_activatable_connections (NMManager *manager, guint *out_len, gboolean sort) +nm_manager_get_activatable_connections (NMManager *manager, + gboolean for_auto_activation, + gboolean sort, + guint *out_len) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager); + GetActivatableConnectionsFilterData d = { + .self = manager, + .for_auto_activation = for_auto_activation, + }; return nm_settings_get_connections_clone (priv->settings, out_len, _get_activatable_connections_filter, - manager, + &d, sort ? nm_settings_connection_cmp_autoconnect_priority_p_with_data : NULL, NULL); } @@ -2444,6 +2469,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)) + /*XXX: consider connection cardinality. */ && !active_connection_find (self, connection_checked, NULL, NM_ACTIVE_CONNECTION_STATE_ACTIVATED, NULL) @@ -2479,7 +2505,7 @@ get_existing_connection (NMManager *self, /* the state file doesn't indicate a connection UUID to assume. Search the * persistent connections for a matching candidate. */ - connections = nm_manager_get_activatable_connections (self, &len, FALSE); + connections = nm_manager_get_activatable_connections (self, FALSE, FALSE, &len); if (len > 0) { for (i = 0, j = 0; i < len; i++) { NMConnection *con = NM_CONNECTION (connections[i]); @@ -3627,7 +3653,7 @@ ensure_master_active_connection (NMManager *self, g_assert (master_connection == NULL); /* Find a compatible connection and activate this device using it */ - connections = nm_manager_get_activatable_connections (self, NULL, TRUE); + connections = nm_manager_get_activatable_connections (self, FALSE, TRUE, NULL); for (i = 0; connections[i]; i++) { NMSettingsConnection *candidate = connections[i]; @@ -4025,6 +4051,7 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError * NMConnection *existing_connection = NULL; NMActiveConnection *master_ac = NULL; NMAuthSubject *subject; + NMConnectionCardinality cardinality; g_return_val_if_fail (NM_IS_MANAGER (self), FALSE); g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (active), FALSE); @@ -4182,7 +4209,12 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError * /* Check slaves for master connection and possibly activate them */ autoconnect_slaves (self, connection, device, nm_active_connection_get_subject (active)); - { + cardinality = _nm_connection_get_cardinality (NM_CONNECTION (connection)); + if ( cardinality == NM_CONNECTION_CARDINALITY_MULTIPLE + || ( cardinality == NM_CONNECTION_CARDINALITY_MANUAL_MULTIPLE + && nm_active_connection_get_activation_reason (active) != NM_ACTIVATION_REASON_AUTOCONNECT)) { + /* the profile can be activated multiple times. Proceed. */ + } else { gs_unref_ptrarray GPtrArray *all_ac_arr = NULL; NMActiveConnection *ac; guint i, n_all; diff --git a/src/nm-manager.h b/src/nm-manager.h index 5444453203..5d9f5e4720 100644 --- a/src/nm-manager.h +++ b/src/nm-manager.h @@ -99,8 +99,9 @@ const CList * nm_manager_get_active_connections (NMManager *manager); iter = c_list_entry (iter->active_connections_lst.next, NMActiveConnection, active_connections_lst)) NMSettingsConnection **nm_manager_get_activatable_connections (NMManager *manager, - guint *out_len, - gboolean sort); + gboolean for_auto_activation, + gboolean sort, + guint *out_len); void nm_manager_write_device_state (NMManager *manager); diff --git a/src/nm-policy.c b/src/nm-policy.c index 55b6caf601..276174857d 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -1210,7 +1210,7 @@ auto_activate_device (NMPolicy *self, if (!nm_device_autoconnect_allowed (device)) return; - connections = nm_manager_get_activatable_connections (priv->manager, &len, TRUE); + connections = nm_manager_get_activatable_connections (priv->manager, TRUE, TRUE, &len); if (!connections[0]) return; |