about summary refs log tree commit diff
path: root/src/nm-initrd-generator/nmi-cmdline-reader.c
diff options
context:
space:
mode:
authorSebastien Bacher <seb128@ubuntu.com>2021-08-25 15:23:22 +0200
committerSebastien Bacher <seb128@ubuntu.com>2021-08-25 15:23:22 +0200
commitcfb80376641fa49137b9996130352697e7f8b436 (patch)
tree4ac3eb90a08f27a8bff2372052f8ae78f7e7c3aa /src/nm-initrd-generator/nmi-cmdline-reader.c
parent35779c6675728fa6f0fd0a21cefb904408509c23 (diff)
New upstream version 1.32.10
Diffstat (limited to 'src/nm-initrd-generator/nmi-cmdline-reader.c')
-rw-r--r--src/nm-initrd-generator/nmi-cmdline-reader.c151
1 files changed, 136 insertions, 15 deletions
diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c
index 799fd5dc..5c42f83c 100644
--- a/src/nm-initrd-generator/nmi-cmdline-reader.c
+++ b/src/nm-initrd-generator/nmi-cmdline-reader.c
@@ -119,6 +119,8 @@ reader_create_connection(Reader *                 reader,
                  reader->dhcp_timeout,
                  NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER,
                  reader->dhcp4_vci,
+                 NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT,
+                 NMI_IP_REQUIRED_TIMEOUT_MSEC,
                  NULL);
 
     setting = nm_setting_ip6_config_new();
@@ -401,18 +403,19 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument)
     gs_unref_hashtable GHashTable *ibft = NULL;
     const char *                   tmp;
     const char *                   tmp2;
-    const char *                   kind             = NULL;
-    const char *                   client_ip        = NULL;
-    const char *                   peer             = NULL;
-    const char *                   gateway_ip       = NULL;
-    const char *                   netmask          = NULL;
-    const char *                   client_hostname  = NULL;
-    const char *                   iface_spec       = NULL;
-    const char *                   mtu              = NULL;
-    const char *                   macaddr          = NULL;
-    int                            client_ip_family = AF_UNSPEC;
-    int                            client_ip_prefix = -1;
-    const char *                   dns[2]           = {
+    const char *                   kind                       = NULL;
+    const char *                   client_ip                  = NULL;
+    const char *                   peer                       = NULL;
+    const char *                   gateway_ip                 = NULL;
+    const char *                   netmask                    = NULL;
+    const char *                   client_hostname            = NULL;
+    const char *                   iface_spec                 = NULL;
+    const char *                   mtu                        = NULL;
+    const char *                   macaddr                    = NULL;
+    int                            client_ip_family           = AF_UNSPEC;
+    int                            client_ip_prefix           = -1;
+    gboolean                       clear_ip4_required_timeout = TRUE;
+    const char *                   dns[2]                     = {
         NULL,
         NULL,
     };
@@ -436,6 +439,7 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument)
                          "none",
                          "off",
                          "dhcp",
+                         "single-dhcp",
                          "on"
                          "any",
                          "dhcp6",
@@ -601,7 +605,7 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument)
                          NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
                          NULL);
         }
-    } else if (nm_streq0(kind, "dhcp")) {
+    } else if (NM_IN_STRSET(kind, "dhcp", "single-dhcp")) {
         g_object_set(s_ip4,
                      NM_SETTING_IP_CONFIG_METHOD,
                      NM_SETTING_IP4_CONFIG_METHOD_AUTO,
@@ -679,8 +683,13 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument)
                 g_clear_error(&error);
             }
         }
+    } else {
+        clear_ip4_required_timeout = FALSE;
     }
 
+    if (clear_ip4_required_timeout)
+        g_object_set(s_ip4, NM_SETTING_IP_CONFIG_REQUIRED_TIMEOUT, -1, NULL);
+
     if (peer && *peer)
         _LOGW(LOGD_CORE, "Ignoring peer: %s (not implemented)\n", peer);
 
@@ -908,6 +917,56 @@ reader_parse_vlan(Reader *reader, char *argument)
 }
 
 static void
