about summary refs log tree commit diff
path: root/src/settings
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2018-06-17 14:54:10 +0200
committerMichael Biebl <biebl@debian.org>2018-06-17 14:54:10 +0200
commit069cb5c3a525ebcc19cc2927964258acaca87b13 (patch)
tree66ac6b21a44d630c0fc281c0df327239d491226a /src/settings
parent04bc9e1cd3544445d883ad29ea108c1645c8e7b7 (diff)
New upstream version 1.11.90 upstream/1.11.90
Diffstat (limited to 'src/settings')
-rw-r--r--src/settings/nm-settings-connection.c5
-rw-r--r--src/settings/nm-settings-connection.h4
-rw-r--r--src/settings/nm-settings.c17
-rw-r--r--src/settings/plugins/ifcfg-rh/nm-ifdown3
-rw-r--r--src/settings/plugins/ifcfg-rh/nm-ifup3
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c151
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c25
7 files changed, 114 insertions, 94 deletions
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index 6526abc7..50cc1427 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -3189,8 +3189,9 @@ static const NMDBusInterfaceInfoExtended interface_info_settings_connection = {
 			&signal_info_removed,
 		),
 		.properties = NM_DEFINE_GDBUS_PROPERTY_INFOS (
-			NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Unsaved", "b",  NM_SETTINGS_CONNECTION_UNSAVED),
-			NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE   ("Flags",   "u",  NM_SETTINGS_CONNECTION_FLAGS),
+			NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Unsaved",  "b",  NM_SETTINGS_CONNECTION_UNSAVED),
+			NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE   ("Flags",    "u",  NM_SETTINGS_CONNECTION_FLAGS),
+			NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE   ("Filename", "s",  NM_SETTINGS_CONNECTION_FILENAME),
 		),
 	),
 	.legacy_property_changed = TRUE,
diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h
index 70518687..cd64f976 100644
--- a/src/settings/nm-settings-connection.h
+++ b/src/settings/nm-settings-connection.h
@@ -42,11 +42,11 @@
 
 /* Properties */
 #define NM_SETTINGS_CONNECTION_UNSAVED  "unsaved"
+#define NM_SETTINGS_CONNECTION_FLAGS    "flags"
+#define NM_SETTINGS_CONNECTION_FILENAME "filename"
 
 /* Internal properties */
 #define NM_SETTINGS_CONNECTION_READY    "ready"
-#define NM_SETTINGS_CONNECTION_FLAGS    "flags"
-#define NM_SETTINGS_CONNECTION_FILENAME "filename"
 
 /**
  * NMSettingsConnectionIntFlags:
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index 94018734..5bb629dc 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -653,7 +653,7 @@ plugin_loaded (GSList *list, const char *path)
 }
 
 static gboolean
-load_plugin (NMSettings *self, GSList *list, const char *pname, GError **error)
+load_plugin (NMSettings *self, GSList **list, const char *pname, GError **error)
 {
 	gs_free char *full_name = NULL;
 	gs_free char *path = NULL;
@@ -666,7 +666,7 @@ load_plugin (NMSettings *self, GSList *list, const char *pname, GError **error)
 	full_name = g_strdup_printf ("nm-settings-plugin-%s", pname);
 	path = g_module_build_path (NMPLUGINDIR, full_name);
 
-	if (plugin_loaded (list, path))
+	if (plugin_loaded (*list, path))
 		return TRUE;
 
 	if (stat (path, &st) != 0) {
@@ -719,7 +719,7 @@ load_plugin (NMSettings *self, GSList *list, const char *pname, GError **error)
 	g_object_set_qdata_full (obj, plugin_module_path_quark (), path, g_free);
 	path = NULL;
 	if (add_plugin (self, NM_SETTINGS_PLUGIN (obj)))
-		list = g_slist_append (list, g_steal_pointer (&obj));
+		*list = g_slist_append (*list, g_steal_pointer (&obj));
 
 	return TRUE;
 }
@@ -787,7 +787,7 @@ load_plugins (NMSettings *self, const char **plugins, GError **error)
 			continue;
 		}
 
-		success = load_plugin (self, list, pname, error);
+		success = load_plugin (self, &list, pname, error);
 		if (!success)
 			break;
 
@@ -797,7 +797,7 @@ load_plugins (NMSettings *self, const char **plugins, GError **error)
 			pname = "ibft";
 			add_ibft = FALSE;
 
-			success = load_plugin (self, list, "ibft", error);
+			success = load_plugin (self, &list, "ibft", error);
 			if (!success)
 				break;
 		}
@@ -886,6 +886,8 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data)
 	g_object_unref (connection);
 
 	check_startup_complete (self);
+
+	g_object_unref (self);       /* Balanced by a ref in claim_connection() */
 }
 
 #define NM_DBUS_SERVICE_OPENCONNECT    "org.freedesktop.NetworkManager.openconnect"
