summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile.am244
-rw-r--r--src/initrd/nm-initrd-generator.h45
-rw-r--r--src/initrd/nmi-ibft-reader.c441
-rw-r--r--src/initrd/tests/meson.build22
-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-ibft-reader.c286
198 files changed, 1231 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index f71f1f88a8..fafa43bda7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -252,6 +252,7 @@ test-*.trs
/src/dhcp/tests/test-dhcp-options
/src/dhcp/tests/test-dhcp-utils
/src/dnsmasq/tests/test-dnsmasq-utils
+/src/initrd/tests/test-ibft-reader
/src/nm-iface-helper
/src/ndisc/tests/test-ndisc-fake
/src/ndisc/tests/test-ndisc-linux
diff --git a/Makefile.am b/Makefile.am
index afa6cfc852..5c75dfcbd8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1925,6 +1925,250 @@ $(src_nm_iface_helper_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
###############################################################################
+noinst_LTLIBRARIES += src/initrd/libnmi-core.la
+
+src_initrd_libnmi_core_la_CPPFLAGS = \
+ $(src_cppflags)
+
+src_initrd_libnmi_core_la_SOURCES = \
+ src/initrd/nm-initrd-generator.h \
+ src/initrd/nmi-ibft-reader.c \
+ $(NULL)
+
+check_programs += src/initrd/tests/test-ibft-reader
+
+src_initrd_tests_test_ibft_reader_CPPFLAGS = \
+ -DNETWORKMANAGER_COMPILATION_TEST \
+ -DTEST_INITRD_DIR=\"$(abs_srcdir)/src/initrd/tests\" \
+ $(src_cppflags)
+
+src_initrd_tests_test_ibft_reader_LDFLAGS = \
+ $(CODE_COVERAGE_LDFLAGS) \
+ $(SANITIZER_EXEC_LDFLAGS)
+
+src_initrd_tests_test_ibft_reader_LDADD = \
+ libnm-core/libnm-core.la \
+ src/initrd/libnmi-core.la \
+ src/libNetworkManagerTest.la \
+ $(GLIB_LIBS)
+
+EXTRA_DIST += \
+ src/initrd/tests/sysfs/class/net/eth0/address \
+ src/initrd/tests/sysfs/class/net/eth2/address \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/mac \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/origin \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/index \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet0/flags \
+ src/initrd/tests/sysfs/firmware/ibft/initiator/isns-server \
+ src/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name \
+ src/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server \
+ src/initrd/tests/sysfs/firmware/ibft/initiator/slp-server \
+ src/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server \
+ src/initrd/tests/sysfs/firmware/ibft/initiator/index \
+ src/initrd/tests/sysfs/firmware/ibft/initiator/flags \
+ src/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc \
+ src/initrd/tests/sysfs/firmware/ibft/target0/ip-addr \
+ src/initrd/tests/sysfs/firmware/ibft/target0/chap-type \
+ src/initrd/tests/sysfs/firmware/ibft/target0/index \
+ src/initrd/tests/sysfs/firmware/ibft/target0/lun \
+ src/initrd/tests/sysfs/firmware/ibft/target0/flags \
+ src/initrd/tests/sysfs/firmware/ibft/target0/port \
+ src/initrd/tests/sysfs/firmware/ibft/target2/target-name \
+ src/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc \
+ src/initrd/tests/sysfs/firmware/ibft/target2/ip-addr \
+ src/initrd/tests/sysfs/firmware/ibft/target2/chap-type \
+ src/initrd/tests/sysfs/firmware/ibft/target2/index \
+ src/initrd/tests/sysfs/firmware/ibft/target2/lun \
+ src/initrd/tests/sysfs/firmware/ibft/target2/flags \
+ src/initrd/tests/sysfs/firmware/ibft/target2/port \
+ src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id \
+ src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id \
+ src/initrd/tests/sysfs/firmware/ibft/acpi_header/signature \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/mac \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/origin \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/index \
+ src/initrd/tests/sysfs/firmware/ibft/ethernet2/flags \
+ src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun \
+ src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port \
+ src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun \
+ src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port \
+ src/initrd/tests/sysfs-bad-gateway/class/net/eth0/address \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun \
+ src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port \
+ src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun \
+ src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port \
+ src/initrd/tests/sysfs-dhcp/class/net/eth0/address \
+ src/initrd/tests/sysfs-dhcp/class/net/eth1/address \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun \
+ src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port \
+ src/initrd/tests/sysfs-static/class/net/eth0/address \
+ src/initrd/tests/sysfs-static/class/net/eth1/address \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index \
+ src/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name \
+ src/initrd/tests/sysfs-static/firmware/ibft/target0/target-name \
+ src/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr \
+ src/initrd/tests/sysfs-static/firmware/ibft/target0/index \
+ src/initrd/tests/sysfs-static/firmware/ibft/target0/lun \
+ src/initrd/tests/sysfs-static/firmware/ibft/target0/port \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns \
+ src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index \
+ src/initrd/tests/sysfs-static/firmware/ibft/target1/target-name \
+ src/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr \
+ src/initrd/tests/sysfs-static/firmware/ibft/target1/index \
+ src/initrd/tests/sysfs-static/firmware/ibft/target1/lun \
+ src/initrd/tests/sysfs-static/firmware/ibft/target1/port \
+ src/initrd/tests/sysfs-vlan/class/net/eth0/address \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/target0/index \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun \
+ src/initrd/tests/sysfs-vlan/firmware/ibft/target0/port \
+ $(NULL)
+
+check_programs += src/initrd/tests/test-cmdline-reader
+
+src_initrd_tests_test_cmdline_reader_CPPFLAGS = \
+ -DNETWORKMANAGER_COMPILATION_TEST \
+ -DTEST_INITRD_DIR=\"$(abs_srcdir)/src/initrd/tests\" \
+ $(src_cppflags)
+
+src_initrd_tests_test_cmdline_reader_LDFLAGS = \
+ $(CODE_COVERAGE_LDFLAGS) \
+ $(SANITIZER_EXEC_LDFLAGS)
+
+src_initrd_tests_test_cmdline_reader_LDADD = \
+ libnm-core/libnm-core.la \
+ src/initrd/libnmi-core.la \
+ src/libNetworkManagerTest.la \
+ $(GLIB_LIBS)
+
+$(src_initrd_libnmi_core_la_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
+$(src_initrd_tests_test_ibft_reader_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
+
+###############################################################################
+
EXTRA_DIST += \
src/org.freedesktop.NetworkManager.conf \
src/nm-test-utils-core.h \
diff --git a/src/initrd/nm-initrd-generator.h b/src/initrd/nm-initrd-generator.h
new file mode 100644
index 0000000000..1fa858fc6a
--- /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-ibft-reader.c b/src/initrd/nmi-ibft-reader.c
new file mode 100644
index 0000000000..c927546746
--- /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/meson.build b/src/initrd/tests/meson.build
new file mode 100644
index 0000000000..0e74ea8d9e
--- /dev/null
+++ b/src/initrd/tests/meson.build
@@ -0,0 +1,22 @@
+test_unit = 'test-ibft'
+
+test_ibft_dir = meson.current_source_dir()
+
+cflags = [
+ '-DTEST_IBFT_DIR="@0@"'.format(test_ibft_dir),
+ '-DTEST_SCRATCH_DIR="@0@"'.format(test_ibft_dir)
+]
+
+exe = executable(
+ test_unit,
+ test_unit + '.c',
+ dependencies: test_nm_dep,
+ c_args: cflags,
+ link_with: libnmi_ibft_core
+)
+
+test(
+ 'ibft/' + test_unit,
+ test_script,
+ args: test_args + [exe.full_path()]
+)
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 0000000000..20659db7e8
--- /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 0000000000..bf6cf4543f
--- /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 0000000000..c227083464
--- /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 0000000000..944c8d4565
--- /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 0000000000..20659db7e8
--- /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 0000000000..56a6051ca2
--- /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 0000000000..8fdd954df9
--- /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 0000000000..2303dbdcbc
--- /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 0000000000..2eb9e1d0ad
--- /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 0000000000..7cb9d0a9bb
--- /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 0000000000..c227083464
--- /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 0000000000..509a7ab8be
--- /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 0000000000..c227083464
--- /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 0000000000..7450fdf90a
--- /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 0000000000..c43d0930ca
--- /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 0000000000..58f0d919f4
--- /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 0000000000..32c9450a2f
--- /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 0000000000..20659db7e8
--- /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 0000000000..bf6cf4543f
--- /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 0000000000..c227083464
--- /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 0000000000..944c8d4565
--- /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 0000000000..20659db7e8
--- /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 0000000000..56a6051ca2
--- /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 0000000000..8fdd954df9
--- /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 0000000000..2e152cb083
--- /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 0000000000..5ed7b71958
--- /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 0000000000..7cb9d0a9bb
--- /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 0000000000..c227083464
--- /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 0000000000..509a7ab8be
--- /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 0000000000..c227083464
--- /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 0000000000..7450fdf90a
--- /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 0000000000..c43d0930ca
--- /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 0000000000..58f0d919f4
--- /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 0000000000..32c9450a2f
--- /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 0000000000..20659db7e8
--- /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 0000000000..1970856e09
--- /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 0000000000..c227083464
--- /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 0000000000..944c8d4565
--- /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 0000000000..20659db7e8
--- /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 0000000000..56a6051ca2
--- /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 0000000000..8fdd954df9
--- /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 0000000000..2e152cb083
--- /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 0000000000..2eb9e1d0ad
--- /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 0000000000..7cb9d0a9bb
--- /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 0000000000..c227083464
--- /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 0000000000..509a7ab8be
--- /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 0000000000..c227083464
--- /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 0000000000..7450fdf90a
--- /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 0000000000..c43d0930ca
--- /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 0000000000..58f0d919f4
--- /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 0000000000..32c9450a2f
--- /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 0000000000..20659db7e8
--- /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 0000000000..bf6cf4543f
--- /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 0000000000..c227083464
--- /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 0000000000..d526f3244f
--- /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 0000000000..20659db7e8
--- /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 0000000000..56a6051ca2
--- /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 0000000000..8fdd954df9
--- /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 0000000000..2e152cb083
--- /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 0000000000..2eb9e1d0ad
--- /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 0000000000..7cb9d0a9bb
--- /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 0000000000..c227083464
--- /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 0000000000..509a7ab8be
--- /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 0000000000..c227083464
--- /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 0000000000..7450fdf90a
--- /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 0000000000..c43d0930ca
--- /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 0000000000..58f0d919f4
--- /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 0000000000..32c9450a2f
--- /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 0000000000..20659db7e8
--- /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 0000000000..befa7850fd
--- /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 0000000000..59ea5b826b
--- /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 0000000000..c227083464
--- /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 0000000000..20659db7e8
--- /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 0000000000..e440e5c842
--- /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 0000000000..2e152cb083
--- /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 0000000000..2eb9e1d0ad
--- /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 0000000000..c227083464
--- /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 0000000000..59ea5b826b
--- /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 0000000000..56a6051ca2
--- /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 0000000000..befa7850fd
--- /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 0000000000..e440e5c842
--- /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 0000000000..2e152cb083
--- /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 0000000000..2eb9e1d0ad
--- /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 0000000000..c227083464
--- /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 0000000000..509a7ab8be
--- /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 0000000000..c227083464
--- /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 0000000000..7450fdf90a
--- /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 0000000000..c43d0930ca
--- /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 0000000000..58f0d919f4
--- /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 0000000000..32c9450a2f
--- /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 0000000000..56a6051ca2
--- /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 0000000000..7450fdf90a
--- /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 0000000000..c43d0930ca
--- /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 0000000000..58f0d919f4
--- /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 0000000000..ac3a6a2ab3
--- /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 0000000000..20659db7e8
--- /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 0000000000..befa7850fd
--- /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 0000000000..bf6cf4543f
--- /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 0000000000..c227083464
--- /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 0000000000..944c8d4565
--- /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 0000000000..20659db7e8
--- /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 0000000000..56a6051ca2
--- /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 0000000000..8fdd954df9
--- /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 0000000000..2e152cb083
--- /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 0000000000..2eb9e1d0ad
--- /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 0000000000..7cb9d0a9bb
--- /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 0000000000..c227083464
--- /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 0000000000..59ea5b826b
--- /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 0000000000..56a6051ca2
--- /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 0000000000..befa7850fd
--- /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 0000000000..e440e5c842
--- /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 0000000000..2e152cb083
--- /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 0000000000..2eb9e1d0ad
--- /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 0000000000..c227083464
--- /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 0000000000..509a7ab8be
--- /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 0000000000..c227083464
--- /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 0000000000..7450fdf90a
--- /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 0000000000..c43d0930ca
--- /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 0000000000..58f0d919f4
--- /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 0000000000..32c9450a2f
--- /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 0000000000..56a6051ca2
--- /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 0000000000..7450fdf90a
--- /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 0000000000..c43d0930ca
--- /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 0000000000..58f0d919f4
--- /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 0000000000..ac3a6a2ab3
--- /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 0000000000..20659db7e8
--- /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 0000000000..c227083464
--- /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 0000000000..4923230c8c
--- /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 0000000000..20659db7e8
--- /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 0000000000..56a6051ca2
--- /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 0000000000..cabf43b5dd
--- /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 0000000000..5a279b41f0
--- /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 0000000000..d800886d9c
--- /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 0000000000..8e9cd2c42c
--- /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 0000000000..c227083464
--- /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 0000000000..a32ce01ba1
--- /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 0000000000..f309ca6a0a
--- /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 0000000000..58f0d919f4
--- /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 0000000000..f0e6115796
--- /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 0000000000..1f2f610ecc
--- /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 0000000000..6ec1078ab8
--- /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 0000000000..590d9cd211
--- /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 0000000000..35d4d09ce2
--- /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 0000000000..e3a5d7ef22
--- /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 0000000000..98a0d79742
--- /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 0000000000..00750edc07
--- /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 0000000000..7f378f8f97
--- /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 0000000000..3ed5163c84
--- /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 0000000000..573541ac97
--- /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 0000000000..98a0d79742
--- /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 0000000000..f24413198a
--- /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 0000000000..b8626c4cff
--- /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 0000000000..900731ffd5
--- /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 0000000000..e7511d5af4
--- /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 0000000000..1f6c5c9547
--- /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 0000000000..5df934545e
--- /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 0000000000..7cc86ad136
--- /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 0000000000..61ef5585ef
--- /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 0000000000..00750edc07
--- /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 0000000000..2096f194ff
--- /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 0000000000..5dc539d584
--- /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 0000000000..0cfbf08886
--- /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 0000000000..61ef5585ef
--- /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 0000000000..2fc3d5253b
--- /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 0000000000..00750edc07
--- /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 0000000000..a45fd52cc5
--- /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 0000000000..6fa8c74292
--- /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 0000000000..a7269ff5e9
--- /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 0000000000..d30f9e9fdb
--- /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 0000000000..573541ac97
--- /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 0000000000..00750edc07
--- /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 0000000000..573541ac97
--- /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 0000000000..337b5a0f3a
--- /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 0000000000..4aff93986c
--- /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 0000000000..a26fb64927
--- /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 0000000000..908be27f4b
--- /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 0000000000..fca9e24bd5
--- /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 0000000000..573541ac97
--- /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 0000000000..00750edc07
--- /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 0000000000..573541ac97
--- /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 0000000000..994b6e9c69
--- /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 0000000000..7c295bd444
--- /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 0000000000..573541ac97
--- /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 0000000000..53f0295f3f
--- /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 0000000000..573541ac97
--- /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 0000000000..00750edc07
--- /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 0000000000..0cfbf08886
--- /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 0000000000..a210477e6d
--- /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 0000000000..7c295bd444
--- /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 0000000000..0cfbf08886
--- /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 0000000000..53f0295f3f
--- /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 0000000000..f409432041
--- /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-ibft-reader.c b/src/initrd/tests/test-ibft-reader.c
new file mode 100644
index 0000000000..340b3896c8
--- /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 ();
+}