#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 #include #include #include /** 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 */