From c7fd4aeecf899733d736c95bb6104401aecef5a0 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 2 Jul 2019 11:46:47 +0200 Subject: [PATCH 1/2] device: properly honor flags when checking connection availability The previous code returned that the device was available when it had only unmanaged-flags that can be overridden by user, without actually considering the @flags argument. Fixes: 920346a5b98c ('device: add and use overrule-unmanaged flag for nm_device_check_connection_available()') --- src/devices/nm-device.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 569ff6289..6a27469d4 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -13445,7 +13445,7 @@ _get_managed_by_flags(NMUnmanagedFlags flags, NMUnmanagedFlags mask, gboolean fo return TRUE; /* A for-user-request, is effectively the same as pretending - * that user-dbus flag is cleared. */ + * that user-explicit flag is cleared. */ mask |= NM_UNMANAGED_USER_EXPLICIT; flags &= ~NM_UNMANAGED_USER_EXPLICIT; } @@ -13497,6 +13497,9 @@ _get_managed_by_flags(NMUnmanagedFlags flags, NMUnmanagedFlags mask, gboolean fo * nm_device_get_managed: * @self: the #NMDevice * @for_user_request: whether to check the flags for an explicit user-request + * Setting this to %TRUE has the same effect as if %NM_UNMANAGED_USER_EXPLICIT + * unmanaged flag would be unset (meaning: explicitly not-unmanaged). + * If this parameter is %TRUE, the device can only appear more managed. * * Whether the device is unmanaged according to the unmanaged flags. * @@ -14066,13 +14069,17 @@ _nm_device_check_connection_available (NMDevice *self, return FALSE; } if (state < NM_DEVICE_STATE_UNAVAILABLE) { - if (!nm_device_get_managed (self, TRUE)) { - if (!nm_device_get_managed (self, FALSE)) { + if (nm_device_get_managed (self, FALSE)) { + /* device is managed, both for user-requests and non-user-requests alike. */ + } else { + if (!nm_device_get_managed (self, TRUE)) { + /* device is strictly unmanaged by authoritative unmanaged reasons. */ nm_utils_error_set_literal (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_UNMANAGED_DEVICE, "device is strictly unmanaged"); return FALSE; } if (!NM_FLAGS_HAS (flags, _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_OVERRULE_UNMANAGED)) { + /* device could be managed for an explict user-request, but this is not such a request. */ nm_utils_error_set_literal (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_UNMANAGED_DEVICE, "device is currently unmanaged"); return FALSE; From ba7b427aecfcea37199fdaa34c4ee655a8afe2ea Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 2 Jul 2019 11:51:29 +0200 Subject: [PATCH 2/2] manager: propagate the for-user-request flag for slaves autoconnection If the master is activated by user, propagate the for-user-request to slaves activations when autoconnecting slaves, so that they can manage slaves device as needed. Reproducer: ip l add eth1 type veth peer name eth2 ip l set eth1 up ip l set eth2 up sleep 2 echo " * Initial state" echo " - eth1: $(nmcli -g general.state device show eth1)" nmcli con add type ethernet ifname eth1 con-name slave-test+ master br-test slave-type bridge nmcli con add type bridge ifname br-test con-name br-test+ connection.autoconnect-slaves yes ip4 172.25.1.1/24 nmcli con up br-test+ echo " * After user activation" echo " - br-test: $(nmcli -g general.state device show br-test)" echo " - eth1: $(nmcli -g general.state device show eth1)" should give: * Initial state - eth1: 10 (unmanaged) * After user activation - br-test: 100 (connected) - eth1: 100 (connected) --- src/nm-manager.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/nm-manager.c b/src/nm-manager.c index d2dd2f4d5..9d9d05c7b 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -4169,7 +4169,8 @@ static SlaveConnectionInfo * find_slaves (NMManager *manager, NMSettingsConnection *sett_conn, NMDevice *device, - guint *out_n_slaves) + guint *out_n_slaves, + gboolean for_user_request) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager); gs_free NMSettingsConnection **all_connections = NULL; @@ -4211,7 +4212,7 @@ find_slaves (NMManager *manager, slave_device = nm_manager_get_best_device_for_connection (manager, candidate, NULL, - FALSE, + for_user_request, devices, NULL); @@ -4287,7 +4288,8 @@ static void autoconnect_slaves (NMManager *self, NMSettingsConnection *master_connection, NMDevice *master_device, - NMAuthSubject *subject) + NMAuthSubject *subject, + gboolean for_user_request) { GError *local_err = NULL; @@ -4297,7 +4299,7 @@ autoconnect_slaves (NMManager *self, guint i, n_slaves = 0; gboolean bind_lifetime_to_profile_visibility; - slaves = find_slaves (self, master_connection, master_device, &n_slaves); + slaves = find_slaves (self, master_connection, master_device, &n_slaves, for_user_request); if (n_slaves > 1) { gs_free char *value = NULL; @@ -4697,7 +4699,8 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError * } /* Check slaves for master connection and possibly activate them */ - autoconnect_slaves (self, sett_conn, device, nm_active_connection_get_subject (active)); + autoconnect_slaves (self, sett_conn, device, nm_active_connection_get_subject (active), + nm_active_connection_get_activation_reason (active) == NM_ACTIVATION_REASON_USER_REQUEST); multi_connect = _nm_connection_get_multi_connect (nm_settings_connection_get_connection (sett_conn)); if ( multi_connect == NM_CONNECTION_MULTI_CONNECT_MULTIPLE