Skip to contentSkip to conversation

Add iSCSI IBFT support (v0.4.5) - fixes to the header files.

PATCH In review Konrad Rzeszutek 2 participants 3 messages Jan 28, 2008 – Jan 30, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Add iSCSI IBFT support (v0.4.5) - fixes to the header files.

This patch (v0.4.5) adds /sysfs/firmware/ibft/[initiator|targetX|ethernetX] directories along with text properties which export the the iSCSI Boot Firmware Table (iBFT) structure.

What is iSCSI Boot Firmware Table? It is a mechanism for the iSCSI tools to extract from the machine NICs the iSCSI connection information so that they can automagically mount the iSCSI share/target. Currently the iSCSI information is hard-coded in the initrd. The /sysfs entries are read-only one-name-and-value fields.

The usual set of data exposed is:

# for a in `find /sys/firmware/ibft/ -type f -print`; do  echo -n "$a: ";  cat $a; done
/sys/firmware/ibft/target0/target-name: iqn.2007.com.intel-sbx44:storage-10gb
/sys/firmware/ibft/target0/nic-assoc: 0
/sys/firmware/ibft/target0/chap-type: 0
/sys/firmware/ibft/target0/lun: 00000000
/sys/firmware/ibft/target0/port: 3260
/sys/firmware/ibft/target0/ip-addr: 192.168.79.116
/sys/firmware/ibft/target0/flags: 3
/sys/firmware/ibft/target0/index: 0
/sys/firmware/ibft/ethernet0/mac: 00:11:25:9d:8b:01
/sys/firmware/ibft/ethernet0/vlan: 0
/sys/firmware/ibft/ethernet0/gateway: 192.168.79.254
/sys/firmware/ibft/ethernet0/origin: 0
/sys/firmware/ibft/ethernet0/subnet-mask: 255.255.252.0
/sys/firmware/ibft/ethernet0/ip-addr: 192.168.77.41
/sys/firmware/ibft/ethernet0/flags: 7
/sys/firmware/ibft/ethernet0/index: 0
/sys/firmware/ibft/initiator/initiator-name: iqn.2007-07.com:konrad.initiator
/sys/firmware/ibft/initiator/flags: 3
/sys/firmware/ibft/initiator/index: 0

For full details of the IBFT structure please take a look at:
ftp://ftp.software.ibm.com/systems/support/system_x_pdf/ibm_iscsi_boot_firmware_table_v1.02.pdf

Please note that this patch depends on the Greg KH patches tree kobject changes.

Cc Mike Christie <[email protected]>
Cc Peter Jones <[email protected]>
Cc Greg KH <[email protected]>
Cc James Bottomley <[email protected]>

---

 Documentation/ABI/testing/sysfs-ibft |   23 
 arch/x86/kernel/setup_32.c           |    3 
 arch/x86/kernel/setup_64.c           |    4 
 drivers/firmware/Kconfig             |   19 
 drivers/firmware/Makefile            |    2 
 drivers/firmware/iscsi_ibft.c        |  975 +++++++++++++++++++++++++++++++++++
 drivers/firmware/iscsi_ibft_find.c   |   77 ++
 include/linux/iscsi_ibft.h           |   52 +
 8 files changed, 1155 insertions(+)
Documentation/ABI/testing/sysfs-ibft new file +23 -0
new file mode 100644
index 0000000..062c009
@@ -0,0 +1,23 @@
+What:		/sys/firmware/ibft/initiator
+Date:		November 2007
+Contact:	Konrad Rzeszutek <[email protected]>
+Description:	The /sys/firmware/ibft/initiator directory will contain
+		files that expose the iSCSI Boot Firmware Table initiator data.
+		Usually this contains the Initiator name.
+
+What:		/sys/firmware/ibft/targetX
+Date:		November 2007
+Contact:	Konrad Rzeszutek <[email protected]>
+Description:	The /sys/firmware/ibft/targetX directory will contain
+		files that expose the iSCSI Boot Firmware Table target data.
+		Usually this contains the target's IP address, boot LUN,
+		target name, and what NIC it is associated with. It can also
+		contain the CHAP name (and password), the reverse CHAP
+		name (and password)
+
+What:		/sys/firmware/ibft/ethernetX
+Date:		November 2007
+Contact:	Konrad Rzeszutek <[email protected]>
+Description:	The /sys/firmware/ibft/ethernetX directory will contain
+		files that expose the iSCSI Boot Firmware Table NIC data.
+		This can this can the IP address, MAC, and gateway of the NIC.
arch/x86/kernel/setup_32.c +3 -0
index 9c24b45..5da7b8d 100644
@@ -39,6 +39,7 @@
 #include <linux/efi.h>
 #include <linux/init.h>
 #include <linux/edd.h>
+#include <linux/iscsi_ibft.h>
 #include <linux/nodemask.h>
 #include <linux/kexec.h>
 #include <linux/crash_dump.h>
@@ -496,6 +497,8 @@ void __init setup_bootmem_allocator(void)
 	}
 #endif
 	reserve_crashkernel();
