summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nm-manager.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c
index e702fd90a5..62ba239c2c 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -4875,6 +4875,27 @@ _new_active_connection (NMManager *self,
device);
}
+static gboolean
+active_connection_master_changed (NMActiveConnection *ac)
+{
+ NMConnection *applied, *connection;
+ NMSettingsConnection *settings;
+ NMSettingConnection *s_con1, *s_con2;
+
+ applied = nm_active_connection_get_applied_connection (ac);
+ settings = nm_active_connection_get_settings_connection (ac);
+ connection = nm_settings_connection_get_connection (settings);
+
+ if (applied == connection)
+ return FALSE;
+
+ s_con1 = nm_connection_get_setting_connection (applied);
+ s_con2 = nm_connection_get_setting_connection (connection);
+
+ return !nm_streq0 (nm_setting_connection_get_master (s_con1),
+ nm_setting_connection_get_master (s_con2));
+}
+
static void
_internal_activation_auth_done (NMManager *self,
NMActiveConnection *active,
@@ -4884,6 +4905,7 @@ _internal_activation_auth_done (NMManager *self,
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
NMActiveConnection *ac;
gs_free_error GError *error = NULL;
+ NMActivationReason reason;
nm_assert (NM_IS_ACTIVE_CONNECTION (active));
@@ -4895,13 +4917,20 @@ _internal_activation_auth_done (NMManager *self,
* We also check this earlier, but there we may fail to detect a duplicate
* if the existing active connection was undergoing authorization.
*/
- if (NM_IN_SET (nm_active_connection_get_activation_reason (active), NM_ACTIVATION_REASON_EXTERNAL,
- NM_ACTIVATION_REASON_ASSUME,
- NM_ACTIVATION_REASON_AUTOCONNECT)) {
+ reason = nm_active_connection_get_activation_reason (active);
+ if (NM_IN_SET (reason, NM_ACTIVATION_REASON_EXTERNAL,
+ NM_ACTIVATION_REASON_ASSUME,
+ NM_ACTIVATION_REASON_AUTOCONNECT,
+ NM_ACTIVATION_REASON_AUTOCONNECT_SLAVES)) {
c_list_for_each_entry (ac, &priv->active_connections_lst_head, active_connections_lst) {
if ( nm_active_connection_get_device (ac) == nm_active_connection_get_device (active)
&& nm_active_connection_get_settings_connection (ac) == nm_active_connection_get_settings_connection (active)
&& nm_active_connection_get_state (ac) <= NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
+
+ if ( reason == NM_ACTIVATION_REASON_AUTOCONNECT_SLAVES
+ && active_connection_master_changed (ac))
+ break;
+
g_set_error (&error,
NM_MANAGER_ERROR,
NM_MANAGER_ERROR_CONNECTION_ALREADY_ACTIVE,