summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cardace <acardace@redhat.com>2020-08-27 17:43:54 +0200
committerAntonio Cardace <acardace@redhat.com>2020-09-01 11:14:46 +0200
commitc056cb9306be29a2c194a308b3b6cc639980abe2 (patch)
treeea11cb26b33cc3d2df6a7f48f76a618d30044f42
parent5cca669ff39c6909be906e8974e424ffd2ea42c2 (diff)
downloadNetworkManager-ac/dhcpclass-initrd.tar.gz
initrd: parse 'rd.net.dhcp.vendor-class' kernel cmdline argac/dhcpclass-initrd
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>
-rw-r--r--src/initrd/nmi-cmdline-reader.c6
-rw-r--r--src/initrd/tests/test-cmdline-reader.c47
2 files changed, 53 insertions, 0 deletions
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 ();
}