+
+	reserve_ibft_region();
 }
 
 /*
arch/x86/kernel/setup_64.c +4 -0
index 30d94d1..3393f2d 100644
@@ -33,6 +33,7 @@
 #include <linux/acpi.h>
 #include <linux/kallsyms.h>
 #include <linux/edd.h>
+#include <linux/iscsi_ibft.h>
 #include <linux/mmzone.h>
 #include <linux/kexec.h>
 #include <linux/cpufreq.h>
@@ -403,6 +404,9 @@ void __init setup_arch(char **cmdline_p)
 	}
 #endif
 	reserve_crashkernel();
+
+	reserve_ibft_region();
+
 	paging_init();
 
 #ifdef CONFIG_PCI
drivers/firmware/Kconfig +19 -0
index 05f02a3..e2f7208 100644
@@ -93,4 +93,23 @@ config DMIID
 	  information from userspace through /sys/class/dmi/id/ or if you want
 	  DMI-based module auto-loading.
 
+config ISCSI_IBFT_FIND
+	bool "iSCSI Boot Firmware Table Attributes"
+	default n
+	help
+	  This option enables the kernel to find the region of memory
+	  in which the ISCSI Boot Firmware Table (iBFT) resides. This
+	  is necessary for iSCSI Boot Firmware Table Attributes module to work
+	  properly.
+
+config ISCSI_IBFT
+	tristate "iSCSI Boot Firmware Table Attributes module"
+	depends on ISCSI_IBFT_FIND
+	default	n
+	help
+	  This option enables support for detection and exposing of iSCSI
+	  Boot Firmware Table (iBFT) via sysfs to userspace. If you wish to
+	  detect iSCSI boot parameters dynamically during system boot, say Y.
+	  Otherwise, say N.
+
 endmenu
drivers/firmware/Makefile +2 -0
index 8d4ebc8..4c91471 100644
@@ -8,3 +8,5 @@ obj-$(CONFIG_EFI_PCDP)		+= pcdp.o
 obj-$(CONFIG_DELL_RBU)          += dell_rbu.o
 obj-$(CONFIG_DCDBAS)		+= dcdbas.o
 obj-$(CONFIG_DMIID)		+= dmi-id.o
+obj-$(CONFIG_ISCSI_IBFT_FIND)	+= iscsi_ibft_find.o
+obj-$(CONFIG_ISCSI_IBFT)	+= iscsi_ibft.o
drivers/firmware/iscsi_ibft.c new file +975 -0

975 lines not on this page · raw message

drivers/firmware/iscsi_ibft_find.c new file +77 -0

77 lines not on this page · raw message

include/linux/iscsi_ibft.h new file +52 -0

52 lines not on this page · raw message

#1 lore raw
Quoted 6 lines · Konrad Rzeszutek
drivers/firmware/iscsi_ibft.c new file +6 -0
+/*
+ * Helper functions to parse data properly.
+ */
+static ssize_t sprintf_ipaddr(char *buf, u8 *ip)
+{
+	if (ip[0] == 0 && ip[1] == 0 && ip[2] == 0 && ip[3] == 0 &&

drivers/firmware/iscsi_ibft.c line 285

Quoted 10 lines
drivers/firmware/iscsi_ibft.c new file +10 -0
+	    ip[4] == 0 && ip[5] == 0 && ip[6] == 0 && ip[7] == 0 &&
+	    ip[8] == 0 && ip[9] == 0 && ip[10] == 0xff && ip[11] == 0xff) {
+		/*
+		 * IPV4
+		 */
+		return sprintf(buf, "%d.%d.%d.%d\n", ip[12],
+			       ip[13], ip[14], ip[15]);
+	} else
+		return 0;
+}

You probably just want to use the NIPQUAD_FMT and NIP6_FMT macros here. Also why isn't ipv6 supported?

#2 lore raw
Quoted 11 lines · On Tuesday 29 January 2008 14:15:15 Mike Christie wrote:
Quoted 10 lines · Konrad Rzeszutek
drivers/firmware/iscsi_ibft.c new file +10 -0
+/*
+ * Helper functions to parse data properly.
+ */
+static ssize_t sprintf_ipaddr(char *buf, u8 *ip)
+{
+	if (ip[0] == 0 && ip[1] == 0 && ip[2] == 0 && ip[3] == 0 &&
+	    ip[4] == 0 && ip[5] == 0 && ip[6] == 0 && ip[7] == 0 &&
+	    ip[8] == 0 && ip[9] == 0 && ip[10] == 0xff && ip[11] == 0xff) {
+		/*
+		 * IPV4
Quoted 8 lines

drivers/firmware/iscsi_ibft.c line 285

Quoted 6 lines
drivers/firmware/iscsi_ibft.c new file +6 -0
+		 */
+		return sprintf(buf, "%d.%d.%d.%d\n", ip[12],
+			       ip[13], ip[14], ip[15]);
+	} else
+		return 0;
+}

You probably just want to use the NIPQUAD_FMT and NIP6_FMT macros here.

Ah, I knew a macro like this _ought_ to be there somewhere. Thanks.

Quoted 1 line

Also why isn't ipv6 supported?

I didn't get to test the IPV6 yet so I didn't want to put in code that might have worked or not :-(