From 004980a38c78be5a11b789bc982c35ea44fb3af0 Mon Sep 17 00:00:00 2001 From: Jonas Jelten Date: Thu, 23 Jul 2020 21:42:56 +0200 Subject: [PATCH] initrd: add ip=... link6 mode for link-local only address assignment This is useful for bringing up the interface with a IPv6 link local address only during boot, e.g. to map a NBD device from a server that is connected directly, e.g. via thunderbolt. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/584 --- src/initrd/nmi-cmdline-reader.c | 18 ++++++++++++++++-- src/initrd/tests/test-cmdline-reader.c | 22 +++++++++++++++++++--- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c index 19e276792..662b98055 100644 --- a/src/initrd/nmi-cmdline-reader.c +++ b/src/initrd/nmi-cmdline-reader.c @@ -421,7 +421,7 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) tmp = get_word(&argument, ':'); if (!*argument) { - /* ip={dhcp|on|any|dhcp6|auto6|ibft} */ + /* ip={dhcp|on|any|dhcp6|auto6|link6|ibft} */ kind = tmp; } else { tmp2 = get_word(&argument, ':'); @@ -434,8 +434,9 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) "dhcp6", "auto", "auto6", + "link6", "ibft")) { - /* :{none|off|dhcp|on|any|dhcp6|auto|auto6|ibft} */ + /* :{none|off|dhcp|on|any|dhcp6|auto|auto6|link6|ibft} */ iface_spec = tmp; kind = tmp2; } else { @@ -603,6 +604,19 @@ reader_parse_ip(Reader *reader, const char *sysfs_dir, char *argument) NM_SETTING_IP4_CONFIG_METHOD_DISABLED, NULL); } + } else if (nm_streq0(kind, "link6")) { + g_object_set(s_ip6, + NM_SETTING_IP_CONFIG_METHOD, + NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL, + 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, + NM_SETTING_IP4_CONFIG_METHOD_DISABLED, + NULL); + } } else if (nm_streq0(kind, "ibft")) { NMSettingWired *s_wired; const char * mac = NULL; diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c index 737e839c2..1dc0988e3 100644 --- a/src/initrd/tests/test-cmdline-reader.c +++ b/src/initrd/tests/test-cmdline-reader.c @@ -568,15 +568,20 @@ static void test_multiple_bootdev(void) { gs_unref_hashtable GHashTable *connections = NULL; - const char *const * ARGV = - NM_MAKE_STRV("nameserver=1.2.3.4", "ip=eth3:auto6", "ip=eth4:dhcp", "bootdev=eth4"); + + const char *const *ARGV = NM_MAKE_STRV("nameserver=1.2.3.4", + "ip=eth3:auto6", + "ip=eth4:dhcp", + "ip=eth5:link6", + "bootdev=eth4"); + NMConnection * connection; NMSettingConnection *s_con; NMSettingIPConfig * s_ip4; NMSettingIPConfig * s_ip6; connections = _parse_cons(ARGV); - g_assert_cmpint(g_hash_table_size(connections), ==, 2); + g_assert_cmpint(g_hash_table_size(connections), ==, 3); connection = g_hash_table_lookup(connections, "eth3"); g_assert(connection); @@ -599,6 +604,17 @@ test_multiple_bootdev(void) g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 1); g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip4, 0), ==, "1.2.3.4"); + + connection = g_hash_table_lookup(connections, "eth5"); + g_assert(connection); + s_con = nm_connection_get_setting_connection(connection); + g_assert(s_con); + g_assert_cmpint(nm_setting_connection_get_wait_device_timeout(s_con), ==, -1); + s_ip6 = nm_connection_get_setting_ip6_config(connection); + g_assert(s_ip6); + g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), + ==, + NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL); } static void