summary refs log tree commit diff
path: root/src/initrd
diff options
context:
space:
mode:
Diffstat (limited to 'src/initrd')
-rw-r--r--src/initrd/nm-initrd-generator.c139
-rw-r--r--src/initrd/nm-initrd-generator.h45
-rw-r--r--src/initrd/nmi-cmdline-reader.c714
-rw-r--r--src/initrd/nmi-ibft-reader.c441
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port1
-rw-r--r--src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port1
-rw-r--r--src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/class/net/eth0/address1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port1
-rw-r--r--src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port1
-rw-r--r--src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name1
-rw-r--r--src/initrd/tests/sysfs-dhcp/class/net/eth0/address1
-rw-r--r--src/initrd/tests/sysfs-dhcp/class/net/eth1/address1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port1
-rw-r--r--src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name1
-rw-r--r--src/initrd/tests/sysfs-static/class/net/eth0/address1
-rw-r--r--src/initrd/tests/sysfs-static/class/net/eth1/address1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target0/index1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target0/lun1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target0/port1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target0/target-name1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target1/index1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target1/lun1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target1/port1
-rw-r--r--src/initrd/tests/sysfs-static/firmware/ibft/target1/target-name1
-rw-r--r--src/initrd/tests/sysfs-vlan/class/net/eth0/address1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/target0/index1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/target0/port1
-rw-r--r--src/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name1
-rw-r--r--src/initrd/tests/sysfs/class/net/eth0/address1
-rw-r--r--src/initrd/tests/sysfs/class/net/eth2/address1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/acpi_header/signature1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/flags1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/index1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/mac1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/origin1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/flags1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/index1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/mac1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/origin1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/initiator/flags1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/initiator/index1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/initiator/isns-server1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/initiator/slp-server1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target0/chap-type1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target0/flags1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target0/index1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target0/ip-addr1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target0/lun1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target0/port1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target2/chap-type1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target2/flags1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target2/index1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target2/ip-addr1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target2/lun1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target2/port1
-rw-r--r--src/initrd/tests/sysfs/firmware/ibft/target2/target-name1
-rw-r--r--src/initrd/tests/test-cmdline-reader.c787
-rw-r--r--src/initrd/tests/test-ibft-reader.c286
198 files changed, 2604 insertions, 0 deletions
diff --git a/src/initrd/nm-initrd-generator.c b/src/initrd/nm-initrd-generator.c
new file mode 100644
index 00000000..eb9a38df
--- /dev/null
+++ b/src/initrd/nm-initrd-generator.c
@@ -0,0 +1,139 @@
+/* NetworkManager initrd configuration generator
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2018 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+#include "nm-core-utils.h"
+#include "nm-core-internal.h"
+#include "nm-keyfile-internal.h"
+#include "nm-initrd-generator.h"
+#include "nm-utils/nm-io-utils.h"
+
+/*****************************************************************************/
+
+#define _NMLOG(level, domain, ...) \
+    nm_log ((level), (domain), NULL, NULL, \
+            "initrd-generator: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__) \
+            _NM_UTILS_MACRO_REST (__VA_ARGS__))
+
+/*****************************************************************************/
+
+static void
+output_conn (gpointer key, gpointer value, gpointer user_data)
+{
+	const char *basename = key;
+	NMConnection *connection = value;
+	char *connections_dir = user_data;
+	GKeyFile *file;
+	gs_free char *data = NULL;
+	GError *error = NULL;
+	gsize len;
+
+	if (!nm_connection_normalize (connection, NULL, NULL, &error)) {
+		g_print ("%s\n", error->message);
+		g_error_free (error);
+		return;
+	}
+
+	file = nm_keyfile_write (connection, NULL, NULL, &error);
+	if (file == NULL) {
+		g_print ("%s\n", error->message);
+		g_error_free (error);
+		return;
+	}
+
+	data = g_key_file_to_data (file, &len, &error);
+	if (!data) {
+		g_print ("%s\n", error->message);
+		g_error_free (error);
+	} else if (connections_dir) {
+		gs_free char *basename_w_ext = g_strconcat (basename, ".nmconnection", NULL);
+		char *filename = g_build_filename (connections_dir, basename_w_ext, NULL);
+
+		if (!nm_utils_file_set_contents (filename, data, len, 0600, &error)) {
+			g_print ("%s\n", error->message);
+			g_error_free (error);
+		}
+		g_free (filename);
+	} else {
+		g_print ("\n*** Connection '%s' ***\n\n%s\n", basename, data);
+	}
+
+	g_key_file_free (file);
+}
+
+#define DEFAULT_CONNECTIONS_DIR  NMRUNDIR "/system-connections"
+#define DEFAULT_SYSFS_DIR        "/sys"
+
+int
+main (int argc, char *argv[])
+{
+	GHashTable *connections;
+	gs_free char *connections_dir = NULL;
+	gs_free char *sysfs_dir = NULL;
+	gboolean dump_to_stdout = FALSE;
+	gs_strfreev char **remaining = NULL;
+	GOptionEntry option_entries[] = {
+		{ "connections-dir", 'c', 0, G_OPTION_ARG_FILENAME, &connections_dir, "Output connection directory", DEFAULT_CONNECTIONS_DIR },
+		{ "sysfs-dir", 'd', 0, G_OPTION_ARG_FILENAME, &sysfs_dir, "The sysfs mount point", DEFAULT_SYSFS_DIR },
+		{ "stdout", 's', 0, G_OPTION_ARG_NONE, &dump_to_stdout, "Dump connections to standard output", NULL },
+		{ G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL },
+		{ NULL }
+	};
+	GOptionContext *option_context;
+	GError *error = NULL;
+
+	option_context = g_option_context_new ("-- [ip=...] [rd.route=...] [bridge=...] [bond=...] [team=...] [vlan=...] "
+	                                       "[bootdev=...] [nameserver=...] [rd.peerdns=...] [rd.bootif=...] [BOOTIF=...] ... ");
+
+	g_option_context_set_summary (option_context, "Generate early NetworkManager configuration.");
+	g_option_context_set_description (option_context,
+		"This tool scans the command line for options relevant to network\n"
+		"configuration and creates configuration files for an early instance\n"
+		"of NetworkManager run from the initial ramdisk during early boot.");
+	g_option_context_add_main_entries (option_context, option_entries, GETTEXT_PACKAGE);
+
+	if (!g_option_context_parse (option_context, &argc, &argv, &error)) {
+		_LOGW (LOGD_CORE, "%s\n", error->message);
+		return 1;
+	}
+
+	if (!remaining) {
+		/* No arguments, no networking. Don't bother. */
+		return 0;
+	}
+
+	if (!connections_dir)
+		connections_dir = g_strdup (DEFAULT_CONNECTIONS_DIR);
+	if (!sysfs_dir)
+		sysfs_dir = g_strdup (DEFAULT_SYSFS_DIR);
+	if (dump_to_stdout)
+		g_clear_pointer (&connections_dir, g_free);
+
+	if (connections_dir && g_mkdir_with_parents (connections_dir, 0755) != 0) {
+		_LOGW (LOGD_CORE, "%s: %s\n", connections_dir, strerror (errno));
+		return 1;
+	}
+
+	connections = nmi_cmdline_reader_parse (sysfs_dir, remaining);
+	g_hash_table_foreach (connections, output_conn, connections_dir);
+	g_hash_table_destroy (connections);
+
+	return 0;
+}
diff --git a/src/initrd/nm-initrd-generator.h b/src/initrd/nm-initrd-generator.h
new file mode 100644
index 00000000..1fa858fc
--- /dev/null
+++ b/src/initrd/nm-initrd-generator.h
@@ -0,0 +1,45 @@
+/* NetworkManager initrd configuration generator
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2014, 2018 Red Hat, Inc.
+ */
+
+#ifndef __NM_INITRD_GENERATOR_H__
+#define __NM_INITRD_GENERATOR_H__
+
+#include "nm-connection.h"
+#include "nm-utils.h"
+
+static inline gboolean
+guess_ip_address_family (const char *str)
+{
+	if (str == NULL)
+		return AF_UNSPEC;
+	else if (strchr (str, '.'))
+		return AF_INET;
+	else if (strchr (str, ':'))
+		return AF_INET6;
+	else
+		return AF_UNSPEC;
+}
+
+GHashTable *nmi_ibft_read (const char *sysfs_dir);
+
+gboolean nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTable *nic, GError **error);
+
+GHashTable *nmi_cmdline_reader_parse (const char *sysfs_dir, char **argv);
+
+#endif  /* __NM_INITRD_GENERATOR_H__ */
diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c
new file mode 100644
index 00000000..2cef534e
--- /dev/null
+++ b/src/initrd/nmi-cmdline-reader.c
@@ -0,0 +1,714 @@
+/* NetworkManager initrd configuration generator
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2018 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+#include "nm-core-internal.h"
+
+#include "nm-initrd-generator.h"
+
+#include <string.h>
+
+/*****************************************************************************/
+
+#define _NMLOG(level, domain, ...) \
+    nm_log ((level), (domain), NULL, NULL, \
+            "cmdline-reader: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__) \
+            _NM_UTILS_MACRO_REST (__VA_ARGS__))
+
+/*****************************************************************************/
+
+static NMConnection *
+get_conn (GHashTable *connections, const char *ifname, const char *type_name)
+{
+	NMConnection *connection;
+	NMSetting *setting;
+	const char *basename = ifname ?: "default_connection";
+
+	connection = g_hash_table_lookup (connections, (gpointer)basename);
+
+	if (connection) {
+		setting = (NMSetting *)nm_connection_get_setting_connection (connection);
+	} else {
+		connection = nm_simple_connection_new ();
+		g_hash_table_insert (connections, g_strdup (basename), connection);
+
+		/* Start off assuming dynamic IP configurations. */
+
+		setting = nm_setting_ip4_config_new ();
+		nm_connection_add_setting (connection, setting);
+		g_object_set (setting,
+		              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
+		              NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
+		              NULL);
+
+		setting = nm_setting_ip6_config_new ();
+		nm_connection_add_setting (connection, setting);
+		g_object_set (setting,
+		              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
+		              NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
+		              NULL);
+
+		setting = nm_setting_connection_new ();
+		nm_connection_add_setting (connection, setting);
+		g_object_set (setting,
+		              NM_SETTING_CONNECTION_ID, ifname ?: "Wired Connection",
+		              NM_SETTING_CONNECTION_UUID, nm_utils_uuid_generate_a (),
+		              NM_SETTING_CONNECTION_INTERFACE_NAME, ifname,
+		              NULL);
+
+		if (!type_name)
+			type_name = NM_SETTING_WIRED_SETTING_NAME;
+	}
+
+	if (type_name) {
+		g_object_set (setting, NM_SETTING_CONNECTION_TYPE, type_name, NULL);
+		if (!nm_connection_get_setting_by_name (connection, type_name)) {
+			setting = g_object_new (nm_setting_lookup_type (type_name), NULL);
+			nm_connection_add_setting (connection, setting);
+		}
+	}
+
+	return connection;
+}
+
+static char *
+get_word (char **argument, const char separator)
+{
+	char *word;
+	int nest = 0;
+
+	if (*argument == NULL)
+		return NULL;
+
+	if (**argument == '[') {
+		nest++;
+		(*argument)++;
+	}
+
+	word = *argument;
+
+	while (**argument != '\0') {
+		if (nest && **argument == ']') {
+			**argument = '\0';
+			(*argument)++;
+			nest--;
+			continue;
+		}
+
+		if (nest == 0 && **argument == separator) {
+			**argument = '\0';
+			(*argument)++;
+			break;
+		}
+		(*argument)++;
+	}
+
+	return *word ? word : NULL;
+}
+
+static void
+_base_setting_set (NMConnection *connection, const char *property, const char *value)
+{
+	NMSetting *setting;
+	const char *type_name = nm_connection_get_connection_type (connection);
+	GObjectClass *object_class = g_type_class_ref (nm_setting_lookup_type (type_name));
+	GParamSpec *spec = g_object_class_find_property (object_class, property);
+
+	if (!spec) {
+		_LOGW (LOGD_CORE, "'%s' does not support setting %s\n", type_name, property);
+		return;
+	}
+
+	setting = nm_connection_get_setting_by_name (connection, type_name);
+
+	if (G_IS_PARAM_SPEC_UINT (spec))
+		g_object_set (setting, property, g_ascii_strtoull (value, NULL, 10), NULL);
+	else if (G_IS_PARAM_SPEC_STRING (spec))
+		g_object_set (setting, property, value, NULL);
+	else
+		_LOGW (LOGD_CORE, "Don't know how to set '%s' of %s\n", property, type_name);
+
+	g_type_class_unref (object_class);
+}
+
+static void
+parse_ip (GHashTable *connections, const char *sysfs_dir, char *argument)
+{
+	NMConnection *connection;
+	NMSettingIPConfig *s_ip4 = NULL, *s_ip6 = NULL;
+	gs_unref_hashtable GHashTable *ibft = NULL;
+	const char *tmp;
+	const char *kind = NULL;
+	const char *client_ip = NULL;
+	const char *peer = NULL;
+	const char *gateway_ip = NULL;
+	const char *netmask = NULL;
+	const char *client_hostname = NULL;
+	const char *ifname = NULL;
+	const char *mtu = NULL;
+	const char *macaddr = NULL;
+	int client_ip_family = AF_UNSPEC;
+	int client_ip_prefix = -1;
+	const char *dns[2] = { 0, };
+	int dns_addr_family[2] = { 0, };
+	int i;
+	GError *error = NULL;
+
+	if (!*argument)
+		return;
+
+	tmp = get_word (&argument, ':');
+	if (!*argument) {
+		/* ip={dhcp|on|any|dhcp6|auto6|ibft} */
+		kind = tmp;
+	} else {
+		client_ip_family = guess_ip_address_family (tmp);
+		if (client_ip_family != AF_UNSPEC) {
+			/* <client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>: */
+			client_ip = tmp;
+			peer = get_word (&argument, ':');
+			gateway_ip = get_word (&argument, ':');
+			netmask = get_word (&argument, ':');
+			client_hostname = get_word (&argument, ':');
+			ifname = get_word (&argument, ':');
+		} else {
+			ifname = tmp;
+		}
+
+		/* <ifname>:{none|off|dhcp|on|any|dhcp6|auto6|ibft} */
+
+		kind = get_word (&argument, ':');
+
+		tmp = get_word (&argument, ':');
+		dns_addr_family[0] = guess_ip_address_family (tmp);
+		if (dns_addr_family[0] != AF_UNSPEC) {
+			dns[0] = tmp;
+			dns[1] = get_word (&argument, ':');
+			dns_addr_family[1] = guess_ip_address_family (dns[1]);
+			if (argument && *argument)
+				_LOGW (LOGD_CORE, "Ignoring extra: '%s'.\n", argument);
+		} else {
+			mtu = tmp;
+			macaddr = argument;
+		}
+	}
+
+	if (ifname == NULL && 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\n");
+				continue;
+			}
+
+			if (!nmi_ibft_update_connection_from_nic (connection, nic, &error)) {
+				_LOGW (LOGD_CORE, "Unable to merge iBFT configuration: %s\n", error->message);
+				g_error_free (error);
+			}
+
+			g_hash_table_insert (connections,
+			                     g_strdup_printf ("ibft%s", index),
+			                     connection);
+		}
+
+		return;
+	}
+
+	/* Parsing done, construct the NMConnection. */
+	connection = get_conn (connections, ifname, NULL);
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+
+	if (netmask && *netmask) {
+		NMIPAddr addr;
+
+		if (nm_utils_parse_inaddr_bin (AF_INET, netmask, &addr)) {
+			client_ip_prefix = nm_utils_ip4_netmask_to_prefix (addr.addr4);
+		} else {
+			_LOGW (LOGD_CORE, "Unrecognized address: %s\n", client_ip);
+		}
+	}
+
+	/* Static IP configuration might be present. */
+	if (client_ip && *client_ip) {
+		NMIPAddress *address = NULL;
+		NMIPAddr addr;
+
+		if (nm_utils_parse_inaddr_prefix_bin (client_ip_family, client_ip, &addr,
+		                                      client_ip_prefix == -1 ? &client_ip_prefix : NULL)) {
+			if (client_ip_prefix == -1) {
+				switch (client_ip_family) {
+				case AF_INET:
+					client_ip_prefix = _nm_utils_ip4_get_default_prefix (addr.addr4);
+					break;
+				case AF_INET6:
+					client_ip_prefix = 64;
+					break;
+				}
+			}
+
+			address = nm_ip_address_new_binary (client_ip_family, &addr.addr_ptr, client_ip_prefix, &error);
+			if (!address) {
+				_LOGW (LOGD_CORE, "Invalid address '%s': %s\n", client_ip, error->message);
+				g_clear_error (&error);
+			}
+		} else {
+			_LOGW (LOGD_CORE, "Unrecognized address: %s\n", client_ip);
+		}
+
+		if (address) {
+			switch (client_ip_family) {
+			case AF_INET:
+				g_object_set (s_ip4,
+				              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
+				              NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
+				              NULL);
+				nm_setting_ip_config_add_address (s_ip4, address);
+				break;
+			case AF_INET6:
+				g_object_set (s_ip6,
+				              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
+				              NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
+				              NULL);
+				nm_setting_ip_config_add_address (s_ip6, address);
+				break;
+			default:
+				_LOGW (LOGD_CORE, "Unknown address family: %s\n", client_ip);
+				break;
+			}
+			nm_ip_address_unref (address);
+		}
+	}
+
+	/* Dynamic IP configuration configured explicitly. */
+	if (g_strcmp0 (kind, "none") == 0 || (g_strcmp0 (kind, "off") == 0)) {
+		if (nm_setting_ip_config_get_num_addresses (s_ip6) == 0) {
+			g_object_set (s_ip6,
+			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
+			              NULL);
+		}
+		if (nm_setting_ip_config_get_num_addresses (s_ip4) == 0) {
+			g_object_set (s_ip4,
+			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
+			              NULL);
+		}
+	} else if (g_strcmp0 (kind, "dhcp") == 0) {
+		g_object_set (s_ip4,
+		              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
+		              NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
+		              NULL);
+		if (nm_setting_ip_config_get_num_addresses (s_ip6) == 0) {
+			g_object_set (s_ip6,
+			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
+			              NULL);
+		}
+	} else if (g_strcmp0 (kind, "dhcp6") == 0) {
+		g_object_set (s_ip6,
+		              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_DHCP,
+		              NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
+		              NULL);
+		if (nm_setting_ip_config_get_num_addresses (s_ip4) == 0) {
+			g_object_set (s_ip4,
+			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
+			              NULL);
+		}
+	} else if (g_strcmp0 (kind, "auto6") == 0) {
+		g_object_set (s_ip4,
+		              NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
+		              NULL);
+		if (nm_setting_ip_config_get_num_addresses (s_ip4) == 0) {
+			g_object_set (s_ip4,
+			              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
+			              NULL);
+		}
+	} else if (g_strcmp0 (kind, "ibft") == 0) {
+		gs_free char *address_path = g_build_filename (sysfs_dir, "class", "net", ifname, "address", NULL);
+		gs_free char *mac, *mac_up = NULL;
+		GHashTable *nic = NULL;
+
+		if (!g_file_get_contents (address_path, &mac, NULL, &error)) {
+			_LOGW (LOGD_CORE, "Can't get a MAC address for %s: %s", ifname, error->message);
+			g_clear_error (&error);
+		}
+
+		if (mac) {
+			g_strchomp (mac);
+			mac_up = g_ascii_strup (mac, -1);
+			if (!ibft)
+				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)\n", ifname, mac_up);
+		}
+
+		if (nic) {
+			if (!nmi_ibft_update_connection_from_nic (connection, nic, &error)) {
+				_LOGW (LOGD_CORE, "Unable to merge iBFT configuration: %s\n", error->message);
+				g_clear_error (&error);
+			}
+		}
+	}
+
+	if (peer && *peer)
+		_LOGW (LOGD_CORE, "Ignoring peer: %s (not implemented)\b", peer);
+
+	if (gateway_ip && *gateway_ip) {
+		int addr_family = guess_ip_address_family (gateway_ip);
+
+		if (nm_utils_ipaddr_valid (addr_family, gateway_ip)) {
+			switch (addr_family) {
+			case AF_INET:
+				g_object_set (s_ip4, NM_SETTING_IP_CONFIG_GATEWAY, gateway_ip, NULL);
+				break;
+			case AF_INET6:
+				g_object_set (s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, gateway_ip, NULL);
+				break;
+			default:
+				_LOGW (LOGD_CORE, "Unknown address family: %s\n", gateway_ip);
+				break;
+			}
+		} else {
+			_LOGW (LOGD_CORE, "Invalid gateway: %s\n", gateway_ip);
+		}
+	}
+
+	if (client_hostname && *client_hostname) {
+		g_object_set (s_ip4, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, client_hostname, NULL);
+		g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, client_hostname, NULL);
+	}
+
+	for (i = 0; i < 2; i++) {
+		if (dns_addr_family[i] == AF_UNSPEC)
+			break;
+		if (nm_utils_ipaddr_valid (dns_addr_family[i], dns[i])) {
+			switch (dns_addr_family[i]) {
+			case AF_INET:
+				nm_setting_ip_config_add_dns (s_ip4, dns[i]);
+				break;
+			case AF_INET6:
+				nm_setting_ip_config_add_dns (s_ip6, dns[i]);
+				break;
+			default:
+				_LOGW (LOGD_CORE, "Unknown address family: %s\n", dns[i]);
+				break;
+			}
+		} else {
+			_LOGW (LOGD_CORE, "Invalid name server: %s\n", dns[i]);
+		}
+	}
+
+	if (mtu && *mtu)
+		_base_setting_set (connection, "mtu", mtu);
+
+	if (macaddr && *macaddr)
+		_base_setting_set (connection, "cloned-mac-address", macaddr);
+}
+
+static void
+parse_master (GHashTable *connections, char *argument, const char *type_name)
+{
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingBond *s_bond;
+	gs_free char *master_to_free = NULL;
+	const char *master;
+	char *slaves;
+	const char *slave;
+	char *opts;
+	char *opt;
+	const char *opt_name;
+	const char *mtu = NULL;
+
+	master = get_word (&argument, ':');
+	if (!master)
+		master = master_to_free = g_strdup_printf ("%s0", type_name);
+	slaves = get_word (&argument, ':');
+
+	connection = get_conn (connections, master, type_name);
+	s_con = nm_connection_get_setting_connection (connection);
+	master = nm_setting_connection_get_uuid (s_con);
+
+	if (strcmp (type_name, NM_SETTING_BOND_SETTING_NAME) == 0) {
+		s_bond = (NMSettingBond *)nm_connection_get_setting_by_name (connection, type_name);
+
+		opts = get_word (&argument, ':');
+		while (opts && *opts) {
+			opt = get_word (&opts, ',');
+			opt_name = get_word (&opt, '=');
+			nm_setting_bond_add_option (s_bond, opt_name, opt);
+		}
+
+		mtu = get_word (&argument, ':');
+	}
+
+	do {
+		slave = get_word (&slaves, ',');
+		if (slave == NULL)
+			slave = "eth0";
+
+		connection = get_conn (connections, slave, NULL);
+		s_con = nm_connection_get_setting_connection (connection);
+		g_object_set (s_con,
+		              NM_SETTING_CONNECTION_SLAVE_TYPE, type_name,
+		              NM_SETTING_CONNECTION_MASTER, master,
+		              NULL);
+		if (mtu)
+			_base_setting_set (connection, "mtu", mtu);
+	} while (slaves && *slaves != '\0');
+
+	if (argument && *argument)
+		_LOGW (LOGD_CORE, "Ignoring extra: '%s'.\n", argument);
+}
+
+static void
+parse_rd_route (GHashTable *connections, char *argument)
+{
+	NMConnection *connection;
+	const char *net;
+	const char *gateway;
+	const char *interface;
+	int family = AF_UNSPEC;
+	NMIPAddr net_addr = { 0, };
+	NMIPAddr gateway_addr = { 0, };
+	int net_prefix = -1;
+	NMIPRoute *route;
+	NMSettingIPConfig *s_ip;
+	GError *error = NULL;
+
+	net = get_word (&argument, ':');
+	gateway = get_word (&argument, ':');
+	interface = get_word (&argument, ':');
+
+	family = guess_ip_address_family (net);
+	connection = get_conn (connections, interface, NULL);
+
+	if (net && *net) {
+		if (!nm_utils_parse_inaddr_prefix_bin (family, net, &net_addr, &net_prefix)) {
+			_LOGW (LOGD_CORE, "Unrecognized address: %s\n", net);
+			return;
+		}
+	}
+
+	if (gateway && *net) {
+		if (!nm_utils_parse_inaddr_bin (family, gateway, &gateway_addr)) {
+			_LOGW (LOGD_CORE, "Unrecognized address: %s\n", gateway);
+			return;
+		}
+	}
+
+	switch (family) {
+	case AF_INET:
+		s_ip = nm_connection_get_setting_ip4_config (connection);
+		if (net_prefix == -1)
+			net_prefix = 32;
+		break;
+	case AF_INET6:
+		s_ip = nm_connection_get_setting_ip6_config (connection);
+		if (net_prefix == -1)
+			net_prefix = 128;
+		break;
+	default:
+		_LOGW (LOGD_CORE, "Unknown address family: %s\n", net);
+		return;
+	}
+
+	route = nm_ip_route_new_binary (family, &net_addr.addr_ptr, net_prefix, &gateway_addr.addr_ptr, -1, &error);
+	if (!route) {
+		g_warning ("Invalid route '%s via %s': %s\n", net, gateway, error->message);
+		g_clear_error (&error);
+		return;
+	}
+
+	nm_setting_ip_config_add_route (s_ip, route);
+	nm_ip_route_unref (route);
+}
+
+static void
+parse_vlan (GHashTable *connections, char *argument)
+{
+	NMConnection *connection;
+	NMSettingVlan *s_vlan;
+	const char *vlan;
+	const char *phy;
+	const char *vlanid;
+
+	vlan = get_word (&argument, ':');
+	phy = get_word (&argument, ':');
+
+	for (vlanid = vlan + strlen (vlan); vlanid > vlan; vlanid--) {
+		if (!g_ascii_isdigit (*(vlanid - 1)))
+			break;
+	}
+
+	connection = get_conn (connections, vlan, NM_SETTING_VLAN_SETTING_NAME);
+
+	s_vlan = nm_connection_get_setting_vlan (connection);
+	g_object_set (s_vlan,
+	              NM_SETTING_VLAN_PARENT, phy,
+	              NM_SETTING_VLAN_ID, g_ascii_strtoull (vlanid, NULL, 10),
+	              NULL);
+
+	if (argument && *argument)
+		_LOGW (LOGD_CORE, "Ignoring extra: '%s'.\n", argument);
+}
+
+static void
+parse_bootdev (GHashTable *connections, char *argument)
+{
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+
+	connection = get_conn (connections, NULL, NULL);
+
+	s_con = nm_connection_get_setting_connection (connection);
+	g_object_set (s_con,
+	              NM_SETTING_CONNECTION_INTERFACE_NAME, argument,
+	              NULL);
+}
+
+static void
+parse_nameserver (GHashTable *connections, char *argument)
+{
+	NMConnection *connection;
+	NMSettingIPConfig *s_ip = NULL;
+	char *dns;
+
+	connection = get_conn (connections, NULL, NULL);
+
+	dns = get_word (&argument, '\0');
+
+	switch (guess_ip_address_family (dns)) {
+	case AF_INET:
+		s_ip = nm_connection_get_setting_ip4_config (connection);
+		break;
+	case AF_INET6:
+		s_ip = nm_connection_get_setting_ip6_config (connection);
+		break;
+	default:
+		_LOGW (LOGD_CORE, "Unknown address family: %s\n", dns);
+		break;
+	}
+
+	nm_setting_ip_config_add_dns (s_ip, dns);
+
+	if (argument && *argument)
+		_LOGW (LOGD_CORE, "xIgnoring extra: '%s'.\n", argument);
+}
+
+static void
+parse_rd_peerdns (GHashTable *connections, char *argument)
+{
+	gboolean auto_dns = !_nm_utils_ascii_str_to_bool (argument, TRUE);
+	NMConnection *connection;
+	NMSettingIPConfig *s_ip = NULL;
+
+	connection = get_conn (connections, NULL, NULL);
+
+	s_ip = nm_connection_get_setting_ip4_config (connection);
+	g_object_set (s_ip,
+	              NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, auto_dns,
+	              NULL);
+
+
+	s_ip = nm_connection_get_setting_ip6_config (connection);
+	g_object_set (s_ip,
+	              NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, auto_dns,
+	              NULL);
+}
+
+static void
+_normalize_conn (gpointer key, gpointer value, gpointer user_data)
+{
+	NMConnection *connection = value;
+
+	nm_connection_normalize (connection, NULL, NULL, NULL);
+}
+
+GHashTable *
+nmi_cmdline_reader_parse (const char *sysfs_dir, char **argv)
+{
+	GHashTable *connections;
+	const char *tag;
+	char *argument;
+	gboolean ignore_bootif = FALSE;
+	char *bootif = NULL;
+	int i;
+
+	connections = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_object_unref);
+
+	for (i = 0; argv[i]; i++) {
+		argument = argv[i];
+		tag = get_word (&argument, '=');
+		if (strcmp (tag, "ip") == 0)
+			parse_ip (connections, sysfs_dir, argument);
+		else if (strcmp (tag, "rd.route") == 0)
+			parse_rd_route (connections, argument);
+		else if (strcmp (tag, "bridge") == 0)
+			parse_master (connections, argument, NM_SETTING_BRIDGE_SETTING_NAME);
+		else if (strcmp (tag, "bond") == 0)
+			parse_master (connections, argument, NM_SETTING_BOND_SETTING_NAME);
+		else if (strcmp (tag, "team") == 0)
+			parse_master (connections, argument, NM_SETTING_TEAM_SETTING_NAME);
+		else if (strcmp (tag, "vlan") == 0)
+			parse_vlan (connections, argument);
+		else if (strcmp (tag, "bootdev") == 0)
+			parse_bootdev (connections, argument);
+		else if (strcmp (tag, "nameserver") == 0)
+			parse_nameserver (connections, argument);
+		else if (strcmp (tag, "rd.peerdns") == 0)
+			parse_rd_peerdns (connections, argument);
+		else if (strcmp (tag, "rd.bootif") == 0)
+			ignore_bootif = !_nm_utils_ascii_str_to_bool (argument, TRUE);
+		else if (strcasecmp (tag, "BOOTIF") == 0)
+			bootif = argument;
+	}
+
+	if (ignore_bootif)
+		bootif = NULL;
+	if (bootif) {
+		NMConnection *connection;
+		NMSettingWired *s_wired;
+
+		connection = get_conn (connections, NULL, NM_SETTING_WIRED_SETTING_NAME);
+
+		s_wired = nm_connection_get_setting_wired (connection);
+		g_object_set (s_wired,
+		              NM_SETTING_WIRED_MAC_ADDRESS, bootif,
+		              NULL);
+	}
+
+	g_hash_table_foreach (connections, _normalize_conn, NULL);
+
+	return connections;
+}
diff --git a/src/initrd/nmi-ibft-reader.c b/src/initrd/nmi-ibft-reader.c
new file mode 100644
index 00000000..c9275467
--- /dev/null
+++ b/src/initrd/nmi-ibft-reader.c
@@ -0,0 +1,441 @@
+/* NetworkManager initrd configuration generator
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2014 - 2018 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+
+#include "nm-initrd-generator.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <sys/wait.h>
+#include <sys/inotify.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include "nm-core-internal.h"
+#include "platform/nm-platform.h"
+#include "NetworkManagerUtils.h"
+
+/*****************************************************************************/
+
+#define _NMLOG(level, domain, ...) \
+    nm_log ((level), (domain), NULL, NULL, \
+            "ibft-reader: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__) \
+            _NM_UTILS_MACRO_REST (__VA_ARGS__))
+
+/*****************************************************************************/
+
+static GHashTable *
+load_one_nic (const char *sysfs_dir, const char *dir_name)
+{
+	gs_free char *nic_path = g_build_filename (sysfs_dir, dir_name, NULL);
+	GDir *nic_dir;
+	const char *entry_name;
+	char *content;
+	gs_free_error GError *error = NULL;
+	GHashTable *nic;
+
+	g_return_val_if_fail (sysfs_dir != NULL, FALSE);
+
+	nic_dir = g_dir_open (nic_path, 0, &error);
+	if (!nic_dir) {
+		_LOGW (LOGD_CORE, "Can't open %s: %s", nic_path, error->message);
+		return NULL;
+	}
+
+	nic = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_free);
+	while ((entry_name = g_dir_read_name (nic_dir))) {
+		gs_free char *entry_path = g_build_filename (nic_path, entry_name, NULL);
+
+		if (!g_file_test (entry_path, G_FILE_TEST_IS_REGULAR))
+			continue;
+
+		if (!g_file_get_contents (entry_path, &content, NULL, &error)) {
+			_LOGW (LOGD_CORE, "Can't read %s: %s", entry_path, error->message);
+			g_clear_error (&error);
+			continue;
+		}
+
+		g_strchomp (content);
+		if (!g_hash_table_insert (nic, g_strdup (entry_name), content))
+			_LOGW (LOGD_CORE, "Duplicate iBFT entry: %s", entry_name);
+	}
+
+	g_dir_close (nic_dir);
+
+	return nic;
+}
+
+GHashTable *
+nmi_ibft_read (const char *sysfs_dir)
+{
+	gs_free char *ibft_path = NULL;
+	GDir *ibft_dir;
+	const char *dir_name;
+	GHashTable *ibft, *nic;
+	char *mac;
+	gs_free_error GError *error = NULL;
+
+	g_return_val_if_fail (sysfs_dir != NULL, FALSE);
+
+	ibft_path = g_build_filename (sysfs_dir, "firmware", "ibft", NULL);
+
+	ibft = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free,
+	                              (GDestroyNotify) g_hash_table_unref);
+
+	if (!g_file_test (ibft_path, G_FILE_TEST_IS_DIR))
+		nm_utils_modprobe (NULL, FALSE, "iscsi_ibft", NULL);
+	if (!g_file_test (ibft_path, G_FILE_TEST_IS_DIR))
+		return ibft;
+
+	ibft_dir = g_dir_open (ibft_path, 0, &error);
+	if (!ibft_dir) {
+		_LOGW (LOGD_CORE, "Unable to open iBFT firmware directory: %s", error->message);
+		return ibft;
+	}
+
+	while ((dir_name = g_dir_read_name (ibft_dir))) {
+		if (!g_str_has_prefix (dir_name, "ethernet"))
+			continue;
+
+		nic = load_one_nic (ibft_path, dir_name);
+		mac = g_hash_table_lookup (nic, "mac");
+
+		if (!mac) {
+			_LOGW (LOGD_CORE, "Ignoring an iBFT record without a MAC address");
+			g_hash_table_unref (nic);
+			continue;
+		}
+
+		mac = g_ascii_strup (mac, -1);
+		if (!g_hash_table_insert (ibft, mac, nic))
+			_LOGW (LOGD_CORE, "Duplicate iBFT record for %s", mac);
+	}
+
+	g_dir_close (ibft_dir);
+
+	return ibft;
+}
+
+static gboolean
+ip_setting_add_from_block (GHashTable *nic,
+                            NMConnection *connection,
+                            GError **error)
+{
+	NMSettingIPConfig *s_ip = NULL;
+	NMSettingIPConfig *s_ip4 = NULL;
+	NMSettingIPConfig *s_ip6 = NULL;
+	NMIPAddress *addr;
+	const char *s_ipaddr = NULL;
+	const char *s_prefix = NULL;
+	const char *s_gateway = NULL;
+	const char *s_dns1 = NULL;
+	const char *s_dns2 = NULL;
+	const char *s_origin = NULL;
+	const char *method = NULL;
+	int family;
+	gint64 prefix;
+
+	s_ipaddr = (const char *)g_hash_table_lookup (nic, "ip-addr");
+	s_prefix = (const char *)g_hash_table_lookup (nic, "prefix-len");
+	s_gateway = (const char *)g_hash_table_lookup (nic, "gateway");
+	s_dns1 = (const char *)g_hash_table_lookup (nic, "primary-dns");
+	s_dns2 = (const char *)g_hash_table_lookup (nic, "secondary-dns");
+	s_origin = (const char *)g_hash_table_lookup (nic, "origin");
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	if (!s_ip4) {
+		s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new ();
+		nm_connection_add_setting (connection, (NMSetting *) s_ip4);
+	}
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	if (!s_ip6) {
+		s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new ();
+		nm_connection_add_setting (connection, (NMSetting *) s_ip6);
+	}
+
+	family = guess_ip_address_family (s_ipaddr);
+	if (family == AF_UNSPEC)
+		family = guess_ip_address_family (s_gateway);
+
+	switch (family) {
+	case AF_INET:
+		s_ip = s_ip4;
+		g_object_set (s_ip6, NM_SETTING_IP_CONFIG_METHOD,
+		              NM_SETTING_IP6_CONFIG_METHOD_IGNORE, NULL);
+		break;
+	case AF_INET6:
+		s_ip = s_ip6;
+		g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD,
+		              NM_SETTING_IP4_CONFIG_METHOD_DISABLED, NULL);
+		break;
+	default:
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+		             "iBFT: invalid IP address '%s'.",
+		             s_ipaddr);
+		return FALSE;
+	}
+
+	if (   (g_strcmp0 (s_origin, "3") == 0 && family == AF_INET)
+	    || (g_strcmp0 (s_origin, "4") == 0 && family == AF_INET)) {
+		method = NM_SETTING_IP4_CONFIG_METHOD_AUTO;
+	} else if (g_strcmp0 (s_origin, "3") == 0 && family == AF_INET6) {
+		method = NM_SETTING_IP6_CONFIG_METHOD_DHCP;
+	} else if (g_strcmp0 (s_origin, "4") == 0 && family == AF_INET6) {
+		method = NM_SETTING_IP6_CONFIG_METHOD_AUTO;
+	} else if (family == AF_INET) {
+		method = NM_SETTING_IP4_CONFIG_METHOD_MANUAL;
+	} else if (family == AF_INET6) {
+		method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL;
+	} else {
+		g_return_val_if_reached (FALSE);
+	}
+	g_object_set (s_ip,
+                      NM_SETTING_IP_CONFIG_METHOD, method,
+                      NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
+	              NULL);
+
+	if (s_gateway && !nm_utils_ipaddr_valid (family, s_gateway)) {
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+		             "iBFT: invalid IP gateway '%s'.", s_gateway);
+		return FALSE;
+	}
+
+	if (s_dns1 && !nm_utils_ipaddr_valid (family, s_dns1)) {
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+		             "iBFT: invalid DNS1 address '%s'.", s_dns1);
+		return FALSE;
+	}
+
+	if (s_dns2 && !nm_utils_ipaddr_valid (family, s_dns2)) {
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+		             "iBFT: invalid DNS2 address '%s'.", s_dns2);
+		return FALSE;
+	}
+
+	if (s_ipaddr) {
+		prefix = _nm_utils_ascii_str_to_int64 (s_prefix, 10, 0, 128, -1);
+		if (prefix == -1) {
+			g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+			             "iBFT: invalid IP prefix '%s'.", s_prefix);
+			return FALSE;
+		}
+
+		addr = nm_ip_address_new (family, s_ipaddr, prefix, error);
+		if (!addr) {
+			g_prefix_error (error, "iBFT: ");
+			return FALSE;
+		}
+
+		nm_setting_ip_config_add_address (s_ip, addr);
+		nm_ip_address_unref (addr);
+
+		g_object_set (s_ip, NM_SETTING_IP_CONFIG_GATEWAY, s_gateway, NULL);
+	}
+
+	if (s_dns1)
+		nm_setting_ip_config_add_dns (s_ip, s_dns1);
+	if (s_dns2)
+		nm_setting_ip_config_add_dns (s_ip, s_dns2);
+
+	return TRUE;
+}
+
+static gboolean
+connection_setting_add (GHashTable *nic,
+                        NMConnection *connection,
+                        const char *type,
+                        const char *prefix,
+                        GError **error)
+{
+	NMSetting *s_con;
+	char *id, *uuid;
+	const char *s_index, *s_hwaddr, *s_ipaddr, *s_vlanid;
+
+	s_index = (const char *)g_hash_table_lookup (nic, "index");
+	s_hwaddr = (const char *)g_hash_table_lookup (nic, "mac");
+	s_ipaddr = (const char *)g_hash_table_lookup (nic, "ip-addr");
+	s_vlanid = (const char *)g_hash_table_lookup (nic, "vlan");
+
+	if (!s_hwaddr) {
+		g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+		                     "iBFT: missing MAC address");
+		return FALSE;
+	}
+
+	id = g_strdup_printf ("iBFT%s%s Connection%s%s",
+	                      prefix ? " " : "",
+	                      prefix ? prefix : "",
+	                      s_index ? " " : "",
+	                      s_index ? s_index : "");
+
+	uuid = _nm_utils_uuid_generate_from_strings ("ibft",
+	                                             s_hwaddr,
+	                                             s_vlanid ? "V" : "v",
+	                                             s_vlanid ? s_vlanid : "",
+	                                             s_ipaddr ? "A" : "DHCP",
+	                                             s_ipaddr ? s_ipaddr : "",
+	                                             NULL);
+
+	s_con = (NMSetting *) nm_connection_get_setting_connection (connection);
+	if (!s_con) {
+		s_con = nm_setting_connection_new ();
+		nm_connection_add_setting (connection, s_con);
+	}
+
+	g_object_set (s_con,
+	              NM_SETTING_CONNECTION_TYPE, type,
+	              NM_SETTING_CONNECTION_UUID, uuid,
+	              NM_SETTING_CONNECTION_ID, id,
+	              NULL);
+
+	g_free (uuid);
+	g_free (id);
+
+	return TRUE;
+}
+
+static gboolean
+is_ibft_vlan_device (GHashTable *nic)
+{
+	const char *s_vlan_id;
+
+	g_assert (nic);
+
+	s_vlan_id = (const char *)g_hash_table_lookup (nic, "vlan");
+
+	if (s_vlan_id) {
+		/* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it
+		 * means "no VLAN".
+		 */
+		if (_nm_utils_ascii_str_to_int64 (s_vlan_id, 10, 1, 4095, -1) != -1)
+			return TRUE;
+	}
+
+	return FALSE;
+}
+
+static gboolean
+vlan_setting_add_from_block (GHashTable *nic,
+                             NMConnection *connection,
+                             GError **error)
+{
+	NMSetting *s_vlan = NULL;
+	const char *vlan_id_str = NULL;
+	gint64 vlan_id = -1;
+
+	g_assert (nic);
+	g_assert (connection);
+
+	/* This won't fail since this function shouldn't be called unless the
+	 * iBFT VLAN ID exists and is > 0.
+	 */
+	vlan_id_str = (const char *)g_hash_table_lookup (nic, "vlan");
+	g_assert (vlan_id_str);
+
+	/* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it means "no VLAN" */
+	vlan_id = _nm_utils_ascii_str_to_int64 (vlan_id_str, 10, 1, 4095, -1);
+	if (vlan_id == -1) {
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+		             "Invalid VLAN_ID '%s'", vlan_id_str);
+		return FALSE;
+	}
+
+	s_vlan = (NMSetting *) nm_connection_get_setting_vlan (connection);
+	if (!s_vlan) {
+		s_vlan = nm_setting_vlan_new ();
+		nm_connection_add_setting (connection, s_vlan);
+	}
+
+	g_object_set (s_vlan, NM_SETTING_VLAN_ID, (guint32) vlan_id, NULL);
+
+	return TRUE;
+}
+
+static gboolean
+wired_setting_add_from_block (GHashTable *nic,
+                              NMConnection *connection,
+                              GError **error)
+{
+	NMSetting *s_wired = NULL;
+	const char *hwaddr = NULL;
+
+	g_assert (nic);
+	g_assert (connection);
+
+
+	hwaddr = (const char *)g_hash_table_lookup (nic, "mac");
+	if (!hwaddr) {
+		g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+		                     "iBFT: missing MAC address");
+		return FALSE;
+	}
+
+	if (!nm_utils_hwaddr_valid (hwaddr, ETH_ALEN)) {
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+		             "iBFT: invalid MAC address '%s'.", hwaddr);
+		return FALSE;
+	}
+
+	s_wired = (NMSetting *) nm_connection_get_setting_wired (connection);
+	if (!s_wired) {
+		s_wired = nm_setting_wired_new ();
+		nm_connection_add_setting (connection, s_wired);
+	}
+
+	g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, hwaddr, NULL);
+
+	return TRUE;
+}
+
+gboolean
+nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTable *nic, GError **error)
+{
+	gboolean is_vlan = FALSE;
+
+	g_assert (nic);
+
+	is_vlan = is_ibft_vlan_device (nic);
+	if (is_vlan && !vlan_setting_add_from_block (nic, connection, error))
+		return FALSE;
+
+	/* Always have a wired setting; for VLAN it defines the parent */
+	if (!wired_setting_add_from_block (nic, connection, error))
+		return FALSE;
+
+	if (!ip_setting_add_from_block (nic, connection, error))
+		return FALSE;
+
+	if (!connection_setting_add (nic,
+	                             connection,
+	                             is_vlan ? NM_SETTING_VLAN_SETTING_NAME : NM_SETTING_WIRED_SETTING_NAME,
+	                             is_vlan ? "VLAN" : NULL,
+	                             error))
+		return FALSE;
+
+	if (!nm_connection_normalize (connection, NULL, NULL, error))
+		return FALSE;
+
+	return TRUE;
+}
diff --git a/src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address b/src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..bf6cf454
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+192.168.35.254
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..944c8d45
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.32.72
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2303dbdc
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10000.500.250.1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address b/src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..bf6cf454
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+192.168.35.254
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..944c8d45
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.32.72
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..5ed7b719
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+blah.foo.bar.baz
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/class/net/eth0/address b/src/initrd/tests/sysfs-bad-gateway/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..1970856e
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+bb.cc.dd.ee
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..944c8d45
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.32.72
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address b/src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..bf6cf454
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+192.168.35.254
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..d526f324
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+aa.bb.cc.dd
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/class/net/eth0/address b/src/initrd/tests/sysfs-dhcp/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/class/net/eth1/address b/src/initrd/tests/sysfs-dhcp/class/net/eth1/address
new file mode 100644
index 00000000..befa7850
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/class/net/eth1/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..59ea5b82
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+10.16.52.254
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..e440e5c8
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway
new file mode 100644
index 00000000..59ea5b82
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway
@@ -0,0 +1 @@
+10.16.52.254
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac
new file mode 100644
index 00000000..befa7850
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin
new file mode 100644
index 00000000..e440e5c8
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name b/src/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name
new file mode 100644
index 00000000..ac3a6a2a
--- /dev/null
+++ b/src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name
@@ -0,0 +1 @@
+iqn.1.2008-11.com.blahblah:iscsi1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/class/net/eth0/address b/src/initrd/tests/sysfs-static/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/class/net/eth1/address b/src/initrd/tests/sysfs-static/class/net/eth1/address
new file mode 100644
index 00000000..befa7850
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/class/net/eth1/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..bf6cf454
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+192.168.35.254
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..944c8d45
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.32.72
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..8fdd954d
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+22
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..7cb9d0a9
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.252.0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway
new file mode 100644
index 00000000..59ea5b82
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway
@@ -0,0 +1 @@
+10.16.52.254
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac
new file mode 100644
index 00000000..befa7850
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin
new file mode 100644
index 00000000..e440e5c8
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns
new file mode 100644
index 00000000..2e152cb0
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns
@@ -0,0 +1 @@
+10.16.255.2
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns
new file mode 100644
index 00000000..2eb9e1d0
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns
@@ -0,0 +1 @@
+10.16.255.3
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name b/src/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..509a7ab8
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.pjones6
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target0/index b/src/initrd/tests/sysfs-static/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr b/src/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target0/lun b/src/initrd/tests/sysfs-static/firmware/ibft/target0/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target0/port b/src/initrd/tests/sysfs-static/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target0/target-name b/src/initrd/tests/sysfs-static/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..32c9450a
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.0.2008-11.com.blahblah:iscsi0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target1/index b/src/initrd/tests/sysfs-static/firmware/ibft/target1/index
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target1/index
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr b/src/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr
new file mode 100644
index 00000000..7450fdf9
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr
@@ -0,0 +1 @@
+10.16.52.16
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target1/lun b/src/initrd/tests/sysfs-static/firmware/ibft/target1/lun
new file mode 100644
index 00000000..c43d0930
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target1/lun
@@ -0,0 +1 @@
+00000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target1/port b/src/initrd/tests/sysfs-static/firmware/ibft/target1/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target1/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-static/firmware/ibft/target1/target-name b/src/initrd/tests/sysfs-static/firmware/ibft/target1/target-name
new file mode 100644
index 00000000..ac3a6a2a
--- /dev/null
+++ b/src/initrd/tests/sysfs-static/firmware/ibft/target1/target-name
@@ -0,0 +1 @@
+iqn.1.2008-11.com.blahblah:iscsi1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/class/net/eth0/address b/src/initrd/tests/sysfs-vlan/class/net/eth0/address
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/class/net/eth0/address
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..4923230c
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+192.168.6.200
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..20659db7
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:33:21:98:b9:f0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..cabf43b5
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+24
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..5a279b41
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.255.0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..d800886d
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+123
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name b/src/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..8e9cd2c4
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.2010-04.org.ipxe:d05faa97-c4be-44f6-a723-efde9aa399a0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/index b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/index
new file mode 100644
index 00000000..c2270834
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..a32ce01b
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+192.168.6.32
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun
new file mode 100644
index 00000000..f309ca6a
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+01000000
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/port b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/port
new file mode 100644
index 00000000..58f0d919
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name
new file mode 100644
index 00000000..f0e61157
--- /dev/null
+++ b/src/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name
@@ -0,0 +1 @@
+iqn.2003-01.org.x:disk1
\ No newline at end of file
diff --git a/src/initrd/tests/sysfs/class/net/eth0/address b/src/initrd/tests/sysfs/class/net/eth0/address
new file mode 100644
index 00000000..1f2f610e
--- /dev/null
+++ b/src/initrd/tests/sysfs/class/net/eth0/address
@@ -0,0 +1 @@
+00:53:00:AB:00:01
diff --git a/src/initrd/tests/sysfs/class/net/eth2/address b/src/initrd/tests/sysfs/class/net/eth2/address
new file mode 100644
index 00000000..6ec1078a
--- /dev/null
+++ b/src/initrd/tests/sysfs/class/net/eth2/address
@@ -0,0 +1 @@
+00:53:06:66:ab:01
diff --git a/src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id b/src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id
new file mode 100644
index 00000000..590d9cd2
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id
@@ -0,0 +1 @@
+NMTst
diff --git a/src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id b/src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id
new file mode 100644
index 00000000..35d4d09c
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id
@@ -0,0 +1 @@
+Whatevs
diff --git a/src/initrd/tests/sysfs/firmware/ibft/acpi_header/signature b/src/initrd/tests/sysfs/firmware/ibft/acpi_header/signature
new file mode 100644
index 00000000..e3a5d7ef
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/acpi_header/signature
@@ -0,0 +1 @@
+IBFT
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp
new file mode 100644
index 00000000..98a0d797
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0002
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/flags b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/flags
@@ -0,0 +1 @@
+3
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway
new file mode 100644
index 00000000..7f378f8f
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0001
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname
new file mode 100644
index 00000000..3ed5163c
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname
@@ -0,0 +1 @@
+host0.example.com
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/index b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/index
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/index
@@ -0,0 +1 @@
+0
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr
new file mode 100644
index 00000000..98a0d797
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0002
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/mac b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/mac
new file mode 100644
index 00000000..f2441319
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/mac
@@ -0,0 +1 @@
+00:53:00:ab:00:01
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/origin b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/origin
new file mode 100644
index 00000000..b8626c4c
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/origin
@@ -0,0 +1 @@
+4
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len
new file mode 100644
index 00000000..900731ff
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len
@@ -0,0 +1 @@
+64
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns
new file mode 100644
index 00000000..e7511d5a
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0053
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns
new file mode 100644
index 00000000..1f6c5c95
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:5353
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask
new file mode 100644
index 00000000..5df93454
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask
@@ -0,0 +1 @@
+255.255.255.255
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan
new file mode 100644
index 00000000..7cc86ad1
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan
@@ -0,0 +1 @@
+666
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp
new file mode 100644
index 00000000..61ef5585
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp
@@ -0,0 +1 @@
+192.0.2.2
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/flags b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/flags
@@ -0,0 +1 @@
+3
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway
new file mode 100644
index 00000000..2096f194
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway
@@ -0,0 +1 @@
+192.0.2.1
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname
new file mode 100644
index 00000000..5dc539d5
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname
@@ -0,0 +1 @@
+host2.example.com
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/index b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/index
new file mode 100644
index 00000000..0cfbf088
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/index
@@ -0,0 +1 @@
+2
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr
new file mode 100644
index 00000000..61ef5585
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr
@@ -0,0 +1 @@
+192.0.2.2
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/mac b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/mac
new file mode 100644
index 00000000..2fc3d525
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/mac
@@ -0,0 +1 @@
+00:53:06:66:AB:01
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/origin b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/origin
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/origin
@@ -0,0 +1 @@
+3
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len
new file mode 100644
index 00000000..a45fd52c
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len
@@ -0,0 +1 @@
+24
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns
new file mode 100644
index 00000000..6fa8c742
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns
@@ -0,0 +1 @@
+192.0.2.53
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns
new file mode 100644
index 00000000..a7269ff5
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns
@@ -0,0 +1 @@
+192.0.2.54
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask
new file mode 100644
index 00000000..d30f9e9f
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask
@@ -0,0 +1 @@
+255.255.255.0
diff --git a/src/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan
@@ -0,0 +1 @@
+0
diff --git a/src/initrd/tests/sysfs/firmware/ibft/initiator/flags b/src/initrd/tests/sysfs/firmware/ibft/initiator/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/initiator/flags
@@ -0,0 +1 @@
+3
diff --git a/src/initrd/tests/sysfs/firmware/ibft/initiator/index b/src/initrd/tests/sysfs/firmware/ibft/initiator/index
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/initiator/index
@@ -0,0 +1 @@
+0
diff --git a/src/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name b/src/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name
new file mode 100644
index 00000000..337b5a0f
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name
@@ -0,0 +1 @@
+iqn.1994-05.com.example.initiator:48b055856417
diff --git a/src/initrd/tests/sysfs/firmware/ibft/initiator/isns-server b/src/initrd/tests/sysfs/firmware/ibft/initiator/isns-server
new file mode 100644
index 00000000..4aff9398
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/initiator/isns-server
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:3205
diff --git a/src/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server b/src/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server
new file mode 100644
index 00000000..a26fb649
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:1812
diff --git a/src/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server b/src/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server
new file mode 100644
index 00000000..908be27f
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server
@@ -0,0 +1 @@
+192.0.2.181
diff --git a/src/initrd/tests/sysfs/firmware/ibft/initiator/slp-server b/src/initrd/tests/sysfs/firmware/ibft/initiator/slp-server
new file mode 100644
index 00000000..fca9e24b
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/initiator/slp-server
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:0427
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target0/chap-type b/src/initrd/tests/sysfs/firmware/ibft/target0/chap-type
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target0/chap-type
@@ -0,0 +1 @@
+0
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target0/flags b/src/initrd/tests/sysfs/firmware/ibft/target0/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target0/flags
@@ -0,0 +1 @@
+3
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target0/index b/src/initrd/tests/sysfs/firmware/ibft/target0/index
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target0/index
@@ -0,0 +1 @@
+0
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target0/ip-addr b/src/initrd/tests/sysfs/firmware/ibft/target0/ip-addr
new file mode 100644
index 00000000..994b6e9c
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target0/ip-addr
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0000:3260
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target0/lun b/src/initrd/tests/sysfs/firmware/ibft/target0/lun
new file mode 100644
index 00000000..7c295bd4
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target0/lun
@@ -0,0 +1 @@
+01000000
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc b/src/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc
@@ -0,0 +1 @@
+0
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target0/port b/src/initrd/tests/sysfs/firmware/ibft/target0/port
new file mode 100644
index 00000000..53f0295f
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target0/port
@@ -0,0 +1 @@
+3260
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target2/chap-type b/src/initrd/tests/sysfs/firmware/ibft/target2/chap-type
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target2/chap-type
@@ -0,0 +1 @@
+0
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target2/flags b/src/initrd/tests/sysfs/firmware/ibft/target2/flags
new file mode 100644
index 00000000..00750edc
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target2/flags
@@ -0,0 +1 @@
+3
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target2/index b/src/initrd/tests/sysfs/firmware/ibft/target2/index
new file mode 100644
index 00000000..0cfbf088
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target2/index
@@ -0,0 +1 @@
+2
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target2/ip-addr b/src/initrd/tests/sysfs/firmware/ibft/target2/ip-addr
new file mode 100644
index 00000000..a210477e
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target2/ip-addr
@@ -0,0 +1 @@
+2001:0db8:0000:0000:0000:0000:0002:3260
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target2/lun b/src/initrd/tests/sysfs/firmware/ibft/target2/lun
new file mode 100644
index 00000000..7c295bd4
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target2/lun
@@ -0,0 +1 @@
+01000000
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc b/src/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc
new file mode 100644
index 00000000..0cfbf088
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc
@@ -0,0 +1 @@
+2
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target2/port b/src/initrd/tests/sysfs/firmware/ibft/target2/port
new file mode 100644
index 00000000..53f0295f
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target2/port
@@ -0,0 +1 @@
+3260
diff --git a/src/initrd/tests/sysfs/firmware/ibft/target2/target-name b/src/initrd/tests/sysfs/firmware/ibft/target2/target-name
new file mode 100644
index 00000000..f4094320
--- /dev/null
+++ b/src/initrd/tests/sysfs/firmware/ibft/target2/target-name
@@ -0,0 +1 @@
+iqn.1994-05.com.example.target:48b055851337
diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c
new file mode 100644
index 00000000..4db71147
--- /dev/null
+++ b/src/initrd/tests/test-cmdline-reader.c
@@ -0,0 +1,787 @@
+/* NetworkManager initrd configuration generator
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2018 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <string.h>
+#include <netinet/ether.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+
+#include "nm-core-internal.h"
+#include "NetworkManagerUtils.h"
+
+#include "../nm-initrd-generator.h"
+
+#include "nm-test-utils-core.h"
+
+static void
+test_auto (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "ip=auto", NULL });
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingWired *s_wired;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+
+	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, "default_connection");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+
+	g_assert (!nm_connection_get_setting_vlan (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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "Wired Connection");
+	g_assert_cmpint (nm_setting_connection_get_timestamp (s_con), ==, 0);
+	g_assert (nm_setting_connection_get_autoconnect (s_con));
+
+	s_wired = nm_connection_get_setting_wired (connection);
+	g_assert (s_wired);
+	g_assert (!nm_setting_wired_get_mac_address (s_wired));
+	g_assert_cmpint (nm_setting_wired_get_mtu (s_wired), ==, 0);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0);
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip4));
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0);
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip6), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
+}
+
+static void
+test_if_auto_with_mtu (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "ip=eth0:auto:1666", NULL });
+	NMConnection *connection;
+	NMSettingWired *s_wired;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+
+	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);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
+
+	s_wired = nm_connection_get_setting_wired (connection);
+	g_assert (s_wired);
+	g_assert_cmpint (nm_setting_wired_get_mtu (s_wired), ==, 1666);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+}
+
+
+static void
+test_if_dhcp6 (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "ip=eth1:dhcp6", NULL });
+	NMConnection *connection;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+
+	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, "eth1");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth1");
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_DHCP);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+}
+
+
+static void
+test_if_auto_with_mtu_and_mac (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "ip=eth2:auto6:2048:00:53:ef:12:34:56", NULL });
+	NMConnection *connection;
+	NMSettingWired *s_wired;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+
+	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, "eth2");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth2");
+
+	s_wired = nm_connection_get_setting_wired (connection);
+	g_assert (s_wired);
+	g_assert_cmpint (nm_setting_wired_get_mtu (s_wired), ==, 2048);
+	g_assert_cmpstr (nm_setting_wired_get_cloned_mac_address (s_wired), ==, "00:53:EF:12:34:56");
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+}
+
+
+static void
+test_if_ip4_manual (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){
+		"ip=192.0.2.2::192.0.2.1:255.255.255.0:"
+		"hostname0.example.com:eth3::192.0.2.53", NULL });
+	NMConnection *connection;
+	NMSettingIPConfig *s_ip4;
+	NMIPAddress *ip_addr;
+
+	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, "eth3");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth3");
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 1);
+	g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip4, 0), ==, "192.0.2.53");
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 0);
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 1);
+	ip_addr = nm_setting_ip_config_get_address (s_ip4, 0);
+	g_assert (ip_addr);
+	g_assert_cmpstr (nm_ip_address_get_address (ip_addr), ==, "192.0.2.2");
+	g_assert_cmpint (nm_ip_address_get_prefix (ip_addr), ==, 24);
+	g_assert_cmpstr (nm_setting_ip_config_get_gateway (s_ip4), ==, "192.0.2.1");
+	g_assert_cmpstr (nm_setting_ip_config_get_dhcp_hostname (s_ip4), ==, "hostname0.example.com");
+}
+
+
+static void
+test_if_ip6_manual (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){
+		"ip=[2001:0db8::02]/64::[2001:0db8::01]::"
+		"hostname0.example.com:eth4::[2001:0db8::53]",
+		NULL
+	});
+	NMConnection *connection;
+	NMSettingIPConfig *s_ip6;
+	NMIPAddress *ip_addr;
+
+	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, "eth4");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth4");
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 1);
+	g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip6, 0), ==, "2001:db8::53");
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 0);
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip6), ==, 1);
+	ip_addr = nm_setting_ip_config_get_address (s_ip6, 0);
+	g_assert (ip_addr);
+	g_assert_cmpstr (nm_ip_address_get_address (ip_addr), ==, "2001:db8::2");
+	g_assert_cmpint (nm_ip_address_get_prefix (ip_addr), ==, 64);
+	g_assert_cmpstr (nm_setting_ip_config_get_gateway (s_ip6), ==, "2001:db8::1");
+	g_assert_cmpstr (nm_setting_ip_config_get_dhcp_hostname (s_ip6), ==, "hostname0.example.com");
+}
+
+static void
+test_multiple (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "ip=192.0.2.2:::::eth0", "ip=[2001:db8::2]:::::eth0", NULL });
+	NMConnection *connection;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	NMIPAddress *ip_addr;
+
+	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);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 1);
+	ip_addr = nm_setting_ip_config_get_address (s_ip4, 0);
+	g_assert (ip_addr);
+	g_assert_cmpstr (nm_ip_address_get_address (ip_addr), ==, "192.0.2.2");
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip6), ==, 1);
+	ip_addr = nm_setting_ip_config_get_address (s_ip6, 0);
+	g_assert (ip_addr);
+	g_assert_cmpstr (nm_ip_address_get_address (ip_addr), ==, "2001:db8::2");
+}
+
+static void
+test_some_more (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "bootdev=eth1", "hail", "nameserver=[2001:DB8:3::53]",
+	                                                 "satan", "nameserver=192.0.2.53", "worship",
+	                                                 "BOOTIF=00-53-AB-cd-02-03", "doom", "rd.peerdns=0",
+	                                                 "rd.route=[2001:DB8:3::/48]:[2001:DB8:2::1]:ens10",
+	                                                 NULL });
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingWired *s_wired;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	NMIPRoute *ip_route;
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+
+	connection = g_hash_table_lookup (connections, "default_connection");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "Wired Connection");
+	g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, "eth1");
+
+	s_wired = nm_connection_get_setting_wired (connection);
+	g_assert (s_wired);
+	g_assert_cmpstr (nm_setting_wired_get_mac_address (s_wired), ==, "00:53:AB:CD:02:03");
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+	g_assert (nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 1);
+	g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip4, 0), ==, "192.0.2.53");
+
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert (nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 1);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
+	g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip6, 0), ==, "2001:db8:3::53");
+
+
+	connection = g_hash_table_lookup (connections, "ens10");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "ens10");
+	g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, "ens10");
+
+	s_wired = nm_connection_get_setting_wired (connection);
+	g_assert (s_wired);
+	g_assert (!nm_setting_wired_get_mac_address (s_wired));
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0);
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 1);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
+	ip_route = nm_setting_ip_config_get_route (s_ip6, 0);
+	g_assert_cmpstr (nm_ip_route_get_dest (ip_route), ==, "2001:db8:3::");
+	g_assert_cmpint (nm_ip_route_get_family (ip_route), ==, AF_INET6);
+	g_assert_cmpint (nm_ip_route_get_metric (ip_route), ==, -1);
+	g_assert_cmpstr (nm_ip_route_get_next_hop (ip_route), ==, "2001:db8:2::1");
+	g_assert_cmpint (nm_ip_route_get_prefix (ip_route), ==, 48);
+}
+
+static void
+test_no_bootif (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "BOOTIF=00-53-AB-cd-02-03", "rd.bootif=0", NULL });
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 0);
+}
+
+static void
+test_bond (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "rd.route=192.0.2.53::bong0", "bond=bong0:eth0,eth1:mode=balance-rr", NULL });
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	NMSettingBond *s_bond;
+	NMIPRoute *ip_route;
+	const char *master_uuid;
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 3);
+
+	connection = g_hash_table_lookup (connections, "bong0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_connection_type (connection), ==, NM_SETTING_BOND_SETTING_NAME);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "bong0");
+	master_uuid = nm_connection_get_uuid (connection);
+	g_assert (master_uuid);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 1);
+	ip_route = nm_setting_ip_config_get_route (s_ip4, 0);
+	g_assert_cmpstr (nm_ip_route_get_dest (ip_route), ==, "192.0.2.53");
+	g_assert_cmpint (nm_ip_route_get_family (ip_route), ==, AF_INET);
+	g_assert_cmpint (nm_ip_route_get_metric (ip_route), ==, -1);
+	g_assert (!nm_ip_route_get_next_hop (ip_route));
+	g_assert_cmpint (nm_ip_route_get_prefix (ip_route), ==, 32);
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 0);
+
+	s_bond = nm_connection_get_setting_bond (connection);
+	g_assert (s_bond);
+	g_assert_cmpint (nm_setting_bond_get_num_options (s_bond), ==, 1);
+	g_assert_cmpstr (nm_setting_bond_get_option_by_name (s_bond, "mode"), ==, "balance-rr");
+
+	connection = g_hash_table_lookup (connections, "eth0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
+
+	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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "eth0");
+	g_assert_cmpstr (nm_setting_connection_get_slave_type (s_con), ==, NM_SETTING_BOND_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, master_uuid);
+
+	connection = g_hash_table_lookup (connections, "eth1");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth1");
+
+	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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "eth1");
+	g_assert_cmpstr (nm_setting_connection_get_slave_type (s_con), ==, NM_SETTING_BOND_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, master_uuid);
+}
+
+static void
+test_bond_default (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "bond", NULL });
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	NMSettingBond *s_bond;
+	const char *master_uuid;
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+
+	connection = g_hash_table_lookup (connections, "bond0");
+
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_connection_type (connection), ==, NM_SETTING_BOND_SETTING_NAME);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "bond0");
+	master_uuid = nm_connection_get_uuid (connection);
+	g_assert (master_uuid);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 0);
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 0);
+
+	s_bond = nm_connection_get_setting_bond (connection);
+	g_assert (s_bond);
+	g_assert_cmpint (nm_setting_bond_get_num_options (s_bond), ==, 1);
+	g_assert_cmpstr (nm_setting_bond_get_option_by_name (s_bond, "mode"), ==, "balance-rr");
+
+	connection = g_hash_table_lookup (connections, "eth0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
+
+	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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "eth0");
+	g_assert_cmpstr (nm_setting_connection_get_slave_type (s_con), ==, NM_SETTING_BOND_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, master_uuid);
+}
+
+static void
+test_bridge (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "bridge=bridge0:eth0,eth1", "rd.route=192.0.2.53::bridge0", NULL });
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	NMSettingBridge *s_bridge;
+	NMIPRoute *ip_route;
+	const char *master_uuid;
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 3);
+
+	connection = g_hash_table_lookup (connections, "bridge0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_connection_type (connection), ==, NM_SETTING_BRIDGE_SETTING_NAME);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "bridge0");
+	master_uuid = nm_connection_get_uuid (connection);
+	g_assert (master_uuid);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 1);
+	ip_route = nm_setting_ip_config_get_route (s_ip4, 0);
+	g_assert_cmpstr (nm_ip_route_get_dest (ip_route), ==, "192.0.2.53");
+	g_assert_cmpint (nm_ip_route_get_family (ip_route), ==, AF_INET);
+	g_assert_cmpint (nm_ip_route_get_metric (ip_route), ==, -1);
+	g_assert (!nm_ip_route_get_next_hop (ip_route));
+	g_assert_cmpint (nm_ip_route_get_prefix (ip_route), ==, 32);
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 0);
+
+	s_bridge = nm_connection_get_setting_bridge (connection);
+	g_assert (s_bridge);
+
+	connection = g_hash_table_lookup (connections, "eth0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
+
+	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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "eth0");
+	g_assert_cmpstr (nm_setting_connection_get_slave_type (s_con), ==, NM_SETTING_BRIDGE_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, master_uuid);
+
+	connection = g_hash_table_lookup (connections, "eth1");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth1");
+
+	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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "eth1");
+	g_assert_cmpstr (nm_setting_connection_get_slave_type (s_con), ==, NM_SETTING_BRIDGE_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, master_uuid);
+}
+
+static void
+test_bridge_default (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "bridge", NULL });
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	NMSettingBridge *s_bridge;
+	const char *master_uuid;
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+
+	connection = g_hash_table_lookup (connections, "bridge0");
+
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_connection_type (connection), ==, NM_SETTING_BRIDGE_SETTING_NAME);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "bridge0");
+	master_uuid = nm_connection_get_uuid (connection);
+	g_assert (master_uuid);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 0);
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 0);
+
+	s_bridge = nm_connection_get_setting_bridge (connection);
+	g_assert (s_bridge);
+
+	connection = g_hash_table_lookup (connections, "eth0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
+
+	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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "eth0");
+	g_assert_cmpstr (nm_setting_connection_get_slave_type (s_con), ==, NM_SETTING_BRIDGE_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, master_uuid);
+}
+
+static void
+test_team (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "team=team0:eth0,eth1", "ip=team0:dhcp6", NULL });
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	NMSettingTeam *s_team;
+	const char *master_uuid;
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 3);
+
+	connection = g_hash_table_lookup (connections, "team0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_connection_type (connection), ==, NM_SETTING_TEAM_SETTING_NAME);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "team0");
+	master_uuid = nm_connection_get_uuid (connection);
+	g_assert (master_uuid);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip4));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 0);
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_DHCP);
+	g_assert (!nm_setting_ip_config_get_ignore_auto_dns (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 0);
+	g_assert (!nm_setting_ip_config_get_gateway (s_ip6));
+	g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 0);
+
+	s_team = nm_connection_get_setting_team (connection);
+	g_assert (s_team);
+
+	connection = g_hash_table_lookup (connections, "eth0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
+
+	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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "eth0");
+	g_assert_cmpstr (nm_setting_connection_get_slave_type (s_con), ==, NM_SETTING_TEAM_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, master_uuid);
+
+	connection = g_hash_table_lookup (connections, "eth1");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth1");
+
+	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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "eth1");
+	g_assert_cmpstr (nm_setting_connection_get_slave_type (s_con), ==, NM_SETTING_TEAM_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, master_uuid);
+}
+
+static void
+test_ibft (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "ip=ibft", NULL });
+	NMConnection *connection;
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 2);
+
+	connection = g_hash_table_lookup (connections, "ibft0");
+	g_assert (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert_cmpstr (nm_connection_get_id (connection), ==, "iBFT VLAN Connection 0");
+
+	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");
+}
+
+static void
+test_ignore_extra (void)
+{
+	gs_unref_hashtable GHashTable *connections = NULL;
+	gs_strfreev char **argv = g_strdupv ((char *[]){ "blabla", "extra", "lalala", NULL });
+
+	connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", argv);
+	g_assert (connections);
+	g_assert_cmpint (g_hash_table_size (connections), ==, 0);
+}
+
+NMTST_DEFINE ();
+
+int main (int argc, char **argv)
+{
+	nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
+
+	g_test_add_func ("/initrd/cmdline/auto", test_auto);
+	g_test_add_func ("/initrd/cmdline/if_auto_with_mtu", test_if_auto_with_mtu);
+	g_test_add_func ("/initrd/cmdline/if_dhcp6", test_if_dhcp6);
+	g_test_add_func ("/initrd/cmdline/if_auto_with_mtu_and_mac", test_if_auto_with_mtu_and_mac);
+	g_test_add_func ("/initrd/cmdline/if_ip4_manual", test_if_ip4_manual);
+	g_test_add_func ("/initrd/cmdline/if_ip6_manual", test_if_ip6_manual);
+	g_test_add_func ("/initrd/cmdline/multiple", test_multiple);
+	g_test_add_func ("/initrd/cmdline/some_more", test_some_more);
+	g_test_add_func ("/initrd/cmdline/no_bootif", test_no_bootif);
+	g_test_add_func ("/initrd/cmdline/bond", test_bond);
+	g_test_add_func ("/initrd/cmdline/bond/default", test_bond_default);
+	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/ignore_extra", test_ignore_extra);
+
+	return g_test_run ();
+}
diff --git a/src/initrd/tests/test-ibft-reader.c b/src/initrd/tests/test-ibft-reader.c
new file mode 100644
index 00000000..340b3896
--- /dev/null
+++ b/src/initrd/tests/test-ibft-reader.c
@@ -0,0 +1,286 @@
+/* NetworkManager initrd configuration generator
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2014 - 2018 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <string.h>
+#include <netinet/ether.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+
+#include "nm-core-internal.h"
+#include "NetworkManagerUtils.h"
+
+#include "../nm-initrd-generator.h"
+
+#include "nm-test-utils-core.h"
+
+static NMConnection *
+read_connection (const char *sysfs_dir, const char *expected_mac, GError **error)
+{
+	NMConnection *connection = NULL;
+	gs_unref_hashtable GHashTable *ibft = NULL;
+	gs_free char *mac = NULL;
+	GHashTable *nic = NULL;
+
+	ibft = nmi_ibft_read (sysfs_dir);
+
+	mac = g_ascii_strup (expected_mac, -1);
+	nic = g_hash_table_lookup (ibft, mac);
+	if (!nic)
+		return NULL;
+
+	connection = nm_simple_connection_new ();
+
+	if (!nmi_ibft_update_connection_from_nic (connection, nic, error))
+		g_clear_object (&connection);
+
+	return connection;
+}
+
+static void
+test_read_ibft_dhcp (void)
+{
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingWired *s_wired;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	GError *error = NULL;
+	const char *mac_address;
+	const char *expected_mac_address = "00:33:21:98:b9:f1";
+
+	connection = read_connection (TEST_INITRD_DIR "/sysfs-dhcp", expected_mac_address, &error);
+	g_assert_no_error (error);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+
+	g_assert (!nm_connection_get_setting_vlan (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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "iBFT Connection 1");
+	g_assert_cmpint (nm_setting_connection_get_timestamp (s_con), ==, 0);
+	g_assert (nm_setting_connection_get_autoconnect (s_con));
+
+	s_wired = nm_connection_get_setting_wired (connection);
+	g_assert (s_wired);
+	mac_address = nm_setting_wired_get_mac_address (s_wired);
+	g_assert (mac_address);
+	g_assert (nm_utils_hwaddr_matches (mac_address, -1, expected_mac_address, -1));
+	g_assert_cmpint (nm_setting_wired_get_mtu (s_wired), ==, 0);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_IGNORE);
+
+	g_object_unref (connection);
+}
+
+static void
+test_read_ibft_static (void)
+{
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingWired *s_wired;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	GError *error = NULL;
+	const char *mac_address;
+	const char *expected_mac_address = "00:33:21:98:b9:f0";
+	NMIPAddress *ip4_addr;
+
+	connection = read_connection (TEST_INITRD_DIR "/sysfs-static", expected_mac_address, &error);
+	g_assert_no_error (error);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+
+	g_assert (!nm_connection_get_setting_vlan (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_WIRED_SETTING_NAME);
+	g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "iBFT Connection 0");
+	g_assert_cmpint (nm_setting_connection_get_timestamp (s_con), ==, 0);
+	g_assert (nm_setting_connection_get_autoconnect (s_con));
+
+	s_wired = nm_connection_get_setting_wired (connection);
+	g_assert (s_wired);
+	mac_address = nm_setting_wired_get_mac_address (s_wired);
+	g_assert (mac_address);
+	g_assert (nm_utils_hwaddr_matches (mac_address, -1, expected_mac_address, -1));
+	g_assert_cmpint (nm_setting_wired_get_mtu (s_wired), ==, 0);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 2);
+	g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip4, 0), ==, "10.16.255.2");
+	g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip4, 1), ==, "10.16.255.3");
+
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 1);
+	ip4_addr = nm_setting_ip_config_get_address (s_ip4, 0);
+	g_assert (ip4_addr);
+	g_assert_cmpstr (nm_ip_address_get_address (ip4_addr), ==, "192.168.32.72");
+	g_assert_cmpint (nm_ip_address_get_prefix (ip4_addr), ==, 22);
+
+	g_assert_cmpstr (nm_setting_ip_config_get_gateway (s_ip4), ==, "192.168.35.254");
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (s_ip6);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_IGNORE);
+
+	g_object_unref (connection);
+}
+
+
+static void
+test_read_ibft_bad_address (gconstpointer user_data)
+{
+	const char *sysfs_dir = user_data;
+	NMConnection *connection;
+	GError *error = NULL;
+
+	g_assert (g_file_test (sysfs_dir, G_FILE_TEST_EXISTS));
+
+	connection = read_connection (sysfs_dir, "00:33:21:98:b9:f0", &error);
+	g_assert (connection == NULL);
+	g_assert (error);
+	g_clear_error (&error);
+}
+
+static void
+test_read_ibft_vlan (void)
+{
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingWired *s_wired;
+	NMSettingVlan *s_vlan;
+	NMSettingIPConfig *s_ip4;
+	const char *mac_address;
+	const char *expected_mac_address = "00:33:21:98:b9:f0";
+	NMIPAddress *ip4_addr;
+	GError *error = NULL;
+
+	connection = read_connection (TEST_INITRD_DIR "/sysfs-vlan", expected_mac_address, &error);
+	g_assert_no_error (error);
+	nmtst_assert_connection_verifies_without_normalization (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);
+
+	/* ===== WIRED SETTING ===== */
+	s_wired = nm_connection_get_setting_wired (connection);
+	g_assert (s_wired);
+	mac_address = nm_setting_wired_get_mac_address (s_wired);
+	g_assert (mac_address);
+	g_assert (nm_utils_hwaddr_matches (mac_address, -1, expected_mac_address, -1));
+
+	/* ===== VLAN SETTING ===== */
+	s_vlan = nm_connection_get_setting_vlan (connection);
+	g_assert (s_vlan);
+	g_assert_cmpint (nm_setting_vlan_get_id (s_vlan), ==, 123);
+	g_assert_cmpstr (nm_setting_vlan_get_parent (s_vlan), ==, NULL);
+
+	/* ===== IPv4 SETTING ===== */
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (s_ip4);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
+
+	g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 0);
+
+	g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 1);
+	ip4_addr = nm_setting_ip_config_get_address (s_ip4, 0);
+	g_assert (ip4_addr);
+	g_assert_cmpstr (nm_ip_address_get_address (ip4_addr), ==, "192.168.6.200");
+	g_assert_cmpint (nm_ip_address_get_prefix (ip4_addr), ==, 24);
+
+	g_assert_cmpstr (nm_setting_ip_config_get_gateway (s_ip4), ==, NULL);
+
+	g_object_unref (connection);
+}
+
+static void
+test_read_ibft (void)
+{
+	NMConnection *connection;
+	NMSettingIPConfig *s_ip4;
+	NMSettingIPConfig *s_ip6;
+	GError *error = NULL;
+
+	/* This test doesn't actually test too much (apart from the presence of
+	 * IPv6 that is not covered by other tests), but the test fixture is a good
+	 * example of about everything that can be included in iBFT table (as of
+	 * ACPI 3.0b). */
+
+	connection = read_connection (TEST_INITRD_DIR "/sysfs", "00:53:00:AB:00:01", &error);
+	g_assert (connection);
+	g_assert_no_error (error);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+	g_assert (nm_setting_ip_config_get_num_addresses (s_ip4) == 0);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (nm_setting_ip_config_get_num_addresses (s_ip6) == 1);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+	g_object_unref (connection);
+
+	connection = read_connection (TEST_INITRD_DIR "/sysfs", "00:53:06:66:AB:01", &error);
+	g_assert (connection);
+	g_assert_no_error (error);
+	nmtst_assert_connection_verifies_without_normalization (connection);
+
+	s_ip4 = nm_connection_get_setting_ip4_config (connection);
+	g_assert (nm_setting_ip_config_get_num_addresses (s_ip4) == 1);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+
+	s_ip6 = nm_connection_get_setting_ip6_config (connection);
+	g_assert (nm_setting_ip_config_get_num_addresses (s_ip6) == 0);
+	g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_IGNORE);
+	g_object_unref (connection);
+}
+
+NMTST_DEFINE ();
+
+int main (int argc, char **argv)
+{
+	nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
+
+	g_test_add_func ("/initrd/ibft", test_read_ibft);
+	g_test_add_func ("/initrd/ibft/dhcp", test_read_ibft_dhcp);
+	g_test_add_func ("/initrd/ibft/static", test_read_ibft_static);
+	g_test_add_func ("/initrd/ibft/vlan", test_read_ibft_vlan);
+	g_test_add_data_func ("/initrd/ibft/bad-ipaddr-read", TEST_INITRD_DIR "/sysfs-bad-ipaddr", test_read_ibft_bad_address);
+	g_test_add_data_func ("/initrd/ibft/bad-gateway-read", TEST_INITRD_DIR "/sysfs-bad-gateway", test_read_ibft_bad_address);
+	g_test_add_data_func ("/initrd/ibft/bad-dns1-read", TEST_INITRD_DIR "/sysfs-bad-dns1", test_read_ibft_bad_address);
+	g_test_add_data_func ("/initrd/ibft/bad-dns2-read", TEST_INITRD_DIR "/sysfs-bad-dns2", test_read_ibft_bad_address);
+
+	return g_test_run ();
+}