123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- #ifndef _IPXE_IBFT_H
- #define _IPXE_IBFT_H
-
- /*
- * Copyright Fen Systems Ltd. 2007. Portions of this code are derived
- * from IBM Corporation Sample Programs. Copyright IBM Corporation
- * 2004, 2007. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
- FILE_LICENCE ( BSD2 );
-
- /** @file
- *
- * iSCSI boot firmware table
- *
- * The information in this file is derived from the document "iSCSI
- * Boot Firmware Table (iBFT)" as published by IBM at
- *
- * ftp://ftp.software.ibm.com/systems/support/system_x_pdf/ibm_iscsi_boot_firmware_table_v1.02.pdf
- *
- */
-
- #include <stdint.h>
- #include <ipxe/acpi.h>
- #include <ipxe/scsi.h>
- #include <ipxe/in.h>
-
- /** iSCSI Boot Firmware Table signature */
- #define IBFT_SIG ACPI_SIGNATURE ( 'i', 'B', 'F', 'T' )
-
- /** Alignment of structures within iBFT */
- #define IBFT_ALIGN 16
-
- /** An offset from the start of the iBFT */
- typedef uint16_t ibft_off_t;
-
- /** Length of a string within the iBFT (excluding terminating NUL) */
- typedef uint16_t ibft_size_t;
-
- /** A string within the iBFT */
- struct ibft_string {
- /** Length of string */
- ibft_size_t len;
- /** Offset to string */
- ibft_off_t offset;
- } __attribute__ (( packed ));
-
- /** An IP address within the iBFT */
- struct ibft_ipaddr {
- /** Reserved; must be zero */
- uint16_t zeroes[5];
- /** Must be 0xffff if IPv4 address is present, otherwise zero */
- uint16_t ones;
- /** The IPv4 address, or zero if not present */
- struct in_addr in;
- } __attribute__ (( packed ));
-
- /**
- * iBFT structure header
- *
- * This structure is common to several sections within the iBFT.
- */
- struct ibft_header {
- /** Structure ID
- *
- * This is an IBFT_STRUCTURE_ID_XXX constant
- */
- uint8_t structure_id;
- /** Version (always 1) */
- uint8_t version;
- /** Length, including this header */
- uint16_t length;
- /** Index
- *
- * This is the number of the NIC or Target, when applicable.
- */
- uint8_t index;
- /** Flags */
- uint8_t flags;
- } __attribute__ (( packed ));
-
- /**
- * iBFT NIC and Target offset pair
- *
- * There is no implicit relation between the NIC and the Target, but
- * using this structure simplifies the table construction code while
- * matching the expected table layout.
- */
- struct ibft_offset_pair {
- /** Offset to NIC structure */
- ibft_off_t nic;
- /** Offset to Target structure */
- ibft_off_t target;
- } __attribute__ (( packed ));
-
- /**
- * iBFT Control structure
- *
- */
- struct ibft_control {
- /** Common header */
- struct ibft_header header;
- /** Extensions */
- uint16_t extensions;
- /** Offset to Initiator structure */
- ibft_off_t initiator;
- /** Offsets to NIC and Target structures */
- struct ibft_offset_pair pair[2];
- } __attribute__ (( packed ));
-
- /** Structure ID for Control section */
- #define IBFT_STRUCTURE_ID_CONTROL 0x01
-
- /** Attempt login only to specified target
- *
- * If this flag is not set, all targets will be logged in to.
- */
- #define IBFT_FL_CONTROL_SINGLE_LOGIN_ONLY 0x01
-
- /**
- * iBFT Initiator structure
- *
- */
- struct ibft_initiator {
- /** Common header */
- struct ibft_header header;
- /** iSNS server */
- struct ibft_ipaddr isns_server;
- /** SLP server */
- struct ibft_ipaddr slp_server;
- /** Primary and secondary Radius servers */
- struct ibft_ipaddr radius[2];
- /** Initiator name */
- struct ibft_string initiator_name;
- } __attribute__ (( packed ));
-
- /** Structure ID for Initiator section */
- #define IBFT_STRUCTURE_ID_INITIATOR 0x02
-
- /** Initiator block valid */
- #define IBFT_FL_INITIATOR_BLOCK_VALID 0x01
-
- /** Initiator firmware boot selected */
- #define IBFT_FL_INITIATOR_FIRMWARE_BOOT_SELECTED 0x02
-
- /**
- * iBFT NIC structure
- *
- */
- struct ibft_nic {
- /** Common header */
- struct ibft_header header;
- /** IP address */
- struct ibft_ipaddr ip_address;
- /** Subnet mask
- *
- * This is the length of the subnet mask in bits (e.g. /24).
- */
- uint8_t subnet_mask_prefix;
- /** Origin */
- uint8_t origin;
- /** Default gateway */
- struct ibft_ipaddr gateway;
- /** Primary and secondary DNS servers */
- struct ibft_ipaddr dns[2];
- /** DHCP server */
- struct ibft_ipaddr dhcp;
- /** VLAN tag */
- uint16_t vlan;
- /** MAC address */
- uint8_t mac_address[6];
- /** PCI bus:dev:fn */
- uint16_t pci_bus_dev_func;
- /** Hostname */
- struct ibft_string hostname;
- } __attribute__ (( packed ));
-
- /** Structure ID for NIC section */
- #define IBFT_STRUCTURE_ID_NIC 0x03
-
- /** NIC block valid */
- #define IBFT_FL_NIC_BLOCK_VALID 0x01
-
- /** NIC firmware boot selected */
- #define IBFT_FL_NIC_FIRMWARE_BOOT_SELECTED 0x02
-
- /** NIC global / link local */
- #define IBFT_FL_NIC_GLOBAL 0x04
-
- /** NIC IP address origin */
- #define IBFT_NIC_ORIGIN_OTHER 0x00
- #define IBFT_NIC_ORIGIN_MANUAL 0x01
- #define IBFT_NIC_ORIGIN_WELLKNOWN 0x02
- #define IBFT_NIC_ORIGIN_DHCP 0x03
- #define IBFT_NIC_ORIGIN_RA 0x04
- #define IBFT_NIC_ORIGIN_UNCHANGED 0x0f
-
- /**
- * iBFT Target structure
- *
- */
- struct ibft_target {
- /** Common header */
- struct ibft_header header;
- /** IP address */
- struct ibft_ipaddr ip_address;
- /** TCP port */
- uint16_t socket;
- /** Boot LUN */
- struct scsi_lun boot_lun;
- /** CHAP type
- *
- * This is an IBFT_CHAP_XXX constant.
- */
- uint8_t chap_type;
- /** NIC association */
- uint8_t nic_association;
- /** Target name */
- struct ibft_string target_name;
- /** CHAP name */
- struct ibft_string chap_name;
- /** CHAP secret */
- struct ibft_string chap_secret;
- /** Reverse CHAP name */
- struct ibft_string reverse_chap_name;
- /** Reverse CHAP secret */
- struct ibft_string reverse_chap_secret;
- } __attribute__ (( packed ));
-
- /** Structure ID for Target section */
- #define IBFT_STRUCTURE_ID_TARGET 0x04
-
- /** Target block valid */
- #define IBFT_FL_TARGET_BLOCK_VALID 0x01
-
- /** Target firmware boot selected */
- #define IBFT_FL_TARGET_FIRMWARE_BOOT_SELECTED 0x02
-
- /** Target use Radius CHAP */
- #define IBFT_FL_TARGET_USE_CHAP 0x04
-
- /** Target use Radius rCHAP */
- #define IBFT_FL_TARGET_USE_RCHAP 0x08
-
- /* Values for chap_type */
- #define IBFT_CHAP_NONE 0 /**< No CHAP authentication */
- #define IBFT_CHAP_ONE_WAY 1 /**< One-way CHAP */
- #define IBFT_CHAP_MUTUAL 2 /**< Mutual CHAP */
-
- /**
- * iSCSI Boot Firmware Table (iBFT)
- */
- struct ibft_table {
- /** ACPI header */
- struct acpi_header acpi;
- /** Reserved */
- uint8_t reserved[12];
- /** Control structure */
- struct ibft_control control;
- } __attribute__ (( packed ));
-
- extern struct acpi_model ibft_model __acpi_model;
-
- #endif /* _IPXE_IBFT_H */
|