summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2021-02-12 09:56:36 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2021-02-17 11:20:18 +0100
commit099ce63888013e82c0f369b02a8f27a0b31813a6 (patch)
tree54b153db49993f8b0a1935e617d4affbd3d1b74c
parent97833237bf38347c75022eb380208d99e1df9d5f (diff)
downloadNetworkManager-bg/initrd-timeout.tar.gz
initrd: support the rd.net.dhcp.retry argumentbg/initrd-timeout
Since we always set autoconnect-retries=1, use the value of rd.net.dhcp.retry as a multiplier for the DHCP timeout.
-rw-r--r--src/core/initrd/nmi-cmdline-reader.c14
-rw-r--r--src/core/initrd/tests/test-cmdline-reader.c4
2 files changed, 14 insertions, 4 deletions
diff --git a/src/core/initrd/nmi-cmdline-reader.c b/src/core/initrd/nmi-cmdline-reader.c
index 8d1c27890c..1a95e4f7dd 100644
--- a/src/core/initrd/nmi-cmdline-reader.c
+++ b/src/core/initrd/nmi-cmdline-reader.c
@@ -53,7 +53,6 @@ reader_new(void)
g_hash_table_new_full(nm_direct_hash, NULL, g_object_unref, NULL),
.vlan_parents = g_ptr_array_new_with_free_func(g_free),
.array = g_ptr_array_new(),
- .dhcp_timeout = 90,
};
return reader;
@@ -1061,6 +1060,8 @@ nmi_cmdline_reader_parse(const char * sysfs_dir,
gs_unref_ptrarray GPtrArray *routes = NULL;
gs_unref_ptrarray GPtrArray *znets = NULL;
int i;
+ guint64 dhcp_timeout = 90;
+ guint64 dhcp_num_tries = 1;
reader = reader_new();
@@ -1079,11 +1080,14 @@ nmi_cmdline_reader_parse(const char * sysfs_dir,
reader->ignore_auto_dns = !_nm_utils_ascii_str_to_bool(argument, TRUE);
else if (nm_streq(tag, "rd.net.timeout.dhcp")) {
if (nm_streq0(argument, "infinity")) {
- reader->dhcp_timeout = G_MAXINT32;
+ dhcp_timeout = G_MAXINT32;
} else {
- reader->dhcp_timeout =
- _nm_utils_ascii_str_to_int64(argument, 10, 1, G_MAXINT32, reader->dhcp_timeout);
+ dhcp_timeout =
+ _nm_utils_ascii_str_to_int64(argument, 10, 1, G_MAXINT32, dhcp_timeout);
}
+ } else if (nm_streq(tag, "rd.net.dhcp.retry")) {
+ dhcp_num_tries =
+ _nm_utils_ascii_str_to_int64(argument, 10, 1, G_MAXINT32, dhcp_num_tries);
} else if (nm_streq(tag, "rd.net.dhcp.vendor-class")) {
if (nm_utils_validate_dhcp4_vendor_class_id(argument, NULL))
nm_utils_strdup_reset(&reader->dhcp4_vci, argument);
@@ -1093,6 +1097,8 @@ nmi_cmdline_reader_parse(const char * sysfs_dir,
}
}
+ reader->dhcp_timeout = NM_CLAMP(dhcp_timeout * dhcp_num_tries, 1, G_MAXINT32);
+
for (i = 0; argv[i]; i++) {
gs_free char *argument_clone = NULL;
char * argument;
diff --git a/src/core/initrd/tests/test-cmdline-reader.c b/src/core/initrd/tests/test-cmdline-reader.c
index 6795e32d37..33fb22d364 100644
--- a/src/core/initrd/tests/test-cmdline-reader.c
+++ b/src/core/initrd/tests/test-cmdline-reader.c
@@ -240,7 +240,11 @@ test_dhcp_timeout(void)
{NM_MAKE_STRV("ip=dhcp", "rd.net.timeout.dhcp=0"), 90},
{NM_MAKE_STRV("ip=dhcp", "rd.net.timeout.dhcp=foobar"), 90},
{NM_MAKE_STRV("ip=dhcp", "rd.net.timeout.dhcp=42"), 42},
+ {NM_MAKE_STRV("ip=dhcp", "rd.net.dhcp.retry=2"), 180},
+ {NM_MAKE_STRV("ip=dhcp", "rd.net.dhcp.retry=3", "rd.net.timeout.dhcp=40"), 120},
{NM_MAKE_STRV("ip=dhcp", "rd.net.timeout.dhcp=infinity"), G_MAXINT32},
+ {NM_MAKE_STRV("ip=dhcp", "rd.net.timeout.dhcp=infinity", "rd.net.dhcp.retry=100"),
+ G_MAXINT32},
};
guint i;