diff options
author | 2017-04-25 03:31:15 -0700 | |
---|---|---|
committer | 2017-05-22 06:48:08 +0000 | |
commit | bb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch) | |
tree | ca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/roms/ipxe/src/arch/i386/include/pxe_api.h | |
parent | a14b48d18a9ed03ec191cf16b162206998a895ce (diff) |
Adding qemu as a submodule of KVMFORNFV
This Patch includes the changes to add qemu as a submodule to
kvmfornfv repo and make use of the updated latest qemu for the
execution of all testcase
Change-Id: I1280af507a857675c7f81d30c95255635667bdd7
Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Diffstat (limited to 'qemu/roms/ipxe/src/arch/i386/include/pxe_api.h')
-rw-r--r-- | qemu/roms/ipxe/src/arch/i386/include/pxe_api.h | 1823 |
1 files changed, 0 insertions, 1823 deletions
diff --git a/qemu/roms/ipxe/src/arch/i386/include/pxe_api.h b/qemu/roms/ipxe/src/arch/i386/include/pxe_api.h deleted file mode 100644 index 3110d26da..000000000 --- a/qemu/roms/ipxe/src/arch/i386/include/pxe_api.h +++ /dev/null @@ -1,1823 +0,0 @@ -#ifndef PXE_API_H -#define PXE_API_H - -/* - * 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 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. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - * - * As an alternative, at your option, you may use this file under the - * following terms, known as the "MIT license": - * - * Copyright (c) 2005-2009 Michael Brown <mbrown@fensystems.co.uk> - * - * 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 - * - * Preboot eXecution Environment (PXE) API - * - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); - -#include "pxe_types.h" - -/** @addtogroup pxe Preboot eXecution Environment (PXE) API - * @{ - */ - -/** @defgroup pxe_api_call PXE entry points - * - * PXE entry points and calling conventions - * - * @{ - */ - -/** The PXENV+ structure */ -struct s_PXENV { - /** Signature - * - * Contains the bytes 'P', 'X', 'E', 'N', 'V', '+'. - */ - UINT8_t Signature[6]; - /** PXE API version - * - * MSB is major version number, LSB is minor version number. - * If the API version number is 0x0201 or greater, the !PXE - * structure pointed to by #PXEPtr should be used instead of - * this data structure. - */ - UINT16_t Version; - UINT8_t Length; /**< Length of this structure */ - /** Checksum - * - * The byte checksum of this structure (using the length in - * #Length) must be zero. - */ - UINT8_t Checksum; - SEGOFF16_t RMEntry; /**< Real-mode PXENV+ entry point */ - /** Protected-mode PXENV+ entry point offset - * - * PXE 2.1 deprecates this entry point. For protected-mode - * API calls, use the !PXE structure pointed to by #PXEPtr - * instead. - */ - UINT32_t PMOffset; - /** Protected-mode PXENV+ entry point segment selector - * - * PXE 2.1 deprecates this entry point. For protected-mode - * API calls, use the !PXE structure pointed to by #PXEPtr - * instead. - */ - SEGSEL_t PMSelector; - SEGSEL_t StackSeg; /**< Stack segment selector */ - UINT16_t StackSize; /**< Stack segment size */ - SEGSEL_t BC_CodeSeg; /**< Base-code code segment selector */ - UINT16_t BC_CodeSize; /**< Base-code code segment size */ - SEGSEL_t BC_DataSeg; /**< Base-code data segment selector */ - UINT16_t BC_DataSize; /**< Base-code data segment size */ - SEGSEL_t UNDIDataSeg; /**< UNDI data segment selector */ - UINT16_t UNDIDataSize; /**< UNDI data segment size */ - SEGSEL_t UNDICodeSeg; /**< UNDI code segment selector */ - UINT16_t UNDICodeSize; /**< UNDI code segment size */ - /** Address of the !PXE structure - * - * This field is present only if #Version is 0x0201 or - * greater. If present, it points to a struct s_PXE. - */ - SEGOFF16_t PXEPtr; -} __attribute__ (( packed )); - -typedef struct s_PXENV PXENV_t; - -/** The !PXE structure */ -struct s_PXE { - /** Signature - * - * Contains the bytes '!', 'P', 'X', 'E'. - */ - UINT8_t Signature[4]; - UINT8_t StructLength; /**< Length of this structure */ - /** Checksum - * - * The byte checksum of this structure (using the length in - * #StructLength) must be zero. - */ - UINT8_t StructCksum; - /** Revision of this structure - * - * For PXE version 2.1, this field must be zero. - */ - UINT8_t StructRev; - UINT8_t reserved_1; /**< Must be zero */ - /** Address of the UNDI ROM ID structure - * - * This is a pointer to a struct s_UNDI_ROM_ID. - */ - SEGOFF16_t UNDIROMID; - /** Address of the Base Code ROM ID structure - * - * This is a pointer to a struct s_BC_ROM_ID. - */ - SEGOFF16_t BaseROMID; - /** 16-bit !PXE entry point - * - * This is the entry point for either real mode, or protected - * mode with a 16-bit stack segment. - */ - SEGOFF16_t EntryPointSP; - /** 32-bit !PXE entry point - * - * This is the entry point for protected mode with a 32-bit - * stack segment. - */ - SEGOFF16_t EntryPointESP; - /** Status call-out function - * - * @v 0 (if in a time-out loop) - * @v n Number of a received TFTP packet - * @ret 0 Continue operation - * @ret 1 Cancel operation - * - * This function will be called whenever the PXE stack is in - * protected mode, is waiting for an event (e.g. a DHCP reply) - * and wishes to allow the user to cancel the operation. - * Parameters are passed in register %ax; the return value - * must also be placed in register %ax. All other registers - * and flags @b must be preserved. - * - * In real mode, an internal function (that checks for a - * keypress) will be used. - * - * If this field is set to -1, no status call-out function - * will be used and consequently the user will not be allowed - * to interrupt operations. - * - * @note The PXE specification version 2.1 defines the - * StatusCallout field, mentions it 11 times, but nowhere - * defines what it actually does or how it gets called. - * Fortunately, the WfM specification version 1.1a deigns to - * inform us of such petty details. - */ - SEGOFF16_t StatusCallout; - UINT8_t reserved_2; /**< Must be zero */ - /** Number of segment descriptors - * - * If this number is greater than 7, the remaining descriptors - * follow immediately after #BC_CodeWrite. - */ - UINT8_t SegDescCnt; - /** First protected-mode selector - * - * This is the segment selector value for the first segment - * assigned to PXE. Protected-mode selectors must be - * consecutive, according to the PXE 2.1 specification, though - * no reason is given. Each #SEGDESC_t includes a field for - * the segment selector, so this information is entirely - * redundant. - */ - SEGSEL_t FirstSelector; - /** Stack segment descriptor */ - SEGDESC_t Stack; - /** UNDI data segment descriptor */ - SEGDESC_t UNDIData; - /** UNDI code segment descriptor */ - SEGDESC_t UNDICode; - /** UNDI writable code segment descriptor */ - SEGDESC_t UNDICodeWrite; - /** Base-code data segment descriptor */ - SEGDESC_t BC_Data; - /** Base-code code segment descriptor */ - SEGDESC_t BC_Code; - /** Base-code writable code segment descriptor */ - SEGDESC_t BC_CodeWrite; -} __attribute__ (( packed )); - -typedef struct s_PXE PXE_t; - -/** @} */ /* pxe_api_call */ - -/** @defgroup pxe_preboot_api PXE Preboot API - * - * General high-level functions: #PXENV_UNLOAD_STACK, #PXENV_START_UNDI etc. - * - * @{ - */ - -/** @defgroup pxenv_unload_stack PXENV_UNLOAD_STACK - * - * UNLOAD BASE CODE STACK - * - * @{ - */ - -/** PXE API function code for pxenv_unload_stack() */ -#define PXENV_UNLOAD_STACK 0x0070 - -/** Parameter block for pxenv_unload_stack() */ -struct s_PXENV_UNLOAD_STACK { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT8_t reserved[10]; /**< Must be zero */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNLOAD_STACK PXENV_UNLOAD_STACK_t; - -/** @} */ /* pxenv_unload_stack */ - -/** @defgroup pxenv_get_cached_info PXENV_GET_CACHED_INFO - * - * GET CACHED INFO - * - * @{ - */ - -/** PXE API function code for pxenv_get_cached_info() */ -#define PXENV_GET_CACHED_INFO 0x0071 - -/** The client's DHCPDISCOVER packet */ -#define PXENV_PACKET_TYPE_DHCP_DISCOVER 1 - -/** The DHCP server's DHCPACK packet */ -#define PXENV_PACKET_TYPE_DHCP_ACK 2 - -/** The Boot Server's Discover Reply packet - * - * This packet contains DHCP option 60 set to "PXEClient", a valid - * boot file name, and may or may not contain MTFTP options. - */ -#define PXENV_PACKET_TYPE_CACHED_REPLY 3 - -/** Parameter block for pxenv_get_cached_info() */ -struct s_PXENV_GET_CACHED_INFO { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Packet type. - * - * Valid values are #PXENV_PACKET_TYPE_DHCP_DISCOVER, - * #PXENV_PACKET_TYPE_DHCP_ACK or #PXENV_PACKET_TYPE_CACHED_REPLY - */ - UINT16_t PacketType; - UINT16_t BufferSize; /**< Buffer size */ - SEGOFF16_t Buffer; /**< Buffer address */ - UINT16_t BufferLimit; /**< Maximum buffer size */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_GET_CACHED_INFO PXENV_GET_CACHED_INFO_t; - -#define BOOTP_REQ 1 /**< A BOOTP request packet */ -#define BOOTP_REP 2 /**< A BOOTP reply packet */ - -/** DHCP broadcast flag - * - * Request a broadcast response (DHCPOFFER or DHCPACK) from the DHCP - * server. - */ -#define BOOTP_BCAST 0x8000 - -#define VM_RFC1048 0x63825363L /**< DHCP magic cookie */ - -/** Maximum length of DHCP options */ -#define BOOTP_DHCPVEND 1024 - -/** Format of buffer filled in by pxenv_get_cached_info() - * - * This somewhat convoluted data structure simply describes the layout - * of a DHCP packet. Refer to RFC2131 section 2 for a full - * description. - */ -struct bootph { - /** Message opcode. - * - * Valid values are #BOOTP_REQ and #BOOTP_REP. - */ - UINT8_t opcode; - /** NIC hardware type. - * - * Valid values are as for s_PXENV_UNDI_GET_INFORMATION::HwType. - */ - UINT8_t Hardware; - UINT8_t Hardlen; /**< MAC address length */ - /** Gateway hops - * - * Zero in packets sent by the client. May be non-zero in - * replies from the DHCP server, if the reply comes via a DHCP - * relay agent. - */ - UINT8_t Gatehops; - UINT32_t ident; /**< DHCP transaction id (xid) */ - /** Elapsed time - * - * Number of seconds since the client began the DHCP - * transaction. - */ - UINT16_t seconds; - /** Flags - * - * This is the bitwise-OR of any of the following values: - * #BOOTP_BCAST. - */ - UINT16_t Flags; - /** Client IP address - * - * Set only if the client already has an IP address. - */ - IP4_t cip; - /** Your IP address - * - * This is the IP address that the server assigns to the - * client. - */ - IP4_t yip; - /** Server IP address - * - * This is the IP address of the BOOTP/DHCP server. - */ - IP4_t sip; - /** Gateway IP address - * - * This is the IP address of the BOOTP/DHCP relay agent, if - * any. It is @b not (necessarily) the address of the default - * gateway for routing purposes. - */ - IP4_t gip; - MAC_ADDR_t CAddr; /**< Client MAC address */ - UINT8_t Sname[64]; /**< Server host name */ - UINT8_t bootfile[128]; /**< Boot file name */ - /** DHCP options - * - * Don't ask. Just laugh. Then burn a copy of the PXE - * specification and send Intel an e-mail asking them if - * they've figured out what a "union" does in C yet. - */ - union bootph_vendor { - UINT8_t d[BOOTP_DHCPVEND]; /**< DHCP options */ - /** DHCP options */ - struct bootph_vendor_v { - /** DHCP magic cookie - * - * Should have the value #VM_RFC1048. - */ - UINT8_t magic[4]; - UINT32_t flags; /**< BOOTP flags/opcodes */ - /** "End of BOOTP vendor extensions" - * - * Abandon hope, all ye who consider the - * purpose of this field. - */ - UINT8_t pad[56]; - } v; - } vendor; -} __attribute__ (( packed )); - -typedef struct bootph BOOTPLAYER_t; - -/** @} */ /* pxenv_get_cached_info */ - -/** @defgroup pxenv_restart_tftp PXENV_RESTART_TFTP - * - * RESTART TFTP - * - * @{ - */ - -/** PXE API function code for pxenv_restart_tftp() */ -#define PXENV_RESTART_TFTP 0x0073 - -/** Parameter block for pxenv_restart_tftp() */ -struct s_PXENV_TFTP_READ_FILE; - -typedef struct s_PXENV_RESTART_TFTP PXENV_RESTART_TFTP_t; - -/** @} */ /* pxenv_restart_tftp */ - -/** @defgroup pxenv_start_undi PXENV_START_UNDI - * - * START UNDI - * - * @{ - */ - -/** PXE API function code for pxenv_start_undi() */ -#define PXENV_START_UNDI 0x0000 - -/** Parameter block for pxenv_start_undi() */ -struct s_PXENV_START_UNDI { - PXENV_STATUS_t Status; /**< PXE status code */ - /** %ax register as passed to the Option ROM initialisation routine. - * - * For a PCI device, this should contain the bus:dev:fn value - * that uniquely identifies the PCI device in the system. For - * a non-PCI device, this field is not defined. - */ - UINT16_t AX; - /** %bx register as passed to the Option ROM initialisation routine. - * - * For an ISAPnP device, this should contain the Card Select - * Number assigned to the ISAPnP card. For non-ISAPnP - * devices, this should contain 0xffff. - */ - UINT16_t BX; - /** %dx register as passed to the Option ROM initialisation routine. - * - * For an ISAPnP device, this should contain the ISAPnP Read - * Port address as currently set in all ISAPnP cards. If - * there are no ISAPnP cards, this should contain 0xffff. (If - * this is a non-ISAPnP device, but there are ISAPnP cards in - * the system, this value is not well defined.) - */ - UINT16_t DX; - /** %di register as passed to the Option ROM initialisation routine. - * - * This contains the #OFF16_t portion of a struct #s_SEGOFF16 - * that points to the System BIOS Plug and Play Installation - * Check Structure. (Refer to section 4.4 of the Plug and - * Play BIOS specification for a description of this - * structure.) - * - * @note The PXE specification defines the type of this field - * as #UINT16_t. For x86, #OFF16_t and #UINT16_t are - * equivalent anyway; for other architectures #OFF16_t makes - * more sense. - */ - OFF16_t DI; - /** %es register as passed to the Option ROM initialisation routine. - * - * This contains the #SEGSEL_t portion of a struct #s_SEGOFF16 - * that points to the System BIOS Plug and Play Installation - * Check Structure. (Refer to section 4.4 of the Plug and - * Play BIOS specification for a description of this - * structure.) - * - * @note The PXE specification defines the type of this field - * as #UINT16_t. For x86, #SEGSEL_t and #UINT16_t are - * equivalent anyway; for other architectures #SEGSEL_t makes - * more sense. - */ - SEGSEL_t ES; -} __attribute__ (( packed )); - -typedef struct s_PXENV_START_UNDI PXENV_START_UNDI_t; - -/** @} */ /* pxenv_start_undi */ - -/** @defgroup pxenv_stop_undi PXENV_STOP_UNDI - * - * STOP UNDI - * - * @{ - */ - -/** PXE API function code for pxenv_stop_undi() */ -#define PXENV_STOP_UNDI 0x0015 - -/** Parameter block for pxenv_stop_undi() */ -struct s_PXENV_STOP_UNDI { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_STOP_UNDI PXENV_STOP_UNDI_t; - -/** @} */ /* pxenv_stop_undi */ - -/** @defgroup pxenv_start_base PXENV_START_BASE - * - * START BASE - * - * @{ - */ - -/** PXE API function code for pxenv_start_base() */ -#define PXENV_START_BASE 0x0075 - -/** Parameter block for pxenv_start_base() */ -struct s_PXENV_START_BASE { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_START_BASE PXENV_START_BASE_t; - -/** @} */ /* pxenv_start_base */ - -/** @defgroup pxenv_stop_base PXENV_STOP_BASE - * - * STOP BASE - * - * @{ - */ - -/** PXE API function code for pxenv_stop_base() */ -#define PXENV_STOP_BASE 0x0076 - -/** Parameter block for pxenv_stop_base() */ -struct s_PXENV_STOP_BASE { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_STOP_BASE PXENV_STOP_BASE_t; - -/** @} */ /* pxenv_stop_base */ - -/** @} */ /* pxe_preboot_api */ - -/** @defgroup pxe_tftp_api PXE TFTP API - * - * Download files via TFTP or MTFTP - * - * @{ - */ - -/** @defgroup pxenv_tftp_open PXENV_TFTP_OPEN - * - * TFTP OPEN - * - * @{ - */ - -/** PXE API function code for pxenv_tftp_open() */ -#define PXENV_TFTP_OPEN 0x0020 - -/** Parameter block for pxenv_tftp_open() */ -struct s_PXENV_TFTP_OPEN { - PXENV_STATUS_t Status; /**< PXE status code */ - IP4_t ServerIPAddress; /**< TFTP server IP address */ - IP4_t GatewayIPAddress; /**< Relay agent IP address */ - UINT8_t FileName[128]; /**< File name */ - UDP_PORT_t TFTPPort; /**< TFTP server UDP port */ - /** Requested size of TFTP packets - * - * This is the TFTP "blksize" option. This must be at least - * 512, since servers that do not support TFTP options cannot - * negotiate blocksizes smaller than this. - */ - UINT16_t PacketSize; -} __attribute__ (( packed )); - -typedef struct s_PXENV_TFTP_OPEN PXENV_TFTP_OPEN_t; - -/** @} */ /* pxenv_tftp_open */ - -/** @defgroup pxenv_tftp_close PXENV_TFTP_CLOSE - * - * TFTP CLOSE - * - * @{ - */ - -/** PXE API function code for pxenv_tftp_close() */ -#define PXENV_TFTP_CLOSE 0x0021 - -/** Parameter block for pxenv_tftp_close() */ -struct s_PXENV_TFTP_CLOSE { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_TFTP_CLOSE PXENV_TFTP_CLOSE_t; - -/** @} */ /* pxenv_tftp_close */ - -/** @defgroup pxenv_tftp_read PXENV_TFTP_READ - * - * TFTP READ - * - * @{ - */ - -/** PXE API function code for pxenv_tftp_read() */ -#define PXENV_TFTP_READ 0x0022 - -/** Parameter block for pxenv_tftp_read() */ -struct s_PXENV_TFTP_READ { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t PacketNumber; /**< TFTP packet number */ - UINT16_t BufferSize; /**< Size of data buffer */ - SEGOFF16_t Buffer; /**< Address of data buffer */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_TFTP_READ PXENV_TFTP_READ_t; - -/** @} */ /* pxenv_tftp_read */ - -/** @defgroup pxenv_tftp_read_file PXENV_TFTP_READ_FILE - * - * TFTP/MTFTP READ FILE - * - * @{ - */ - -/** PXE API function code for pxenv_tftp_read_file() */ -#define PXENV_TFTP_READ_FILE 0x0023 - -/** Parameter block for pxenv_tftp_read_file() */ -struct s_PXENV_TFTP_READ_FILE { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT8_t FileName[128]; /**< File name */ - UINT32_t BufferSize; /**< Size of data buffer */ - ADDR32_t Buffer; /**< Address of data buffer */ - IP4_t ServerIPAddress; /**< TFTP server IP address */ - IP4_t GatewayIPAddress; /**< Relay agent IP address */ - /** File multicast IP address */ - IP4_t McastIPAddress; - /** Client multicast listening port */ - UDP_PORT_t TFTPClntPort; - /** Server multicast listening port */ - UDP_PORT_t TFTPSrvPort; - /** TFTP open timeout. - * - * This is the timeout for receiving the first DATA or ACK - * packets during the MTFTP Listen phase. - */ - UINT16_t TFTPOpenTimeOut; - /** TFTP reopen timeout. - * - * This is the timeout for receiving an ACK packet while in - * the MTFTP Listen phase (when at least one ACK packet has - * already been seen). - */ - UINT16_t TFTPReopenDelay; -} __attribute__ (( packed )); - -typedef struct s_PXENV_TFTP_READ_FILE PXENV_TFTP_READ_FILE_t; - -/** @} */ /* pxenv_tftp_read_file */ - -/** @defgroup pxenv_tftp_get_fsize PXENV_TFTP_GET_FSIZE - * - * TFTP GET FILE SIZE - * - * @{ - */ - -/** PXE API function code for pxenv_tftp_get_fsize() */ -#define PXENV_TFTP_GET_FSIZE 0x0025 - -/** Parameter block for pxenv_tftp_get_fsize() */ -struct s_PXENV_TFTP_GET_FSIZE { - PXENV_STATUS_t Status; /**< PXE status code */ - IP4_t ServerIPAddress; /**< TFTP server IP address */ - IP4_t GatewayIPAddress; /**< Relay agent IP address */ - UINT8_t FileName[128]; /**< File name */ - UINT32_t FileSize; /**< Size of the file */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_TFTP_GET_FSIZE PXENV_TFTP_GET_FSIZE_t; - -/** @} */ /* pxenv_tftp_get_fsize */ - -/** @} */ /* pxe_tftp_api */ - -/** @defgroup pxe_udp_api PXE UDP API - * - * Transmit and receive UDP packets - * - * @{ - */ - -/** @defgroup pxenv_udp_open PXENV_UDP_OPEN - * - * UDP OPEN - * - * @{ - */ - -/** PXE API function code for pxenv_udp_open() */ -#define PXENV_UDP_OPEN 0x0030 - -/** Parameter block for pxenv_udp_open() */ -struct s_PXENV_UDP_OPEN { - PXENV_STATUS_t Status; /**< PXE status code */ - IP4_t src_ip; /**< IP address of this station */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UDP_OPEN PXENV_UDP_OPEN_t; - -/** @} */ /* pxenv_udp_open */ - -/** @defgroup pxenv_udp_close PXENV_UDP_CLOSE - * - * UDP CLOSE - * - * @{ - */ - -/** PXE API function code for pxenv_udp_close() */ -#define PXENV_UDP_CLOSE 0x0031 - -/** Parameter block for pxenv_udp_close() */ -struct s_PXENV_UDP_CLOSE { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UDP_CLOSE PXENV_UDP_CLOSE_t; - -/** @} */ /* pxenv_udp_close */ - -/** @defgroup pxenv_udp_write PXENV_UDP_WRITE - * - * UDP WRITE - * - * @{ - */ - -/** PXE API function code for pxenv_udp_write() */ -#define PXENV_UDP_WRITE 0x0033 - -/** Parameter block for pxenv_udp_write() */ -struct s_PXENV_UDP_WRITE { - PXENV_STATUS_t Status; /**< PXE status code */ - IP4_t ip; /**< Destination IP address */ - IP4_t gw; /**< Relay agent IP address */ - UDP_PORT_t src_port; /**< Source UDP port */ - UDP_PORT_t dst_port; /**< Destination UDP port */ - UINT16_t buffer_size; /**< UDP payload buffer size */ - SEGOFF16_t buffer; /**< UDP payload buffer address */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UDP_WRITE PXENV_UDP_WRITE_t; - -/** @} */ /* pxenv_udp_write */ - -/** @defgroup pxenv_udp_read PXENV_UDP_READ - * - * UDP READ - * - * @{ - */ - -/** PXE API function code for pxenv_udp_read() */ -#define PXENV_UDP_READ 0x0032 - -/** Parameter block for pxenv_udp_read() */ -struct s_PXENV_UDP_READ { - PXENV_STATUS_t Status; /**< PXE status code */ - IP4_t src_ip; /**< Source IP address */ - IP4_t dest_ip; /**< Destination IP address */ - UDP_PORT_t s_port; /**< Source UDP port */ - UDP_PORT_t d_port; /**< Destination UDP port */ - UINT16_t buffer_size; /**< UDP payload buffer size */ - SEGOFF16_t buffer; /**< UDP payload buffer address */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UDP_READ PXENV_UDP_READ_t; - -/** @} */ /* pxenv_udp_read */ - -/** @} */ /* pxe_udp_api */ - -/** @defgroup pxe_undi_api PXE UNDI API - * - * Direct control of the network interface card - * - * @{ - */ - -/** @defgroup pxenv_undi_startup PXENV_UNDI_STARTUP - * - * UNDI STARTUP - * - * @{ - */ - -/** PXE API function code for pxenv_undi_startup() */ -#define PXENV_UNDI_STARTUP 0x0001 - -#define PXENV_BUS_ISA 0 /**< ISA bus type */ -#define PXENV_BUS_EISA 1 /**< EISA bus type */ -#define PXENV_BUS_MCA 2 /**< MCA bus type */ -#define PXENV_BUS_PCI 3 /**< PCI bus type */ -#define PXENV_BUS_VESA 4 /**< VESA bus type */ -#define PXENV_BUS_PCMCIA 5 /**< PCMCIA bus type */ - -/** Parameter block for pxenv_undi_startup() */ -struct s_PXENV_UNDI_STARTUP { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_STARTUP PXENV_UNDI_STARTUP_t; - -/** @} */ /* pxenv_undi_startup */ - -/** @defgroup pxenv_undi_cleanup PXENV_UNDI_CLEANUP - * - * UNDI CLEANUP - * - * @{ - */ - -/** PXE API function code for pxenv_undi_cleanup() */ -#define PXENV_UNDI_CLEANUP 0x0002 - -/** Parameter block for pxenv_undi_cleanup() */ -struct s_PXENV_UNDI_CLEANUP { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_CLEANUP PXENV_UNDI_CLEANUP_t; - -/** @} */ /* pxenv_undi_cleanup */ - -/** @defgroup pxenv_undi_initialize PXENV_UNDI_INITIALIZE - * - * UNDI INITIALIZE - * - * @{ - */ - -/** PXE API function code for pxenv_undi_initialize() */ -#define PXENV_UNDI_INITIALIZE 0x0003 - -/** Parameter block for pxenv_undi_initialize() */ -struct s_PXENV_UNDI_INITIALIZE { - PXENV_STATUS_t Status; /**< PXE status code */ - /** NDIS 2.0 configuration information, or NULL - * - * This is a pointer to the data structure returned by the - * NDIS 2.0 GetProtocolManagerInfo() API call. The data - * structure is documented, in a rather haphazard way, in - * section 4-17 of the NDIS 2.0 specification. - */ - ADDR32_t ProtocolIni; - UINT8_t reserved[8]; /**< Must be zero */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_INITIALIZE PXENV_UNDI_INITIALIZE_t; - -/** @} */ /* pxenv_undi_initialize */ - -/** @defgroup pxenv_undi_reset_adapter PXENV_UNDI_RESET_ADAPTER - * - * UNDI RESET ADAPTER - * - * @{ - */ - -/** PXE API function code for pxenv_undi_reset_adapter() */ -#define PXENV_UNDI_RESET_ADAPTER 0x0004 - -/** Maximum number of multicast MAC addresses */ -#define MAXNUM_MCADDR 8 - -/** List of multicast MAC addresses */ -struct s_PXENV_UNDI_MCAST_ADDRESS { - /** Number of multicast MAC addresses */ - UINT16_t MCastAddrCount; - /** List of up to #MAXNUM_MCADDR multicast MAC addresses */ - MAC_ADDR_t McastAddr[MAXNUM_MCADDR]; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_MCAST_ADDRESS PXENV_UNDI_MCAST_ADDRESS_t; - -/** Parameter block for pxenv_undi_reset_adapter() */ -struct s_PXENV_UNDI_RESET { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Multicast MAC addresses */ - struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_RESET PXENV_UNDI_RESET_t; - -/** @} */ /* pxenv_undi_reset_adapter */ - -/** @defgroup pxenv_undi_shutdown PXENV_UNDI_SHUTDOWN - * - * UNDI SHUTDOWN - * - * @{ - */ - -/** PXE API function code for pxenv_undi_shutdown() */ -#define PXENV_UNDI_SHUTDOWN 0x0005 - -/** Parameter block for pxenv_undi_shutdown() */ -struct s_PXENV_UNDI_SHUTDOWN { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_SHUTDOWN PXENV_UNDI_SHUTDOWN_t; - -/** @} */ /* pxenv_undi_shutdown */ - -/** @defgroup pxenv_undi_open PXENV_UNDI_OPEN - * - * UNDI OPEN - * - * @{ - */ - -/** PXE API function code for pxenv_undi_open() */ -#define PXENV_UNDI_OPEN 0x0006 - -/** Accept "directed" packets - * - * These are packets addresses to either this adapter's MAC address or - * to any of the configured multicast MAC addresses (see - * #s_PXENV_UNDI_MCAST_ADDRESS). - */ -#define FLTR_DIRECTED 0x0001 -/** Accept broadcast packets */ -#define FLTR_BRDCST 0x0002 -/** Accept all packets; listen in promiscuous mode */ -#define FLTR_PRMSCS 0x0004 -/** Accept source-routed packets */ -#define FLTR_SRC_RTG 0x0008 - -/** Parameter block for pxenv_undi_open() */ -struct s_PXENV_UNDI_OPEN { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Open flags as defined in NDIS 2.0 - * - * This is the OpenOptions field as passed to the NDIS 2.0 - * OpenAdapter() API call. It is defined to be "adapter - * specific", though 0 is guaranteed to be a valid value. - */ - UINT16_t OpenFlag; - /** Receive packet filter - * - * This is the bitwise-OR of any of the following flags: - * #FLTR_DIRECTED, #FLTR_BRDCST, #FLTR_PRMSCS and - * #FLTR_SRC_RTG. - */ - UINT16_t PktFilter; - /** Multicast MAC addresses */ - struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_OPEN PXENV_UNDI_OPEN_t; - -/** @} */ /* pxenv_undi_open */ - -/** @defgroup pxenv_undi_close PXENV_UNDI_CLOSE - * - * UNDI CLOSE - * - * @{ - */ - -/** PXE API function code for pxenv_undi_close() */ -#define PXENV_UNDI_CLOSE 0x0007 - -/** Parameter block for pxenv_undi_close() */ -struct s_PXENV_UNDI_CLOSE { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_CLOSE PXENV_UNDI_CLOSE_t; - -/** @} */ /* pxenv_undi_close */ - -/** @defgroup pxenv_undi_transmit PXENV_UNDI_TRANSMIT - * - * UNDI TRANSMIT PACKET - * - * @{ - */ - -/** PXE API function code for pxenv_undi_transmit() */ -#define PXENV_UNDI_TRANSMIT 0x0008 - -#define P_UNKNOWN 0 /**< Media header already filled in */ -#define P_IP 1 /**< IP protocol */ -#define P_ARP 2 /**< ARP protocol */ -#define P_RARP 3 /**< RARP protocol */ -#define P_OTHER 4 /**< Other protocol */ - -#define XMT_DESTADDR 0x0000 /**< Unicast packet */ -#define XMT_BROADCAST 0x0001 /**< Broadcast packet */ - -/** Maximum number of data blocks in a transmit buffer descriptor */ -#define MAX_DATA_BLKS 8 - -/** A transmit buffer descriptor, as pointed to by s_PXENV_UNDI_TRANSMIT::TBD - */ -struct s_PXENV_UNDI_TBD { - UINT16_t ImmedLength; /**< Length of the transmit buffer */ - SEGOFF16_t Xmit; /**< Address of the transmit buffer */ - UINT16_t DataBlkCount; - /** Array of up to #MAX_DATA_BLKS additional transmit buffers */ - struct DataBlk { - /** Always 1 - * - * A value of 0 would indicate that #TDDataPtr were an - * #ADDR32_t rather than a #SEGOFF16_t. The PXE - * specification version 2.1 explicitly states that - * this is not supported; #TDDataPtr will always be a - * #SEGOFF16_t. - */ - UINT8_t TDPtrType; - UINT8_t TDRsvdByte; /**< Must be zero */ - UINT16_t TDDataLen; /**< Length of this transmit buffer */ - SEGOFF16_t TDDataPtr; /**< Address of this transmit buffer */ - } DataBlock[MAX_DATA_BLKS]; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_TBD PXENV_UNDI_TBD_t; - -/** Parameter block for pxenv_undi_transmit() */ -struct s_PXENV_UNDI_TRANSMIT { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Protocol - * - * Valid values are #P_UNKNOWN, #P_IP, #P_ARP or #P_RARP. If - * the caller has already filled in the media header, this - * field must be set to #P_UNKNOWN. - */ - UINT8_t Protocol; - /** Unicast/broadcast flag - * - * Valid values are #XMT_DESTADDR or #XMT_BROADCAST. - */ - UINT8_t XmitFlag; - SEGOFF16_t DestAddr; /**< Destination MAC address */ - /** Address of the Transmit Buffer Descriptor - * - * This is a pointer to a struct s_PXENV_UNDI_TBD. - */ - SEGOFF16_t TBD; - UINT32_t Reserved[2]; /**< Must be zero */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_TRANSMIT PXENV_UNDI_TRANSMIT_t; - -/** @} */ /* pxenv_undi_transmit */ - -/** @defgroup pxenv_undi_set_mcast_address PXENV_UNDI_SET_MCAST_ADDRESS - * - * UNDI SET MULTICAST ADDRESS - * - * @{ - */ - -/** PXE API function code for pxenv_undi_set_mcast_address() */ -#define PXENV_UNDI_SET_MCAST_ADDRESS 0x0009 - -/** Parameter block for pxenv_undi_set_mcast_address() */ -struct s_PXENV_UNDI_SET_MCAST_ADDRESS { - PXENV_STATUS_t Status; /**< PXE status code */ - /** List of multicast addresses */ - struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS PXENV_UNDI_SET_MCAST_ADDRESS_t; - -/** @} */ /* pxenv_undi_set_mcast_address */ - -/** @defgroup pxenv_undi_set_station_address PXENV_UNDI_SET_STATION_ADDRESS - * - * UNDI SET STATION ADDRESS - * - * @{ - */ - -/** PXE API function code for pxenv_undi_set_station_address() */ -#define PXENV_UNDI_SET_STATION_ADDRESS 0x000a - -/** Parameter block for pxenv_undi_set_station_address() */ -struct s_PXENV_UNDI_SET_STATION_ADDRESS { - PXENV_STATUS_t Status; /**< PXE status code */ - MAC_ADDR_t StationAddress; /**< Station MAC address */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS PXENV_UNDI_SET_STATION_ADDRESS_t; - -/** @} */ /* pxenv_undi_set_station_address */ - -/** @defgroup pxenv_undi_set_packet_filter PXENV_UNDI_SET_PACKET_FILTER - * - * UNDI SET PACKET FILTER - * - * @{ - */ - -/** PXE API function code for pxenv_undi_set_packet_filter() */ -#define PXENV_UNDI_SET_PACKET_FILTER 0x000b - -/** Parameter block for pxenv_undi_set_packet_filter() */ -struct s_PXENV_UNDI_SET_PACKET_FILTER { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Receive packet filter - * - * This field takes the same values as - * s_PXENV_UNDI_OPEN::PktFilter. - * - * @note Yes, this field is a different size to - * s_PXENV_UNDI_OPEN::PktFilter. Blame "the managers at Intel - * who apparently let a consultant come up with the spec - * without any kind of adult supervision" (quote from hpa). - */ - UINT8_t filter; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_SET_PACKET_FILTER PXENV_UNDI_SET_PACKET_FILTER_t; - -/** @} */ /* pxenv_undi_set_packet_filter */ - -/** @defgroup pxenv_undi_get_information PXENV_UNDI_GET_INFORMATION - * - * UNDI GET INFORMATION - * - * @{ - */ - -/** PXE API function code for pxenv_undi_get_information() */ -#define PXENV_UNDI_GET_INFORMATION 0x000c - -#define ETHER_TYPE 1 /**< Ethernet (10Mb) */ -#define EXP_ETHER_TYPE 2 /**< Experimental Ethernet (3Mb) */ -#define AX25_TYPE 3 /**< Amateur Radio AX.25 */ -#define TOKEN_RING_TYPE 4 /**< Proteon ProNET Token Ring */ -#define CHAOS_TYPE 5 /**< Chaos */ -#define IEEE_TYPE 6 /**< IEEE 802 Networks */ -#define ARCNET_TYPE 7 /**< ARCNET */ - -/** Parameter block for pxenv_undi_get_information() */ -struct s_PXENV_UNDI_GET_INFORMATION { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t BaseIo; /**< I/O base address */ - UINT16_t IntNumber; /**< IRQ number */ - UINT16_t MaxTranUnit; /**< Adapter MTU */ - /** Hardware type - * - * Valid values are defined in RFC1010 ("Assigned numbers"), - * and are #ETHER_TYPE, #EXP_ETHER_TYPE, #AX25_TYPE, - * #TOKEN_RING_TYPE, #CHAOS_TYPE, #IEEE_TYPE or #ARCNET_TYPE. - */ - UINT16_t HwType; - UINT16_t HwAddrLen; /**< MAC address length */ - MAC_ADDR_t CurrentNodeAddress; /**< Current MAC address */ - MAC_ADDR_t PermNodeAddress; /**< Permanent (EEPROM) MAC address */ - SEGSEL_t ROMAddress; /**< Real-mode ROM segment address */ - UINT16_t RxBufCt; /**< Receive queue length */ - UINT16_t TxBufCt; /**< Transmit queue length */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_GET_INFORMATION PXENV_UNDI_GET_INFORMATION_t; - -/** @} */ /* pxenv_undi_get_information */ - -/** @defgroup pxenv_undi_get_statistics PXENV_UNDI_GET_STATISTICS - * - * UNDI GET STATISTICS - * - * @{ - */ - -/** PXE API function code for pxenv_undi_get_statistics() */ -#define PXENV_UNDI_GET_STATISTICS 0x000d - -/** Parameter block for pxenv_undi_get_statistics() */ -struct s_PXENV_UNDI_GET_STATISTICS { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT32_t XmtGoodFrames; /**< Successful transmission count */ - UINT32_t RcvGoodFrames; /**< Successful reception count */ - UINT32_t RcvCRCErrors; /**< Receive CRC error count */ - UINT32_t RcvResourceErrors; /**< Receive queue overflow count */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_GET_STATISTICS PXENV_UNDI_GET_STATISTICS_t; - -/** @} */ /* pxenv_undi_get_statistics */ - -/** @defgroup pxenv_undi_clear_statistics PXENV_UNDI_CLEAR_STATISTICS - * - * UNDI CLEAR STATISTICS - * - * @{ - */ - -/** PXE API function code for pxenv_undi_clear_statistics() */ -#define PXENV_UNDI_CLEAR_STATISTICS 0x000e - -/** Parameter block for pxenv_undi_clear_statistics() */ -struct s_PXENV_UNDI_CLEAR_STATISTICS { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_CLEAR_STATISTICS PXENV_UNDI_CLEAR_STATISTICS_t; - -/** @} */ /* pxenv_undi_clear_statistics */ - -/** @defgroup pxenv_undi_initiate_diags PXENV_UNDI_INITIATE_DIAGS - * - * UNDI INITIATE DIAGS - * - * @{ - */ - -/** PXE API function code for pxenv_undi_initiate_diags() */ -#define PXENV_UNDI_INITIATE_DIAGS 0x000f - -/** Parameter block for pxenv_undi_initiate_diags() */ -struct s_PXENV_UNDI_INITIATE_DIAGS { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_INITIATE_DIAGS PXENV_UNDI_INITIATE_DIAGS_t; - -/** @} */ /* pxenv_undi_initiate_diags */ - -/** @defgroup pxenv_undi_force_interrupt PXENV_UNDI_FORCE_INTERRUPT - * - * UNDI FORCE INTERRUPT - * - * @{ - */ - -/** PXE API function code for pxenv_undi_force_interrupt() */ -#define PXENV_UNDI_FORCE_INTERRUPT 0x0010 - -/** Parameter block for pxenv_undi_force_interrupt() */ -struct s_PXENV_UNDI_FORCE_INTERRUPT { - PXENV_STATUS_t Status; /**< PXE status code */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_FORCE_INTERRUPT PXENV_UNDI_FORCE_INTERRUPT_t; - -/** @} */ /* pxenv_undi_force_interrupt */ - -/** @defgroup pxenv_undi_get_mcast_address PXENV_UNDI_GET_MCAST_ADDRESS - * - * UNDI GET MULTICAST ADDRESS - * - * @{ - */ - -/** PXE API function code for pxenv_undi_get_mcast_address() */ -#define PXENV_UNDI_GET_MCAST_ADDRESS 0x0011 - -/** Parameter block for pxenv_undi_get_mcast_address() */ -struct s_PXENV_UNDI_GET_MCAST_ADDRESS { - PXENV_STATUS_t Status; /**< PXE status code */ - IP4_t InetAddr; /**< Multicast IP address */ - MAC_ADDR_t MediaAddr; /**< Multicast MAC address */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS PXENV_UNDI_GET_MCAST_ADDRESS_t; - -/** @} */ /* pxenv_undi_get_mcast_address */ - -/** @defgroup pxenv_undi_get_nic_type PXENV_UNDI_GET_NIC_TYPE - * - * UNDI GET NIC TYPE - * - * @{ - */ - -/** PXE API function code for pxenv_undi_get_nic_type() */ -#define PXENV_UNDI_GET_NIC_TYPE 0x0012 - -#define PCI_NIC 2 /**< PCI network card */ -#define PnP_NIC 3 /**< ISAPnP network card */ -#define CardBus_NIC 4 /**< CardBus network card */ - -/** Information for a PCI or equivalent NIC */ -struct pci_nic_info { - UINT16_t Vendor_ID; /**< PCI vendor ID */ - UINT16_t Dev_ID; /**< PCI device ID */ - UINT8_t Base_Class; /**< PCI base class */ - UINT8_t Sub_Class; /**< PCI sub class */ - UINT8_t Prog_Intf; /**< PCI programming interface */ - UINT8_t Rev; /**< PCI revision */ - UINT16_t BusDevFunc; /**< PCI bus:dev:fn address */ - UINT16_t SubVendor_ID; /**< PCI subvendor ID */ - UINT16_t SubDevice_ID; /**< PCI subdevice ID */ -} __attribute__ (( packed )); - -/** Information for an ISAPnP or equivalent NIC */ -struct pnp_nic_info { - UINT32_t EISA_Dev_ID; /**< EISA device ID */ - UINT8_t Base_Class; /**< Base class */ - UINT8_t Sub_Class; /**< Sub class */ - UINT8_t Prog_Intf; /**< Programming interface */ - /** Card Select Number assigned to card */ - UINT16_t CardSelNum; -} __attribute__ (( packed )); - -/** Parameter block for pxenv_undi_get_nic_type() */ -struct s_PXENV_UNDI_GET_NIC_TYPE { - PXENV_STATUS_t Status; /**< PXE status code */ - /** NIC type - * - * Valid values are #PCI_NIC, #PnP_NIC or #CardBus_NIC. - */ - UINT8_t NicType; - /** NIC information */ - union nic_type_info { - /** NIC information (if #NicType==#PCI_NIC) */ - struct pci_nic_info pci; - /** NIC information (if #NicType==#CardBus_NIC) */ - struct pci_nic_info cardbus; - /** NIC information (if #NicType==#PnP_NIC) */ - struct pnp_nic_info pnp; - } info; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_GET_NIC_TYPE PXENV_UNDI_GET_NIC_TYPE_t; - -/** @} */ /* pxenv_undi_get_nic_type */ - -/** @defgroup pxenv_undi_get_iface_info PXENV_UNDI_GET_IFACE_INFO - * - * UNDI GET IFACE INFO - * - * @{ - */ - -/** PXE API function code for pxenv_undi_get_iface_info() */ -#define PXENV_UNDI_GET_IFACE_INFO 0x0013 - -/** Broadcast supported */ -#define SUPPORTED_BROADCAST 0x0001 -/** Multicast supported */ -#define SUPPORTED_MULTICAST 0x0002 -/** Functional/group addressing supported */ -#define SUPPORTED_GROUP 0x0004 -/** Promiscuous mode supported */ -#define SUPPORTED_PROMISCUOUS 0x0008 -/** Software settable station address */ -#define SUPPORTED_SET_STATION_ADDRESS 0x0010 -/** InitiateDiagnostics supported */ -#define SUPPORTED_DIAGNOSTICS 0x0040 -/** Reset MAC supported */ -#define SUPPORTED_RESET 0x0400 -/** Open / Close Adapter supported */ -#define SUPPORTED_OPEN_CLOSE 0x0800 -/** Interrupt Request supported */ -#define SUPPORTED_IRQ 0x1000 - -/** Parameter block for pxenv_undi_get_iface_info() */ -struct s_PXENV_UNDI_GET_IFACE_INFO { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Interface type - * - * This is defined in the NDIS 2.0 specification to be one of - * the strings "802.3", "802.4", "802.5", "802.6", "DIX", - * "DIX+802.3", "APPLETALK", "ARCNET", "FDDI", "SDLC", "BSC", - * "HDLC", or "ISDN". - * - * "Normal" Ethernet, for various historical reasons, is - * "DIX+802.3". - */ - UINT8_t IfaceType[16]; - UINT32_t LinkSpeed; /**< Link speed, in bits per second */ - /** Service flags - * - * These are the "service flags" defined in the "MAC - * Service-Specific Characteristics" table in the NDIS 2.0 - * specification. Almost all of them are irrelevant to PXE. - */ - UINT32_t ServiceFlags; - UINT32_t Reserved[4]; /**< Must be zero */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_GET_IFACE_INFO PXENV_UNDI_GET_IFACE_INFO_t; - -/** @} */ /* pxenv_undi_get_iface_info */ - -/** @defgroup pxenv_undi_get_state PXENV_UNDI_GET_STATE - * - * UNDI GET STATE - * - * @{ - */ - -/** PXE API function code for pxenv_undi_get_state() */ -#define PXENV_UNDI_GET_STATE 0x0015 - -/** pxenv_start_undi() has been called */ -#define PXE_UNDI_GET_STATE_STARTED 1 -/** pxenv_undi_initialize() has been called */ -#define PXE_UNDI_GET_STATE_INITIALIZED 2 -/** pxenv_undi_open() has been called */ -#define PXE_UNDI_GET_STATE_OPENED 3 - -/** Parameter block for pxenv_undi_get_state() */ -struct s_PXENV_UNDI_GET_STATE { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Current state of the UNDI driver - * - * Valid values are #PXE_UNDI_GET_STATE_STARTED, - * #PXE_UNDI_GET_STATE_INITIALIZED or - * #PXE_UNDI_GET_STATE_OPENED. - */ - UINT8_t UNDIstate; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_GET_STATE PXENV_UNDI_GET_STATE_t; - -/** @} */ /* pxenv_undi_get_state */ - -/** @defgroup pxenv_undi_isr PXENV_UNDI_ISR - * - * UNDI ISR - * - * @{ - */ - -/** PXE API function code for pxenv_undi_isr() */ -#define PXENV_UNDI_ISR 0x0014 - -/** Determine whether or not this is our interrupt */ -#define PXENV_UNDI_ISR_IN_START 1 -/** Start processing interrupt */ -#define PXENV_UNDI_ISR_IN_PROCESS 2 -/** Continue processing interrupt */ -#define PXENV_UNDI_ISR_IN_GET_NEXT 3 -/** This interrupt was ours */ -#define PXENV_UNDI_ISR_OUT_OURS 0 -/** This interrupt was not ours */ -#define PXENV_UNDI_ISR_OUT_NOT_OURS 1 -/** Finished processing interrupt */ -#define PXENV_UNDI_ISR_OUT_DONE 0 -/** A packet transmission has completed */ -#define PXENV_UNDI_ISR_OUT_TRANSMIT 2 -/** A packet has been received */ -#define PXENV_UNDI_ISR_OUT_RECEIVE 3 -/** We are already in the middle of processing an interrupt */ -#define PXENV_UNDI_ISR_OUT_BUSY 4 - -/** Unicast packet (or packet captured in promiscuous mode) */ -#define P_DIRECTED 0 -/** Broadcast packet */ -#define P_BROADCAST 1 -/** Multicast packet */ -#define P_MULTICAST 2 - -/** Parameter block for pxenv_undi_isr() */ -struct s_PXENV_UNDI_ISR { - PXENV_STATUS_t Status; /**< PXE status code */ - /** Function flag - * - * Valid values are #PXENV_UNDI_ISR_IN_START, - * #PXENV_UNDI_ISR_IN_PROCESS, #PXENV_UNDI_ISR_IN_GET_NEXT, - * #PXENV_UNDI_ISR_OUT_OURS, #PXENV_UNDI_ISR_OUT_NOT_OURS, - * #PXENV_UNDI_ISR_OUT_DONE, #PXENV_UNDI_ISR_OUT_TRANSMIT, - * #PXENV_UNDI_ISR_OUT_RECEIVE or #PXENV_UNDI_ISR_OUT_BUSY. - */ - UINT16_t FuncFlag; - UINT16_t BufferLength; /**< Data buffer length */ - UINT16_t FrameLength; /**< Total frame length */ - UINT16_t FrameHeaderLength; /**< Frame header length */ - SEGOFF16_t Frame; /**< Data buffer address */ - /** Protocol type - * - * Valid values are #P_IP, #P_ARP, #P_RARP or #P_OTHER. - */ - UINT8_t ProtType; - /** Packet type - * - * Valid values are #P_DIRECTED, #P_BROADCAST or #P_MULTICAST. - */ - UINT8_t PktType; -} __attribute__ (( packed )); - -typedef struct s_PXENV_UNDI_ISR PXENV_UNDI_ISR_t; - -/** @} */ /* pxenv_undi_isr */ - -/** @} */ /* pxe_undi_api */ - -/** @defgroup pxe_file_api PXE FILE API - * - * POSIX-like file operations - * - * @{ - */ - -/** Minimum possible opcode used within PXE FILE API */ -#define PXENV_FILE_MIN 0x00e0 - -/** Minimum possible opcode used within PXE FILE API */ -#define PXENV_FILE_MAX 0x00ef - -/** @defgroup pxenv_file_open PXENV_FILE_OPEN - * - * FILE OPEN - * - * @{ - */ - -/** PXE API function code for pxenv_file_open() */ -#define PXENV_FILE_OPEN 0x00e0 - -/** Parameter block for pxenv_file_open() */ -struct s_PXENV_FILE_OPEN { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t FileHandle; /**< File handle */ - SEGOFF16_t FileName; /**< File URL */ - UINT32_t Reserved; /**< Reserved */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_FILE_OPEN PXENV_FILE_OPEN_t; - -/** @} */ /* pxenv_file_open */ - -/** @defgroup pxenv_file_close PXENV_FILE_CLOSE - * - * FILE CLOSE - * - * @{ - */ - -/** PXE API function code for pxenv_file_close() */ -#define PXENV_FILE_CLOSE 0x00e1 - -/** Parameter block for pxenv_file_close() */ -struct s_PXENV_FILE_CLOSE { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t FileHandle; /**< File handle */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_FILE_CLOSE PXENV_FILE_CLOSE_t; - -/** @} */ /* pxenv_file_close */ - -/** @defgroup pxenv_file_select PXENV_FILE_SELECT - * - * FILE SELECT - * - * @{ - */ - -/** PXE API function code for pxenv_file_select() */ -#define PXENV_FILE_SELECT 0x00e2 - -/** File is ready for reading */ -#define RDY_READ 0x0001 - -/** Parameter block for pxenv_file_select() */ -struct s_PXENV_FILE_SELECT { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t FileHandle; /**< File handle */ - UINT16_t Ready; /**< Indication of readiness */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_FILE_SELECT PXENV_FILE_SELECT_t; - -/** @} */ /* pxenv_file_select */ - -/** @defgroup pxenv_file_read PXENV_FILE_READ - * - * FILE READ - * - * @{ - */ - -/** PXE API function code for pxenv_file_read() */ -#define PXENV_FILE_READ 0x00e3 - -/** Parameter block for pxenv_file_read() */ -struct s_PXENV_FILE_READ { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t FileHandle; /**< File handle */ - UINT16_t BufferSize; /**< Data buffer size */ - SEGOFF16_t Buffer; /**< Data buffer */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_FILE_READ PXENV_FILE_READ_t; - -/** @} */ /* pxenv_file_read */ - -/** @defgroup pxenv_get_file_size PXENV_GET_FILE_SIZE - * - * GET FILE SIZE - * - * @{ - */ - -/** PXE API function code for pxenv_get_file_size() */ -#define PXENV_GET_FILE_SIZE 0x00e4 - -/** Parameter block for pxenv_get_file_size() */ -struct s_PXENV_GET_FILE_SIZE { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t FileHandle; /**< File handle */ - UINT32_t FileSize; /**< File size */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_GET_FILE_SIZE PXENV_GET_FILE_SIZE_t; - -/** @} */ /* pxenv_get_file_size */ - -/** @defgroup pxenv_file_exec PXENV_FILE_EXEC - * - * FILE EXEC - * - * @{ - */ - -/** PXE API function code for pxenv_file_exec() */ -#define PXENV_FILE_EXEC 0x00e5 - -/** Parameter block for pxenv_file_exec() */ -struct s_PXENV_FILE_EXEC { - PXENV_STATUS_t Status; /**< PXE status code */ - SEGOFF16_t Command; /**< Command to execute */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_FILE_EXEC PXENV_FILE_EXEC_t; - -/** @} */ /* pxenv_file_exec */ - -/** @defgroup pxenv_file_api_check PXENV_FILE_API_CHECK - * - * FILE API CHECK - * - * @{ - */ - -/** PXE API function code for pxenv_file_api_check() */ -#define PXENV_FILE_API_CHECK 0x00e6 - -/** Parameter block for pxenv_file_api_check() */ -struct s_PXENV_FILE_API_CHECK { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t Size; /**< Size of structure */ - UINT32_t Magic; /**< Magic number */ - UINT32_t Provider; /**< Implementation identifier */ - UINT32_t APIMask; /**< Supported API functions */ - UINT32_t Flags; /**< Reserved for the future */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_FILE_API_CHECK PXENV_FILE_API_CHECK_t; - -/** @} */ /* pxenv_file_api_check */ - -/** @defgroup pxenv_file_exit_hook PXENV_FILE_EXIT_HOOK - * - * FILE EXIT HOOK - * - * @{ - */ - -/** PXE API function code for pxenv_file_exit_hook() */ -#define PXENV_FILE_EXIT_HOOK 0x00e7 - -/** Parameter block for pxenv_file_exit_hook() */ -struct s_PXENV_FILE_EXIT_HOOK { - PXENV_STATUS_t Status; /**< PXE status code */ - SEGOFF16_t Hook; /**< SEG16:OFF16 to jump to */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_FILE_EXIT_HOOK PXENV_FILE_EXIT_HOOK_t; - -/** @} */ /* pxenv_file_exit_hook */ - -/** @defgroup pxenv_file_cmdline PXENV_FILE_CMDLINE - * - * FILE CMDLINE - * - * @{ - */ - -/** PXE API function code for pxenv_file_cmdline() */ -#define PXENV_FILE_CMDLINE 0x00e8 - -/** Parameter block for pxenv_file_cmdline() */ -struct s_PXENV_FILE_CMDLINE { - PXENV_STATUS_t Status; /**< PXE status code */ - UINT16_t BufferSize; /**< Data buffer size */ - SEGOFF16_t Buffer; /**< Data buffer */ -} __attribute__ (( packed )); - -typedef struct s_PXENV_FILE_CMDLINE PXENV_FILE_CMDLINE_t; - -/** @} */ /* pxe_file_cmdline */ - -/** @} */ /* pxe_file_api */ - -/** @defgroup pxe_loader_api PXE Loader API - * - * The UNDI ROM loader API - * - * @{ - */ - -/** Parameter block for undi_loader() */ -struct s_UNDI_LOADER { - /** PXE status code */ - PXENV_STATUS_t Status; - /** %ax register as for PXENV_START_UNDI */ - UINT16_t AX; - /** %bx register as for PXENV_START_UNDI */ - UINT16_t BX; - /** %dx register as for PXENV_START_UNDI */ - UINT16_t DX; - /** %di register as for PXENV_START_UNDI */ - OFF16_t DI; - /** %es register as for PXENV_START_UNDI */ - SEGSEL_t ES; - /** UNDI data segment - * - * @note The PXE specification defines the type of this field - * as #UINT16_t. For x86, #SEGSEL_t and #UINT16_t are - * equivalent anyway; for other architectures #SEGSEL_t makes - * more sense. - */ - SEGSEL_t UNDI_DS; - /** UNDI code segment - * - * @note The PXE specification defines the type of this field - * as #UINT16_t. For x86, #SEGSEL_t and #UINT16_t are - * equivalent anyway; for other architectures #SEGSEL_t makes - * more sense. - */ - SEGSEL_t UNDI_CS; - /** Address of the !PXE structure (a struct s_PXE) */ - SEGOFF16_t PXEptr; - /** Address of the PXENV+ structure (a struct s_PXENV) */ - SEGOFF16_t PXENVptr; -} __attribute__ (( packed )); - -typedef struct s_UNDI_LOADER UNDI_LOADER_t; - -/** @} */ /* pxe_loader_api */ - -/** @} */ /* pxe */ - -/** @page pxe_notes Etherboot PXE implementation notes - -@section pxe_routing IP routing - -Several PXE API calls (e.g. pxenv_tftp_open() and pxenv_udp_write()) -allow for the caller to specify a "relay agent IP address", often in a -field called "gateway" or similar. The PXE specification states that -"The IP layer should provide space for a minimum of four routing -entries obtained from the default router and static route DHCP option -tags in the DHCPACK message, plus any non-zero giaddr field from the -DHCPOFFER message(s) accepted by the client". - -The DHCP static route option ("option static-routes" in dhcpd.conf) -works only for classed IP routing (i.e. it provides no way to specify -a subnet mask). Since virtually everything now uses classless IP -routing, the DHCP static route option is almost totally useless, and -is (according to the dhcp-options man page) not implemented by any of -the popular DHCP clients. - -This leaves the caller-specified "relay agent IP address", the giaddr -field from the DHCPOFFER message(s) and the default gateway(s) -provided via the routers option ("option routers" in dhcpd.conf) in -the DHCPACK message. Each of these is a default gateway address. -It's a fair bet that the routers option should take priority over the -giaddr field, since the routers option has to be explicitly specified -by the DHCP server operator. Similarly, it's fair to assume that the -caller-specified "relay agent IP address", if present, should take -priority over any other routing table entries. - -@bug Etherboot currently ignores all potential sources of routing -information other than the first router provided to it by a DHCP -routers option. - -@section pxe_x86_modes x86 processor mode restrictions - -On the x86 platform, different PXE API calls have different -restrictions on the processor modes (real or protected) that can be -used. See the individual API call descriptions for the restrictions -that apply to any particular call. - -@subsection pxe_x86_pmode16 Real mode, or protected-mode with 16-bit stack - -The PXE specification states that the API function can be called in -protected mode only if the s_PXE::StatusCallout field is set to a -non-zero value, and that the API function cannot be called with a -32-bit stack segment. - -Etherboot does not enforce either of these restrictions; they seem (as -with so much of the PXE specification) to be artifacts of the Intel -implementation. - -*/ - -#endif /* PXE_API_H */ |