1221828Sgrehan/* $FreeBSD$ */
2221828Sgrehan#ifndef _EFIPXEBC_H
3221828Sgrehan#define _EFIPXEBC_H
4221828Sgrehan
5221828Sgrehan/*++
6221828Sgrehan
7221828SgrehanCopyright (c)  1999 - 2002 Intel Corporation. All rights reserved
8221828SgrehanThis software and associated documentation (if any) is furnished
9221828Sgrehanunder a license and may only be used or copied in accordance
10221828Sgrehanwith the terms of the license. Except as permitted by such
11221828Sgrehanlicense, no part of this software or documentation may be
12221828Sgrehanreproduced, stored in a retrieval system, or transmitted in any
13221828Sgrehanform or by any means without the express written consent of
14221828SgrehanIntel Corporation.
15221828Sgrehan
16221828SgrehanModule Name:
17221828Sgrehan
18221828Sgrehan    efipxebc.h
19221828Sgrehan
20221828SgrehanAbstract:
21221828Sgrehan
22221828Sgrehan    EFI PXE Base Code Protocol
23221828Sgrehan
24221828Sgrehan
25221828Sgrehan
26221828SgrehanRevision History
27221828Sgrehan
28221828Sgrehan--*/
29221828Sgrehan
30221828Sgrehan//
31221828Sgrehan// PXE Base Code protocol
32221828Sgrehan//
33221828Sgrehan
34221828Sgrehan#define EFI_PXE_BASE_CODE_PROTOCOL \
35256072Sneel    { 0x03c4e603, 0xac28, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
36256072Sneel
37256072SneelINTERFACE_DECL(_EFI_PXE_BASE_CODE);
38221828Sgrehan
39221828Sgrehan#define DEFAULT_TTL 8
40256072Sneel#define DEFAULT_ToS 0
41221828Sgrehan//
42256072Sneel// Address definitions
43256072Sneel//
44241362Sneel
45256072Sneeltypedef union {
46221828Sgrehan    UINT32      Addr[4];
47221828Sgrehan    EFI_IPv4_ADDRESS    v4;
48221828Sgrehan    EFI_IPv6_ADDRESS    v6;
49221828Sgrehan} EFI_IP_ADDRESS;
50221828Sgrehan
51221828Sgrehantypedef UINT16 EFI_PXE_BASE_CODE_UDP_PORT;
52221828Sgrehan
53221828Sgrehan//
54221828Sgrehan// Packet definitions
55221828Sgrehan//
56221828Sgrehan
57221828Sgrehantypedef struct {
58256072Sneel    UINT8                           BootpOpcode;
59256072Sneel    UINT8                           BootpHwType;
60256072Sneel    UINT8                           BootpHwAddrLen;
61221828Sgrehan    UINT8                           BootpGateHops;
62256072Sneel    UINT32                          BootpIdent;
63256072Sneel    UINT16                          BootpSeconds;
64256072Sneel    UINT16                          BootpFlags;
65221828Sgrehan    UINT8                           BootpCiAddr[4];
66256072Sneel    UINT8                           BootpYiAddr[4];
67256072Sneel    UINT8                           BootpSiAddr[4];
68256072Sneel    UINT8                           BootpGiAddr[4];
69221828Sgrehan    UINT8                           BootpHwAddr[16];
70256072Sneel    UINT8                           BootpSrvName[64];
71256072Sneel    UINT8                           BootpBootFile[128];
72241362Sneel    UINT32                          DhcpMagik;
73256072Sneel    UINT8                           DhcpOptions[56];
74256072Sneel} EFI_PXE_BASE_CODE_DHCPV4_PACKET;
75256072Sneel
76256072Sneel// TBD in EFI v1.1
77256072Sneel//typedef struct {
78241362Sneel//    UINT8                           reserved;
79256072Sneel//} EFI_PXE_BASE_CODE_DHCPV6_PACKET;
80256072Sneel
81256072Sneeltypedef union {
82256072Sneel    UINT8                               Raw[1472];
83256072Sneel    EFI_PXE_BASE_CODE_DHCPV4_PACKET     Dhcpv4;
84256072Sneel//    EFI_PXE_BASE_CODE_DHCPV6_PACKET     Dhcpv6;
85256072Sneel} EFI_PXE_BASE_CODE_PACKET;
86256072Sneel
87256072Sneeltypedef struct {
88256072Sneel    UINT8                   Type;
89256072Sneel    UINT8                   Code;
90256072Sneel    UINT16                  Checksum;
91256072Sneel    union {
92221828Sgrehan        UINT32              reserved;
93221828Sgrehan        UINT32              Mtu;
94256072Sneel        UINT32              Pointer;
95256072Sneel        struct {
96256072Sneel            UINT16          Identifier;
97256072Sneel            UINT16          Sequence;
98256072Sneel        } Echo;
99256072Sneel    } u;
100256072Sneel    UINT8                   Data[494];
101256072Sneel} EFI_PXE_BASE_CODE_ICMP_ERROR;
102256072Sneel
103256072Sneeltypedef struct {
104256072Sneel    UINT8                   ErrorCode;
105256072Sneel    CHAR8                   ErrorString[127];
106221828Sgrehan} EFI_PXE_BASE_CODE_TFTP_ERROR;
107256072Sneel
108239700Sgrehan//
109239700Sgrehan// IP Receive Filter definitions
110221828Sgrehan//
111256072Sneel#define EFI_PXE_BASE_CODE_MAX_IPCNT             8
112221828Sgrehantypedef struct {
113221828Sgrehan    UINT8                       Filters;
114256072Sneel    UINT8                       IpCnt;
115256072Sneel    UINT16                      reserved;
116256072Sneel    EFI_IP_ADDRESS              IpList[EFI_PXE_BASE_CODE_MAX_IPCNT];
117221828Sgrehan} EFI_PXE_BASE_CODE_IP_FILTER;
118221828Sgrehan
119221828Sgrehan#define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP             0x0001
120221828Sgrehan#define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST              0x0002
121241362Sneel#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS            0x0004
122221828Sgrehan#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST  0x0008
123
124//
125// ARP Cache definitions
126//
127
128typedef struct {
129    EFI_IP_ADDRESS       IpAddr;
130    EFI_MAC_ADDRESS      MacAddr;
131} EFI_PXE_BASE_CODE_ARP_ENTRY;
132
133typedef struct {
134    EFI_IP_ADDRESS       IpAddr;
135    EFI_IP_ADDRESS       SubnetMask;
136    EFI_IP_ADDRESS       GwAddr;
137} EFI_PXE_BASE_CODE_ROUTE_ENTRY;
138
139//
140// UDP definitions
141//
142
143#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP    0x0001
144#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT  0x0002
145#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP   0x0004
146#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT 0x0008
147#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER    0x0010
148#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT  0x0020
149
150//
151// Discover() definitions
152//
153
154#define EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP           0
155#define EFI_PXE_BASE_CODE_BOOT_TYPE_MS_WINNT_RIS        1
156#define EFI_PXE_BASE_CODE_BOOT_TYPE_INTEL_LCM           2
157#define EFI_PXE_BASE_CODE_BOOT_TYPE_DOSUNDI             3
158#define EFI_PXE_BASE_CODE_BOOT_TYPE_NEC_ESMPRO          4
159#define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_WSoD            5
160#define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_LCCM            6
161#define EFI_PXE_BASE_CODE_BOOT_TYPE_CA_UNICENTER_TNG    7
162#define EFI_PXE_BASE_CODE_BOOT_TYPE_HP_OPENVIEW         8
163#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_9           9
164#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_10          10
165#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_11          11
166#define EFI_PXE_BASE_CODE_BOOT_TYPE_NOT_USED_12         12
167#define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_INSTALL      13
168#define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_BOOT         14
169#define EFI_PXE_BASE_CODE_BOOT_TYPE_REMBO               15
170#define EFI_PXE_BASE_CODE_BOOT_TYPE_BEOBOOT             16
171//
172// 17 through 32767 are reserved
173// 32768 through 65279 are for vendor use
174// 65280 through 65534 are reserved
175//
176#define EFI_PXE_BASE_CODE_BOOT_TYPE_PXETEST             65535
177
178#define EFI_PXE_BASE_CODE_BOOT_LAYER_MASK               0x7FFF
179#define EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL            0x0000
180#define EFI_PXE_BASE_CODE_BOOT_LAYER_CREDENTIALS        0x8000
181
182
183typedef struct {
184    UINT16                      Type;
185    BOOLEAN                     AcceptAnyResponse;
186    UINT8                       Reserved;
187    EFI_IP_ADDRESS              IpAddr;
188} EFI_PXE_BASE_CODE_SRVLIST;
189
190typedef struct {
191    BOOLEAN                     UseMCast;
192    BOOLEAN                     UseBCast;
193    BOOLEAN                     UseUCast;
194    BOOLEAN                     MustUseList;
195    EFI_IP_ADDRESS              ServerMCastIp;
196    UINT16                      IpCnt;
197    EFI_PXE_BASE_CODE_SRVLIST   SrvList[1];
198} EFI_PXE_BASE_CODE_DISCOVER_INFO;
199
200//
201// Mtftp() definitions
202//
203
204typedef enum {
205    EFI_PXE_BASE_CODE_TFTP_FIRST,
206    EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
207    EFI_PXE_BASE_CODE_TFTP_READ_FILE,
208    EFI_PXE_BASE_CODE_TFTP_WRITE_FILE,
209    EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY,
210    EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE,
211    EFI_PXE_BASE_CODE_MTFTP_READ_FILE,
212    EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY,
213    EFI_PXE_BASE_CODE_MTFTP_LAST
214} EFI_PXE_BASE_CODE_TFTP_OPCODE;
215
216typedef struct {
217    EFI_IP_ADDRESS   MCastIp;
218    EFI_PXE_BASE_CODE_UDP_PORT  CPort;
219    EFI_PXE_BASE_CODE_UDP_PORT  SPort;
220    UINT16                      ListenTimeout;
221    UINT16                      TransmitTimeout;
222} EFI_PXE_BASE_CODE_MTFTP_INFO;
223
224//
225// PXE Base Code Mode structure
226//
227
228#define EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES       8
229#define EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES     8
230
231typedef struct {
232    BOOLEAN                         Started;
233    BOOLEAN                         Ipv6Available;
234    BOOLEAN                         Ipv6Supported;
235    BOOLEAN                         UsingIpv6;
236    BOOLEAN                         BisSupported;
237    BOOLEAN                         BisDetected;
238    BOOLEAN                         AutoArp;
239    BOOLEAN                         SendGUID;
240    BOOLEAN                         DhcpDiscoverValid;
241    BOOLEAN                         DhcpAckReceived;
242    BOOLEAN                         ProxyOfferReceived;
243    BOOLEAN                         PxeDiscoverValid;
244    BOOLEAN                         PxeReplyReceived;
245    BOOLEAN                         PxeBisReplyReceived;
246    BOOLEAN                         IcmpErrorReceived;
247    BOOLEAN                         TftpErrorReceived;
248    BOOLEAN                         MakeCallbacks;
249    UINT8                           TTL;
250    UINT8                           ToS;
251    EFI_IP_ADDRESS                  StationIp;
252    EFI_IP_ADDRESS                  SubnetMask;
253    EFI_PXE_BASE_CODE_PACKET        DhcpDiscover;
254    EFI_PXE_BASE_CODE_PACKET        DhcpAck;
255    EFI_PXE_BASE_CODE_PACKET        ProxyOffer;
256    EFI_PXE_BASE_CODE_PACKET        PxeDiscover;
257    EFI_PXE_BASE_CODE_PACKET        PxeReply;
258    EFI_PXE_BASE_CODE_PACKET        PxeBisReply;
259    EFI_PXE_BASE_CODE_IP_FILTER     IpFilter;
260    UINT32                          ArpCacheEntries;
261    EFI_PXE_BASE_CODE_ARP_ENTRY     ArpCache[EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES];
262    UINT32                          RouteTableEntries;
263    EFI_PXE_BASE_CODE_ROUTE_ENTRY   RouteTable[EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES];
264    EFI_PXE_BASE_CODE_ICMP_ERROR    IcmpError;
265    EFI_PXE_BASE_CODE_TFTP_ERROR    TftpError;
266} EFI_PXE_BASE_CODE_MODE;
267
268//
269// PXE Base Code Interface Function definitions
270//
271
272typedef
273EFI_STATUS
274(EFIAPI *EFI_PXE_BASE_CODE_START) (
275    IN struct _EFI_PXE_BASE_CODE    *This,
276    IN BOOLEAN                      UseIpv6
277    );
278
279typedef
280EFI_STATUS
281(EFIAPI *EFI_PXE_BASE_CODE_STOP) (
282    IN struct _EFI_PXE_BASE_CODE    *This
283    );
284
285typedef
286EFI_STATUS
287(EFIAPI *EFI_PXE_BASE_CODE_DHCP) (
288    IN struct _EFI_PXE_BASE_CODE    *This,
289    IN BOOLEAN                      SortOffers
290    );
291
292typedef
293EFI_STATUS
294(EFIAPI *EFI_PXE_BASE_CODE_DISCOVER) (
295    IN struct _EFI_PXE_BASE_CODE            *This,
296    IN UINT16                               Type,
297    IN UINT16                               *Layer,
298    IN BOOLEAN                              UseBis,
299    IN OUT EFI_PXE_BASE_CODE_DISCOVER_INFO  *Info   OPTIONAL
300    );
301
302typedef
303EFI_STATUS
304(EFIAPI *EFI_PXE_BASE_CODE_MTFTP) (
305    IN struct _EFI_PXE_BASE_CODE        *This,
306    IN EFI_PXE_BASE_CODE_TFTP_OPCODE    Operation,
307    IN OUT VOID                         *BufferPtr  OPTIONAL,
308    IN BOOLEAN                          Overwrite,
309    IN OUT UINT64                       *BufferSize,
310    IN UINTN                            *BlockSize  OPTIONAL,
311    IN EFI_IP_ADDRESS                   *ServerIp,
312    IN UINT8                            *Filename,
313    IN EFI_PXE_BASE_CODE_MTFTP_INFO     *Info       OPTIONAL,
314    IN BOOLEAN                          DontUseBuffer
315    );
316
317typedef
318EFI_STATUS
319(EFIAPI *EFI_PXE_BASE_CODE_UDP_WRITE) (
320    IN struct _EFI_PXE_BASE_CODE        *This,
321    IN UINT16                           OpFlags,
322    IN EFI_IP_ADDRESS                   *DestIp,
323    IN EFI_PXE_BASE_CODE_UDP_PORT       *DestPort,
324    IN EFI_IP_ADDRESS                   *GatewayIp,  OPTIONAL
325    IN EFI_IP_ADDRESS                   *SrcIp,      OPTIONAL
326    IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort,    OPTIONAL
327    IN UINTN                            *HeaderSize, OPTIONAL
328    IN VOID                             *HeaderPtr,  OPTIONAL
329    IN UINTN                            *BufferSize,
330    IN VOID                             *BufferPtr
331    );
332
333typedef
334EFI_STATUS
335(EFIAPI *EFI_PXE_BASE_CODE_UDP_READ) (
336    IN struct _EFI_PXE_BASE_CODE        *This,
337    IN UINT16                           OpFlags,
338    IN OUT EFI_IP_ADDRESS               *DestIp,      OPTIONAL
339    IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *DestPort,    OPTIONAL
340    IN OUT EFI_IP_ADDRESS               *SrcIp,       OPTIONAL
341    IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort,     OPTIONAL
342    IN UINTN                            *HeaderSize,  OPTIONAL
343    IN VOID                             *HeaderPtr,   OPTIONAL
344    IN OUT UINTN                        *BufferSize,
345    IN VOID                             *BufferPtr
346    );
347
348typedef
349EFI_STATUS
350(EFIAPI *EFI_PXE_BASE_CODE_SET_IP_FILTER) (
351    IN struct _EFI_PXE_BASE_CODE    *This,
352    IN EFI_PXE_BASE_CODE_IP_FILTER  *NewFilter
353    );
354
355typedef
356EFI_STATUS
357(EFIAPI *EFI_PXE_BASE_CODE_ARP) (
358    IN struct _EFI_PXE_BASE_CODE    *This,
359    IN EFI_IP_ADDRESS               *IpAddr,
360    IN EFI_MAC_ADDRESS              *MacAddr      OPTIONAL
361    );
362
363typedef
364EFI_STATUS
365(EFIAPI *EFI_PXE_BASE_CODE_SET_PARAMETERS) (
366    IN struct _EFI_PXE_BASE_CODE    *This,
367    IN BOOLEAN                      *NewAutoArp,    OPTIONAL
368    IN BOOLEAN                      *NewSendGUID,   OPTIONAL
369    IN UINT8                        *NewTTL,        OPTIONAL
370    IN UINT8                        *NewToS,        OPTIONAL
371    IN BOOLEAN                      *NewMakeCallback    OPTIONAL
372    );
373
374typedef
375EFI_STATUS
376(EFIAPI *EFI_PXE_BASE_CODE_SET_STATION_IP) (
377    IN struct _EFI_PXE_BASE_CODE    *This,
378    IN EFI_IP_ADDRESS               *NewStationIp,  OPTIONAL
379    IN EFI_IP_ADDRESS               *NewSubnetMask  OPTIONAL
380    );
381
382typedef
383EFI_STATUS
384(EFIAPI *EFI_PXE_BASE_CODE_SET_PACKETS) (
385    IN struct _EFI_PXE_BASE_CODE    *This,
386    BOOLEAN                         *NewDhcpDiscoverValid,  OPTIONAL
387    BOOLEAN                         *NewDhcpAckReceived,    OPTIONAL
388    BOOLEAN                         *NewProxyOfferReceived, OPTIONAL
389    BOOLEAN                         *NewPxeDiscoverValid,   OPTIONAL
390    BOOLEAN                         *NewPxeReplyReceived,   OPTIONAL
391    BOOLEAN                         *NewPxeBisReplyReceived,OPTIONAL
392    IN EFI_PXE_BASE_CODE_PACKET     *NewDhcpDiscover, OPTIONAL
393    IN EFI_PXE_BASE_CODE_PACKET     *NewDhcpAck,      OPTIONAL
394    IN EFI_PXE_BASE_CODE_PACKET     *NewProxyOffer,   OPTIONAL
395    IN EFI_PXE_BASE_CODE_PACKET     *NewPxeDiscover,  OPTIONAL
396    IN EFI_PXE_BASE_CODE_PACKET     *NewPxeReply,     OPTIONAL
397    IN EFI_PXE_BASE_CODE_PACKET     *NewPxeBisReply   OPTIONAL
398    );
399
400//
401// PXE Base Code Protocol structure
402//
403
404#define EFI_PXE_BASE_CODE_INTERFACE_REVISION    0x00010000
405
406typedef struct _EFI_PXE_BASE_CODE {
407    UINT64                              Revision;
408    EFI_PXE_BASE_CODE_START             Start;
409    EFI_PXE_BASE_CODE_STOP              Stop;
410    EFI_PXE_BASE_CODE_DHCP              Dhcp;
411    EFI_PXE_BASE_CODE_DISCOVER          Discover;
412    EFI_PXE_BASE_CODE_MTFTP             Mtftp;
413    EFI_PXE_BASE_CODE_UDP_WRITE         UdpWrite;
414    EFI_PXE_BASE_CODE_UDP_READ          UdpRead;
415    EFI_PXE_BASE_CODE_SET_IP_FILTER     SetIpFilter;
416    EFI_PXE_BASE_CODE_ARP               Arp;
417    EFI_PXE_BASE_CODE_SET_PARAMETERS    SetParameters;
418    EFI_PXE_BASE_CODE_SET_STATION_IP    SetStationIp;
419    EFI_PXE_BASE_CODE_SET_PACKETS       SetPackets;
420    EFI_PXE_BASE_CODE_MODE              *Mode;
421} EFI_PXE_BASE_CODE;
422
423//
424// Call Back Definitions
425//
426
427#define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL \
428    { 0x245dca21, 0xfb7b, 0x11d3, {0x8f, 0x01, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
429
430//
431// Revision Number
432//
433
434#define EFI_PXE_BASE_CODE_CALLBACK_INTERFACE_REVISION   0x00010000
435
436INTERFACE_DECL(_EFI_PXE_BASE_CODE_CALLBACK);
437
438typedef enum {
439    EFI_PXE_BASE_CODE_FUNCTION_FIRST,
440    EFI_PXE_BASE_CODE_FUNCTION_DHCP,
441    EFI_PXE_BASE_CODE_FUNCTION_DISCOVER,
442    EFI_PXE_BASE_CODE_FUNCTION_MTFTP,
443    EFI_PXE_BASE_CODE_FUNCTION_UDP_WRITE,
444    EFI_PXE_BASE_CODE_FUNCTION_UDP_READ,
445    EFI_PXE_BASE_CODE_FUNCTION_ARP,
446    EFI_PXE_BASE_CODE_FUNCTION_IGMP,
447    EFI_PXE_BASE_CODE_PXE_FUNCTION_LAST
448} EFI_PXE_BASE_CODE_FUNCTION;
449
450typedef enum {
451    EFI_PXE_BASE_CODE_CALLBACK_STATUS_FIRST,
452    EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
453    EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT,
454    EFI_PXE_BASE_CODE_CALLBACK_STATUS_LAST
455} EFI_PXE_BASE_CODE_CALLBACK_STATUS;
456
457typedef
458EFI_PXE_BASE_CODE_CALLBACK_STATUS
459(EFIAPI *EFI_PXE_CALLBACK) (
460    IN struct _EFI_PXE_BASE_CODE_CALLBACK   *This,
461    IN EFI_PXE_BASE_CODE_FUNCTION           Function,
462    IN BOOLEAN                              Received,
463    IN UINT32                               PacketLen,
464    IN EFI_PXE_BASE_CODE_PACKET             *Packet     OPTIONAL
465    );
466
467typedef struct _EFI_PXE_BASE_CODE_CALLBACK {
468    UINT64                      Revision;
469    EFI_PXE_CALLBACK            Callback;
470} EFI_PXE_BASE_CODE_CALLBACK;
471
472#endif /* _EFIPXEBC_H */
473