mirror of
https://github.com/xcat2/xNBA.git
synced 2024-12-15 07:41:45 +00:00
1632 lines
44 KiB
C
1632 lines
44 KiB
C
#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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
/** @file
|
|
*
|
|
* Preboot eXecution Environment (PXE) API
|
|
*
|
|
*/
|
|
|
|
#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;
|
|
} 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;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXE PXE_t;
|
|
|
|
/** @} */ /* pxe_api_call */
|
|
|
|
/** @defgroup pxe_loader_api PXE Loader API
|
|
*
|
|
* The UNDI ROM loader API
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/** The UNDI ROM ID structure */
|
|
struct s_UNDI_ROM_ID {
|
|
/** Signature
|
|
*
|
|
* Contains the bytes 'U', 'N', 'D', 'I'.
|
|
*/
|
|
UINT32_t Signature;
|
|
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;
|
|
/** UNDI revision
|
|
*
|
|
* UNDI revision, least significant byte first. For UNDI
|
|
* version 2.1.0, this field will contain { 0x00, 0x01, 0x02 }.
|
|
*/
|
|
UINT8_t UNDIRev[3];
|
|
/** UNDI loader routine entry point
|
|
*
|
|
* This is the entry point for calling undi_loader().
|
|
*/
|
|
UINT16_t UNDILoader;
|
|
/** Minimum required stack segment size */
|
|
UINT16_t StackSize;
|
|
/** Minimum required data segment size */
|
|
UINT16_t DataSize;
|
|
/** Minimum required code segment size */
|
|
UINT16_t CodeSize;
|
|
} PACKED;
|
|
|
|
typedef struct s_UNDI_ROM_ID UNDI_ROM_ID_t;
|
|
|
|
/** Parameter block for undi_loader() */
|
|
struct s_UNDI_LOADER {
|
|
/** struct s_UNDI_LOADER starts with a struct s_PXENV_START_UNDI */
|
|
union undi_loader_start_undi {
|
|
PXENV_STATUS_t Status; /**< PXE status code */
|
|
/** Parameters to pass to pxenv_start_undi() */
|
|
struct s_PXENV_START_UNDI start_undi;
|
|
} u;
|
|
/** 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 pxe_ptr;
|
|
/** Address of the PXENV+ structure (a struct s_PXENV) */
|
|
SEGOFF16_t pxenv_ptr;
|
|
} PACKED;
|
|
|
|
typedef struct s_UNDI_LOADER UNDI_LOADER_t;
|
|
|
|
extern PXENV_EXIT_t undi_loader ( struct s_UNDI_LOADER *undi_loader );
|
|
|
|
/** @} */ /* pxe_loader_api */
|
|
|
|
/** @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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNLOAD_STACK PXENV_UNLOAD_STACK_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK
|
|
*unload_stack );
|
|
|
|
/** @} */ /* 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 */
|
|
} 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 */
|
|
|
|
/** 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;
|
|
} PACKED;
|
|
|
|
typedef struct bootph BOOTPLAYER_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO
|
|
*get_cached_info );
|
|
|
|
/** @} */ /* 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;
|
|
|
|
extern PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE
|
|
*restart_tftp );
|
|
|
|
/** @} */ /* 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;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_START_UNDI PXENV_START_UNDI_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_STOP_UNDI PXENV_STOP_UNDI_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_START_BASE PXENV_START_BASE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_STOP_BASE PXENV_STOP_BASE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base );
|
|
|
|
/** @} */ /* 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, according to the PXE specification, though no reason
|
|
* is offered.
|
|
*/
|
|
UINT16_t PacketSize;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_TFTP_OPEN PXENV_TFTP_OPEN_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_TFTP_CLOSE PXENV_TFTP_CLOSE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_TFTP_READ PXENV_TFTP_READ_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_tftp_read ( struct s_PXENV_TFTP_READ *tftp_read );
|
|
|
|
/** @} */ /* 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;
|
|
/** Timeout for receiving data or ACK packets */
|
|
UINT16_t TFTPOpenTimeOut;
|
|
/** Timeout before issuing MTFTP open */
|
|
UINT16_t TFTPReopenDelay;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_TFTP_READ_FILE PXENV_TFTP_READ_FILE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_tftp_read_file ( struct s_PXENV_TFTP_READ_FILE
|
|
*tftp_read_file );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_TFTP_GET_FSIZE PXENV_TFTP_GET_FSIZE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE
|
|
*get_fsize );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UDP_OPEN PXENV_UDP_OPEN_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *udp_open );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UDP_CLOSE PXENV_UDP_CLOSE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *udp_close );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UDP_WRITE PXENV_UDP_WRITE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_udp_write ( struct s_PXENV_UDP_WRITE *udp_write );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UDP_READ PXENV_UDP_READ_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *udp_read );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_STARTUP PXENV_UNDI_STARTUP_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP
|
|
*undi_startup );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_CLEANUP PXENV_UNDI_CLEANUP_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP
|
|
*undi_cleanup );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_INITIALIZE PXENV_UNDI_INITIALIZE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE
|
|
*undi_initialize );
|
|
|
|
/** @} */ /* 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];
|
|
} 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_ADAPTER {
|
|
PXENV_STATUS_t Status; /**< PXE status code */
|
|
/** Multicast MAC addresses */
|
|
struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_RESET_ADAPTER PXENV_UNDI_RESET_ADAPTER_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET
|
|
*undi_reset_adapter );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_SHUTDOWN PXENV_UNDI_SHUTDOWN_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN
|
|
*undi_shutdown );
|
|
|
|
/** @} */ /* 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;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_OPEN PXENV_UNDI_OPEN_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_CLOSE PXENV_UNDI_CLOSE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close );
|
|
|
|
/** @} */ /* 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];
|
|
} 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_TRANSMIT PXENV_UNDI_TRANSMIT_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT
|
|
*undi_transmit );
|
|
|
|
/** @} */ /* 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;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS PXENV_UNDI_SET_MCAST_ADDRESS_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_set_mcast_address (
|
|
struct s_PXENV_UNDI_SET_MCAST_ADDRESS *undi_set_mcast_address );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS PXENV_UNDI_SET_STATION_ADDRESS_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_set_station_address (
|
|
struct s_PXENV_UNDI_SET_STATION_ADDRESS *undi_set_station_address );
|
|
|
|
/** @} */ /* 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;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_SET_PACKET_FILTER PXENV_UNDI_SET_PACKET_FILTER_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_set_packet_filter (
|
|
struct s_PXENV_UNDI_SET_PACKET_FILTER *undi_set_packet_filter );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_GET_INFORMATION PXENV_UNDI_GET_INFORMATION_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_get_information (
|
|
struct s_PXENV_UNDI_GET_INFORMATION *undi_get_information );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_GET_STATISTICS PXENV_UNDI_GET_STATISTICS_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_get_statistics (
|
|
struct s_PXENV_UNDI_GET_STATISTICS *undi_get_statistics );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_CLEAR_STATISTICS PXENV_UNDI_CLEAR_STATISTICS_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_clear_statistics (
|
|
struct s_PXENV_UNDI_CLEAR_STATISTICS *undi_clear_statistics );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_INITIATE_DIAGS PXENV_UNDI_INITIATE_DIAGS_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_initiate_diags (
|
|
struct s_PXENV_UNDI_INITIATE_DIAGS *undi_initiate_diags );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_FORCE_INTERRUPT PXENV_UNDI_FORCE_INTERRUPT_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_force_interrupt (
|
|
struct s_PXENV_UNDI_FORCE_INTERRUPT *undi_force_interrupt );
|
|
|
|
/** @} */ /* 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS PXENV_UNDI_GET_MCAST_ADDRESS_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_get_mcast_address (
|
|
struct s_PXENV_UNDI_GET_MCAST_ADDRESS *undi_get_mcast_address );
|
|
|
|
/** @} */ /* 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 */
|
|
} 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;
|
|
} 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;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_GET_NIC_TYPE PXENV_UNDI_GET_NIC_TYPE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_get_nic_type (
|
|
struct s_PXENV_UNDI_GET_NIC_TYPE *undi_get_nic_type );
|
|
|
|
/** @} */ /* 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
|
|
|
|
/** 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 */
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_GET_IFACE_INFO PXENV_UNDI_GET_IFACE_INFO_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_get_iface_info (
|
|
struct s_PXENV_UNDI_GET_IFACE_INFO *undi_get_iface_info );
|
|
|
|
/** @} */ /* 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;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_GET_STATE PXENV_UNDI_GET_STATE_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_get_state ( struct s_PXENV_UNDI_GET_STATE
|
|
*undi_get_state );
|
|
|
|
/** @} */ /* 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;
|
|
} PACKED;
|
|
|
|
typedef struct s_PXENV_UNDI_ISR PXENV_UNDI_ISR_t;
|
|
|
|
extern PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr );
|
|
|
|
/** @} */ /* pxenv_undi_isr */
|
|
|
|
/** @} */ /* pxe_undi_api */
|
|
|
|
/** @} */ /* pxe */
|
|
|
|
#endif /* PXE_API_H */
|