summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2016-01-05 15:54:00 +0100
committerLubomir Rintel <lkundrak@v3.sk>2016-01-10 23:14:29 +0100
commit02bf4db8bc0716dd963d00b2930663f4f00e89a3 (patch)
tree9cd687fe073af34a85d958c06c59febef2421f24
parenta5b6436a901b63fb12d9268c3ae7e472945b8329 (diff)
downloadNetworkManager-02bf4db8bc0716dd963d00b2930663f4f00e89a3.tar.gz
device: add possibility to reapply the ipv6 settings
-rw-r--r--src/devices/nm-device.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 6099d84333..73ca147c36 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -6879,6 +6879,56 @@ reapply_ip4_config (NMDevice *self,
return TRUE;
}
+static gboolean
+reapply_ip6_config (NMDevice *self,
+ NMConnection *old,
+ gboolean reconfigure,
+ GError **error)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ NMSettingsConnection *connection = nm_device_get_settings_connection (self);
+ NMSettingIPConfig *s_ip6 = nm_connection_get_setting_ip6_config (NM_CONNECTION (connection));
+ NMSettingIPConfig *s_ip6_applied = nm_connection_get_setting_ip6_config (old);
+ const char *method;
+ const char *method_applied;
+
+ if (!s_ip6 || !s_ip6_applied || priv->ip6_state == IP_NONE) {
+ g_set_error_literal (error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
+ "No IPv6 configuration to update");
+ return FALSE;
+ }
+
+ if (!reconfigure)
+ return TRUE;
+
+ method = nm_setting_ip_config_get_method (s_ip6);
+ method_applied = nm_setting_ip_config_get_method (s_ip6_applied);
+
+ g_clear_object (&priv->con_ip6_config);
+ priv->con_ip6_config = nm_ip6_config_new (nm_device_get_ip_ifindex (self));
+ nm_ip6_config_merge_setting (priv->con_ip6_config,
+ nm_connection_get_setting_ip6_config (NM_CONNECTION (connection)),
+ nm_device_get_ip6_route_metric (self));
+
+ if (strcmp (method, method_applied)) {
+ _cleanup_ip6_pre (self, CLEANUP_TYPE_DECONFIGURE);
+ priv->ip6_state = IP_WAIT;
+ if (!nm_device_activate_stage3_ip6_start (self)) {
+ g_set_error_literal (error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
+ "Failed to apply IPv6 configuration");
+ return FALSE;
+ }
+ } else {
+ ip6_config_merge_and_apply (self, TRUE, NULL);
+ }
+
+ return TRUE;
+}
+
/* reapply_connection:
* @connection: the new connection settings to be applied
* @flags: always zero
@@ -6932,6 +6982,9 @@ reapply_connection (NMDevice *self,
if (strcmp (setting, NM_SETTING_IP4_CONFIG_SETTING_NAME) == 0) {
if (!reapply_ip4_config (self, old, reconfigure, error))
goto done;
+ } else if (strcmp (setting, NM_SETTING_IP6_CONFIG_SETTING_NAME) == 0) {
+ if (!reapply_ip6_config (self, old, reconfigure, error))
+ goto done;
} else {
g_set_error (error,
NM_DEVICE_ERROR,