summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-04-18 11:08:05 +0200
committerThomas Haller <thaller@redhat.com>2018-04-25 08:28:19 +0200
commit75cd1b1d1a215442c274a756f77aa8b6de0d0241 (patch)
tree138d725b1fdd27594b4f6bc82a0482c0160b2204
parenta9c99c77bd2bb31b88b4047b966b67877760c1ed (diff)
downloadNetworkManager-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.c44
-rw-r--r--src/nm-manager.h5
-rw-r--r--src/nm-policy.c2
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;