+reader_parse_ib_pkey(Reader *reader, char *argument)
+{
+    NMConnection *       connection;
+    NMSettingInfiniband *s_ib;
+    char *               ifname;
+    gs_free char *       parent = NULL;
+    char *               pkey;
+    gint64               pkey_int;
+
+    /* At the moment we only support ib.pkey=<parent>.<pkey>;
+     * in the future we want to possibly support other options:
+     * ib.pkey=<parent>.<pkey>:<option>:...
+     */
+    ifname = get_word(&argument, ':');
+    if (!ifname) {
+        _LOGW(LOGD_CORE, "ib.pkey= without argument");
+        return;
+    }
+
+    parent = g_strdup(ifname);
+    pkey   = strchr(parent, '.');
+    if (!pkey) {
+        _LOGW(LOGD_CORE, "No pkey found for '%s'", ifname);
+        return;
+    }
+
+    *pkey = '\0';
+    pkey++;
+
+    pkey_int = _nm_utils_ascii_str_to_int64(pkey, 16, 0, 0xFFFF, -1);
+    if (pkey_int == -1) {
+        _LOGW(LOGD_CORE, "Invalid pkey '%s'", pkey);
+        return;
+    }
+
+    connection = reader_get_connection(reader, ifname, NM_SETTING_INFINIBAND_SETTING_NAME, TRUE);
+
+    s_ib = nm_connection_get_setting_infiniband(connection);
+    g_object_set(s_ib,
+                 NM_SETTING_INFINIBAND_PARENT,
+                 parent,
+                 NM_SETTING_INFINIBAND_P_KEY,
+                 (int) pkey_int,
+                 NULL);
+
+    if (argument && *argument)
+        _LOGW(LOGD_CORE, "Ignoring extra: '%s' for ib.pkey=", argument);
+}
+
+static void
 reader_parse_rd_znet(Reader *reader, char *argument, gboolean net_ifnames)
 {
     const char *    nettype;
@@ -998,6 +1057,65 @@ reader_parse_rd_znet(Reader *reader, char *argument, gboolean net_ifnames)
 }
 
 static void
+reader_parse_ethtool(Reader *reader, char *argument)
+{
+    const char *    interface   = NULL;
+    NMConnection *  connection  = NULL;
+    NMSettingWired *s_wired     = NULL;
+    const char *    autoneg_str = NULL;
+    gboolean        autoneg     = FALSE;
+    const char *    speed_str   = NULL;
+    guint           speed       = 0;
+
+    interface = get_word(&argument, ':');
+    if (!interface) {
+        _LOGW(LOGD_CORE, "Impossible to set rd.ethtool options: invalid format");
+        return;
+    }
+
+    if (!*argument) {
+        _LOGW(LOGD_CORE, "Could not find rd.ethtool options to set");
+        return;
+    }
+
+    connection = reader_get_connection(reader, interface, NM_SETTING_WIRED_SETTING_NAME, TRUE);
+    s_wired    = nm_connection_get_setting_wired(connection);
+
+    autoneg_str = get_word(&argument, ':');
+    if (autoneg_str) {
+        autoneg = _nm_utils_ascii_str_to_bool(autoneg_str, -1);
+        if (autoneg == -1)
+            _LOGW(LOGD_CORE,
+                  "Invalid value for rd.ethtool.autoneg, rd.ethtool.autoneg was not set");
+        else
+            g_object_set(s_wired, NM_SETTING_WIRED_AUTO_NEGOTIATE, autoneg, NULL);
+    }
+    if (!*argument)
+        return;
+
+    speed_str = get_word(&argument, ':');
+    if (speed_str) {
+        speed = _nm_utils_ascii_str_to_int64(speed_str, 10, 0, G_MAXUINT32, -1);
+        if (speed == -1)
+            _LOGW(LOGD_CORE, "Invalid value for rd.ethtool.speed, rd.ethtool.speed was not set");
+        else
+            g_object_set(s_wired,
+                         NM_SETTING_WIRED_SPEED,
+                         speed,
+                         NM_SETTING_WIRED_DUPLEX,
+                         "full",
+                         NULL);
+    }
+
+    if (!*argument)
+        return;
+    else
+        _LOGW(LOGD_CORE,
+              "Invalid extra argument '%s' for rd.ethtool, this value was not set",
+              argument);
+}
+
+static void
 _normalize_conn(gpointer key, gpointer value, gpointer user_data)
 {
     NMConnection *connection = value;
@@ -1062,7 +1180,7 @@ connection_set_needed(NMConnection *connection)
 
     g_object_set(s_con,
                  NM_SETTING_CONNECTION_WAIT_DEVICE_TIMEOUT,
-                 (int) NMI_WAIT_DEVICE_TIMEOUT_MS,
+                 (int) NMI_WAIT_DEVICE_TIMEOUT_MSEC,
                  NULL);
 }
 
@@ -1151,6 +1269,8 @@ nmi_cmdline_reader_parse(const char *       sysfs_dir,
             reader_parse_master(reader, argument, NM_SETTING_TEAM_SETTING_NAME, NULL);
         else if (nm_streq(tag, "vlan"))
             reader_parse_vlan(reader, argument);
+        else if (nm_streq(tag, "ib.pkey"))
+            reader_parse_ib_pkey(reader, argument);
         else if (nm_streq(tag, "bootdev")) {
             g_free(bootdev);
             bootdev = g_strdup(argument);
@@ -1176,7 +1296,8 @@ nmi_cmdline_reader_parse(const char *       sysfs_dir,
         } else if (g_ascii_strcasecmp(tag, "BOOTIF") == 0) {
             nm_clear_g_free(&bootif_val);
             bootif_val = g_strdup(argument);
-        }
+        } else if (nm_streq(tag, "rd.ethtool"))
+            reader_parse_ethtool(reader, argument);
     }
 
     for (i = 0; i < reader->vlan_parents->len; i++) {