@@ -998,6 +1000,11 @@ claim_connection (NMSettings *self, NMSettingsConnection *connection)
 	_clear_connections_cached_list (priv);
 
 	g_object_ref (connection);
+	/* FIXME(shutdown): The NMSettings instance can't be disposed
+	 * while there is any exported connection. Ideally we should
+	 * unexport all connections on NMSettings' disposal, but for now
+	 * leak @self on termination when there are connections alive. */
+	g_object_ref (self);
 	priv->connections_len++;
 	c_list_link_tail (&priv->connections_lst_head, &connection->_connections_lst);
 
diff --git a/src/settings/plugins/ifcfg-rh/nm-ifdown b/src/settings/plugins/ifcfg-rh/nm-ifdown
new file mode 100644
index 00000000..e7bd73ae
--- /dev/null
+++ b/src/settings/plugins/ifcfg-rh/nm-ifdown
@@ -0,0 +1,3 @@
+#!/bin/sh
+nmcli connection load "/etc/sysconfig/network-scripts/ifcfg-$1" &&
+exec nmcli connection down filename "/etc/sysconfig/network-scripts/ifcfg-$1"
diff --git a/src/settings/plugins/ifcfg-rh/nm-ifup b/src/settings/plugins/ifcfg-rh/nm-ifup
new file mode 100644
index 00000000..96637a92
--- /dev/null
+++ b/src/settings/plugins/ifcfg-rh/nm-ifup
@@ -0,0 +1,3 @@
+#!/bin/sh
+nmcli connection load "/etc/sysconfig/network-scripts/ifcfg-$1" &&
+exec nmcli connection up filename "/etc/sysconfig/network-scripts/ifcfg-$1"
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
index 722d4e36..c1960846 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
@@ -1685,12 +1685,13 @@ make_ip6_setting (shvarFile *ifcfg,
 {
 	NMSettingIPConfig *s_ip6 = NULL;
 	const char *v;
-	char *value = NULL;
-	char *str_value;
+	gs_free char *value = NULL;
 	char *route6_path = NULL;
 	gboolean ipv6init, ipv6forwarding, dhcp6 = FALSE;
 	char *method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL;
-	char *ipv6addr, *ipv6addr_secondaries;
+	const char *ipv6addr, *ipv6addr_secondaries;
+	gs_free char *ipv6addr_to_free = NULL;
+	gs_free char *ipv6addr_secondaries_to_free = NULL;
 	gs_free const char **list = NULL;
 	const char *const *iter;
 	guint32 i;
@@ -1716,13 +1717,16 @@ make_ip6_setting (shvarFile *ifcfg,
 	 * When both are set, the device specified in IPV6_DEFAULTGW takes preference.
 	 */
 	if (network_ifcfg) {
-		char *ipv6_defaultgw, *ipv6_defaultdev;
-		char *default_dev = NULL;
+		const char *ipv6_defaultgw, *ipv6_defaultdev;
+		gs_free char *ipv6_defaultgw_to_free = NULL;
+		gs_free char *ipv6_defaultdev_to_free = NULL;
+		const char *default_dev = NULL;
 
 		/* Get the connection ifcfg device name and the global default route device */
-		value = svGetValueStr_cp (ifcfg, "DEVICE");
-		ipv6_defaultgw = svGetValueStr_cp (network_ifcfg, "IPV6_DEFAULTGW");
-		ipv6_defaultdev = svGetValueStr_cp (network_ifcfg, "IPV6_DEFAULTDEV");
+		nm_clear_g_free (&value);
+		v = svGetValueStr (ifcfg, "DEVICE", &value);
+		ipv6_defaultgw = svGetValueStr (network_ifcfg, "IPV6_DEFAULTGW", &ipv6_defaultgw_to_free);
+		ipv6_defaultdev = svGetValueStr (network_ifcfg, "IPV6_DEFAULTDEV", &ipv6_defaultdev_to_free);
 
 		if (ipv6_defaultgw) {
 			default_dev = strchr (ipv6_defaultgw, '%');
@@ -1735,66 +1739,64 @@ make_ip6_setting (shvarFile *ifcfg,
 		/* If there was a global default route device specified, then only connections
 		 * for that device can be the default connection.
 		 */
-		if (default_dev && value)
-			never_default = !!strcmp (value, default_dev);
-
-		g_free (ipv6_defaultgw);
-		g_free (ipv6_defaultdev);
-		g_free (value);
+		if (default_dev && v)
+			never_default = !!strcmp (v, default_dev);
 	}
 
 	/* Find out method property */
 	/* Is IPV6 enabled? Set method to "ignored", when not enabled */
-	str_value = svGetValueStr_cp (ifcfg, "IPV6INIT");
+	nm_clear_g_free (&value);
+	v = svGetValueStr (ifcfg, "IPV6INIT", &value);
 	ipv6init = svGetValueBoolean (ifcfg, "IPV6INIT", FALSE);
-	if (!str_value) {
+	if (!v) {
 		if (network_ifcfg)
 			ipv6init = svGetValueBoolean (network_ifcfg, "IPV6INIT", FALSE);
 	}
-	g_free (str_value);
 
 	if (!ipv6init)
 		method = NM_SETTING_IP6_CONFIG_METHOD_IGNORE;  /* IPv6 is disabled */
 	else {
 		ipv6forwarding = svGetValueBoolean (ifcfg, "IPV6FORWARDING", FALSE);
-		str_value = svGetValueStr_cp (ifcfg, "IPV6_AUTOCONF");
+		nm_clear_g_free (&value);
+		v = svGetValueStr (ifcfg, "IPV6_AUTOCONF", &value);
 		dhcp6 = svGetValueBoolean (ifcfg, "DHCPV6C", FALSE);
 
-		if (!g_strcmp0 (str_value, "shared"))
+		if (!g_strcmp0 (v, "shared"))
 			method = NM_SETTING_IP6_CONFIG_METHOD_SHARED;
-		else if (svParseBoolean (str_value, !ipv6forwarding))
+		else if (svParseBoolean (v, !ipv6forwarding))
 			method = NM_SETTING_IP6_CONFIG_METHOD_AUTO;
 		else if (dhcp6)
 			method = NM_SETTING_IP6_CONFIG_METHOD_DHCP;
 		else {
 			/* IPV6_AUTOCONF=no and no IPv6 address -> method 'link-local' */
-			g_free (str_value);
-			str_value = svGetValueStr_cp (ifcfg, "IPV6ADDR");
-			if (!str_value)
-				str_value = svGetValueStr_cp (ifcfg, "IPV6ADDR_SECONDARIES");
+			nm_clear_g_free (&value);
+			v = svGetValueStr (ifcfg, "IPV6ADDR", &value);
+			if (!v) {
+				nm_clear_g_free (&value);
+				v = svGetValueStr (ifcfg, "IPV6ADDR_SECONDARIES", &value);
+			}
 
-			if (!str_value)
+			if (!v)
 				method = NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL;
 		}
-		g_free (str_value);
 	}
 	/* TODO - handle other methods */
 
 	/* Read IPv6 Privacy Extensions configuration */
-	str_value = svGetValueStr_cp (ifcfg, "IPV6_PRIVACY");
-	if (str_value) {
-		ip6_privacy = svParseBoolean (str_value, FALSE);
+	nm_clear_g_free (&value);
+	v = svGetValueStr (ifcfg, "IPV6_PRIVACY", &value);
+	if (v) {
+		ip6_privacy = svParseBoolean (v, FALSE);
 		if (!ip6_privacy)
-			ip6_privacy = (g_strcmp0 (str_value, "rfc4941") == 0) ||
-			              (g_strcmp0 (str_value, "rfc3041") == 0);
+			ip6_privacy = (g_strcmp0 (v, "rfc4941") == 0) ||
+			              (g_strcmp0 (v, "rfc3041") == 0);
 	}
 	ip6_privacy_prefer_public_ip = svGetValueBoolean (ifcfg, "IPV6_PRIVACY_PREFER_PUBLIC_IP", FALSE);
-	ip6_privacy_val = str_value ?
+	ip6_privacy_val = v ?
 	                      (ip6_privacy ?
 	                          (ip6_privacy_prefer_public_ip ? NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR : NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR) :
 	                          NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED) :
 	                      NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN;
-	g_free (str_value);
 
 	/* the route table (policy routing) is ignored if we don't handle routes. */
 	route_table = svGetValueInt64 (ifcfg, "IPV6_ROUTE_TABLE", 10,
@@ -1821,19 +1823,25 @@ make_ip6_setting (shvarFile *ifcfg,
 	if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE) == 0)
 		return NM_SETTING (s_ip6);
 
-	value = svGetValueStr_cp (ifcfg, "DHCPV6_HOSTNAME");
+	nm_clear_g_free (&value);
+	v = svGetValueStr (ifcfg, "DHCPV6_DUID", &value);
+	if (v)
+		g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_DHCP_DUID, v, NULL);
+
+	nm_clear_g_free (&value);
+	v = svGetValueStr (ifcfg, "DHCPV6_HOSTNAME", &value);
 	/* Use DHCP_HOSTNAME as fallback if it is in FQDN format and ipv6.method is
 	 * auto or dhcp: this is required to support old ifcfg files
 	 */
-	if (!value && (   !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO)
+	if (!v && (   !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO)
 		       || !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP))) {
-		value = svGetValueStr_cp (ifcfg, "DHCP_HOSTNAME");
-		if (value && !strchr (value, '.'))
-			g_clear_pointer (&value, g_free);
+		nm_clear_g_free (&value);
+		v = svGetValueStr (ifcfg, "DHCP_HOSTNAME", &value);
+		if (v && !strchr (v, '.'))
+			v = NULL;
 	}
-	if (value)
-		g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, value, NULL);
-	g_free (value);
+	if (v)
+		g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, v, NULL);
 
 	g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME,
 		      svGetValueBoolean (ifcfg, "DHCPV6_SEND_HOSTNAME", TRUE), NULL);
@@ -1843,18 +1851,16 @@ make_ip6_setting (shvarFile *ifcfg,
 	 * added to the automatic ones. Note that this is not currently supported by
 	 * the legacy 'network' service (ifup-eth).
 	 */
-	ipv6addr = svGetValueStr_cp (ifcfg, "IPV6ADDR");
-	ipv6addr_secondaries = svGetValueStr_cp (ifcfg, "IPV6ADDR_SECONDARIES");
+	ipv6addr = svGetValueStr (ifcfg, "IPV6ADDR", &ipv6addr_to_free);
+	ipv6addr_secondaries = svGetValueStr (ifcfg, "IPV6ADDR_SECONDARIES", &ipv6addr_secondaries_to_free);
 
+	nm_clear_g_free (&value);
 	value = g_strjoin (ipv6addr && ipv6addr_secondaries ? " " : NULL,
 	                   ipv6addr ?: "",
 	                   ipv6addr_secondaries ?: "",
 	                   NULL);
-	g_free (ipv6addr);
-	g_free (ipv6addr_secondaries);
 
 	list = nm_utils_strsplit_set (value, " ");
-	g_free (value);
 	for (iter = list, i = 0; iter && *iter; iter++, i++) {
 		NMIPAddress *addr = NULL;
 
@@ -1868,25 +1874,26 @@ make_ip6_setting (shvarFile *ifcfg,
 
 	/* Gateway */
 	if (nm_setting_ip_config_get_num_addresses (s_ip6)) {
-		value = svGetValueStr_cp (ifcfg, "IPV6_DEFAULTGW");
-		if (!value) {
+		nm_clear_g_free (&value);
+		v = svGetValueStr (ifcfg, "IPV6_DEFAULTGW", &value);
+		if (!v) {
 			/* If no gateway in the ifcfg, try global /etc/sysconfig/network instead */
-			if (network_ifcfg)
-				value = svGetValueStr_cp (network_ifcfg, "IPV6_DEFAULTGW");
+			if (network_ifcfg) {
+				nm_clear_g_free (&value);
+				v = svGetValueStr (network_ifcfg, "IPV6_DEFAULTGW", &value);
+			}
 		}
-		if (value) {
+		if (v) {
 			char *ptr;
-			if ((ptr = strchr (value, '%')) != NULL)
+			if ((ptr = strchr (v, '%')) != NULL)
 				*ptr = '\0';  /* remove %interface prefix if present */
-			if (!nm_utils_ipaddr_valid (AF_INET6, value)) {
+			if (!nm_utils_ipaddr_valid (AF_INET6, v)) {
 				g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
-				             "Invalid IP6 address '%s'", value);
-				g_free (value);
+				             "Invalid IP6 address '%s'", v);
 				goto error;
 			}
 
-			g_object_set (s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, value, NULL);
-			g_free (value);
+			g_object_set (s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, v, NULL);
 		}
 	}
 
@@ -1900,11 +1907,10 @@ make_ip6_setting (shvarFile *ifcfg,
 	g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, i_val, NULL);
 
 	/* IPv6 tokenized interface identifier */
-	str_value = svGetValueStr_cp (ifcfg, "IPV6_TOKEN");
-	if (str_value) {
-		g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_TOKEN, str_value, NULL);
-		g_free (str_value);
-	}
+	nm_clear_g_free (&value);
+	v = svGetValueStr (ifcfg, "IPV6_TOKEN", &value);
+	if (v)
+		g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_TOKEN, v, NULL);
 
 	/* DNS servers
 	 * Pick up just IPv6 addresses (IPv4 addresses are taken by make_ip4_setting())
@@ -1913,24 +1919,22 @@ make_ip6_setting (shvarFile *ifcfg,
 		char tag[256];
 
 		numbered_tag (tag, "DNS", i);
-		value = svGetValueStr_cp (ifcfg, tag);
-		if (!value) {
+		nm_clear_g_free (&value);
+		v = svGetValueStr (ifcfg, tag, &value);
+		if (!v) {
 			/* all done */
 			break;
 		}
 
-		if (nm_utils_ipaddr_valid (AF_INET6, value)) {
-			if (!nm_setting_ip_config_add_dns (s_ip6, value))
+		if (nm_utils_ipaddr_valid (AF_INET6, v)) {
+			if (!nm_setting_ip_config_add_dns (s_ip6, v))
 				PARSE_WARNING ("duplicate DNS server %s", tag);
-		} else if (nm_utils_ipaddr_valid (AF_INET, value)) {
+		} else if (nm_utils_ipaddr_valid (AF_INET, v)) {
 			/* Ignore IPv4 addresses */
 		} else {
-			PARSE_WARNING ("invalid DNS server address %s", value);
-			g_free (value);
+			PARSE_WARNING ("invalid DNS server address %s", v);
 			goto error;
 		}
-
-		g_free (value);
 	}
 
 	if (!routes_read) {
@@ -1961,7 +1965,6 @@ make_ip6_setting (shvarFile *ifcfg,
 	/* DNS options */
 	nm_clear_g_free (&value);
 	parse_dns_options (s_ip6, svGetValue (ifcfg, "IPV6_RES_OPTIONS", &value));
-	g_free (value);
 
 	/* DNS priority */
 	priority = svGetValueInt64 (ifcfg, "IPV6_DNS_PRIORITY", 10, G_MININT32, G_MAXINT32, 0);
@@ -4171,8 +4174,8 @@ parse_ethtool_options (shvarFile *ifcfg, NMSettingWired *s_wired, const char *va
 	              NM_SETTING_WIRED_WAKE_ON_LAN, wol_flags,
 	              NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD, ignore_wol_password ? NULL : wol_password,
 	              NM_SETTING_WIRED_AUTO_NEGOTIATE, autoneg,
-	              NM_SETTING_WIRED_SPEED, autoneg ? 0 : speed,
-	              NM_SETTING_WIRED_DUPLEX, autoneg ? NULL : duplex,
+	              NM_SETTING_WIRED_SPEED, speed,
+	              NM_SETTING_WIRED_DUPLEX, duplex,
 	              NULL);
 }
 
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
index bdad7389..fdb2e10a 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
@@ -1135,6 +1135,9 @@ write_wired_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
 	/* Stuff ETHTOOL_OPT with required options */
 	str = NULL;
 	auto_negotiate = nm_setting_wired_get_auto_negotiate (s_wired);
+	speed = nm_setting_wired_get_speed (s_wired);
+	duplex = nm_setting_wired_get_duplex (s_wired);
+
 	/* autoneg off + speed 0 + duplex NULL, means we want NM
 	 * to skip link configuration which is default. So write
 	 * down link config only if we have auto-negotiate true or
@@ -1143,18 +1146,14 @@ write_wired_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
 	if (auto_negotiate) {
 		str = g_string_sized_new (64);
 		g_string_printf (str, "autoneg on");
-	} else {
-		speed = nm_setting_wired_get_speed (s_wired);
-		duplex = nm_setting_wired_get_duplex (s_wired);
-		if (speed || duplex) {
-			str = g_string_sized_new (64);
-			g_string_printf (str, "autoneg off");
-			if (speed)
-				g_string_append_printf (str, " speed %u", speed);
-			if (duplex)
-				g_string_append_printf (str, " duplex %s", duplex);
-		}
+	} else if (speed || duplex) {
+		str = g_string_sized_new (64);
+		g_string_printf (str, "autoneg off");
 	}
+	if (speed)
+		g_string_append_printf (str, " speed %u", speed);
+	if (duplex)
+		g_string_append_printf (str, " duplex %s", duplex);
 
 	wol = nm_setting_wired_get_wake_on_lan (s_wired);
 	wol_password = nm_setting_wired_get_wake_on_lan_password (s_wired);
@@ -2568,6 +2567,7 @@ write_ip6_setting (NMConnection *connection,
 		svUnsetValue (ifcfg, "IPV6INIT");
 		svUnsetValue (ifcfg, "IPV6_AUTOCONF");
 		svUnsetValue (ifcfg, "DHCPV6C");
+		svUnsetValue (ifcfg, "DHCPv6_DUID");
 		svUnsetValue (ifcfg, "DHCPV6_HOSTNAME");
 		svUnsetValue (ifcfg, "DHCPV6_SEND_HOSTNAME");
 		svUnsetValue (ifcfg, "IPV6_DEFROUTE");
@@ -2608,6 +2608,9 @@ write_ip6_setting (NMConnection *connection,
 		svUnsetValue (ifcfg, "DHCPV6C");
 	}
 
+	svSetValueStr (ifcfg, "DHCPV6_DUID",
+	               nm_setting_ip6_config_get_dhcp_duid (NM_SETTING_IP6_CONFIG (s_ip6)));
+
 	write_ip6_setting_dhcp_hostname (s_ip6, ifcfg);
 
 	/* Write out IP addresses */