summary refs log tree commit diff
path: root/src/core/initrd/nmi-cmdline-reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/initrd/nmi-cmdline-reader.c')
-rw-r--r--src/core/initrd/nmi-cmdline-reader.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c
index 508ef2b2..0a24199e 100644
--- a/src/core/initrd/nmi-cmdline-reader.c
+++ b/src/core/initrd/nmi-cmdline-reader.c
@@ -393,8 +393,9 @@ reader_read_all_connections_from_fw(Reader *reader, const char *sysfs_dir)
 static void
 reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument)
 {
-    NMConnection *     connection;
-    NMSettingIPConfig *s_ip4 = NULL, *s_ip6 = NULL;
+    NMConnection *       connection;
+    NMSettingConnection *s_con;
+    NMSettingIPConfig *  s_ip4 = NULL, *s_ip6 = NULL;
     gs_unref_hashtable GHashTable *ibft = NULL;
     const char *                   tmp;
     const char *                   tmp2;
@@ -495,6 +496,7 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument)
 
     g_hash_table_add(reader->explicit_ip_connections, g_object_ref(connection));
 
+    s_con = nm_connection_get_setting_connection(connection);
     s_ip4 = nm_connection_get_setting_ip4_config(connection);
     s_ip6 = nm_connection_get_setting_ip6_config(connection);
 
@@ -544,6 +546,12 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument)
             nm_assert_not_reached();
 
         if (address) {
+            /* We don't want to have multiple devices up with the
+             * same static address. */
+            g_object_set(s_con,
+                         NM_SETTING_CONNECTION_MULTI_CONNECT,
+                         NM_CONNECTION_MULTI_CONNECT_SINGLE,
+                         NULL);
             switch (client_ip_family) {
             case AF_INET:
                 g_object_set(s_ip4,
@@ -599,7 +607,12 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument)
                          NULL);
         }
     } else if (NM_IN_STRSET(kind, "auto6", "dhcp6")) {
-        g_object_set(s_ip4, NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE, NULL);
+        g_object_set(s_ip6,
+                     NM_SETTING_IP_CONFIG_METHOD,
+                     NM_SETTING_IP6_CONFIG_METHOD_AUTO,
+                     NM_SETTING_IP_CONFIG_MAY_FAIL,
+                     FALSE,
+                     NULL);
         if (nm_setting_ip_config_get_num_addresses(s_ip4) == 0) {
             g_object_set(s_ip4,
                          NM_SETTING_IP_CONFIG_METHOD,
@@ -764,6 +777,9 @@ reader_parse_master(Reader *reader, char *argument, const char *type_name, const
         mtu = get_word(&argument, ':');
     }
 
+    if (mtu)
+        connection_set(connection, NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MTU, mtu);
+
     do {
         slave = get_word(&slaves, ',');
         if (slave == NULL)
@@ -777,8 +793,6 @@ reader_parse_master(Reader *reader, char *argument, const char *type_name, const
                      NM_SETTING_CONNECTION_MASTER,
                      master,
                      NULL);
-        if (mtu)
-            connection_set(connection, NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MTU, mtu);
     } while (slaves && *slaves != '\0');
 
     if (argument && *argument)
@@ -916,6 +930,11 @@ reader_parse_rd_znet(Reader *reader, char *argument, gboolean net_ifnames)
     subchannels[0] = get_word(&argument, ',');
     subchannels[1] = get_word(&argument, ',');
 
+    /* Without subchannels we can't univocally match
+     * a device. */
+    if (!subchannels[0] || !subchannels[1])
+        return;
+
     if (nm_streq0(nettype, "ctc")) {
         if (net_ifnames == TRUE) {
             prefix = "sl";