summary refs log tree commit diff
path: root/src/core/settings/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/settings/plugins')
-rw-r--r--src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c93
-rw-r--r--src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c3
-rw-r--r--src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c37
-rw-r--r--src/core/settings/plugins/ifcfg-rh/shvar.c3
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-System_test-bridge-component-b.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_User_1.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Bond_Main.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Permissions.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Proxy_Basic.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected3
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_VLAN_reorder_hdr.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_A.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Hidden.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_always.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_default.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_missing.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_never.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_LEAP.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_WEP_104_ASCII.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Auto-Negotiate.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Static_Routes.cexpected1
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Wake-on-LAN.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected1
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-dcb-test.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection.cexpected1
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection_2.cexpected1
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-ip6-disabled.cexpected1
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-link_local3
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-sriov-write.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-1.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-2.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-3.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-4.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-5.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes2
-rw-r--r--src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c65
-rw-r--r--src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c2
-rw-r--r--src/core/settings/plugins/keyfile/nms-keyfile-plugin.c10
-rw-r--r--src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c10
44 files changed, 219 insertions, 73 deletions
diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
index e62c0227..6452d72a 100644
--- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
@@ -393,7 +393,9 @@ make_connection_setting(const char *file,
     const char             *v;
     gs_free char           *stable_id = NULL;
     const char *const      *iter;
-    int                     vint64, i_val;
+    gint32                  vint32;
+    gint64                  vint64;
+    int                     i_val;
 
     ifcfg_name = utils_get_ifcfg_name(file, TRUE);
     if (!ifcfg_name)
@@ -586,8 +588,8 @@ make_connection_setting(const char *file,
         break;
     }
 
-    vint64 = svGetValueInt64(ifcfg, "AUTH_RETRIES", 10, -1, G_MAXINT32, -1);
-    g_object_set(s_con, NM_SETTING_CONNECTION_AUTH_RETRIES, (int) vint64, NULL);
+    vint32 = svGetValueInt64(ifcfg, "AUTH_RETRIES", 10, -1, G_MAXINT32, -1);
+    g_object_set(s_con, NM_SETTING_CONNECTION_AUTH_RETRIES, (int) vint32, NULL);
 
     nm_clear_g_free(&value);
     v = svGetValue(ifcfg, "DEVTIMEOUT", &value);
@@ -643,6 +645,14 @@ make_connection_setting(const char *file,
         PARSE_WARNING("invalid DNS_OVER_TLS setting");
     g_object_set(s_con, NM_SETTING_CONNECTION_DNS_OVER_TLS, i_val, NULL);
 
+    i_val = NM_MPTCP_FLAGS_NONE;
+    if (!svGetValueEnum(ifcfg, "MPTCP_FLAGS", nm_mptcp_flags_get_type(), &i_val, NULL))
+        PARSE_WARNING("invalid MPTCP_FLAGS setting");
+    g_object_set(s_con, NM_SETTING_CONNECTION_MPTCP_FLAGS, (guint) i_val, NULL);
+
+    vint32 = svGetValueInt64(ifcfg, "WAIT_ACTIVATION_DELAY", 10, -1, G_MAXINT32, -1);
+    g_object_set(s_con, NM_SETTING_CONNECTION_WAIT_ACTIVATION_DELAY, (int) vint32, NULL);
+
     return NM_SETTING(s_con);
 }
 
@@ -772,7 +782,7 @@ read_full_ip4_address(shvarFile    *ifcfg,
         if (!read_ip4_address(ifcfg, numbered_tag(tag, "NETMASK", which), &has_key, &a, error))
             return FALSE;
         if (has_key)
-            prefix = nm_utils_ip4_netmask_to_prefix(a);
+            prefix = _nm_utils_ip4_netmask_to_prefix(a);
         else {
             if (base_addr)
                 prefix = nm_ip_address_get_prefix(base_addr);
@@ -845,6 +855,7 @@ typedef struct {
     union {
         guint8      uint8;
         guint32     uint32;
+        gboolean    boolean;
         const char *str;
         struct {
             guint32 uint32;
@@ -873,6 +884,9 @@ enum {
     PARSE_LINE_ATTR_ROUTE_INITCWND,
     PARSE_LINE_ATTR_ROUTE_INITRWND,
     PARSE_LINE_ATTR_ROUTE_MTU,
+    PARSE_LINE_ATTR_ROUTE_ADVMSS,
+    PARSE_LINE_ATTR_ROUTE_RTO_MIN,
+    PARSE_LINE_ATTR_ROUTE_QUICKACK,
 
     /* iproute2 arguments that only matter when parsing the file. */
     PARSE_LINE_ATTR_ROUTE_TO,
@@ -886,6 +900,7 @@ enum {
 #define PARSE_LINE_TYPE_UINT8            '8'
 #define PARSE_LINE_TYPE_UINT32           'u'
 #define PARSE_LINE_TYPE_UINT32_WITH_LOCK 'l'
+#define PARSE_LINE_TYPE_BOOL             'b'
 #define PARSE_LINE_TYPE_ADDR             'a'
 #define PARSE_LINE_TYPE_ADDR_WITH_PREFIX 'p'
 #define PARSE_LINE_TYPE_IFNAME           'i'
@@ -972,6 +987,11 @@ parse_route_line(const char *line,
                 .key  = NM_IP_ROUTE_ATTRIBUTE_CWND,
                 .type = PARSE_LINE_TYPE_UINT32_WITH_LOCK,
             },
+        [PARSE_LINE_ATTR_ROUTE_ADVMSS] =
+            {
+                .key  = NM_IP_ROUTE_ATTRIBUTE_ADVMSS,
+                .type = PARSE_LINE_TYPE_UINT32_WITH_LOCK,
+            },
         [PARSE_LINE_ATTR_ROUTE_INITCWND] =
             {
                 .key  = NM_IP_ROUTE_ATTRIBUTE_INITCWND,
@@ -987,7 +1007,16 @@ parse_route_line(const char *line,
                 .key  = NM_IP_ROUTE_ATTRIBUTE_MTU,
                 .type = PARSE_LINE_TYPE_UINT32_WITH_LOCK,
             },
-
+        [PARSE_LINE_ATTR_ROUTE_QUICKACK] =
+            {
+                .key  = NM_IP_ROUTE_ATTRIBUTE_QUICKACK,
+                .type = PARSE_LINE_TYPE_BOOL,
+            },
+        [PARSE_LINE_ATTR_ROUTE_RTO_MIN] =
+            {
+                .key  = NM_IP_ROUTE_ATTRIBUTE_RTO_MIN,
+                .type = PARSE_LINE_TYPE_UINT32,
+            },
         [PARSE_LINE_ATTR_ROUTE_TO] =
             {
                 .key                         = "to",
@@ -1090,6 +1119,9 @@ parse_route_line(const char *line,
             case PARSE_LINE_TYPE_UINT32_WITH_LOCK:
                 i_words++;
                 goto parse_line_type_uint32_with_lock;
+            case PARSE_LINE_TYPE_BOOL:
+                i_words++;
+                goto parse_line_type_bool;
             case PARSE_LINE_TYPE_ADDR:
                 i_words++;
                 goto parse_line_type_addr;
@@ -1218,6 +1250,22 @@ parse_line_type_uint32_with_lock:
         i_words++;
         goto next;
 
+parse_line_type_bool:
+        s = words[i_words];
+        if (!s)
+            goto err_word_missing_argument;
+        p_data->v.boolean = !!_nm_utils_ascii_str_to_int64(s, 10, 0, 1, 0);
+        if (errno) {
+            g_set_error(error,
+                        NM_SETTINGS_ERROR,
+                        NM_SETTINGS_ERROR_INVALID_CONNECTION,
+                        "Argument for \"%s\" is not a valid boolean number",
+                        w);
+            return -EINVAL;
+        }
+        i_words++;
+        goto next;
+
 parse_line_type_ifname:
         s = words[i_words];
         if (!s)
@@ -1370,6 +1418,9 @@ next:;
                                       p_info->key,
                                       g_variant_new_uint32(p_data->v.uint32_with_lock.uint32));
             break;
+        case PARSE_LINE_TYPE_BOOL:
+            nm_ip_route_set_attribute(route, p_info->key, g_variant_new_boolean(p_data->v.boolean));
+            break;
         case PARSE_LINE_TYPE_ADDR:
         case PARSE_LINE_TYPE_ADDR_WITH_PREFIX:
             nm_ip_route_set_attribute(
@@ -1445,7 +1496,7 @@ read_one_ip4_route(shvarFile *ifcfg, guint32 which, NMIPRoute **out_route, GErro
                           error))
         return FALSE;
     if (has_key) {
-        prefix = nm_utils_ip4_netmask_to_prefix(netmask);
+        prefix = _nm_utils_ip4_netmask_to_prefix(netmask);
         if (netmask != _nm_utils_ip4_prefix_to_netmask(prefix)) {
             g_set_error(error,
                         NM_SETTINGS_ERROR,
@@ -1786,6 +1837,7 @@ make_ip4_setting(shvarFile *ifcfg,
     int                                priority;
     const char *const                 *item;
     guint32                            route_table;
+    int                                ipv4_link_local;
 
     nm_assert(out_has_defroute && !*out_has_defroute);
 
@@ -1858,6 +1910,14 @@ make_ip4_setting(shvarFile *ifcfg,
         route_table = 0;
     }
 
+    ipv4_link_local = NM_SETTING_IP4_LL_DEFAULT;
+    if (!svGetValueEnum(ifcfg,
+                        "IPV4_LINK_LOCAL",
+                        nm_setting_ip4_link_local_get_type(),
+                        &ipv4_link_local,
+                        NULL))
+        PARSE_WARNING("invalid IPV4_LINK_LOCAL setting");
+
     g_object_set(s_ip4,
                  NM_SETTING_IP_CONFIG_METHOD,
                  method,
@@ -1873,6 +1933,8 @@ make_ip4_setting(shvarFile *ifcfg,
                  svGetValueInt64(ifcfg, "IPV4_ROUTE_METRIC", 10, -1, G_MAXUINT32, -1),
                  NM_SETTING_IP_CONFIG_ROUTE_TABLE,
                  (guint) route_table,
+                 NM_SETTING_IP4_CONFIG_LINK_LOCAL,
+                 ipv4_link_local,
                  NULL);
 
     if (nm_streq(method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED))
@@ -2498,7 +2560,13 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
         }
     }
 
-    i_val = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64;
+    /* IPv6 tokenized interface identifier */
+    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);
+
+    i_val = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT_OR_EUI64;
     if (!svGetValueEnum(ifcfg,
                         "IPV6_ADDR_GEN_MODE",
                         nm_setting_ip6_config_addr_gen_mode_get_type(),
@@ -2506,15 +2574,14 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
                         &local)) {
         PARSE_WARNING("%s", local->message);
         g_clear_error(&local);
+    } else if (errno == ENOENT) {
+        /* The key is not specified. If "v" (IPV6_TOKEN) is set,
+         * we default to EUI64. Otherwise, the connection would not verify. */
+        if (v)
+            i_val = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64;
     }
     g_object_set(s_ip6, NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, i_val, NULL);
 
-    /* IPv6 tokenized interface identifier */
-    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())
      */
diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
index 15e01ba9..e1ef8174 100644
--- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c
@@ -960,6 +960,7 @@ const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = {
     _KEY_TYPE("IPV4_DHCP_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("IPV4_DNS_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("IPV4_FAILURE_FATAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
+    _KEY_TYPE("IPV4_LINK_LOCAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("IPV4_REQUIRED_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("IPV4_ROUTE_METRIC", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("IPV4_ROUTE_TABLE", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
@@ -1005,6 +1006,7 @@ const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = {
     _KEY_TYPE("MDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("METRIC", NMS_IFCFG_KEY_TYPE_IS_NUMBERED),
     _KEY_TYPE("MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
+    _KEY_TYPE("MPTCP_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("MTU", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("MUD_URL", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("MULTI_CONNECT", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
@@ -1061,6 +1063,7 @@ const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = {
     _KEY_TYPE("VLAN_INGRESS_PRIORITY_MAP", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("VRF", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("VRF_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
+    _KEY_TYPE("WAIT_ACTIVATION_DELAY", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("WEP_KEY_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("WPA_ALLOW_WPA", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
     _KEY_TYPE("WPA_ALLOW_WPA2", NMS_IFCFG_KEY_TYPE_IS_PLAIN),
diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
index d7a1cfc6..d1f8dbad 100644
--- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h
@@ -33,7 +33,7 @@ typedef struct {
     NMSIfcfgKeyTypeFlags key_flags;
 } NMSIfcfgKeyTypeInfo;
 
-extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[253];
+extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[256];
 
 const NMSIfcfgKeyTypeInfo *nms_ifcfg_well_known_key_find_info(const char *key, gssize *out_idx);
 
diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
index 551f2b91..96efc9e5 100644
--- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
@@ -2095,6 +2095,7 @@ write_connection_setting(NMSettingConnection *s_con, shvarFile *ifcfg)
     NMSettingConnectionMdns       mdns;
     NMSettingConnectionLlmnr      llmnr;
     NMSettingConnectionDnsOverTls dns_over_tls;
+    NMMptcpFlags                  mptcp_flags;
     guint32                       vuint32;
     const char                   *tmp, *mud_url;
 
@@ -2258,6 +2259,9 @@ write_connection_setting(NMSettingConnection *s_con, shvarFile *ifcfg)
     vint = nm_setting_connection_get_auth_retries(s_con);
     svSetValueInt64_cond(ifcfg, "AUTH_RETRIES", vint >= 0, vint);
 
+    vint32 = nm_setting_connection_get_wait_activation_delay(s_con);
+    svSetValueInt64_cond(ifcfg, "WAIT_ACTIVATION_DELAY", vint32 >= 0, vint32);
+
     vint32 = nm_setting_connection_get_wait_device_timeout(s_con);
     if (vint32 == -1) {
         /* pass */
@@ -2286,13 +2290,18 @@ write_connection_setting(NMSettingConnection *s_con, shvarFile *ifcfg)
                        nm_setting_connection_dns_over_tls_get_type(),
                        dns_over_tls);
     }
+
+    mptcp_flags = nm_setting_connection_get_mptcp_flags(s_con);
+    if (mptcp_flags != NM_MPTCP_FLAGS_NONE)
+        svSetValueEnum(ifcfg, "MPTCP_FLAGS", nm_mptcp_flags_get_type(), mptcp_flags);
 }
 
 static char *
 get_route_attributes_string(NMIPRoute *route, int family)
 {
     gs_free const char **names = NULL;
-    GVariant            *attr, *lock;
+    GVariant            *attr;
+    GVariant            *lock;
     GString             *str;
     guint                i, len;
 
@@ -2317,6 +2326,7 @@ get_route_attributes_string(NMIPRoute *route, int family)
             continue;
 
         if (NM_IN_STRSET(names[i],
+                         NM_IP_ROUTE_ATTRIBUTE_ADVMSS,
                          NM_IP_ROUTE_ATTRIBUTE_WINDOW,
                          NM_IP_ROUTE_ATTRIBUTE_CWND,
                          NM_IP_ROUTE_ATTRIBUTE_INITCWND,
@@ -2332,12 +2342,12 @@ get_route_attributes_string(NMIPRoute *route, int family)
                                    names[i],
                                    (lock && g_variant_get_boolean(lock)) ? "lock " : "",
                                    g_variant_get_uint32(attr));
-        } else if (strstr(names[i], "lock-")) {
+        } else if (NM_STR_HAS_PREFIX(names[i], "lock-")) {
             const char *n = &(names[i])[NM_STRLEN("lock-")];
 
-            attr = nm_ip_route_get_attribute(route, n);
-            if (!attr) {
-                g_string_append_printf(str, "%s lock 0", n);
+            if (!nm_ip_route_get_attribute(route, n)) {
+                if (g_variant_get_boolean(attr))
+                    g_string_append_printf(str, "%s lock 0", n);
             } else {
                 /* we also have a corresponding attribute with the numeric value. The
                  * lock setting is handled above. */
@@ -2346,8 +2356,12 @@ get_route_attributes_string(NMIPRoute *route, int family)
             g_string_append_printf(str, "%s %u", names[i], (unsigned) g_variant_get_byte(attr));
         } else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_TOS)) {
             g_string_append_printf(str, "%s 0x%02x", names[i], (unsigned) g_variant_get_byte(attr));
-        } else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_TABLE)) {
+        } else if (NM_IN_STRSET(names[i],
+                                NM_IP_ROUTE_ATTRIBUTE_TABLE,
+                                NM_IP_ROUTE_ATTRIBUTE_RTO_MIN)) {
             g_string_append_printf(str, "%s %u", names[i], (unsigned) g_variant_get_uint32(attr));
+        } else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_QUICKACK)) {
+            g_string_append_printf(str, "%s %u", names[i], (unsigned) g_variant_get_boolean(attr));
         } else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_ONLINK)) {
             if (g_variant_get_boolean(attr))
                 g_string_append(str, "onlink");
@@ -2733,6 +2747,7 @@ write_ip4_setting(NMConnection *connection,
     gboolean                      has_netmask;
     NMDhcpHostnameFlags           flags;
     const char *const            *strv;
+    NMSettingIP4LinkLocal         ipv4_link_local;
 
     NM_SET_OUT(out_route_content_svformat, NULL);
     NM_SET_OUT(out_route_content, NULL);
@@ -2839,6 +2854,14 @@ write_ip4_setting(NMConnection *connection,
     value = nm_setting_ip_config_get_dhcp_hostname(s_ip4);
     svSetValueStr(ifcfg, "DHCP_HOSTNAME", value);
 
+    ipv4_link_local = nm_setting_ip4_config_get_link_local(NM_SETTING_IP4_CONFIG(s_ip4));
+    if (ipv4_link_local != NM_SETTING_IP4_LL_DEFAULT) {
+        svSetValueEnum(ifcfg,
+                       "IPV4_LINK_LOCAL",
+                       nm_setting_ip4_link_local_get_type(),
+                       ipv4_link_local);
+    }
+
     value = nm_setting_ip4_config_get_dhcp_fqdn(NM_SETTING_IP4_CONFIG(s_ip4));
     svSetValueStr(ifcfg, "DHCP_FQDN", value);
 
@@ -3149,7 +3172,7 @@ write_ip6_setting(NMConnection *connection, shvarFile *ifcfg, GString **out_rout
 
     /* IPv6 Address generation mode */
     addr_gen_mode = nm_setting_ip6_config_get_addr_gen_mode(NM_SETTING_IP6_CONFIG(s_ip6));
-    if (addr_gen_mode != NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64) {
+    if (addr_gen_mode != NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT_OR_EUI64) {
         svSetValueEnum(ifcfg,
                        "IPV6_ADDR_GEN_MODE",
                        nm_setting_ip6_config_addr_gen_mode_get_type(),
diff --git a/src/core/settings/plugins/ifcfg-rh/shvar.c b/src/core/settings/plugins/ifcfg-rh/shvar.c
index 2ca49558..fe8187c3 100644
--- a/src/core/settings/plugins/ifcfg-rh/shvar.c
+++ b/src/core/settings/plugins/ifcfg-rh/shvar.c
@@ -1328,6 +1328,7 @@ svGetValueEnum(shvarFile *s, const char *key, GType gtype, int *out_value, GErro
     if (!svalue) {
         /* don't touch out_value. The caller is supposed
          * to initialize it with the default value. */
+        errno = ENOENT;
         return TRUE;
     }
 
@@ -1339,10 +1340,12 @@ svGetValueEnum(shvarFile *s, const char *key, GType gtype, int *out_value, GErro
                     err_token,
                     svalue,
                     key);
+        errno = EINVAL;
         return FALSE;
     }
 
     NM_SET_OUT(out_value, value);
+    errno = 0;
     return TRUE;
 }
 
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-System_test-bridge-component-b.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-System_test-bridge-component-b.cexpected
index 71d2cda8..1330382d 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-System_test-bridge-component-b.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-System_test-bridge-component-b.cexpected
@@ -13,4 +13,4 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_User_1.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_User_1.cexpected
index a48be78a..15ced3ab 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_User_1.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_User_1.cexpected
@@ -28,7 +28,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test User 1"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Bond_Main.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Bond_Main.cexpected
index ccc0f35a..1aeb2cdc 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Bond_Main.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Bond_Main.cexpected
@@ -13,7 +13,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Bond Main"
 UUID=${UUID}
 DEVICE=bond0
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Permissions.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Permissions.cexpected
index d4a978b6..a7df77e4 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Permissions.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Permissions.cexpected
@@ -7,7 +7,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Permissions"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Proxy_Basic.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Proxy_Basic.cexpected
index 716eedc2..7fcd2c15 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Proxy_Basic.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Proxy_Basic.cexpected
@@ -9,7 +9,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Proxy Basic"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected
index 0c2fa035..d03e9a0d 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Routing_Rules.cexpected
@@ -3,12 +3,13 @@ PROXY_METHOD=none
 BROWSER_ONLY=no
 BOOTPROTO=dhcp
 DEFROUTE=yes
+IPV4_LINK_LOCAL=enabled
 IPV4_FAILURE_FATAL=no
 IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 ROUTING_RULE_1="priority 10 from 0.0.0.0/0 table 1"
 ROUTING_RULE_2="priority 10 to 192.167.8.0/24 table 2"
 ROUTING_RULE6_3="priority 10 from ::/0 table 10"
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_VLAN_reorder_hdr.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_VLAN_reorder_hdr.cexpected
index 9c2a1ff0..6a233664 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_VLAN_reorder_hdr.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_VLAN_reorder_hdr.cexpected
@@ -15,7 +15,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write VLAN reorder_hdr"
 UUID=${UUID}
 ONBOOT=no
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected
index ccec2b81..caeaaff8 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_AP_Mode.cexpected
@@ -13,7 +13,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wi-Fi AP Mode"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_A.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_A.cexpected
index ddbd986f..7e3d4f02 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_A.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Band_A.cexpected
@@ -12,7 +12,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wi-Fi Band A"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Hidden.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Hidden.cexpected
index 495a24d3..01a091ec 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Hidden.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_Hidden.cexpected
@@ -11,7 +11,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wi-Fi Hidden"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_always.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_always.cexpected
index aec6918a..7fa0fc98 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_always.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_always.cexpected
@@ -12,7 +12,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wi-Fi MAC always"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_default.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_default.cexpected
index 9d47163f..1b4ca948 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_default.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_default.cexpected
@@ -11,7 +11,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wi-Fi MAC default"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_missing.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_missing.cexpected
index 43c07ddb..089d1442 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_missing.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_missing.cexpected
@@ -12,7 +12,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wi-Fi MAC missing"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_never.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_never.cexpected
index 21f2e2de..880db3f7 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_never.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_WiFi_MAC_never.cexpected
@@ -12,7 +12,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wi-Fi MAC never"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_LEAP.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_LEAP.cexpected
index f1b01a21..b9129c59 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_LEAP.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_LEAP.cexpected
@@ -13,7 +13,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wifi LEAP"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_WEP_104_ASCII.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_WEP_104_ASCII.cexpected
index 60540fbe..2dd8958b 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_WEP_104_ASCII.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wifi_WEP_104_ASCII.cexpected
@@ -12,7 +12,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wifi WEP 104 ASCII"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Auto-Negotiate.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Auto-Negotiate.cexpected
index 214f5da5..8dd2cbff 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Auto-Negotiate.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Auto-Negotiate.cexpected
@@ -9,7 +9,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wired Auto-Negotiate"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Static_Routes.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Static_Routes.cexpected
index fe864c43..bc2806a9 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Static_Routes.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Static_Routes.cexpected
@@ -19,6 +19,7 @@ ARPING_WAIT=1
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
+IPV6_ADDR_GEN_MODE=eui64
 NAME="Test Write Wired Static Routes"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Wake-on-LAN.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Wake-on-LAN.cexpected
index de66dcdd..34f89b5e 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Wake-on-LAN.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_Wake-on-LAN.cexpected
@@ -9,7 +9,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wired Wake-on-LAN"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected
index 908cb917..318fae5d 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected
@@ -10,6 +10,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
+IPV6_ADDR_GEN_MODE=eui64
 NAME="Test Write Wired with Match setting"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-dcb-test.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-dcb-test.cexpected
index fef36f2f..0a9ef3d4 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-dcb-test.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-dcb-test.cexpected
@@ -33,7 +33,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME=dcb-test
 UUID=${UUID}
 DEVICE=eth0
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection.cexpected
index 1f5e04ff..0a5c2ccf 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection.cexpected
@@ -10,6 +10,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
+IPV6_ADDR_GEN_MODE=eui64
 NAME="random wifi connection"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection_2.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection_2.cexpected
index 3dcdbda0..8a874d24 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection_2.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-random_wifi_connection_2.cexpected
@@ -10,6 +10,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
+IPV6_ADDR_GEN_MODE=eui64
 NAME="random wifi connection 2"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-ip6-disabled.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-ip6-disabled.cexpected
index b3199c01..9cba7e20 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-ip6-disabled.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-ip6-disabled.cexpected
@@ -8,6 +8,7 @@ IPV6_DISABLED=yes
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
+IPV6_ADDR_GEN_MODE=eui64
 NAME="Test Write Wired Disabled IP6"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-link_local b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-link_local
new file mode 100644
index 00000000..cfc963fb
--- /dev/null
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-link_local
@@ -0,0 +1,3 @@
+TYPE=Ethernet
+BOOTPROTO=dhcp
+IPV4_LINK_LOCAL=enabled
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-sriov-write.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-sriov-write.cexpected
index a77c615d..121ead79 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-sriov-write.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-sriov-write.cexpected
@@ -14,7 +14,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write SR-IOV config"
 UUID=${UUID}
 DEVICE=eth0
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected
index 1125ef55..8f513922 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write-empty.cexpected
@@ -11,7 +11,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write TC config"
 UUID=${UUID}
 DEVICE=eth0
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write.cexpected
index d87efd72..698bda3a 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-tc-write.cexpected
@@ -12,7 +12,7 @@ IPV4_FAILURE_FATAL=no
 IPV6INIT=no
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write TC config"
 UUID=${UUID}
 DEVICE=eth0
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-1.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-1.cexpected
index 5186f90c..11fd060e 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-1.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-1.cexpected
@@ -8,7 +8,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME=test_roundtrip_ethtool
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-2.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-2.cexpected
index 5632ebec..abd74bbd 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-2.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-2.cexpected
@@ -9,7 +9,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME=test_roundtrip_ethtool
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-3.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-3.cexpected
index 96eec43b..962cbdd5 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-3.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-3.cexpected
@@ -9,7 +9,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME=test_roundtrip_ethtool
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-4.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-4.cexpected
index 90250a30..213045df 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-4.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-4.cexpected
@@ -9,7 +9,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME=test_roundtrip_ethtool
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-5.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-5.cexpected
index 721eacb2..d3b9c056 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-5.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_roundtrip_ethtool-5.cexpected
@@ -9,7 +9,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME=test_roundtrip_ethtool
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected
index 42608576..542f5b5b 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected
@@ -9,7 +9,7 @@ IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
-IPV6_ADDR_GEN_MODE=stable-privacy
+IPV6_ADDR_GEN_MODE=default
 NAME="Test Write Wired Auto-Negotiate"
 UUID=${UUID}
 ONBOOT=yes
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes
index 9c05417e..717ad1ac 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes
+++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes
@@ -6,7 +6,7 @@ ADDRESS1=44.55.66.77
 NETMASK1=255.255.255.255
 GATEWAY1=192.168.1.7
 METRIC1=3
-OPTIONS1="mtu lock 9000 cwnd 12 src 1.1.1.1 tos 0x28 window 30000 scope 10 initcwnd lock 13 initrwnd 14"
+OPTIONS1="mtu lock 9000 cwnd 12 src 1.1.1.1 tos 0x28 window 30000 scope 10 initcwnd lock 13 initrwnd 14 rto_min 300 advmss 1300 quickack 1"
 
 ADDRESS2=44.55.66.78
 NETMASK2=255.255.255.255
diff --git a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
index 83e48b81..9fdae4bd 100644
--- a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
+++ b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
@@ -668,8 +668,8 @@ test_read_miscellaneous_variables(void)
     NMSettingWired               *s_wired;
     NMSettingIPConfig            *s_ip4;
     char                         *expected_mac_blacklist[3] = {"00:16:41:11:22:88",
-                                       "00:16:41:11:22:99",
-                                       "6a:5d:5a:fa:dd:f0"};
+                                                               "00:16:41:11:22:99",
+                                                               "6a:5d:5a:fa:dd:f0"};
     int                           mac_blacklist_num, i;
     guint64                       expected_timestamp = 0;
 
@@ -1352,6 +1352,7 @@ test_read_wired_static_routes(void)
     g_assert_cmpint(nm_ip_route_get_prefix(ip4_route), ==, 32);
     g_assert_cmpstr(nm_ip_route_get_next_hop(ip4_route), ==, "192.168.1.7");
     g_assert_cmpint(nm_ip_route_get_metric(ip4_route), ==, 3);
+    nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_ADVMSS, 1300);
     nmtst_assert_route_attribute_byte(ip4_route, NM_IP_ROUTE_ATTRIBUTE_TOS, 0x28);
     nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_WINDOW, 30000);
     nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_CWND, 12);
@@ -1360,6 +1361,8 @@ test_read_wired_static_routes(void)
     nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_MTU, 9000);
     nmtst_assert_route_attribute_boolean(ip4_route, NM_IP_ROUTE_ATTRIBUTE_LOCK_MTU, TRUE);
     nmtst_assert_route_attribute_boolean(ip4_route, NM_IP_ROUTE_ATTRIBUTE_LOCK_INITCWND, TRUE);
+    nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_RTO_MIN, 300);
+    nmtst_assert_route_attribute_boolean(ip4_route, NM_IP_ROUTE_ATTRIBUTE_QUICKACK, TRUE);
     nmtst_assert_route_attribute_string(ip4_route, NM_IP_ROUTE_ATTRIBUTE_SRC, "1.1.1.1");
     nmtst_assert_route_attribute_byte(ip4_route, NM_IP_ROUTE_ATTRIBUTE_SCOPE, 10);
 
@@ -2027,17 +2030,17 @@ test_read_wired_aliases_good(gconstpointer test_data)
     NMSettingIPConfig            *s_ip4;
     int                           expected_num_addresses;
     const char                   *expected_address_0[] = {"192.168.1.5",
-                                        "192.168.1.6",
-                                        "192.168.1.9",
-                                        "192.168.1.99",
-                                        NULL};
+                                                          "192.168.1.6",
+                                                          "192.168.1.9",
+                                                          "192.168.1.99",
+                                                          NULL};
     const char                   *expected_address_3[] = {"192.168.1.5", "192.168.1.6", NULL};
     const char                   *expected_label_0[]   = {
-        NULL,
-        "aliasem0:1",
-        "aliasem0:2",
-        "aliasem0:99",
-        NULL,
+                            NULL,
+                            "aliasem0:1",
+                            "aliasem0:2",
+                            "aliasem0:99",
+                            NULL,
     };
     const char *expected_label_3[] = {
         NULL,
@@ -4538,7 +4541,12 @@ test_write_routing_rules(void)
     _nm_connection_new_setting(connection, NM_TYPE_SETTING_WIRED);
 
     s_ip4 = _nm_connection_new_setting(connection, NM_TYPE_SETTING_IP4_CONFIG);
-    g_object_set(s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
+    g_object_set(s_ip4,
+                 NM_SETTING_IP_CONFIG_METHOD,
+                 NM_SETTING_IP4_CONFIG_METHOD_AUTO,
+                 NM_SETTING_IP4_CONFIG_LINK_LOCAL,
+                 NM_SETTING_IP4_LL_ENABLED,
+                 NULL);
 
     s_ip6 = _nm_connection_new_setting(connection, NM_TYPE_SETTING_IP6_CONFIG);
     g_object_set(s_ip6, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, NULL);
@@ -4634,6 +4642,34 @@ test_write_wired_dhcp_plus_ip(void)
 }
 
 static void
+test_read_write_link_local(void)
+{
+    nmtst_auto_unlinkfile char   *testfile   = NULL;
+    gs_unref_object NMConnection *connection = NULL;
+    gs_unref_object NMConnection *reread     = NULL;
+    NMSettingIPConfig            *s_ip4;
+
+    connection =
+        _connection_from_file(TEST_IFCFG_DIR "/ifcfg-test-link_local", NULL, TYPE_ETHERNET, NULL);
+
+    s_ip4 = nmtst_connection_assert_setting(connection, NM_TYPE_SETTING_IP4_CONFIG);
+    g_assert(nm_setting_ip4_config_get_link_local(NM_SETTING_IP4_CONFIG(s_ip4))
+             == NM_SETTING_IP4_LL_ENABLED);
+
+    g_object_set(s_ip4, NM_SETTING_IP4_CONFIG_LINK_LOCAL, NM_SETTING_IP4_LL_DISABLED, NULL);
+
+    _writer_new_connection(connection, TEST_SCRATCH_DIR, &testfile);
+
+    reread = _connection_from_file(testfile, NULL, TYPE_ETHERNET, NULL);
+
+    nmtst_assert_connection_equals(connection, TRUE, reread, FALSE);
+
+    s_ip4 = nmtst_connection_assert_setting(reread, NM_TYPE_SETTING_IP4_CONFIG);
+    g_assert(nm_setting_ip4_config_get_link_local(NM_SETTING_IP4_CONFIG(s_ip4))
+             == NM_SETTING_IP4_LL_DISABLED);
+}
+
+static void
 test_read_write_wired_dhcp_send_hostname(void)
 {
     nmtst_auto_unlinkfile char   *testfile   = NULL;
@@ -8153,8 +8189,8 @@ test_read_infiniband(void)
     char                         *unmanaged = NULL;
     const char                   *mac;
     char        expected_mac_address[INFINIBAND_ALEN] = {0x80, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55,
-                                                  0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc,
-                                                  0xdd, 0xee, 0xff, 0x00, 0x11, 0x22};
+                                                         0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc,
+                                                         0xdd, 0xee, 0xff, 0x00, 0x11, 0x22};
     const char *transport_mode;
 
     connection = _connection_from_file(TEST_IFCFG_DIR "/ifcfg-test-infiniband",
@@ -10245,6 +10281,7 @@ main(int argc, char **argv)
     g_test_add_func(TPATH "read-dhcp", test_read_wired_dhcp);
     g_test_add_func(TPATH "read-dhcp-plus-ip", test_read_wired_dhcp_plus_ip);
     g_test_add_func(TPATH "read-shared-plus-ip", test_read_wired_shared_plus_ip);
+    g_test_add_func(TPATH "read-write-link-local", test_read_write_link_local);
     g_test_add_func(TPATH "read-dhcp-send-hostname", test_read_write_wired_dhcp_send_hostname);
     g_test_add_func(TPATH "read-dhcpv6-hostname-fallback",
                     test_read_wired_dhcpv6_hostname_fallback);
diff --git a/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c b/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c
index c079266e..a1d6781b 100644
--- a/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c
+++ b/src/core/settings/plugins/ifupdown/nms-ifupdown-parser.c
@@ -451,7 +451,7 @@ update_ip4_setting_from_if_block(NMConnection *connection, if_block *block, GErr
                             netmask_v);
                 return FALSE;
             } else {
-                netmask_int = nm_utils_ip4_netmask_to_prefix(tmp_mask);
+                netmask_int = _nm_utils_ip4_netmask_to_prefix(tmp_mask);
             }
         }
 
diff --git a/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c b/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c
index efb9bfce..1d7de8d2 100644
--- a/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c
+++ b/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c
@@ -26,8 +26,6 @@
 #include "libnm-core-intern/nm-core-internal.h"
 #include "libnm-core-intern/nm-keyfile-internal.h"
 
-#include "libnm-systemd-shared/nm-sd-utils-shared.h"
-
 #include "settings/nm-settings-plugin.h"
 #include "settings/nm-settings-storage.h"
 #include "settings/nm-settings-utils.h"
@@ -1247,9 +1245,9 @@ nms_keyfile_plugin_init(NMSKeyfilePlugin *plugin)
     /* dirname_libs are a set of read-only directories with lower priority than /etc or /run.
      * There is nothing complicated about having multiple of such directories, so dirname_libs
      * is a list (which currently only has at most one directory). */
-    priv->dirname_libs[0] = nm_sd_utils_path_simplify(g_strdup(NM_KEYFILE_PATH_NAME_LIB));
+    priv->dirname_libs[0] = nm_path_simplify(g_strdup(NM_KEYFILE_PATH_NAME_LIB));
     priv->dirname_libs[1] = NULL;
-    priv->dirname_run     = nm_sd_utils_path_simplify(g_strdup(NM_KEYFILE_PATH_NAME_RUN));
+    priv->dirname_run     = nm_path_simplify(g_strdup(NM_KEYFILE_PATH_NAME_RUN));
     priv->dirname_etc     = nm_config_data_get_value(NM_CONFIG_GET_DATA_ORIG,
                                                  NM_CONFIG_KEYFILE_GROUP_KEYFILE,
                                                  NM_CONFIG_KEYFILE_KEY_KEYFILE_PATH,
@@ -1262,9 +1260,9 @@ nms_keyfile_plugin_init(NMSKeyfilePlugin *plugin)
     } else if (!priv->dirname_etc || priv->dirname_etc[0] != '/') {
         /* either invalid path or unspecified. Use the default. */
         g_free(priv->dirname_etc);
-        priv->dirname_etc = nm_sd_utils_path_simplify(g_strdup(NM_KEYFILE_PATH_NAME_ETC_DEFAULT));
+        priv->dirname_etc = nm_path_simplify(g_strdup(NM_KEYFILE_PATH_NAME_ETC_DEFAULT));
     } else
-        nm_sd_utils_path_simplify(priv->dirname_etc);
+        nm_path_simplify(priv->dirname_etc);
 
     /* no duplicates */
     if (NM_IN_STRSET(priv->dirname_libs[0], priv->dirname_etc, priv->dirname_run))
diff --git a/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c b/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c
index 11a8e416..1307d4b2 100644
--- a/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c
+++ b/src/core/settings/plugins/keyfile/tests/test-keyfile-settings.c
@@ -1805,8 +1805,8 @@ test_read_infiniband_connection(void)
     NMSettingInfiniband          *s_ib;
     const char                   *mac;
     guint8      expected_mac[INFINIBAND_ALEN] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
-                                            0x77, 0x88, 0x99, 0x01, 0x12, 0x23, 0x34,
-                                            0x45, 0x56, 0x67, 0x78, 0x89, 0x90};
+                                                 0x77, 0x88, 0x99, 0x01, 0x12, 0x23, 0x34,
+                                                 0x45, 0x56, 0x67, 0x78, 0x89, 0x90};
     const char *expected_id                   = "Test InfiniBand Connection";
     const char *expected_uuid                 = "4e80a56d-c99f-4aad-a6dd-b449bc398c57";
 
@@ -1924,6 +1924,7 @@ test_write_bridge_main(void)
     gs_unref_object NMConnection *connection = NULL;
     NMSettingConnection          *s_con;
     NMSettingBridge              *s_bridge;
+    NMSettingWired               *s_wired;
     NMSettingIPConfig            *s_ip4;
     NMSettingIPConfig            *s_ip6;
 
@@ -1953,6 +1954,11 @@ test_write_bridge_main(void)
     g_assert(s_bridge);
     nm_connection_add_setting(connection, NM_SETTING(s_bridge));
 
+    /* Ethernet setting */
+    s_wired = (NMSettingWired *) nm_setting_wired_new();
+    g_assert(s_wired);
+    nm_connection_add_setting(connection, NM_SETTING(s_wired));
+
     /* IP4 setting */
     s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new();
     g_assert(s_ip4);