diff options
| author | Sebastien Bacher <seb128@ubuntu.com> | 2021-08-25 15:23:22 +0200 |
|---|---|---|
| committer | Sebastien Bacher <seb128@ubuntu.com> | 2021-08-25 15:23:22 +0200 |
| commit | cfb80376641fa49137b9996130352697e7f8b436 (patch) | |
| tree | 4ac3eb90a08f27a8bff2372052f8ae78f7e7c3aa /src/nm-initrd-generator/nmi-cmdline-reader.c | |
| parent | 35779c6675728fa6f0fd0a21cefb904408509c23 (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.c | 151 |
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++) { |