#define PACKED __packed
#define S_SIZE(s) s, sizeof(s) - 1
#define PXENFSROOTPATH "/pxeroot"
typedef struct {
uint16_t offset;
uint16_t segment;
} SEGOFF16_t;
typedef struct {
uint16_t Seg_Addr;
uint32_t Phy_Addr;
uint16_t Seg_Size;
} PACKED SEGDESC_t;
typedef uint16_t SEGSEL_t;
typedef uint16_t PXENV_STATUS_t;
typedef uint32_t IP4_t;
typedef uint32_t ADDR32_t;
typedef uint16_t UDP_PORT_t;
#define MAC_ADDR_LEN 16
typedef uint8_t MAC_ADDR[MAC_ADDR_LEN];
typedef struct {
uint8_t Signature[6];
uint16_t Version;
uint8_t Length;
uint8_t Checksum;
SEGOFF16_t RMEntry;
uint32_t PMOffset;
SEGSEL_t PMSelector;
SEGSEL_t StackSeg;
uint16_t StackSize;
SEGSEL_t BC_CodeSeg;
uint16_t BC_CodeSize;
SEGSEL_t BC_DataSeg;
uint16_t BC_DataSize;
SEGSEL_t UNDIDataSeg;
uint16_t UNDIDataSize;
SEGSEL_t UNDICodeSeg;
uint16_t UNDICodeSize;
SEGOFF16_t PXEPtr;
} PACKED pxenv_t;
typedef struct {
uint8_t Signature[4];
uint8_t StructLength;
uint8_t StructCksum;
uint8_t StructRev;
uint8_t reserved_1;
SEGOFF16_t UNDIROMID;
SEGOFF16_t BaseROMID;
SEGOFF16_t EntryPointSP;
SEGOFF16_t EntryPointESP;
SEGOFF16_t StatusCallout;
uint8_t reserved_2;
uint8_t SegDescCn;
SEGSEL_t FirstSelector;
SEGDESC_t Stack;
SEGDESC_t UNDIData;
SEGDESC_t UNDICode;
SEGDESC_t UNDICodeWrite;
SEGDESC_t BC_Data;
SEGDESC_t BC_Code;
SEGDESC_t BC_CodeWrite;
} PACKED pxe_t;
#define PXENV_START_UNDI 0x0000
typedef struct {
PXENV_STATUS_t Status;
uint16_t ax;
uint16_t bx;
uint16_t dx;
uint16_t di;
uint16_t es;
} PACKED t_PXENV_START_UNDI;
#define PXENV_UNDI_STARTUP 0x0001
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_UNDI_STARTUP;
#define PXENV_UNDI_CLEANUP 0x0002
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_UNDI_CLEANUP;
#define PXENV_UNDI_INITIALIZE 0x0003
typedef struct {
PXENV_STATUS_t Status;
ADDR32_t ProtocolIni;
uint8_t reserved[8];
} PACKED t_PXENV_UNDI_INITIALIZE;
#define MAXNUM_MCADDR 8
typedef struct {
uint16_t MCastAddrCount;
MAC_ADDR McastAddr[MAXNUM_MCADDR];
} PACKED t_PXENV_UNDI_MCAST_ADDRESS;
#define PXENV_UNDI_RESET_ADAPTER 0x0004
typedef struct {
PXENV_STATUS_t Status;
t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
} PACKED t_PXENV_UNDI_RESET;
#define PXENV_UNDI_SHUTDOWN 0x0005
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_UNDI_SHUTDOWN;
#define PXENV_UNDI_OPEN 0x0006
typedef struct {
PXENV_STATUS_t Status;
uint16_t OpenFlag;
uint16_t PktFilter;
# define FLTR_DIRECTED 0x0001
# define FLTR_BRDCST 0x0002
# define FLTR_PRMSCS 0x0004
# define FLTR_SRC_RTG 0x0008
t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
} PACKED t_PXENV_UNDI_OPEN;
#define PXENV_UNDI_CLOSE 0x0007
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_UNDI_CLOSE;
#define PXENV_UNDI_TRANSMIT 0x0008
typedef struct {
PXENV_STATUS_t Status;
uint8_t Protocol;
# define P_UNKNOWN 0
# define P_IP 1
# define P_ARP 2
# define P_RARP 3
uint8_t XmitFlag;
# define XMT_DESTADDR 0x0000
# define XMT_BROADCAST 0x0001
SEGOFF16_t DestAddr;
SEGOFF16_t TBD;
uint32_t Reserved[2];
} PACKED t_PXENV_UNDI_TRANSMIT;
#define MAX_DATA_BLKS 8
typedef struct {
uint16_t ImmedLength;
SEGOFF16_t Xmit;
uint16_t DataBlkCount;
struct DataBlk {
uint8_t TDPtrType;
uint8_t TDRsvdByte;
uint16_t TDDataLen;
SEGOFF16_t TDDataPtr;
} DataBlock[MAX_DATA_BLKS];
} PACKED t_PXENV_UNDI_TBD;
#define PXENV_UNDI_SET_MCAST_ADDRESS 0x0009
typedef struct {
PXENV_STATUS_t Status;
t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
} PACKED t_PXENV_UNDI_SET_MCAST_ADDR;
#define PXENV_UNDI_SET_STATION_ADDRESS 0x000A
typedef struct {
PXENV_STATUS_t Status;
MAC_ADDR StationAddress;
} PACKED t_PXENV_UNDI_SET_STATION_ADDR;
#define PXENV_UNDI_SET_PACKET_FILTER 0x000B
typedef struct {
PXENV_STATUS_t Status;
uint8_t filter;
} PACKED t_PXENV_UNDI_SET_PACKET_FILTER;
#define PXENV_UNDI_GET_INFORMATION 0x000C
typedef struct {
PXENV_STATUS_t Status;
uint16_t BaseIo;
uint16_t IntNumber;
uint16_t MaxTranUnit;
uint16_t HwType;
# define ETHER_TYPE 1
# define EXP_ETHER_TYPE 2
# define IEEE_TYPE 6
uint16_t HwAddrLen;
MAC_ADDR CurrentNodeAddress;
MAC_ADDR PermNodeAddress;
SEGSEL_t ROMAddress;
uint16_t RxBufCt;
uint16_t TxBufCt;
} PACKED t_PXENV_UNDI_GET_INFORMATION;
#define PXENV_UNDI_GET_STATISTICS 0x000D
typedef struct {
PXENV_STATUS_t Status;
uint32_t XmitGoodFrames;
uint32_t RcvGoodFrames;
uint32_t RcvCRCErrors;
uint32_t RcvResourceErrors;
} PACKED t_PXENV_UNDI_GET_STATISTICS;
#define PXENV_UNDI_CLEAR_STATISTICS 0x000E
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_UNDI_CLEAR_STATISTICS;
#define PXENV_UNDI_INITIATE_DIAGS 0x000F
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_UNDI_INITIATE_DIAGS;
#define PXENV_UNDI_FORCE_INTERRUPT 0x0010
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_UNDI_FORCE_INTERRUPT;
#define PXENV_UNDI_GET_MCAST_ADDRESS 0x0011
typedef struct {
PXENV_STATUS_t Status;
IP4_t InetAddr;
MAC_ADDR MediaAddr;
} PACKED t_PXENV_UNDI_GET_MCAST_ADDR;
#define PXENV_UNDI_GET_NIC_TYPE 0x0012
typedef struct {
PXENV_STATUS_t Status;
uint8_t NicType;
# define PCI_NIC 2
# define PnP_NIC 3
# define CardBus_NIC 4
union {
struct {
uint16_t Vendor_ID;
uint16_t Dev_ID;
uint8_t Base_Class;
uint8_t Sub_Class;
uint8_t Prog_Intf;
uint8_t Rev;
uint16_t BusDevFunc;
uint16_t SubVendor_ID;
uint16_t SubDevice_ID;
} pci, cardbus;
struct {
uint32_t EISA_Dev_ID;
uint8_t Base_Class;
uint8_t Sub_Class;
uint8_t Prog_Intf;
uint16_t CardSelNum;
} pnp;
} info;
} PACKED t_PXENV_UNDI_GET_NIC_TYPE;
#define PXENV_UNDI_GET_IFACE_INFO 0x0013
typedef struct {
PXENV_STATUS_t Status;
uint8_t IfaceType[16];
uint32_t LinkSpeed;
uint32_t ServiceFlags;
uint32_t Reserved[4];
} PACKED t_PXENV_UNDI_GET_NDIS_INFO;
#define PXENV_UNDI_ISR 0x0014
typedef struct {
PXENV_STATUS_t Status;
uint16_t FuncFlag;
uint16_t BufferLength;
uint16_t FrameLength;
uint16_t FrameHeaderLength;
SEGOFF16_t Frame;
uint8_t ProtType;
uint8_t PktType;
# define PXENV_UNDI_ISR_IN_START 1
# define PXENV_UNDI_ISR_IN_PROCESS 2
# define PXENV_UNDI_ISR_IN_GET_NEXT 3
# define PXENV_UNDI_ISR_OUT_OURS 0
# define PXENV_UNDI_ISR_OUT_NOT_OUTS 1
# define PXENV_UNDI_ISR_OUT_DONE 0
# define PXENV_UNDI_ISR_OUT_TRANSMIT 2
# define PXENV_UNDI_ISR_OUT_RECEIVE 3
# define PXENV_UNDI_ISR_OUT_BUSY 4
} PACKED t_PXENV_UNDI_ISR;
#define PXENV_STOP_UNDI 0x0015
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_STOP_UNDI;
#define PXENV_TFTP_OPEN 0x0020
typedef struct {
PXENV_STATUS_t Status;
IP4_t ServerIPAddress;
IP4_t GatewayIPAddress;
uint8_t FileName[128];
UDP_PORT_t TFTPPort;
uint16_t PacketSize;
} PACKED t_PXENV_TFTP_OPEN;
#define PXENV_TFTP_CLOSE 0x0021
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_TFTP_CLOSE;
#define PXENV_TFTP_READ 0x0022
typedef struct {
PXENV_STATUS_t Status;
uint16_t PacketNumber;
uint16_t BufferSize;
SEGOFF16_t Buffer;
} PACKED t_PXENV_TFTP_READ;
#define PXENV_TFTP_READ_FILE 0x0023
typedef struct {
PXENV_STATUS_t Status;
uint8_t FileName[128];
uint32_t BufferSize;
ADDR32_t Buffer;
IP4_t ServerIPAddress;
IP4_t GatewayIPAdress;
IP4_t McastIPAdress;
UDP_PORT_t TFTPClntPort;
UDP_PORT_t TFTPSrvPort;
uint16_t TFTPOpenTimeOut;
uint16_t TFTPReopenDelay;
} PACKED t_PXENV_TFTP_READ_FILE;
#define PXENV_TFTP_GET_FSIZE 0x0025
typedef struct {
PXENV_STATUS_t Status;
IP4_t ServerIPAddress;
IP4_t GatewayIPAdress;
uint8_t FileName[128];
uint32_t FileSize;
} PACKED t_PXENV_TFTP_GET_FSIZE;
#define PXENV_UDP_OPEN 0x0030
typedef struct {
PXENV_STATUS_t status;
IP4_t src_ip;
} PACKED t_PXENV_UDP_OPEN;
#define PXENV_UDP_CLOSE 0x0031
typedef struct {
PXENV_STATUS_t status;
} PACKED t_PXENV_UDP_CLOSE;
#define PXENV_UDP_READ 0x0032
typedef struct {
PXENV_STATUS_t status;
IP4_t src_ip;
IP4_t dest_ip;
UDP_PORT_t s_port;
UDP_PORT_t d_port;
uint16_t buffer_size;
SEGOFF16_t buffer;
} PACKED t_PXENV_UDP_READ;
#define PXENV_UDP_WRITE 0x0033
typedef struct {
PXENV_STATUS_t status;
IP4_t ip;
IP4_t gw;
UDP_PORT_t src_port;
UDP_PORT_t dst_port;
uint16_t buffer_size;
SEGOFF16_t buffer;
} PACKED t_PXENV_UDP_WRITE;
#define PXENV_UNLOAD_STACK 0x0070
typedef struct {
PXENV_STATUS_t Status;
uint8_t reserved[10];
} PACKED t_PXENV_UNLOAD_STACK;
#define PXENV_GET_CACHED_INFO 0x0071
typedef struct {
PXENV_STATUS_t Status;
uint16_t PacketType;
# define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
# define PXENV_PACKET_TYPE_DHCP_ACK 2
# define PXENV_PACKET_TYPE_BINL_REPLY 3
uint16_t BufferSize;
SEGOFF16_t Buffer;
uint16_t BufferLimit;
} PACKED t_PXENV_GET_CACHED_INFO;
typedef struct {
uint8_t opcode;
# define BOOTP_REQ 1
# define BOOTP_REP 2
uint8_t Hardware;
uint8_t Hardlen;
uint8_t Gatehops;
uint32_t ident;
uint16_t seconds;
uint16_t Flags;
# define BOOTP_BCAST 0x8000
IP4_t cip;
IP4_t yip;
IP4_t sip;
IP4_t gip;
MAC_ADDR CAddr;
uint8_t Sname[64];
uint8_t bootfile[128];
union {
# if 1
# define BOOTP_DHCPVEND 1024
# else
# define BOOTP_DHCPVEND 312
# endif
uint8_t d[BOOTP_DHCPVEND];
struct {
uint8_t magic[4];
# ifndef VM_RFC1048
# define VM_RFC1048 0x63825363L
# endif
uint32_t flags;
uint8_t pad[56];
} v;
} vendor;
} PACKED BOOTPLAYER;
#define PXENV_RESTART_TFTP 0x0073
#define t_PXENV_RESTART_TFTP t_PXENV_TFTP_READ_FILE
#define PXENV_START_BASE 0x0075
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_START_BASE;
#define PXENV_STOP_BASE 0x0076
typedef struct {
PXENV_STATUS_t Status;
} PACKED t_PXENV_STOP_BASE;