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 <acardace@redhat.com>
This commit is contained in:
Antonio Cardace
2020-08-27 17:43:54 +02:00
parent 5cca669ff3
commit c056cb9306
2 changed files with 53 additions and 0 deletions

View File

@@ -28,6 +28,7 @@ typedef struct {
/* Parameters to be set for all connections */ /* Parameters to be set for all connections */
gboolean ignore_auto_dns; gboolean ignore_auto_dns;
int dhcp_timeout; int dhcp_timeout;
char *dhcp4_vci;
} Reader; } Reader;
static Reader * static Reader *
@@ -52,6 +53,7 @@ reader_destroy (Reader *reader, gboolean free_hash)
g_ptr_array_unref (reader->array); g_ptr_array_unref (reader->array);
hash = g_steal_pointer (&reader->hash); hash = g_steal_pointer (&reader->hash);
nm_clear_g_free (&reader->hostname); nm_clear_g_free (&reader->hostname);
nm_clear_g_free (&reader->dhcp4_vci);
nm_g_slice_free (reader); nm_g_slice_free (reader);
if (!free_hash) if (!free_hash)
return g_steal_pointer (&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_MAY_FAIL, TRUE,
NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, reader->ignore_auto_dns, NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, reader->ignore_auto_dns,
NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, reader->dhcp_timeout, NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, reader->dhcp_timeout,
NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER, reader->dhcp4_vci,
NULL); NULL);
setting = nm_setting_ip6_config_new (); 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")) { else if (nm_streq (tag, "rd.net.timeout.dhcp")) {
reader->dhcp_timeout = _nm_utils_ascii_str_to_int64 (argument, reader->dhcp_timeout = _nm_utils_ascii_str_to_int64 (argument,
10, 0, G_MAXINT32, 0); 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);
} }
} }

View File

@@ -1485,6 +1485,52 @@ test_bootif_off (void)
g_assert_cmpstr (hostname, ==, NULL); 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 (); NMTST_DEFINE ();
int main (int argc, char **argv) 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/hwtype", test_bootif_hwtype);
g_test_add_func ("/initrd/cmdline/bootif/off", test_bootif_off); 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/neednet", test_neednet);
g_test_add_func ("/initrd/cmdline/dhcp/vendor_class_id", test_dhcp_vendor_class_id);
return g_test_run (); return g_test_run ();
} }