about summary refs log tree commit diff
path: root/src/initrd
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2020-01-31 12:10:14 +0100
committerMichael Biebl <biebl@debian.org>2020-01-31 12:10:14 +0100
commitf3c6d0765dff885e168b94f28e06ecc640315a74 (patch)
tree30d67309f4d9b48ad269dfad6e80e5c15373ea75 /src/initrd
parent90c93214efba0966274224a93a77d235d4f8c034 (diff)
New upstream version 1.22.6 upstream/1.22.6
Diffstat (limited to 'src/initrd')
-rw-r--r--src/initrd/nmi-cmdline-reader.c85
-rw-r--r--src/initrd/nmi-ibft-reader.c1
-rw-r--r--src/initrd/tests/test-cmdline-reader.c46
-rw-r--r--src/initrd/tests/test-ibft-reader.c3
4 files changed, 92 insertions, 43 deletions
diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c
index c32ef1cf..2cb93a2d 100644
--- a/src/initrd/nmi-cmdline-reader.c
+++ b/src/initrd/nmi-cmdline-reader.c
@@ -195,6 +195,47 @@ _base_setting_set (NMConnection *connection, const char *property, const char *v
 }
 
 static void
+read_all_connections_from_fw (GHashTable *connections, const char *sysfs_dir)
+{
+	gs_unref_hashtable GHashTable *ibft = NULL;
+	NMConnection *connection;
+	GHashTableIter iter;
+	const char *mac;
+	GHashTable *nic;
+	const char *index;
+	GError *error = NULL;
+
+	ibft = nmi_ibft_read (sysfs_dir);
+
+	g_hash_table_iter_init (&iter, ibft);
+	while (g_hash_table_iter_next (&iter, (gpointer *) &mac, (gpointer *) &nic)) {
+		connection = nm_simple_connection_new ();
+
+		index = g_hash_table_lookup (nic, "index");
+		if (!index) {
+			_LOGW (LOGD_CORE, "Ignoring an iBFT entry without an index");
+			continue;
+		}
+
+		if (!nmi_ibft_update_connection_from_nic (connection, nic, &error)) {
+			_LOGW (LOGD_CORE, "Unable to merge iBFT configuration: %s", error->message);
+			g_error_free (error);
+		}
+
+		g_hash_table_insert (connections,
+		                     g_strdup_printf ("ibft%s", index),
+		                     connection);
+	}
+
+	connection = nmi_dt_reader_parse (sysfs_dir);
+	if (connection) {
+		g_hash_table_insert (connections,
+		                     g_strdup ("ofw"),
+		                     connection);
+	}
+}
+
+static void
 parse_ip (GHashTable *connections, const char *sysfs_dir, char *argument)
 {
 	NMConnection *connection;
@@ -258,44 +299,7 @@ parse_ip (GHashTable *connections, const char *sysfs_dir, char *argument)
 
 	if (ifname == NULL && (   g_strcmp0 (kind, "fw") == 0
 	                       || g_strcmp0 (kind, "ibft") == 0)) {
-		GHashTableIter iter;
-		const char *mac;
-		GHashTable *nic;
-		const char *index;
-
-		/* This is the ip=ibft case. Just take all we got from iBFT
-		 * and don't process anything else, since there's no ifname
-		 * specified to apply it to. */
-		if (!ibft)
-			ibft = nmi_ibft_read (sysfs_dir);
-
-		g_hash_table_iter_init (&iter, ibft);
-		while (g_hash_table_iter_next (&iter, (gpointer)&mac, (gpointer)&nic)) {
-			connection = nm_simple_connection_new ();
-
-			index = g_hash_table_lookup (nic, "index");
-			if (!index) {
-				_LOGW (LOGD_CORE, "Ignoring an iBFT entry without an index");
-				continue;
-			}
-
-			if (!nmi_ibft_update_connection_from_nic (connection, nic, &error)) {
-				_LOGW (LOGD_CORE, "Unable to merge iBFT configuration: %s", error->message);
-				g_error_free (error);
-			}
-
-			g_hash_table_insert (connections,
-			                     g_strdup_printf ("ibft%s", index),
-			                     connection);
-		}
-
-		connection = nmi_dt_reader_parse (sysfs_dir);
-		if (connection) {
-			g_hash_table_insert (connections,
-			                     g_strdup ("ofw"),
-			                     connection);
-		}
-
+		read_all_connections_from_fw (connections, sysfs_dir);
 		return;
 	}
 
@@ -421,8 +425,7 @@ parse_ip (GHashTable *connections, const char *sysfs_dir, char *argument)
 		if (mac) {
 			g_strchomp (mac);
 			mac_up = g_ascii_strup (mac, -1);
-			if (!ibft)
-				ibft = nmi_ibft_read (sysfs_dir);
+			ibft = nmi_ibft_read (sysfs_dir);
 			nic = g_hash_table_lookup (ibft, mac_up);
 			if (!nic)
 				_LOGW (LOGD_CORE, "No iBFT NIC for %s (%s)", ifname, mac_up);
@@ -838,6 +841,8 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv)
 			parse_nameserver (connections, argument);
 		else if (strcmp (tag, "rd.peerdns") == 0)
 			parse_rd_peerdns (connections, argument);
+		else if (strcmp (tag, "rd.iscsi.ibft") == 0 && _nm_utils_ascii_str_to_bool (argument, TRUE))
+			read_all_connections_from_fw (connections, sysfs_dir);
 		else if (strcmp (tag, "rd.bootif") == 0)
 			ignore_bootif = !_nm_utils_ascii_str_to_bool (argument, TRUE);
 		else if (strcmp (tag, "rd.neednet") == 0)
diff --git a/src/initrd/nmi-ibft-reader.c b/src/initrd/nmi-ibft-reader.c
index ffce98fc..47b90ebf 100644
--- a/src/initrd/nmi-ibft-reader.c
+++ b/src/initrd/nmi-ibft-reader.c
@@ -296,6 +296,7 @@ connection_setting_add (GHashTable *nic,
 	              NM_SETTING_CONNECTION_TYPE, type,
 	              NM_SETTING_CONNECTION_UUID, uuid,
 	              NM_SETTING_CONNECTION_ID, id,
+	              NM_SETTING_CONNECTION_INTERFACE_NAME, NULL,
 	              NULL);
 
 	g_free (uuid);
diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c
index 1d4bb9a6..8951e491 100644
--- a/src/initrd/tests/test-cmdline-reader.c
+++ b/src/initrd/tests/test-cmdline-reader.c
@@ -768,10 +768,30 @@ test_team (void)
 }
 
 static void
