diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c index bafad0418..68fe7004e 100644 --- a/src/nm-initrd-generator/nmi-cmdline-reader.c +++ b/src/nm-initrd-generator/nmi-cmdline-reader.c @@ -1274,7 +1274,39 @@ reader_parse_ethtool(Reader *reader, char *argument) static void _normalize_conn(gpointer key, gpointer value, gpointer user_data) { - NMConnection *connection = value; + NMConnection *connection = value; + NMSettingIPConfig *s_ip4 = NULL, *s_ip6 = NULL; + + s_ip4 = nm_connection_get_setting_ip4_config(connection); + if (s_ip4) { + const char *method = nm_setting_ip_config_get_method(s_ip4); + + if (!nm_streq(method, NM_SETTING_IP4_CONFIG_METHOD_AUTO)) { + g_object_set(s_ip4, + NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, + NULL, + NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, + NULL, + NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER, + NULL, + NULL); + } + } + + s_ip6 = nm_connection_get_setting_ip6_config(connection); + if (s_ip6) { + const char *method = nm_setting_ip_config_get_method(s_ip6); + + if (!nm_streq(method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) + && !nm_streq(method, NM_SETTING_IP6_CONFIG_METHOD_DHCP)) { + g_object_set(s_ip6, + NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, + NULL, + NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, + NULL, + NULL); + } + } nm_connection_normalize(connection, NULL, NULL, NULL); } diff --git a/src/nm-initrd-generator/tests/test-cmdline-reader.c b/src/nm-initrd-generator/tests/test-cmdline-reader.c index 2dfc23a36..7124d74ed 100644 --- a/src/nm-initrd-generator/tests/test-cmdline-reader.c +++ b/src/nm-initrd-generator/tests/test-cmdline-reader.c @@ -399,6 +399,7 @@ test_if_auto_with_mtu_and_mac(void) g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_DISABLED); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, NULL); g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4)); s_ip6 = nm_connection_get_setting_ip6_config(connection); @@ -451,7 +452,7 @@ test_if_ip4_manual(void) g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "192.0.2.2"); g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 24); g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "192.0.2.1"); - g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "hostname0.example.com"); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, NULL); g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip4), ==, -1); s_ip6 = nm_connection_get_setting_ip6_config(connection); @@ -459,6 +460,7 @@ test_if_ip4_manual(void) g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_DISABLED); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, NULL); g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip6), ==, -1); @@ -480,7 +482,7 @@ test_if_ip4_manual(void) g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "203.0.113.2"); g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 26); g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "203.0.113.1"); - g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "hostname1.example.com"); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, NULL); s_ip6 = nm_connection_get_setting_ip6_config(connection); g_assert(s_ip6); @@ -488,6 +490,59 @@ test_if_ip4_manual(void) g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); } +static void +test_if_ip4_auto(void) +{ + gs_unref_hashtable GHashTable *connections = NULL; + const char *const *ARGV = NM_MAKE_STRV("ip=172.25.1.1::172.25.1.2:24:" + "myhostname:eth0:dhcp", + "rd.net.timeout.dhcp=10"); + NMConnection *connection; + NMSettingConnection *s_con; + NMSettingIPConfig *s_ip4; + NMSettingIPConfig *s_ip6; + NMIPAddress *ip_addr; + gs_free char *hostname = NULL; + gint64 carrier_timeout_sec = 0; + + connections = _parse(ARGV, &hostname, &carrier_timeout_sec); + g_assert_cmpint(g_hash_table_size(connections), ==, 1); + g_assert_cmpstr(hostname, ==, "myhostname"); + g_assert_cmpint(carrier_timeout_sec, ==, 0); + + connection = g_hash_table_lookup(connections, "eth0"); + nmtst_assert_connection_verifies_without_normalization(connection); + g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth0"); + + 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_ip4 = nm_connection_get_setting_ip4_config(connection); + g_assert(s_ip4); + g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); + g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4)); + g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0); + g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip4), ==, 0); + g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip4), ==, 1); + g_assert_cmpint(nm_setting_ip_config_get_dhcp_timeout(s_ip4), ==, 10); + g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip4), ==, "172.25.1.2"); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "myhostname"); + + ip_addr = nm_setting_ip_config_get_address(s_ip4, 0); + g_assert(ip_addr); + g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "172.25.1.1"); + g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 24); + + 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_AUTO); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, "myhostname"); + g_assert(nm_setting_ip_config_get_may_fail(s_ip6)); + g_assert_cmpint(nm_setting_ip_config_get_dhcp_timeout(s_ip6), ==, 10); + g_assert_cmpint(nm_setting_ip_config_get_required_timeout(s_ip6), ==, -1); +} + static void test_if_ip4_manual_no_dev(void) { @@ -535,6 +590,7 @@ test_if_ip6_manual(void) const char *const *ARGV = NM_MAKE_STRV("ip=[2001:0db8::02]/64::[2001:0db8::01]::" "hostname0.example.com:eth4::[2001:0db8::53]"); NMConnection *connection; + NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; NMIPAddress *ip_addr; gs_free char *hostname = NULL; @@ -549,6 +605,11 @@ test_if_ip6_manual(void) nmtst_assert_connection_verifies_without_normalization(connection); g_assert_cmpstr(nm_connection_get_id(connection), ==, "eth4"); + s_ip4 = nm_connection_get_setting_ip4_config(connection); + g_assert(s_ip4); + g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "hostname0.example.com"); + s_ip6 = nm_connection_get_setting_ip6_config(connection); g_assert(s_ip6); g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), @@ -564,7 +625,7 @@ test_if_ip6_manual(void) g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "2001:db8::2"); g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 64); g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip6), ==, "2001:db8::1"); - g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, "hostname0.example.com"); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, NULL); } static void @@ -616,6 +677,7 @@ test_if_mac_ifname(void) const char *const *ARGV = NM_MAKE_STRV("ip=[2001:0db8::42]/64::[2001:0db8::01]::" "hostname0:00-11-22-33-44-55::[2001:0db8::53]"); NMConnection *connection; + NMSettingIPConfig *s_ip4; NMSettingIPConfig *s_ip6; NMSettingWired *s_wired; NMIPAddress *ip_addr; @@ -636,6 +698,11 @@ test_if_mac_ifname(void) g_assert(s_wired); g_assert_cmpstr(nm_setting_wired_get_mac_address(s_wired), ==, "00:11:22:33:44:55"); + s_ip4 = nm_connection_get_setting_ip4_config(connection); + g_assert(s_ip4); + g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, "hostname0"); + s_ip6 = nm_connection_get_setting_ip6_config(connection); g_assert(s_ip6); g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), @@ -646,12 +713,13 @@ test_if_mac_ifname(void) g_assert_cmpstr(nm_setting_ip_config_get_dns(s_ip6, 0), ==, "2001:db8::53"); g_assert_cmpint(nm_setting_ip_config_get_num_routes(s_ip6), ==, 0); g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip6), ==, 1); + g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip6), ==, "2001:db8::1"); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, NULL); + ip_addr = nm_setting_ip_config_get_address(s_ip6, 0); g_assert(ip_addr); g_assert_cmpstr(nm_ip_address_get_address(ip_addr), ==, "2001:db8::42"); g_assert_cmpint(nm_ip_address_get_prefix(ip_addr), ==, 64); - g_assert_cmpstr(nm_setting_ip_config_get_gateway(s_ip6), ==, "2001:db8::1"); - g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, "hostname0"); } static void @@ -1040,6 +1108,7 @@ test_bond_ip(void) g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_DISABLED); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip6), ==, NULL); g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip6)); g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip6), ==, 0); g_assert(!nm_setting_ip_config_get_gateway(s_ip6)); @@ -1403,6 +1472,7 @@ test_team(void) g_assert_cmpstr(nm_setting_ip_config_get_method(s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_DISABLED); + g_assert_cmpstr(nm_setting_ip_config_get_dhcp_hostname(s_ip4), ==, NULL); g_assert(!nm_setting_ip_config_get_ignore_auto_dns(s_ip4)); g_assert_cmpint(nm_setting_ip_config_get_num_dns(s_ip4), ==, 0); g_assert(!nm_setting_ip_config_get_gateway(s_ip4)); @@ -2551,6 +2621,7 @@ main(int argc, char **argv) g_test_add_func("/initrd/cmdline/if_dhcp6", test_if_dhcp6); g_test_add_func("/initrd/cmdline/if_auto_with_mtu_and_mac", test_if_auto_with_mtu_and_mac); g_test_add_func("/initrd/cmdline/if_ip4_manual", test_if_ip4_manual); + g_test_add_func("/initrd/cmdline/if_ip4_auto", test_if_ip4_auto); g_test_add_func("/initrd/cmdline/if_ip4_manual_no_dev", test_if_ip4_manual_no_dev); g_test_add_func("/initrd/cmdline/if_ip6_manual", test_if_ip6_manual); g_test_add_func("/initrd/cmdline/if_mac_ifname", test_if_mac_ifname);