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