From c056cb9306be29a2c194a308b3b6cc639980abe2 Mon Sep 17 00:00:00 2001 From: Antonio Cardace Date: Thu, 27 Aug 2020 17:43:54 +0200 Subject: initrd: parse 'rd.net.dhcp.vendor-class' kernel cmdline arg This arguments makes NM set the ipv4.dhcp-vendor-class-identifier property for all connections. https://bugzilla.redhat.com/show_bug.cgi?id=1872299 Signed-off-by: Antonio Cardace --- src/initrd/nmi-cmdline-reader.c | 6 +++++ src/initrd/tests/test-cmdline-reader.c | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c index be39ef896f..ba747b30ad 100644 --- a/src/initrd/nmi-cmdline-reader.c +++ b/src/initrd/nmi-cmdline-reader.c @@ -28,6 +28,7 @@ typedef struct { /* Parameters to be set for all connections */ gboolean ignore_auto_dns; int dhcp_timeout; + char *dhcp4_vci; } Reader; static Reader * @@ -52,6 +53,7 @@ reader_destroy (Reader *reader, gboolean free_hash) g_ptr_array_unref (reader->array); hash = g_steal_pointer (&reader->hash); nm_clear_g_free (&reader->hostname); + nm_clear_g_free (&reader->dhcp4_vci); nm_g_slice_free (reader); if (!free_hash) return g_steal_pointer (&hash); @@ -95,6 +97,7 @@ reader_create_connection (Reader *reader, NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE, NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, reader->ignore_auto_dns, NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, reader->dhcp_timeout, + NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER, reader->dhcp4_vci, NULL); setting = nm_setting_ip6_config_new (); @@ -927,6 +930,9 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv, char ** else if (nm_streq (tag, "rd.net.timeout.dhcp")) { reader->dhcp_timeout = _nm_utils_ascii_str_to_int64 (argument, 10, 0, G_MAXINT32, 0); + } 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); } } diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c index 7787cf5ea0..a909bc3802 100644 --- a/src/initrd/tests/test-cmdline-reader.c +++ b/src/initrd/tests/test-cmdline-reader.c @@ -1485,6 +1485,52 @@ test_bootif_off (void) g_assert_cmpstr (hostname, ==, NULL); } +static void +test_dhcp_vendor_class_id (void) +{ + gs_unref_hashtable GHashTable *connections = NULL; + const char *const*ARGV = NM_MAKE_STRV ("rd.net.dhcp.vendor-class=testvci", + "ip=eno1:dhcp"); + NMConnection *connection; + NMSettingIP4Config *s_ip4; + gs_free char *hostname = NULL; + gs_free char *vci_long = NULL; + char vci_arg_long[512] = {0}; + + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); + g_assert (connections); + g_assert_cmpint (g_hash_table_size (connections), ==, 1); + g_assert_cmpstr (hostname, ==, NULL); + + connection = g_hash_table_lookup (connections, "eno1"); + g_assert (connection); + nmtst_assert_connection_verifies_without_normalization (connection); + s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting_ip4_config (connection)); + g_assert_cmpstr (nm_setting_ip4_config_get_dhcp_vendor_class_identifier (s_ip4), ==, "testvci"); + + ARGV = NM_MAKE_STRV ("rd.net.dhcp.vendor-class", + "ip=eno1:dhcp"); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); + connection = g_hash_table_lookup (connections, "eno1"); + g_assert (connection); + nmtst_assert_connection_verifies_without_normalization (connection); + s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting_ip4_config (connection)); + g_assert (nm_setting_ip4_config_get_dhcp_vendor_class_identifier (s_ip4) == NULL); + + + + memset (vci_arg_long, 'A', 400); + vci_long = g_strdup_printf ("rd.net.dhcp.vendor-class=%s", vci_arg_long); + ARGV = NM_MAKE_STRV (vci_long, + "ip=eno1:dhcp"); + connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname); + connection = g_hash_table_lookup (connections, "eno1"); + g_assert (connection); + nmtst_assert_connection_verifies_without_normalization (connection); + s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting_ip4_config (connection)); + g_assert (nm_setting_ip4_config_get_dhcp_vendor_class_identifier (s_ip4) == NULL); +} + NMTST_DEFINE (); int main (int argc, char **argv) @@ -1521,6 +1567,7 @@ int main (int argc, char **argv) g_test_add_func ("/initrd/cmdline/bootif/hwtype", test_bootif_hwtype); g_test_add_func ("/initrd/cmdline/bootif/off", test_bootif_off); g_test_add_func ("/initrd/cmdline/neednet", test_neednet); + g_test_add_func ("/initrd/cmdline/dhcp/vendor_class_id", test_dhcp_vendor_class_id); return g_test_run (); } -- cgit v1.2.1