diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2018-04-09 10:23:26 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2018-04-09 10:23:26 +0200 |
commit | 7a063a91c7f8db8f78cab124bf9ba80a242be233 (patch) | |
tree | 2b21f31bf9af100b519b930597afe9077e9db322 | |
parent | d607f288993f15d18754605840ced70979fd3fec (diff) | |
parent | 4985ca5ada9b9c24118b57c3288c5aa37c38ab81 (diff) |
core: merge branch 'bg/autoconnect-slaves-rh1548265'
https://bugzilla.redhat.com/show_bug.cgi?id=1548265
-rw-r--r-- | src/nm-act-request.c | 5 | ||||
-rw-r--r-- | src/nm-act-request.h | 1 | ||||
-rw-r--r-- | src/nm-active-connection.c | 25 | ||||
-rw-r--r-- | src/nm-active-connection.h | 13 | ||||
-rw-r--r-- | src/nm-checkpoint.c | 4 | ||||
-rw-r--r-- | src/nm-manager.c | 31 | ||||
-rw-r--r-- | src/nm-manager.h | 1 | ||||
-rw-r--r-- | src/nm-policy.c | 3 | ||||
-rw-r--r-- | src/nm-types.h | 7 | ||||
-rw-r--r-- | src/vpn/nm-vpn-connection.c | 2 | ||||
-rw-r--r-- | src/vpn/nm-vpn-connection.h | 1 |
11 files changed, 83 insertions, 10 deletions
diff --git a/src/nm-act-request.c b/src/nm-act-request.c index 1a0936d6dd..344084d867 100644 --- a/src/nm-act-request.c +++ b/src/nm-act-request.c @@ -537,7 +537,8 @@ nm_act_request_init (NMActRequest *req) * @specific_object: the object path of the specific object (ie, WiFi access point, * etc) that will be used to activate @connection and @device * @subject: the #NMAuthSubject representing the requestor of the activation - * @activation_type: the #NMActivationType. + * @activation_type: the #NMActivationType + * @activation_reason: the reason for activation * @device: the device/interface to configure according to @connection * * Creates a new device-based activation request. If an applied connection is @@ -551,6 +552,7 @@ nm_act_request_new (NMSettingsConnection *settings_connection, const char *specific_object, NMAuthSubject *subject, NMActivationType activation_type, + NMActivationReason activation_reason, NMDevice *device) { g_return_val_if_fail (!settings_connection || NM_IS_SETTINGS_CONNECTION (settings_connection), NULL); @@ -564,6 +566,7 @@ nm_act_request_new (NMSettingsConnection *settings_connection, NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, specific_object, NM_ACTIVE_CONNECTION_INT_SUBJECT, subject, NM_ACTIVE_CONNECTION_INT_ACTIVATION_TYPE, (int) activation_type, + NM_ACTIVE_CONNECTION_INT_ACTIVATION_REASON, (int) activation_reason, NULL); } diff --git a/src/nm-act-request.h b/src/nm-act-request.h index 5d1c9dfd3b..a8f09271a1 100644 --- a/src/nm-act-request.h +++ b/src/nm-act-request.h @@ -41,6 +41,7 @@ NMActRequest *nm_act_request_new (NMSettingsConnection *settings_connec const char *specific_object, NMAuthSubject *subject, NMActivationType activation_type, + NMActivationReason activation_reason, NMDevice *device); NMSettingsConnection *nm_act_request_get_settings_connection (NMActRequest *req); diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c index 6e0e39ea9e..88074e2302 100644 --- a/src/nm-active-connection.c +++ b/src/nm-active-connection.c @@ -52,6 +52,7 @@ typedef struct _NMActiveConnectionPrivate { bool master_ready:1; NMActivationType activation_type:3; + NMActivationReason activation_reason:3; NMAuthSubject *subject; NMActiveConnection *master; @@ -90,6 +91,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMActiveConnection, PROP_INT_MASTER, PROP_INT_MASTER_READY, PROP_INT_ACTIVATION_TYPE, + PROP_INT_ACTIVATION_REASON, ); enum { @@ -892,6 +894,14 @@ _set_activation_type_managed (NMActiveConnection *self) nm_device_sys_iface_state_set (priv->device, NM_DEVICE_SYS_IFACE_STATE_MANAGED); } +NMActivationReason +nm_active_connection_get_activation_reason (NMActiveConnection *self) +{ + g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (self), NM_ACTIVATION_REASON_UNSET); + + return NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->activation_reason; +} + /*****************************************************************************/ static void @@ -1291,6 +1301,12 @@ set_property (GObject *object, guint prop_id, g_return_if_reached (); _set_activation_type (self, (NMActivationType) i); break; + case PROP_INT_ACTIVATION_REASON: + /* construct-only */ + i = g_value_get_int (value); + priv->activation_reason = i; + nm_assert (priv->activation_reason == ((NMActivationReason) i)); + break; case PROP_SPECIFIC_OBJECT: /* construct-only */ tmp = g_value_get_string (value); @@ -1598,6 +1614,15 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class) G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_INT_ACTIVATION_REASON] = + g_param_spec_int (NM_ACTIVE_CONNECTION_INT_ACTIVATION_REASON, "", "", + NM_ACTIVATION_REASON_UNSET, + NM_ACTIVATION_REASON_USER_REQUEST, + NM_ACTIVATION_REASON_UNSET, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); signals[DEVICE_CHANGED] = diff --git a/src/nm-active-connection.h b/src/nm-active-connection.h index 4d893e2c76..45a5ac427a 100644 --- a/src/nm-active-connection.h +++ b/src/nm-active-connection.h @@ -53,11 +53,12 @@ /* Internal non-exported properties */ #define NM_ACTIVE_CONNECTION_INT_SETTINGS_CONNECTION "int-settings-connection" #define NM_ACTIVE_CONNECTION_INT_APPLIED_CONNECTION "int-applied-connection" -#define NM_ACTIVE_CONNECTION_INT_DEVICE "int-device" -#define NM_ACTIVE_CONNECTION_INT_SUBJECT "int-subject" -#define NM_ACTIVE_CONNECTION_INT_MASTER "int-master" -#define NM_ACTIVE_CONNECTION_INT_MASTER_READY "int-master-ready" -#define NM_ACTIVE_CONNECTION_INT_ACTIVATION_TYPE "int-activation-type" +#define NM_ACTIVE_CONNECTION_INT_DEVICE "int-device" +#define NM_ACTIVE_CONNECTION_INT_SUBJECT "int-subject" +#define NM_ACTIVE_CONNECTION_INT_MASTER "int-master" +#define NM_ACTIVE_CONNECTION_INT_MASTER_READY "int-master-ready" +#define NM_ACTIVE_CONNECTION_INT_ACTIVATION_TYPE "int-activation-type" +#define NM_ACTIVE_CONNECTION_INT_ACTIVATION_REASON "int-activation-reason" /* Signals */ #define NM_ACTIVE_CONNECTION_STATE_CHANGED "state-changed" @@ -184,6 +185,8 @@ void nm_active_connection_set_parent (NMActiveConnection *self, NMActivationType nm_active_connection_get_activation_type (NMActiveConnection *self); +NMActivationReason nm_active_connection_get_activation_reason (NMActiveConnection *self); + void nm_active_connection_clear_secrets (NMActiveConnection *self); #endif /* __NETWORKMANAGER_ACTIVE_CONNECTION_H__ */ diff --git a/src/nm-checkpoint.c b/src/nm-checkpoint.c index c508405185..a17f7eda6f 100644 --- a/src/nm-checkpoint.c +++ b/src/nm-checkpoint.c @@ -47,6 +47,7 @@ typedef struct { NMDeviceState state; bool realized:1; NMUnmanFlagOp unmanaged_explicit; + NMActivationReason activation_reason; } DeviceCheckpoint; NM_GOBJECT_PROPERTIES_DEFINE (NMCheckpoint, @@ -333,6 +334,7 @@ activate: device, subject, NM_ACTIVATION_TYPE_MANAGED, + dev_checkpoint->activation_reason, &local_error)) { _LOGW ("rollback: reactivation of connection %s/%s failed: %s", nm_connection_get_id ((NMConnection *) connection), @@ -438,6 +440,8 @@ device_checkpoint_create (NMDevice *device) nm_simple_connection_new_clone (NM_CONNECTION (settings_connection)); dev_checkpoint->ac_version_id = nm_active_connection_version_id_get (NM_ACTIVE_CONNECTION (act_request)); + dev_checkpoint->activation_reason = + nm_active_connection_get_activation_reason (NM_ACTIVE_CONNECTION (act_request)); } return dev_checkpoint; diff --git a/src/nm-manager.c b/src/nm-manager.c index c82347e27e..4bc5c5dd9a 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -285,6 +285,7 @@ static NMActiveConnection *_new_active_connection (NMManager *self, NMDevice *device, NMAuthSubject *subject, NMActivationType activation_type, + NMActivationReason activation_reason, GError **error); static void policy_activating_device_changed (GObject *object, GParamSpec *pspec, gpointer user_data); @@ -2334,6 +2335,7 @@ recheck_assume_connection (NMManager *self, active = _new_active_connection (self, NM_CONNECTION (connection), NULL, NULL, device, subject, generated ? NM_ACTIVATION_TYPE_EXTERNAL : NM_ACTIVATION_TYPE_ASSUME, + NM_ACTIVATION_REASON_AUTOCONNECT, &error); if (!active) { @@ -3216,6 +3218,7 @@ find_master (NMManager *self, * @device: the #NMDevice, if any, which will activate @connection * @master_connection: the master connection, or %NULL * @master_device: the master device, or %NULL + * @activation_reason: the reason for activation * @error: the error, if an error occurred * * Determines whether a given #NMConnection depends on another connection to @@ -3243,6 +3246,7 @@ ensure_master_active_connection (NMManager *self, NMDevice *device, NMSettingsConnection *master_connection, NMDevice *master_device, + NMActivationReason activation_reason, GError **error) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); @@ -3305,6 +3309,7 @@ ensure_master_active_connection (NMManager *self, master_device, subject, NM_ACTIVATION_TYPE_MANAGED, + activation_reason, error); return master_ac; } @@ -3348,6 +3353,7 @@ ensure_master_active_connection (NMManager *self, candidate, subject, NM_ACTIVATION_TYPE_MANAGED, + activation_reason, error); return master_ac; } @@ -3570,6 +3576,7 @@ autoconnect_slaves (NMManager *self, slave->device, subject, NM_ACTIVATION_TYPE_MANAGED, + NM_ACTIVATION_REASON_AUTOCONNECT_SLAVES, &local_err); if (local_err) { _LOGW (LOGD_CORE, "Slave connection activation failed: %s", local_err->message); @@ -3744,7 +3751,10 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError * } parent_ac = nm_manager_activate_connection (self, parent_con, NULL, NULL, parent, - subject, NM_ACTIVATION_TYPE_MANAGED, error); + subject, + NM_ACTIVATION_TYPE_MANAGED, + nm_active_connection_get_activation_reason (active), + error); if (!parent_ac) { g_prefix_error (error, "%s failed to activate parent: ", nm_device_get_iface (device)); return FALSE; @@ -3805,6 +3815,7 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError * device, master_connection, master_device, + nm_active_connection_get_activation_reason (active), error); if (!master_ac) { if (master_device) { @@ -3907,6 +3918,7 @@ _new_vpn_active_connection (NMManager *self, NMSettingsConnection *settings_connection, const char *specific_object, NMAuthSubject *subject, + NMActivationReason activation_reason, GError **error) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); @@ -3942,6 +3954,7 @@ _new_vpn_active_connection (NMManager *self, return (NMActiveConnection *) nm_vpn_connection_new (settings_connection, device, nm_dbus_object_get_path (NM_DBUS_OBJECT (parent)), + activation_reason, subject); } @@ -3953,6 +3966,7 @@ _new_active_connection (NMManager *self, NMDevice *device, NMAuthSubject *subject, NMActivationType activation_type, + NMActivationReason activation_reason, GError **error) { NMSettingsConnection *settings_connection = NULL; @@ -3987,6 +4001,7 @@ _new_active_connection (NMManager *self, settings_connection, specific_object, subject, + activation_reason, error); } @@ -3998,6 +4013,7 @@ _new_active_connection (NMManager *self, specific_object, subject, activation_type, + activation_reason, device); } @@ -4016,13 +4032,15 @@ _internal_activation_auth_done (NMActiveConnection *active, priv->authorizing_connections = g_slist_remove (priv->authorizing_connections, active); - /* Don't continue with the activation if an equivalent active connection - * already exists. We also check this earlier, but there we may fail to + /* Don't continue with an internal activation if an equivalent active + * connection already exists. Note that slave autoconnections always force a + * reconnection. We also check this earlier, but there we may fail to * detect a duplicate if the existing active connection is undergoing * authorization in impl_manager_activate_connection(). */ if ( success - && nm_auth_subject_is_internal (nm_active_connection_get_subject (active))) { + && nm_auth_subject_is_internal (nm_active_connection_get_subject (active)) + && nm_active_connection_get_activation_reason (active) != 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) @@ -4061,6 +4079,7 @@ _internal_activation_auth_done (NMActiveConnection *active, * @subject: the subject which requested activation * @activation_type: whether to assume the connection. That is, take over gracefully, * non-destructible. + * @activation_reason: the reason for activation * @error: return location for an error * * Begins a new internally-initiated activation of @connection on @device. @@ -4081,6 +4100,7 @@ nm_manager_activate_connection (NMManager *self, NMDevice *device, NMAuthSubject *subject, NMActivationType activation_type, + NMActivationReason activation_reason, GError **error) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); @@ -4128,6 +4148,7 @@ nm_manager_activate_connection (NMManager *self, device, subject, activation_type, + activation_reason, error); if (active) { priv->authorizing_connections = g_slist_prepend (priv->authorizing_connections, active); @@ -4379,6 +4400,7 @@ impl_manager_activate_connection (NMDBusObject *obj, device, subject, NM_ACTIVATION_TYPE_MANAGED, + NM_ACTIVATION_REASON_USER_REQUEST, &error); if (!active) goto error; @@ -4600,6 +4622,7 @@ impl_manager_add_and_activate_connection (NMDBusObject *obj, device, subject, NM_ACTIVATION_TYPE_MANAGED, + NM_ACTIVATION_REASON_USER_REQUEST, &error); if (!active) goto error; diff --git a/src/nm-manager.h b/src/nm-manager.h index 3d651c7f7d..9e94e97064 100644 --- a/src/nm-manager.h +++ b/src/nm-manager.h @@ -147,6 +147,7 @@ NMActiveConnection *nm_manager_activate_connection (NMManager *manager, NMDevice *device, NMAuthSubject *subject, NMActivationType activation_type, + NMActivationReason activation_reason, GError **error); gboolean nm_manager_deactivate_connection (NMManager *manager, diff --git a/src/nm-policy.c b/src/nm-policy.c index 3984feb326..61efee556b 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -1252,6 +1252,7 @@ auto_activate_device (NMPolicy *self, device, subject, NM_ACTIVATION_TYPE_MANAGED, + NM_ACTIVATION_REASON_AUTOCONNECT, &error); if (!ac) { _LOGI (LOGD_DEVICE, "connection '%s' auto-activation failed: %s", @@ -1674,6 +1675,7 @@ activate_secondary_connections (NMPolicy *self, device, nm_active_connection_get_subject (NM_ACTIVE_CONNECTION (req)), NM_ACTIVATION_TYPE_MANAGED, + nm_active_connection_get_activation_reason (NM_ACTIVE_CONNECTION (req)), &error); if (ac) secondary_ac_list = g_slist_append (secondary_ac_list, g_object_ref (ac)); @@ -2115,6 +2117,7 @@ vpn_connection_retry_after_failure (NMVpnConnection *vpn, NMPolicy *self) NULL, nm_active_connection_get_subject (ac), NM_ACTIVATION_TYPE_MANAGED, + nm_active_connection_get_activation_reason (ac), &error)) { _LOGW (LOGD_DEVICE, "VPN '%s' reconnect failed: %s", nm_settings_connection_get_id (connection), diff --git a/src/nm-types.h b/src/nm-types.h index 6bcd8f0d8a..0d5277e3af 100644 --- a/src/nm-types.h +++ b/src/nm-types.h @@ -76,6 +76,13 @@ typedef enum { } NMActivationType; typedef enum { + NM_ACTIVATION_REASON_UNSET = 0, + NM_ACTIVATION_REASON_AUTOCONNECT = 1, + NM_ACTIVATION_REASON_AUTOCONNECT_SLAVES = 2, + NM_ACTIVATION_REASON_USER_REQUEST = 3, +} NMActivationReason; + +typedef enum { /* In priority order; higher number == higher priority */ NM_IP_CONFIG_SOURCE_UNKNOWN = 0, diff --git a/src/vpn/nm-vpn-connection.c b/src/vpn/nm-vpn-connection.c index 7e9b6c9cb0..dd7be77492 100644 --- a/src/vpn/nm-vpn-connection.c +++ b/src/vpn/nm-vpn-connection.c @@ -850,6 +850,7 @@ NMVpnConnection * nm_vpn_connection_new (NMSettingsConnection *settings_connection, NMDevice *parent_device, const char *specific_object, + NMActivationReason activation_reason, NMAuthSubject *subject) { g_return_val_if_fail (!settings_connection || NM_IS_SETTINGS_CONNECTION (settings_connection), NULL); @@ -860,6 +861,7 @@ nm_vpn_connection_new (NMSettingsConnection *settings_connection, NM_ACTIVE_CONNECTION_INT_DEVICE, parent_device, NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, specific_object, NM_ACTIVE_CONNECTION_INT_SUBJECT, subject, + NM_ACTIVE_CONNECTION_INT_ACTIVATION_REASON, activation_reason, NM_ACTIVE_CONNECTION_VPN, TRUE, NULL); } diff --git a/src/vpn/nm-vpn-connection.h b/src/vpn/nm-vpn-connection.h index 10d40e192b..3046634d5f 100644 --- a/src/vpn/nm-vpn-connection.h +++ b/src/vpn/nm-vpn-connection.h @@ -52,6 +52,7 @@ GType nm_vpn_connection_get_type (void); NMVpnConnection * nm_vpn_connection_new (NMSettingsConnection *settings_connection, NMDevice *parent_device, const char *specific_object, + NMActivationReason activation_reason, NMAuthSubject *subject); void nm_vpn_connection_activate (NMVpnConnection *self, |