diff options
author | Thomas Haller <thaller@redhat.com> | 2017-03-07 11:04:36 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-03-16 18:27:33 +0100 |
commit | 8a31e66d2cffbedb2efa39d7e6d38d1dfe51cb61 (patch) | |
tree | 081a1d3c79a26e3f0308ba6622c6f5a9394cde3c | |
parent | ae4535ba7b79fa8f9707c429cb7909193cf144fe (diff) | |
download | NetworkManager-8a31e66d2cffbedb2efa39d7e6d38d1dfe51cb61.tar.gz |
core: add activation-type property to active-connection
It is still unused, but will be useful to mark a connection
whether it is a full activation or assumed.
-rw-r--r-- | src/nm-act-request.c | 3 | ||||
-rw-r--r-- | src/nm-act-request.h | 1 | ||||
-rw-r--r-- | src/nm-active-connection.c | 34 | ||||
-rw-r--r-- | src/nm-active-connection.h | 3 | ||||
-rw-r--r-- | src/nm-checkpoint.c | 1 | ||||
-rw-r--r-- | src/nm-core-utils.c | 8 | ||||
-rw-r--r-- | src/nm-core-utils.h | 6 | ||||
-rw-r--r-- | src/nm-manager.c | 20 | ||||
-rw-r--r-- | src/nm-manager.h | 1 | ||||
-rw-r--r-- | src/nm-policy.c | 3 | ||||
-rw-r--r-- | src/nm-types.h | 11 |
11 files changed, 88 insertions, 3 deletions
diff --git a/src/nm-act-request.c b/src/nm-act-request.c index 0396489683..e4f6492365 100644 --- a/src/nm-act-request.c +++ b/src/nm-act-request.c @@ -543,6 +543,7 @@ 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. * @device: the device/interface to configure according to @connection * * Creates a new device-based activation request. If an applied connection is @@ -555,6 +556,7 @@ nm_act_request_new (NMSettingsConnection *settings_connection, NMConnection *applied_connection, const char *specific_object, NMAuthSubject *subject, + NMActivationType activation_type, NMDevice *device) { g_return_val_if_fail (!settings_connection || NM_IS_SETTINGS_CONNECTION (settings_connection), NULL); @@ -567,6 +569,7 @@ nm_act_request_new (NMSettingsConnection *settings_connection, NM_ACTIVE_CONNECTION_INT_DEVICE, device, NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, specific_object, NM_ACTIVE_CONNECTION_INT_SUBJECT, subject, + NM_ACTIVE_CONNECTION_INT_ACTIVATION_TYPE, (int) activation_type, NULL); } diff --git a/src/nm-act-request.h b/src/nm-act-request.h index 47247f8910..b854940442 100644 --- a/src/nm-act-request.h +++ b/src/nm-act-request.h @@ -40,6 +40,7 @@ NMActRequest *nm_act_request_new (NMSettingsConnection *settings_connec NMConnection *applied_connection, const char *specific_object, NMAuthSubject *subject, + NMActivationType activation_type, 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 a96f33b432..95b81b1d8d 100644 --- a/src/nm-active-connection.c +++ b/src/nm-active-connection.c @@ -52,6 +52,8 @@ typedef struct _NMActiveConnectionPrivate { bool assumed:1; bool master_ready:1; + NMActivationType activation_type:3; + NMAuthSubject *subject; NMActiveConnection *master; @@ -87,6 +89,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMActiveConnection, PROP_INT_SUBJECT, PROP_INT_MASTER, PROP_INT_MASTER_READY, + PROP_INT_ACTIVATION_TYPE, ); enum { @@ -711,6 +714,14 @@ nm_active_connection_set_master (NMActiveConnection *self, NMActiveConnection *m check_master_ready (self); } +NMActivationType +nm_active_connection_get_activation_type (NMActiveConnection *self) +{ + g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (self), NM_ACTIVATION_TYPE_MANAGED); + + return NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->activation_type; +} + void nm_active_connection_set_assumed (NMActiveConnection *self, gboolean assumed) { @@ -1057,6 +1068,7 @@ set_property (GObject *object, guint prop_id, const char *tmp; NMSettingsConnection *con; NMConnection *acon; + int i; switch (prop_id) { case PROP_INT_SETTINGS_CONNECTION: @@ -1081,6 +1093,13 @@ set_property (GObject *object, guint prop_id, case PROP_INT_MASTER: nm_active_connection_set_master (self, g_value_get_object (value)); break; + case PROP_INT_ACTIVATION_TYPE: + /* construct-only */ + i = g_value_get_int (value); + if (!NM_IN_SET (i, NM_ACTIVATION_TYPE_MANAGED, NM_ACTIVATION_TYPE_ASSUME)) + g_return_if_reached (); + priv->activation_type = (NMActivationType) i; + break; case PROP_SPECIFIC_OBJECT: tmp = g_value_get_string (value); /* NM uses "/" to mean NULL */ @@ -1116,6 +1135,7 @@ nm_active_connection_init (NMActiveConnection *self) _LOGT ("creating"); + priv->activation_type = NM_ACTIVATION_TYPE_MANAGED; priv->version_id = _version_id_new (); } @@ -1135,7 +1155,10 @@ constructed (GObject *object) if (priv->applied_connection) nm_connection_clear_secrets (priv->applied_connection); - _LOGD ("constructed (%s, version-id %llu)", G_OBJECT_TYPE_NAME (self), (unsigned long long) priv->version_id); + _LOGD ("constructed (%s, version-id %llu, type %s)", + G_OBJECT_TYPE_NAME (self), + (unsigned long long) priv->version_id, + nm_activation_type_to_string (priv->activation_type)); g_return_if_fail (priv->subject); } @@ -1320,6 +1343,15 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class) FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_INT_ACTIVATION_TYPE] = + g_param_spec_int (NM_ACTIVE_CONNECTION_INT_ACTIVATION_TYPE, "", "", + NM_ACTIVATION_TYPE_MANAGED, + NM_ACTIVATION_TYPE_ASSUME, + NM_ACTIVATION_TYPE_MANAGED, + 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 d87a30b540..0c2e2358d5 100644 --- a/src/nm-active-connection.h +++ b/src/nm-active-connection.h @@ -55,6 +55,7 @@ #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" /* Internal signals*/ #define NM_ACTIVE_CONNECTION_DEVICE_CHANGED "device-changed" @@ -163,6 +164,8 @@ void nm_active_connection_set_assumed (NMActiveConnection *self, gboolean nm_active_connection_get_assumed (NMActiveConnection *self); +NMActivationType nm_active_connection_get_activation_type (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 c6b494624a..927dc859d2 100644 --- a/src/nm-checkpoint.c +++ b/src/nm-checkpoint.c @@ -281,6 +281,7 @@ activate: NULL, device, subject, + NM_ACTIVATION_TYPE_MANAGED, &local_error)) { _LOGW ("rollback: reactivation of connection %s/%s failed: %s", nm_connection_get_id ((NMConnection *) connection), diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index ead86d4775..25b1262193 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -4339,3 +4339,11 @@ nm_utils_format_con_diff_for_audit (GHashTable *diff) return g_string_free (str, FALSE); } + +/*****************************************************************************/ + +NM_UTILS_LOOKUP_STR_DEFINE (nm_activation_type_to_string, NMActivationType, + NM_UTILS_LOOKUP_DEFAULT_WARN ("(unknown)"), + NM_UTILS_LOOKUP_STR_ITEM (NM_ACTIVATION_TYPE_MANAGED, "managed"), + NM_UTILS_LOOKUP_STR_ITEM (NM_ACTIVATION_TYPE_ASSUME, "assume"), +) diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index b0dbe9bf06..779ba90ab9 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -472,4 +472,10 @@ char **nm_utils_read_plugin_paths (const char *dirname, const char *prefix); char *nm_utils_format_con_diff_for_audit (GHashTable *diff); +/*****************************************************************************/ + +const char *nm_activation_type_to_string (NMActivationType activation_type); + +/*****************************************************************************/ + #endif /* __NM_CORE_UTILS_H__ */ diff --git a/src/nm-manager.c b/src/nm-manager.c index f239d5f32b..4218530870 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -67,6 +67,7 @@ static NMActiveConnection *_new_active_connection (NMManager *self, const char *specific_object, NMDevice *device, NMAuthSubject *subject, + NMActivationType activation_type, GError **error); static void policy_activating_device_changed (GObject *object, GParamSpec *pspec, gpointer user_data); @@ -1835,7 +1836,8 @@ assume_connection (NMManager *self, NMDevice *device, NMSettingsConnection *conn g_return_val_if_fail (nm_device_get_state (device) >= NM_DEVICE_STATE_DISCONNECTED, FALSE); subject = nm_auth_subject_new_internal (); - active = _new_active_connection (self, NM_CONNECTION (connection), NULL, NULL, device, subject, &error); + active = _new_active_connection (self, NM_CONNECTION (connection), NULL, NULL, + device, subject, NM_ACTIVATION_TYPE_MANAGED, &error); g_object_unref (subject); if (!active) { @@ -2762,6 +2764,7 @@ ensure_master_active_connection (NMManager *self, NULL, master_device, subject, + NM_ACTIVATION_TYPE_MANAGED, error); return master_ac; } @@ -2807,6 +2810,7 @@ ensure_master_active_connection (NMManager *self, NULL, candidate, subject, + NM_ACTIVATION_TYPE_MANAGED, error); return master_ac; } @@ -2953,6 +2957,7 @@ autoconnect_slaves (NMManager *self, NULL, nm_manager_get_best_device_for_connection (self, NM_CONNECTION (slave_connection), FALSE), subject, + NM_ACTIVATION_TYPE_MANAGED, &local_err); if (local_err) { _LOGW (LOGD_CORE, "Slave connection activation failed: %s", local_err->message); @@ -3110,7 +3115,8 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError * return FALSE; } - parent_ac = nm_manager_activate_connection (self, parent_con, NULL, NULL, parent, subject, error); + parent_ac = nm_manager_activate_connection (self, parent_con, NULL, NULL, parent, + subject, NM_ACTIVATION_TYPE_MANAGED, error); if (!parent_ac) { g_prefix_error (error, "%s failed to activate parent: ", nm_device_get_iface (device)); return FALSE; @@ -3305,6 +3311,7 @@ _new_active_connection (NMManager *self, const char *specific_object, NMDevice *device, NMAuthSubject *subject, + NMActivationType activation_type, GError **error) { NMSettingsConnection *settings_connection = NULL; @@ -3333,6 +3340,8 @@ _new_active_connection (NMManager *self, settings_connection = (NMSettingsConnection *) connection; if (is_vpn) { + if (activation_type != NM_ACTIVATION_TYPE_MANAGED) + g_return_val_if_reached (NULL); return _new_vpn_active_connection (self, settings_connection, specific_object, @@ -3344,6 +3353,7 @@ _new_active_connection (NMManager *self, applied, specific_object, subject, + activation_type, device); } @@ -3396,6 +3406,8 @@ _internal_activation_auth_done (NMActiveConnection *active, * @specific_object: the specific object path, if any, for the activation * @device: the #NMDevice to activate @connection on * @subject: the subject which requested activation + * @activation_type: whether to assume the connection. That is, take over gracefully, + * non-destructible. * @error: return location for an error * * Begins a new internally-initiated activation of @connection on @device. @@ -3415,6 +3427,7 @@ nm_manager_activate_connection (NMManager *self, const char *specific_object, NMDevice *device, NMAuthSubject *subject, + NMActivationType activation_type, GError **error) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); @@ -3461,6 +3474,7 @@ nm_manager_activate_connection (NMManager *self, specific_object, device, subject, + activation_type, error); if (active) { priv->authorizing_connections = g_slist_prepend (priv->authorizing_connections, active); @@ -3704,6 +3718,7 @@ impl_manager_activate_connection (NMManager *self, specific_object_path, device, subject, + NM_ACTIVATION_TYPE_MANAGED, &error); if (!active) goto error; @@ -3923,6 +3938,7 @@ impl_manager_add_and_activate_connection (NMManager *self, specific_object_path, device, subject, + NM_ACTIVATION_TYPE_MANAGED, &error); if (!active) goto error; diff --git a/src/nm-manager.h b/src/nm-manager.h index a7baf30986..676fa995b6 100644 --- a/src/nm-manager.h +++ b/src/nm-manager.h @@ -115,6 +115,7 @@ NMActiveConnection *nm_manager_activate_connection (NMManager *manager, const char *specific_object, NMDevice *device, NMAuthSubject *subject, + NMActivationType activation_type, GError **error); gboolean nm_manager_deactivate_connection (NMManager *manager, diff --git a/src/nm-policy.c b/src/nm-policy.c index 2cba2852a3..66c9895c8d 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -1023,6 +1023,7 @@ auto_activate_device (NMPolicy *self, specific_object, device, subject, + NM_ACTIVATION_TYPE_MANAGED, &error)) { _LOGI (LOGD_DEVICE, "connection '%s' auto-activation failed: (%d) %s", nm_settings_connection_get_id (best_connection), @@ -1433,6 +1434,7 @@ activate_secondary_connections (NMPolicy *self, nm_exported_object_get_path (NM_EXPORTED_OBJECT (req)), device, nm_active_connection_get_subject (NM_ACTIVE_CONNECTION (req)), + NM_ACTIVATION_TYPE_MANAGED, &error); if (ac) secondary_ac_list = g_slist_append (secondary_ac_list, g_object_ref (ac)); @@ -1846,6 +1848,7 @@ vpn_connection_retry_after_failure (NMVpnConnection *vpn, NMPolicy *self) NULL, NULL, nm_active_connection_get_subject (ac), + NM_ACTIVATION_TYPE_MANAGED, &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 01d9dde9b2..cf5f4cb0a9 100644 --- a/src/nm-types.h +++ b/src/nm-types.h @@ -55,6 +55,17 @@ typedef struct _NMSleepMonitor NMSleepMonitor; typedef struct _NMLldpListener NMLldpListener; typedef struct _NMConfigDeviceStateData NMConfigDeviceStateData; +/*****************************************************************************/ + +typedef enum { + /* Do a full activation. */ + NM_ACTIVATION_TYPE_MANAGED = 0, + + /* gracefully/seamlessly take over the device. This leaves additional + * IP addresses and does not restore missing manual addresses. */ + NM_ACTIVATION_TYPE_ASSUME = 1, +} NMActivationType; + typedef enum { /* In priority order; higher number == higher priority */ |