1ca987d46SWarner Losh /* 2ca987d46SWarner Losh * Copyright (c) 2000 Alfred Perlstein <alfred@freebsd.org> 3ca987d46SWarner Losh * All rights reserved. 4ca987d46SWarner Losh * Copyright (c) 2000 Paul Saab <ps@freebsd.org> 5ca987d46SWarner Losh * All rights reserved. 6ca987d46SWarner Losh * Copyright (c) 2000 John Baldwin <jhb@freebsd.org> 7ca987d46SWarner Losh * 8ca987d46SWarner Losh * Redistribution and use in source and binary forms, with or without 9ca987d46SWarner Losh * modification, are permitted provided that the following conditions 10ca987d46SWarner Losh * are met: 11ca987d46SWarner Losh * 1. Redistributions of source code must retain the above copyright 12ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer. 13ca987d46SWarner Losh * 2. Redistributions in binary form must reproduce the above copyright 14ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer in the 15ca987d46SWarner Losh * documentation and/or other materials provided with the distribution. 16ca987d46SWarner Losh * 17ca987d46SWarner Losh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18ca987d46SWarner Losh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19ca987d46SWarner Losh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20ca987d46SWarner Losh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21ca987d46SWarner Losh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22ca987d46SWarner Losh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23ca987d46SWarner Losh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24ca987d46SWarner Losh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25ca987d46SWarner Losh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26ca987d46SWarner Losh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27ca987d46SWarner Losh * SUCH DAMAGE. 28ca987d46SWarner Losh * 29ca987d46SWarner Losh * $FreeBSD$ 30ca987d46SWarner Losh */ 31ca987d46SWarner Losh 32ca987d46SWarner Losh /* 33ca987d46SWarner Losh * The typedefs and structures declared in this file 34ca987d46SWarner Losh * clearly violate style(9), the reason for this is to conform to the 35ca987d46SWarner Losh * typedefs/structure-names used in the Intel literature to avoid confusion. 36ca987d46SWarner Losh * 37ca987d46SWarner Losh * It's for your own good. :) 38ca987d46SWarner Losh */ 39ca987d46SWarner Losh 40ca987d46SWarner Losh /* It seems that intel didn't think about ABI, 41ca987d46SWarner Losh * either that or 16bit ABI != 32bit ABI (which seems reasonable) 42ca987d46SWarner Losh * I have to thank Intel for the hair loss I incurred trying to figure 43ca987d46SWarner Losh * out why PXE was mis-reading structures I was passing it (at least 44ca987d46SWarner Losh * from my point of view) 45ca987d46SWarner Losh * 46ca987d46SWarner Losh * Solution: use gcc's '__packed' to correctly align 47ca987d46SWarner Losh * structures passed into PXE 48ca987d46SWarner Losh * Question: does this really work for PXE's expected ABI? 49ca987d46SWarner Losh */ 50ca987d46SWarner Losh #define PACKED __packed 51ca987d46SWarner Losh 52ca987d46SWarner Losh #define S_SIZE(s) s, sizeof(s) - 1 53ca987d46SWarner Losh 54ca987d46SWarner Losh #define PXENFSROOTPATH "/pxeroot" 55ca987d46SWarner Losh 56ca987d46SWarner Losh typedef struct { 57ca987d46SWarner Losh uint16_t offset; 58ca987d46SWarner Losh uint16_t segment; 59ca987d46SWarner Losh } SEGOFF16_t; 60ca987d46SWarner Losh 61ca987d46SWarner Losh typedef struct { 62ca987d46SWarner Losh uint16_t Seg_Addr; 63ca987d46SWarner Losh uint32_t Phy_Addr; 64ca987d46SWarner Losh uint16_t Seg_Size; 65*795497bfSToomas Soome } PACKED SEGDESC_t; 66ca987d46SWarner Losh 67ca987d46SWarner Losh typedef uint16_t SEGSEL_t; 68ca987d46SWarner Losh typedef uint16_t PXENV_STATUS_t; 69ca987d46SWarner Losh typedef uint32_t IP4_t; 70ca987d46SWarner Losh typedef uint32_t ADDR32_t; 71ca987d46SWarner Losh typedef uint16_t UDP_PORT_t; 72ca987d46SWarner Losh 73ca987d46SWarner Losh #define MAC_ADDR_LEN 16 74ca987d46SWarner Losh typedef uint8_t MAC_ADDR[MAC_ADDR_LEN]; 75ca987d46SWarner Losh 76ca987d46SWarner Losh /* PXENV+ */ 77ca987d46SWarner Losh typedef struct { 78ca987d46SWarner Losh uint8_t Signature[6]; /* 'PXENV+' */ 79ca987d46SWarner Losh uint16_t Version; /* MSB = major, LSB = minor */ 80ca987d46SWarner Losh uint8_t Length; /* structure length */ 81ca987d46SWarner Losh uint8_t Checksum; /* checksum pad */ 82ca987d46SWarner Losh SEGOFF16_t RMEntry; /* SEG:OFF to PXE entry point */ 83ca987d46SWarner Losh /* don't use PMOffset and PMSelector (from the 2.1 PXE manual) */ 84ca987d46SWarner Losh uint32_t PMOffset; /* Protected mode entry */ 85ca987d46SWarner Losh SEGSEL_t PMSelector; /* Protected mode selector */ 86ca987d46SWarner Losh SEGSEL_t StackSeg; /* Stack segment address */ 87ca987d46SWarner Losh uint16_t StackSize; /* Stack segment size (bytes) */ 88ca987d46SWarner Losh SEGSEL_t BC_CodeSeg; /* BC Code segment address */ 89ca987d46SWarner Losh uint16_t BC_CodeSize; /* BC Code segment size (bytes) */ 90ca987d46SWarner Losh SEGSEL_t BC_DataSeg; /* BC Data segment address */ 91ca987d46SWarner Losh uint16_t BC_DataSize; /* BC Data segment size (bytes) */ 92ca987d46SWarner Losh SEGSEL_t UNDIDataSeg; /* UNDI Data segment address */ 93ca987d46SWarner Losh uint16_t UNDIDataSize; /* UNDI Data segment size (bytes) */ 94ca987d46SWarner Losh SEGSEL_t UNDICodeSeg; /* UNDI Code segment address */ 95ca987d46SWarner Losh uint16_t UNDICodeSize; /* UNDI Code segment size (bytes) */ 96ca987d46SWarner Losh SEGOFF16_t PXEPtr; /* SEG:OFF to !PXE struct, 97ca987d46SWarner Losh only present when Version > 2.1 */ 98ca987d46SWarner Losh } PACKED pxenv_t; 99ca987d46SWarner Losh 100ca987d46SWarner Losh /* !PXE */ 101ca987d46SWarner Losh typedef struct { 102ca987d46SWarner Losh uint8_t Signature[4]; 103ca987d46SWarner Losh uint8_t StructLength; 104ca987d46SWarner Losh uint8_t StructCksum; 105ca987d46SWarner Losh uint8_t StructRev; 106ca987d46SWarner Losh uint8_t reserved_1; 107ca987d46SWarner Losh SEGOFF16_t UNDIROMID; 108ca987d46SWarner Losh SEGOFF16_t BaseROMID; 109ca987d46SWarner Losh SEGOFF16_t EntryPointSP; 110ca987d46SWarner Losh SEGOFF16_t EntryPointESP; 111ca987d46SWarner Losh SEGOFF16_t StatusCallout; 112ca987d46SWarner Losh uint8_t reserved_2; 113ca987d46SWarner Losh uint8_t SegDescCn; 114ca987d46SWarner Losh SEGSEL_t FirstSelector; 115ca987d46SWarner Losh SEGDESC_t Stack; 116ca987d46SWarner Losh SEGDESC_t UNDIData; 117ca987d46SWarner Losh SEGDESC_t UNDICode; 118ca987d46SWarner Losh SEGDESC_t UNDICodeWrite; 119ca987d46SWarner Losh SEGDESC_t BC_Data; 120ca987d46SWarner Losh SEGDESC_t BC_Code; 121ca987d46SWarner Losh SEGDESC_t BC_CodeWrite; 122ca987d46SWarner Losh } PACKED pxe_t; 123ca987d46SWarner Losh 124ca987d46SWarner Losh #define PXENV_START_UNDI 0x0000 125ca987d46SWarner Losh typedef struct { 126ca987d46SWarner Losh PXENV_STATUS_t Status; 127ca987d46SWarner Losh uint16_t ax; 128ca987d46SWarner Losh uint16_t bx; 129ca987d46SWarner Losh uint16_t dx; 130ca987d46SWarner Losh uint16_t di; 131ca987d46SWarner Losh uint16_t es; 132ca987d46SWarner Losh } PACKED t_PXENV_START_UNDI; 133ca987d46SWarner Losh 134ca987d46SWarner Losh #define PXENV_UNDI_STARTUP 0x0001 135ca987d46SWarner Losh typedef struct { 136ca987d46SWarner Losh PXENV_STATUS_t Status; 137ca987d46SWarner Losh } PACKED t_PXENV_UNDI_STARTUP; 138ca987d46SWarner Losh 139ca987d46SWarner Losh #define PXENV_UNDI_CLEANUP 0x0002 140ca987d46SWarner Losh typedef struct { 141ca987d46SWarner Losh PXENV_STATUS_t Status; 142ca987d46SWarner Losh } PACKED t_PXENV_UNDI_CLEANUP; 143ca987d46SWarner Losh 144ca987d46SWarner Losh #define PXENV_UNDI_INITIALIZE 0x0003 145ca987d46SWarner Losh typedef struct { 146ca987d46SWarner Losh PXENV_STATUS_t Status; 147ca987d46SWarner Losh ADDR32_t ProtocolIni; /* Phys addr of a copy of the driver module */ 148ca987d46SWarner Losh uint8_t reserved[8]; 149456a4ad5SKyle Evans } PACKED t_PXENV_UNDI_INITIALIZE; 150ca987d46SWarner Losh 151ca987d46SWarner Losh 152ca987d46SWarner Losh #define MAXNUM_MCADDR 8 153ca987d46SWarner Losh typedef struct { 154ca987d46SWarner Losh uint16_t MCastAddrCount; 155ca987d46SWarner Losh MAC_ADDR McastAddr[MAXNUM_MCADDR]; 156ca987d46SWarner Losh } PACKED t_PXENV_UNDI_MCAST_ADDRESS; 157ca987d46SWarner Losh 158ca987d46SWarner Losh #define PXENV_UNDI_RESET_ADAPTER 0x0004 159ca987d46SWarner Losh typedef struct { 160ca987d46SWarner Losh PXENV_STATUS_t Status; 161ca987d46SWarner Losh t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 162ca987d46SWarner Losh } PACKED t_PXENV_UNDI_RESET; 163ca987d46SWarner Losh 164ca987d46SWarner Losh #define PXENV_UNDI_SHUTDOWN 0x0005 165ca987d46SWarner Losh typedef struct { 166ca987d46SWarner Losh PXENV_STATUS_t Status; 167ca987d46SWarner Losh } PACKED t_PXENV_UNDI_SHUTDOWN; 168ca987d46SWarner Losh 169ca987d46SWarner Losh #define PXENV_UNDI_OPEN 0x0006 170ca987d46SWarner Losh typedef struct { 171ca987d46SWarner Losh PXENV_STATUS_t Status; 172ca987d46SWarner Losh uint16_t OpenFlag; 173ca987d46SWarner Losh uint16_t PktFilter; 174ca987d46SWarner Losh # define FLTR_DIRECTED 0x0001 175ca987d46SWarner Losh # define FLTR_BRDCST 0x0002 176ca987d46SWarner Losh # define FLTR_PRMSCS 0x0004 177ca987d46SWarner Losh # define FLTR_SRC_RTG 0x0008 178ca987d46SWarner Losh 179ca987d46SWarner Losh t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 180ca987d46SWarner Losh } PACKED t_PXENV_UNDI_OPEN; 181ca987d46SWarner Losh 182ca987d46SWarner Losh #define PXENV_UNDI_CLOSE 0x0007 183ca987d46SWarner Losh typedef struct { 184ca987d46SWarner Losh PXENV_STATUS_t Status; 185ca987d46SWarner Losh } PACKED t_PXENV_UNDI_CLOSE; 186ca987d46SWarner Losh 187ca987d46SWarner Losh #define PXENV_UNDI_TRANSMIT 0x0008 188ca987d46SWarner Losh typedef struct { 189ca987d46SWarner Losh PXENV_STATUS_t Status; 190ca987d46SWarner Losh uint8_t Protocol; 191ca987d46SWarner Losh # define P_UNKNOWN 0 192ca987d46SWarner Losh # define P_IP 1 193ca987d46SWarner Losh # define P_ARP 2 194ca987d46SWarner Losh # define P_RARP 3 195ca987d46SWarner Losh 196ca987d46SWarner Losh uint8_t XmitFlag; 197ca987d46SWarner Losh # define XMT_DESTADDR 0x0000 198ca987d46SWarner Losh # define XMT_BROADCAST 0x0001 199ca987d46SWarner Losh 200ca987d46SWarner Losh SEGOFF16_t DestAddr; 201ca987d46SWarner Losh SEGOFF16_t TBD; 202ca987d46SWarner Losh uint32_t Reserved[2]; 203ca987d46SWarner Losh } PACKED t_PXENV_UNDI_TRANSMIT; 204ca987d46SWarner Losh 205ca987d46SWarner Losh #define MAX_DATA_BLKS 8 206ca987d46SWarner Losh typedef struct { 207ca987d46SWarner Losh uint16_t ImmedLength; 208ca987d46SWarner Losh SEGOFF16_t Xmit; 209ca987d46SWarner Losh uint16_t DataBlkCount; 210ca987d46SWarner Losh struct DataBlk { 211ca987d46SWarner Losh uint8_t TDPtrType; 212ca987d46SWarner Losh uint8_t TDRsvdByte; 213ca987d46SWarner Losh uint16_t TDDataLen; 214ca987d46SWarner Losh SEGOFF16_t TDDataPtr; 215ca987d46SWarner Losh } DataBlock[MAX_DATA_BLKS]; 216ca987d46SWarner Losh } PACKED t_PXENV_UNDI_TBD; 217ca987d46SWarner Losh 218ca987d46SWarner Losh #define PXENV_UNDI_SET_MCAST_ADDRESS 0x0009 219ca987d46SWarner Losh typedef struct { 220ca987d46SWarner Losh PXENV_STATUS_t Status; 221ca987d46SWarner Losh t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 222ca987d46SWarner Losh } PACKED t_PXENV_UNDI_SET_MCAST_ADDR; 223ca987d46SWarner Losh 224ca987d46SWarner Losh #define PXENV_UNDI_SET_STATION_ADDRESS 0x000A 225ca987d46SWarner Losh typedef struct { 226ca987d46SWarner Losh PXENV_STATUS_t Status; 227ca987d46SWarner Losh MAC_ADDR StationAddress; /* Temp MAC address to use */ 228ca987d46SWarner Losh } PACKED t_PXENV_UNDI_SET_STATION_ADDR; 229ca987d46SWarner Losh 230ca987d46SWarner Losh #define PXENV_UNDI_SET_PACKET_FILTER 0x000B 231ca987d46SWarner Losh typedef struct { 232ca987d46SWarner Losh PXENV_STATUS_t Status; 233ca987d46SWarner Losh uint8_t filter; /* see UNDI_OPEN (0x0006) */ 234ca987d46SWarner Losh } PACKED t_PXENV_UNDI_SET_PACKET_FILTER; 235ca987d46SWarner Losh 236ca987d46SWarner Losh #define PXENV_UNDI_GET_INFORMATION 0x000C 237ca987d46SWarner Losh typedef struct { 238ca987d46SWarner Losh PXENV_STATUS_t Status; 239ca987d46SWarner Losh uint16_t BaseIo; /* Adapter base I/O address */ 240ca987d46SWarner Losh uint16_t IntNumber; /* Adapter IRQ number */ 241ca987d46SWarner Losh uint16_t MaxTranUnit; /* Adapter maximum transmit unit */ 242ca987d46SWarner Losh uint16_t HwType; /* Type of protocol at the hardware addr */ 243ca987d46SWarner Losh # define ETHER_TYPE 1 244ca987d46SWarner Losh # define EXP_ETHER_TYPE 2 245ca987d46SWarner Losh # define IEEE_TYPE 6 246ca987d46SWarner Losh 247ca987d46SWarner Losh uint16_t HwAddrLen; /* Length of hardware address */ 248ca987d46SWarner Losh MAC_ADDR CurrentNodeAddress; /* Current hardware address */ 249ca987d46SWarner Losh MAC_ADDR PermNodeAddress; /* Permanent hardware address */ 250ca987d46SWarner Losh SEGSEL_t ROMAddress; /* Real mode ROM segment address */ 251ca987d46SWarner Losh uint16_t RxBufCt; /* Receive queue length */ 252ca987d46SWarner Losh uint16_t TxBufCt; /* Transmit queue length */ 253ca987d46SWarner Losh } PACKED t_PXENV_UNDI_GET_INFORMATION; 254ca987d46SWarner Losh 255ca987d46SWarner Losh #define PXENV_UNDI_GET_STATISTICS 0x000D 256ca987d46SWarner Losh typedef struct { 257ca987d46SWarner Losh PXENV_STATUS_t Status; 258ca987d46SWarner Losh uint32_t XmitGoodFrames; /* Number of successful transmissions */ 259ca987d46SWarner Losh uint32_t RcvGoodFrames; /* Number of good frames received */ 260ca987d46SWarner Losh uint32_t RcvCRCErrors; /* Number of frames with CRC errors */ 261ca987d46SWarner Losh uint32_t RcvResourceErrors; /* Number of frames dropped */ 262ca987d46SWarner Losh } PACKED t_PXENV_UNDI_GET_STATISTICS; 263ca987d46SWarner Losh 264ca987d46SWarner Losh #define PXENV_UNDI_CLEAR_STATISTICS 0x000E 265ca987d46SWarner Losh typedef struct { 266ca987d46SWarner Losh PXENV_STATUS_t Status; 267ca987d46SWarner Losh } PACKED t_PXENV_UNDI_CLEAR_STATISTICS; 268ca987d46SWarner Losh 269ca987d46SWarner Losh #define PXENV_UNDI_INITIATE_DIAGS 0x000F 270ca987d46SWarner Losh typedef struct { 271ca987d46SWarner Losh PXENV_STATUS_t Status; 272ca987d46SWarner Losh } PACKED t_PXENV_UNDI_INITIATE_DIAGS; 273ca987d46SWarner Losh 274ca987d46SWarner Losh #define PXENV_UNDI_FORCE_INTERRUPT 0x0010 275ca987d46SWarner Losh typedef struct { 276ca987d46SWarner Losh PXENV_STATUS_t Status; 277ca987d46SWarner Losh } PACKED t_PXENV_UNDI_FORCE_INTERRUPT; 278ca987d46SWarner Losh 279ca987d46SWarner Losh #define PXENV_UNDI_GET_MCAST_ADDRESS 0x0011 280ca987d46SWarner Losh typedef struct { 281ca987d46SWarner Losh PXENV_STATUS_t Status; 282ca987d46SWarner Losh IP4_t InetAddr; /* IP mulicast address */ 283ca987d46SWarner Losh MAC_ADDR MediaAddr; /* MAC multicast address */ 284ca987d46SWarner Losh } PACKED t_PXENV_UNDI_GET_MCAST_ADDR; 285ca987d46SWarner Losh 286ca987d46SWarner Losh #define PXENV_UNDI_GET_NIC_TYPE 0x0012 287ca987d46SWarner Losh typedef struct { 288ca987d46SWarner Losh PXENV_STATUS_t Status; 289ca987d46SWarner Losh uint8_t NicType; /* Type of NIC */ 290ca987d46SWarner Losh # define PCI_NIC 2 291ca987d46SWarner Losh # define PnP_NIC 3 292ca987d46SWarner Losh # define CardBus_NIC 4 293ca987d46SWarner Losh 294ca987d46SWarner Losh union { 295ca987d46SWarner Losh struct { 296ca987d46SWarner Losh uint16_t Vendor_ID; 297ca987d46SWarner Losh uint16_t Dev_ID; 298ca987d46SWarner Losh uint8_t Base_Class; 299ca987d46SWarner Losh uint8_t Sub_Class; 300ca987d46SWarner Losh uint8_t Prog_Intf; 301ca987d46SWarner Losh uint8_t Rev; 302ca987d46SWarner Losh uint16_t BusDevFunc; 303ca987d46SWarner Losh uint16_t SubVendor_ID; 304ca987d46SWarner Losh uint16_t SubDevice_ID; 305ca987d46SWarner Losh } pci, cardbus; 306ca987d46SWarner Losh struct { 307ca987d46SWarner Losh uint32_t EISA_Dev_ID; 308ca987d46SWarner Losh uint8_t Base_Class; 309ca987d46SWarner Losh uint8_t Sub_Class; 310ca987d46SWarner Losh uint8_t Prog_Intf; 311ca987d46SWarner Losh uint16_t CardSelNum; 312ca987d46SWarner Losh } pnp; 313ca987d46SWarner Losh } info; 314ca987d46SWarner Losh } PACKED t_PXENV_UNDI_GET_NIC_TYPE; 315ca987d46SWarner Losh 316ca987d46SWarner Losh #define PXENV_UNDI_GET_IFACE_INFO 0x0013 317ca987d46SWarner Losh typedef struct { 318ca987d46SWarner Losh PXENV_STATUS_t Status; 319ca987d46SWarner Losh uint8_t IfaceType[16]; /* Name of MAC type in ASCII. */ 320ca987d46SWarner Losh uint32_t LinkSpeed; /* Defined in NDIS 2.0 spec */ 321ca987d46SWarner Losh uint32_t ServiceFlags; /* Defined in NDIS 2.0 spec */ 322ca987d46SWarner Losh uint32_t Reserved[4]; /* must be 0 */ 323ca987d46SWarner Losh } PACKED t_PXENV_UNDI_GET_NDIS_INFO; 324ca987d46SWarner Losh 325ca987d46SWarner Losh #define PXENV_UNDI_ISR 0x0014 326ca987d46SWarner Losh typedef struct { 327ca987d46SWarner Losh PXENV_STATUS_t Status; 328ca987d46SWarner Losh uint16_t FuncFlag; /* PXENV_UNDI_ISR_OUT_xxx */ 329ca987d46SWarner Losh uint16_t BufferLength; /* Length of Frame */ 330ca987d46SWarner Losh uint16_t FrameLength; /* Total length of receiver frame */ 331ca987d46SWarner Losh uint16_t FrameHeaderLength; /* Length of the media header in Frame */ 332ca987d46SWarner Losh SEGOFF16_t Frame; /* receive buffer */ 333ca987d46SWarner Losh uint8_t ProtType; /* Protocol type */ 334ca987d46SWarner Losh uint8_t PktType; /* Packet Type */ 335ca987d46SWarner Losh # define PXENV_UNDI_ISR_IN_START 1 336ca987d46SWarner Losh # define PXENV_UNDI_ISR_IN_PROCESS 2 337ca987d46SWarner Losh # define PXENV_UNDI_ISR_IN_GET_NEXT 3 338ca987d46SWarner Losh 339ca987d46SWarner Losh /* one of these will be returned for PXENV_UNDI_ISR_IN_START */ 340ca987d46SWarner Losh # define PXENV_UNDI_ISR_OUT_OURS 0 341ca987d46SWarner Losh # define PXENV_UNDI_ISR_OUT_NOT_OUTS 1 342ca987d46SWarner Losh 343ca987d46SWarner Losh /* 344ca987d46SWarner Losh * one of these will bre returned for PXEND_UNDI_ISR_IN_PROCESS 345ca987d46SWarner Losh * and PXENV_UNDI_ISR_IN_GET_NEXT 346ca987d46SWarner Losh */ 347ca987d46SWarner Losh # define PXENV_UNDI_ISR_OUT_DONE 0 348ca987d46SWarner Losh # define PXENV_UNDI_ISR_OUT_TRANSMIT 2 349ca987d46SWarner Losh # define PXENV_UNDI_ISR_OUT_RECEIVE 3 350ca987d46SWarner Losh # define PXENV_UNDI_ISR_OUT_BUSY 4 351ca987d46SWarner Losh } PACKED t_PXENV_UNDI_ISR; 352ca987d46SWarner Losh 353ca987d46SWarner Losh #define PXENV_STOP_UNDI 0x0015 354ca987d46SWarner Losh typedef struct { 355ca987d46SWarner Losh PXENV_STATUS_t Status; 356ca987d46SWarner Losh } PACKED t_PXENV_STOP_UNDI; 357ca987d46SWarner Losh 358ca987d46SWarner Losh #define PXENV_TFTP_OPEN 0x0020 359ca987d46SWarner Losh typedef struct { 360ca987d46SWarner Losh PXENV_STATUS_t Status; 361ca987d46SWarner Losh IP4_t ServerIPAddress; 362ca987d46SWarner Losh IP4_t GatewayIPAddress; 363ca987d46SWarner Losh uint8_t FileName[128]; 364ca987d46SWarner Losh UDP_PORT_t TFTPPort; 365ca987d46SWarner Losh uint16_t PacketSize; 366ca987d46SWarner Losh } PACKED t_PXENV_TFTP_OPEN; 367ca987d46SWarner Losh 368ca987d46SWarner Losh #define PXENV_TFTP_CLOSE 0x0021 369ca987d46SWarner Losh typedef struct { 370ca987d46SWarner Losh PXENV_STATUS_t Status; 371ca987d46SWarner Losh } PACKED t_PXENV_TFTP_CLOSE; 372ca987d46SWarner Losh 373ca987d46SWarner Losh #define PXENV_TFTP_READ 0x0022 374ca987d46SWarner Losh typedef struct { 375ca987d46SWarner Losh PXENV_STATUS_t Status; 376ca987d46SWarner Losh uint16_t PacketNumber; 377ca987d46SWarner Losh uint16_t BufferSize; 378ca987d46SWarner Losh SEGOFF16_t Buffer; 379ca987d46SWarner Losh } PACKED t_PXENV_TFTP_READ; 380ca987d46SWarner Losh 381ca987d46SWarner Losh #define PXENV_TFTP_READ_FILE 0x0023 382ca987d46SWarner Losh typedef struct { 383ca987d46SWarner Losh PXENV_STATUS_t Status; 384ca987d46SWarner Losh uint8_t FileName[128]; 385ca987d46SWarner Losh uint32_t BufferSize; 386ca987d46SWarner Losh ADDR32_t Buffer; 387ca987d46SWarner Losh IP4_t ServerIPAddress; 388ca987d46SWarner Losh IP4_t GatewayIPAdress; 389ca987d46SWarner Losh IP4_t McastIPAdress; 390ca987d46SWarner Losh UDP_PORT_t TFTPClntPort; 391ca987d46SWarner Losh UDP_PORT_t TFTPSrvPort; 392ca987d46SWarner Losh uint16_t TFTPOpenTimeOut; 393ca987d46SWarner Losh uint16_t TFTPReopenDelay; 394ca987d46SWarner Losh } PACKED t_PXENV_TFTP_READ_FILE; 395ca987d46SWarner Losh 396ca987d46SWarner Losh #define PXENV_TFTP_GET_FSIZE 0x0025 397ca987d46SWarner Losh typedef struct { 398ca987d46SWarner Losh PXENV_STATUS_t Status; 399ca987d46SWarner Losh IP4_t ServerIPAddress; 400ca987d46SWarner Losh IP4_t GatewayIPAdress; 401ca987d46SWarner Losh uint8_t FileName[128]; 402ca987d46SWarner Losh uint32_t FileSize; 403ca987d46SWarner Losh } PACKED t_PXENV_TFTP_GET_FSIZE; 404ca987d46SWarner Losh 405ca987d46SWarner Losh #define PXENV_UDP_OPEN 0x0030 406ca987d46SWarner Losh typedef struct { 407ca987d46SWarner Losh PXENV_STATUS_t status; 408ca987d46SWarner Losh IP4_t src_ip; /* IP address of this station */ 409ca987d46SWarner Losh } PACKED t_PXENV_UDP_OPEN; 410ca987d46SWarner Losh 411ca987d46SWarner Losh #define PXENV_UDP_CLOSE 0x0031 412ca987d46SWarner Losh typedef struct { 413ca987d46SWarner Losh PXENV_STATUS_t status; 414ca987d46SWarner Losh } PACKED t_PXENV_UDP_CLOSE; 415ca987d46SWarner Losh 416ca987d46SWarner Losh #define PXENV_UDP_READ 0x0032 417ca987d46SWarner Losh typedef struct { 418ca987d46SWarner Losh PXENV_STATUS_t status; 419ca987d46SWarner Losh IP4_t src_ip; /* IP of sender */ 420ca987d46SWarner Losh IP4_t dest_ip; /* Only accept packets sent to this IP */ 421ca987d46SWarner Losh UDP_PORT_t s_port; /* UDP source port of sender */ 422ca987d46SWarner Losh UDP_PORT_t d_port; /* Only accept packets sent to this port */ 423ca987d46SWarner Losh uint16_t buffer_size; /* Size of the packet buffer */ 424ca987d46SWarner Losh SEGOFF16_t buffer; /* SEG:OFF to the packet buffer */ 425ca987d46SWarner Losh } PACKED t_PXENV_UDP_READ; 426ca987d46SWarner Losh 427ca987d46SWarner Losh #define PXENV_UDP_WRITE 0x0033 428ca987d46SWarner Losh typedef struct { 429ca987d46SWarner Losh PXENV_STATUS_t status; 430ca987d46SWarner Losh IP4_t ip; /* dest ip addr */ 431ca987d46SWarner Losh IP4_t gw; /* ip gateway */ 432ca987d46SWarner Losh UDP_PORT_t src_port; /* source udp port */ 433ca987d46SWarner Losh UDP_PORT_t dst_port; /* destination udp port */ 434ca987d46SWarner Losh uint16_t buffer_size; /* Size of the packet buffer */ 435ca987d46SWarner Losh SEGOFF16_t buffer; /* SEG:OFF to the packet buffer */ 436ca987d46SWarner Losh } PACKED t_PXENV_UDP_WRITE; 437ca987d46SWarner Losh 438ca987d46SWarner Losh #define PXENV_UNLOAD_STACK 0x0070 439ca987d46SWarner Losh typedef struct { 440ca987d46SWarner Losh PXENV_STATUS_t Status; 441ca987d46SWarner Losh uint8_t reserved[10]; 442ca987d46SWarner Losh } PACKED t_PXENV_UNLOAD_STACK; 443ca987d46SWarner Losh 444ca987d46SWarner Losh 445ca987d46SWarner Losh #define PXENV_GET_CACHED_INFO 0x0071 446ca987d46SWarner Losh typedef struct { 447ca987d46SWarner Losh PXENV_STATUS_t Status; 448ca987d46SWarner Losh uint16_t PacketType; /* type (defined right here) */ 449ca987d46SWarner Losh # define PXENV_PACKET_TYPE_DHCP_DISCOVER 1 450ca987d46SWarner Losh # define PXENV_PACKET_TYPE_DHCP_ACK 2 451ca987d46SWarner Losh # define PXENV_PACKET_TYPE_BINL_REPLY 3 452ca987d46SWarner Losh uint16_t BufferSize; /* max to copy, leave at 0 for pointer */ 453ca987d46SWarner Losh SEGOFF16_t Buffer; /* copy to, leave at 0 for pointer */ 454ca987d46SWarner Losh uint16_t BufferLimit; /* max size of buffer in BC dataseg ? */ 455ca987d46SWarner Losh } PACKED t_PXENV_GET_CACHED_INFO; 456ca987d46SWarner Losh 457ca987d46SWarner Losh 458ca987d46SWarner Losh /* structure filled in by PXENV_GET_CACHED_INFO 459ca987d46SWarner Losh * (how we determine which IP we downloaded the initial bootstrap from) 460ca987d46SWarner Losh * words can't describe... 461ca987d46SWarner Losh */ 462ca987d46SWarner Losh typedef struct { 463ca987d46SWarner Losh uint8_t opcode; 464ca987d46SWarner Losh # define BOOTP_REQ 1 465ca987d46SWarner Losh # define BOOTP_REP 2 466ca987d46SWarner Losh uint8_t Hardware; /* hardware type */ 467ca987d46SWarner Losh uint8_t Hardlen; /* hardware addr len */ 468ca987d46SWarner Losh uint8_t Gatehops; /* zero it */ 469ca987d46SWarner Losh uint32_t ident; /* random number chosen by client */ 470ca987d46SWarner Losh uint16_t seconds; /* seconds since did initial bootstrap */ 471ca987d46SWarner Losh uint16_t Flags; /* seconds since did initial bootstrap */ 472ca987d46SWarner Losh # define BOOTP_BCAST 0x8000 /* ? */ 473ca987d46SWarner Losh IP4_t cip; /* Client IP */ 474ca987d46SWarner Losh IP4_t yip; /* Your IP */ 475ca987d46SWarner Losh IP4_t sip; /* IP to use for next boot stage */ 476ca987d46SWarner Losh IP4_t gip; /* Relay IP ? */ 477ca987d46SWarner Losh MAC_ADDR CAddr; /* Client hardware address */ 478ca987d46SWarner Losh uint8_t Sname[64]; /* Server's hostname (Optional) */ 479ca987d46SWarner Losh uint8_t bootfile[128]; /* boot filename */ 480ca987d46SWarner Losh union { 481ca987d46SWarner Losh # if 1 482ca987d46SWarner Losh # define BOOTP_DHCPVEND 1024 /* DHCP extended vendor field size */ 483ca987d46SWarner Losh # else 484ca987d46SWarner Losh # define BOOTP_DHCPVEND 312 /* DHCP standard vendor field size */ 485ca987d46SWarner Losh # endif 486ca987d46SWarner Losh uint8_t d[BOOTP_DHCPVEND]; /* raw array of vendor/dhcp options */ 487ca987d46SWarner Losh struct { 488ca987d46SWarner Losh uint8_t magic[4]; /* DHCP magic cookie */ 489ca987d46SWarner Losh # ifndef VM_RFC1048 490ca987d46SWarner Losh # define VM_RFC1048 0x63825363L /* ? */ 491ca987d46SWarner Losh # endif 492ca987d46SWarner Losh uint32_t flags; /* bootp flags/opcodes */ 493ca987d46SWarner Losh uint8_t pad[56]; /* I don't think intel knows what a 494ca987d46SWarner Losh union does... */ 495ca987d46SWarner Losh } v; 496ca987d46SWarner Losh } vendor; 497ca987d46SWarner Losh } PACKED BOOTPLAYER; 498ca987d46SWarner Losh 499ca987d46SWarner Losh #define PXENV_RESTART_TFTP 0x0073 500ca987d46SWarner Losh #define t_PXENV_RESTART_TFTP t_PXENV_TFTP_READ_FILE 501ca987d46SWarner Losh 502ca987d46SWarner Losh #define PXENV_START_BASE 0x0075 503ca987d46SWarner Losh typedef struct { 504ca987d46SWarner Losh PXENV_STATUS_t Status; 505ca987d46SWarner Losh } PACKED t_PXENV_START_BASE; 506ca987d46SWarner Losh 507ca987d46SWarner Losh #define PXENV_STOP_BASE 0x0076 508ca987d46SWarner Losh typedef struct { 509ca987d46SWarner Losh PXENV_STATUS_t Status; 510ca987d46SWarner Losh } PACKED t_PXENV_STOP_BASE; 511