-test_ibft (void)
+test_ibft_ip_dev (void)
+{
+	const char *const*ARGV = NM_MAKE_STRV ("ip=eth0:ibft");
+	gs_unref_hashtable GHashTable *connections = NULL;
+	NMSettingConnection *s_con;
+	NMConnection *connection;
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 1);
+
+	connection = g_hash_table_lookup (connections, "eth0");
+	g_assert (connection);
+
+	s_con = nm_connection_get_setting_connection (connection);
+	g_assert (s_con);
+	g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con), ==, NM_SETTING_VLAN_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, NULL);
+}
+
+static void
+_test_ibft_ip (const char *const*ARGV)
 {
 	gs_unref_hashtable GHashTable *connections = NULL;
-	const char *const*ARGV = NM_MAKE_STRV ("ip=ibft");
 	NMConnection *connection;
 
 	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV);
@@ -782,11 +802,29 @@ test_ibft (void)
 	g_assert (connection);
 	nmtst_assert_connection_verifies_without_normalization (connection);
 	g_assert_cmpstr (nm_connection_get_id (connection), ==, "iBFT VLAN Connection 0");
+	g_assert_cmpstr (nm_connection_get_interface_name (connection), ==, NULL);
 
 	connection = g_hash_table_lookup (connections, "ibft2");
 	g_assert (connection);
 	nmtst_assert_connection_verifies_without_normalization (connection);
 	g_assert_cmpstr (nm_connection_get_id (connection), ==, "iBFT Connection 2");
+	g_assert_cmpstr (nm_connection_get_interface_name (connection), ==, NULL);
+}
+
+static void
+test_ibft_ip (void)
+{
+	const char *const*ARGV = NM_MAKE_STRV ("ip=ibft");
+
+	_test_ibft_ip (ARGV);
+}
+
+static void
+test_ibft_rd_iscsi_ibft (void)
+{
+	const char *const*ARGV = NM_MAKE_STRV ("rd.iscsi.ibft");
+
+	_test_ibft_ip (ARGV);
 }
 
 static void
@@ -1045,7 +1083,9 @@ int main (int argc, char **argv)
 	g_test_add_func ("/initrd/cmdline/team", test_team);
 	g_test_add_func ("/initrd/cmdline/bridge", test_bridge);
 	g_test_add_func ("/initrd/cmdline/bridge/default", test_bridge_default);
-	g_test_add_func ("/initrd/cmdline/ibft", test_ibft);
+	g_test_add_func ("/initrd/cmdline/ibft/ip_dev", test_ibft_ip_dev);
+	g_test_add_func ("/initrd/cmdline/ibft/ip", test_ibft_ip);
+	g_test_add_func ("/initrd/cmdline/ibft/rd_iscsi_ibft", test_ibft_rd_iscsi_ibft);
 	g_test_add_func ("/initrd/cmdline/ignore_extra", test_ignore_extra);
 	g_test_add_func ("/initrd/cmdline/rd_znet", test_rd_znet);
 	g_test_add_func ("/initrd/cmdline/rd_znet/legacy", test_rd_znet_legacy);
diff --git a/src/initrd/tests/test-ibft-reader.c b/src/initrd/tests/test-ibft-reader.c
index 932c1a48..f7709543 100644
--- a/src/initrd/tests/test-ibft-reader.c
+++ b/src/initrd/tests/test-ibft-reader.c
@@ -65,6 +65,7 @@ test_read_ibft_dhcp (void)
 	g_assert (s_con);
 	g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con), ==, NM_SETTING_WIRED_SETTING_NAME);
 	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "iBFT Connection 1");
+	g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, NULL);
 	g_assert_cmpint (nm_setting_connection_get_timestamp (s_con), ==, 0);
 	g_assert (nm_setting_connection_get_autoconnect (s_con));
 
@@ -109,6 +110,7 @@ test_read_ibft_static (void)
 	g_assert (s_con);
 	g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con), ==, NM_SETTING_WIRED_SETTING_NAME);
 	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "iBFT Connection 0");
+	g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, NULL);
 	g_assert_cmpint (nm_setting_connection_get_timestamp (s_con), ==, 0);
 	g_assert (nm_setting_connection_get_autoconnect (s_con));
 
@@ -178,6 +180,7 @@ test_read_ibft_vlan (void)
 	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 	g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con), ==, NM_SETTING_VLAN_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, NULL);
 
 	/* ===== WIRED SETTING ===== */
 	s_wired = nm_connection_get_setting_wired (connection);