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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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 ();
|
||||
}
|
||||
|
Reference in New Issue
Block a user