1#ifndef _EFIPXEBC_H
2#define _EFIPXEBC_H
3
4/*++
5
6Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
7This software and associated documentation (if any) is furnished
8under a license and may only be used or copied in accordance
9with the terms of the license. Except as permitted by such
10license, no part of this software or documentation may be
11reproduced, stored in a retrieval system, or transmitted in any
12form or by any means without the express written consent of
13Intel Corporation.
14
15Module Name:
16
17    efipxebc.h
18
19Abstract:
20
21    EFI PXE Base Code Protocol
22
23
24
25Revision History
26
27--*/
28
29//
30// PXE Base Code protocol
31//
32
33#define EFI_PXE_BASE_CODE_PROTOCOL \
34    { 0x03c4e603, 0xac28, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
35
36INTERFACE_DECL(_EFI_PXE_BASE_CODE);
37
38#define DEFAULT_TTL 8
39#define DEFAULT_ToS 0
40//
41// Address definitions
42//
43
44typedef union {
45    UINT32      Addr[4];
46    EFI_IPv4_ADDRESS    v4;
47    EFI_IPv6_ADDRESS    v6;
48} EFI_IP_ADDRESS;
49
50typedef UINT16 EFI_PXE_BASE_CODE_UDP_PORT;
51
52//
53// Packet definitions
54//
55
56typedef struct {
57    UINT8                           BootpOpcode;
58    UINT8                           BootpHwType;
59    UINT8                           BootpHwAddrLen;
60    UINT8                           BootpGateHops;
61    UINT32                          BootpIdent;
62    UINT16                          BootpSeconds;
63    UINT16                          BootpFlags;
64    UINT8                           BootpCiAddr[4];
65    UINT8                           BootpYiAddr[4];
66    UINT8                           BootpSiAddr[4];
67    UINT8                           BootpGiAddr[4];
68    UINT8                           BootpHwAddr[16];
69    UINT8                           BootpSrvName[64];
70    UINT8                           BootpBootFile[128];
71    UINT32                          DhcpMagik;
72    UINT8                           DhcpOptions[56];
73} EFI_PXE_BASE_CODE_DHCPV4_PACKET;
74
75// TBD in EFI v1.1
76//typedef struct {
77//    UINT8                           reserved;
78//} EFI_PXE_BASE_CODE_DHCPV6_PACKET;
79
80typedef union {
81    UINT8                               Raw[1472];
82    EFI_PXE_BASE_CODE_DHCPV4_PACKET     Dhcpv4;
83//    EFI_PXE_BASE_CODE_DHCPV6_PACKET     Dhcpv6;
84} EFI_PXE_BASE_CODE_PACKET;
85
86typedef struct {
87    UINT8                   Type;
88    UINT8                   Code;
89    UINT16                  Checksum;
90    union {
91        UINT32              reserved;
92        UINT32              Mtu;
93        UINT32              Pointer;
94        struct {
95            UINT16          Identifier;
96            UINT16          Sequence;
97        } Echo;
98    } u;
99    UINT8                   Data[494];
100} EFI_PXE_BASE_CODE_ICMP_ERROR;
101
102typedef struct {
103    UINT8                   ErrorCode;
104    CHAR8                   ErrorString[127];
105} EFI_PXE_BASE_CODE_TFTP_ERROR;
106
107//
108// IP Receive Filter definitions
109//
110#define EFI_PXE_BASE_CODE_MAX_IPCNT             8
111typedef struct {
112    UINT8                       Filters;
113    UINT8                       IpCnt;
114    UINT16                      reserved;
115    EFI_IP_ADDRESS              IpList[EFI_PXE_BASE_CODE_MAX_IPCNT];
116} EFI_PXE_BASE_CODE_IP_FILTER;
117
118#define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP             0x0001
119#define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST              0x0002
120#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS            0x0004
121#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST  0x0008
122
123//
124// ARP Cache definitions
125//
126
127typedef struct {
128    EFI_IP_ADDRESS       IpAddr;
129    EFI_MAC_ADDRESS      MacAddr;
130} EFI_PXE_BASE_CODE_ARP_ENTRY;
131
132typedef struct {
133    EFI_IP_ADDRESS       IpAddr;
134    EFI_IP_ADDRESS       SubnetMask;
135    EFI_IP_ADDRESS       GwAddr;
136} EFI_PXE_BASE_CODE_ROUTE_ENTRY;
137
138//
139// UDP definitions
140//
141
142#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP    0x0001
143#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT  0x0002
144#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP   0x0004
145#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT 0x0008
146#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER    0x0010
147#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT  0x0020
148
149//
150// Discover() definitions
151//
152
153#define EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP           0
154#define EFI_PXE_BASE_CODE_BOOT_TYPE_MS_WINNT_RIS        1
155#define EFI_PXE_BASE_CODE_BOOT_TYPE_INTEL_LCM           2
156#define EFI_PXE_BASE_CODE_BOOT_TYPE_DOSUNDI             3
157#define EFI_PXE_BASE_CODE_BOOT_TYPE_NEC_ESMPRO          4
158#define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_WSoD            5
159#define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_LCCM            6
160#define EFI_PXE_BASE_CODE_BOOT_TYPE_CA_UNICENTER_TNG    7
161#define EFI_PXE_BASE_CODE_BOOT_TYPE_HP_OPENVIEW         8
162#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_9           9
163#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_10          10
164#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_11          11
165#define EFI_PXE_BASE_CODE_BOOT_TYPE_NOT_USED_12         12
166#define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_INSTALL      13
167#define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_BOOT         14
168#define EFI_PXE_BASE_CODE_BOOT_TYPE_REMBO               15
169#define EFI_PXE_BASE_CODE_BOOT_TYPE_BEOBOOT             16
170//
171// 17 through 32767 are reserved
172// 32768 through 65279 are for vendor use
173// 65280 through 65534 are reserved
174//
175#define EFI_PXE_BASE_CODE_BOOT_TYPE_PXETEST             65535
176
177#define EFI_PXE_BASE_CODE_BOOT_LAYER_MASK               0x7FFF
178#define EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL            0x0000
179#define EFI_PXE_BASE_CODE_BOOT_LAYER_CREDENTIALS        0x8000
180
181
182typedef struct {
183    UINT16                      Type;
184    BOOLEAN                     AcceptAnyResponse;
185    UINT8                       Reserved;
186    EFI_IP_ADDRESS              IpAddr;
187} EFI_PXE_BASE_CODE_SRVLIST;
188
189typedef struct {
190    BOOLEAN                     UseMCast;
191    BOOLEAN                     UseBCast;
192    BOOLEAN                     UseUCast;
193    BOOLEAN                     MustUseList;
194    EFI_IP_ADDRESS              ServerMCastIp;
195    UINT16                      IpCnt;
196    EFI_PXE_BASE_CODE_SRVLIST   SrvList[1];
197} EFI_PXE_BASE_CODE_DISCOVER_INFO;
198
199//
200// Mtftp() definitions
201//
202
203typedef enum {
204    EFI_PXE_BASE_CODE_TFTP_FIRST,
205    EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
206    EFI_PXE_BASE_CODE_TFTP_READ_FILE,
207    EFI_PXE_BASE_CODE_TFTP_WRITE_FILE,
208    EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY,
209    EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE,
210    EFI_PXE_BASE_CODE_MTFTP_READ_FILE,
211    EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY,
212    EFI_PXE_BASE_CODE_MTFTP_LAST
213} EFI_PXE_BASE_CODE_TFTP_OPCODE;
214
215typedef struct {
216    EFI_IP_ADDRESS   MCastIp;
217    EFI_PXE_BASE_CODE_UDP_PORT  CPort;
218    EFI_PXE_BASE_CODE_UDP_PORT  SPort;
219    UINT16                      ListenTimeout;
220    UINT16                      TransmitTimeout;
221} EFI_PXE_BASE_CODE_MTFTP_INFO;
222
223//
224// PXE Base Code Mode structure
225//
226
227#define EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES       8
228#define EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES     8
229
230typedef struct {
231    BOOLEAN                         Started;
232    BOOLEAN                         Ipv6Available;
233    BOOLEAN                         Ipv6Supported;
234    BOOLEAN                         UsingIpv6;
235    BOOLEAN                         BisSupported;
236    BOOLEAN                         BisDetected;
237    BOOLEAN                         AutoArp;
238    BOOLEAN                         SendGUID;
239    BOOLEAN                         DhcpDiscoverValid;
240    BOOLEAN                         DhcpAckReceived;
241    BOOLEAN                         ProxyOfferReceived;
242    BOOLEAN                         PxeDiscoverValid;
243    BOOLEAN                         PxeReplyReceived;
244    BOOLEAN                         PxeBisReplyReceived;
245    BOOLEAN                         IcmpErrorReceived;
246    BOOLEAN                         TftpErrorReceived;
247    BOOLEAN                         MakeCallbacks;
248    UINT8                           TTL;
249    UINT8                           ToS;
250    EFI_IP_ADDRESS                  StationIp;
251    EFI_IP_ADDRESS                  SubnetMask;
252    EFI_PXE_BASE_CODE_PACKET        DhcpDiscover;
253    EFI_PXE_BASE_CODE_PACKET        DhcpAck;
254    EFI_PXE_BASE_CODE_PACKET        ProxyOffer;
255    EFI_PXE_BASE_CODE_PACKET        PxeDiscover;
256    EFI_PXE_BASE_CODE_PACKET        PxeReply;
257    EFI_PXE_BASE_CODE_PACKET        PxeBisReply;
258    EFI_PXE_BASE_CODE_IP_FILTER     IpFilter;
259    UINT32                          ArpCacheEntries;
260    EFI_PXE_BASE_CODE_ARP_ENTRY     ArpCache[EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES];
261    UINT32                          RouteTableEntries;
262    EFI_PXE_BASE_CODE_ROUTE_ENTRY   RouteTable[EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES];
263    EFI_PXE_BASE_CODE_ICMP_ERROR    IcmpError;
264    EFI_PXE_BASE_CODE_TFTP_ERROR    TftpError;
265} EFI_PXE_BASE_CODE_MODE;
266
267//
268// PXE Base Code Interface Function definitions
269//
270
271typedef
272EFI_STATUS
273(EFIAPI *EFI_PXE_BASE_CODE_START) (
274    IN struct _EFI_PXE_BASE_CODE    *This,
275    IN BOOLEAN                      UseIpv6
276    );
277
278typedef
279EFI_STATUS
280(EFIAPI *EFI_PXE_BASE_CODE_STOP) (
281    IN struct _EFI_PXE_BASE_CODE    *This
282    );
283
284typedef
285EFI_STATUS
286(EFIAPI *EFI_PXE_BASE_CODE_DHCP) (
287    IN struct _EFI_PXE_BASE_CODE    *This,
288    IN BOOLEAN                      SortOffers
289    );
290
291typedef
292EFI_STATUS
293(EFIAPI *EFI_PXE_BASE_CODE_DISCOVER) (
294    IN struct _EFI_PXE_BASE_CODE            *This,
295    IN UINT16                               Type,
296    IN UINT16                               *Layer,
297    IN BOOLEAN                              UseBis,
298    IN OUT EFI_PXE_BASE_CODE_DISCOVER_INFO  *Info   OPTIONAL
299    );
300
301typedef
302EFI_STATUS
303(EFIAPI *EFI_PXE_BASE_CODE_MTFTP) (
304    IN struct _EFI_PXE_BASE_CODE        *This,
305    IN EFI_PXE_BASE_CODE_TFTP_OPCODE    Operation,
306    IN OUT VOID                         *BufferPtr  OPTIONAL,
307    IN BOOLEAN                          Overwrite,
308    IN OUT UINT64                       *BufferSize,
309    IN UINTN                            *BlockSize  OPTIONAL,
310    IN EFI_IP_ADDRESS                   *ServerIp,
311    IN UINT8                            *Filename,
312    IN EFI_PXE_BASE_CODE_MTFTP_INFO     *Info       OPTIONAL,
313    IN BOOLEAN                          DontUseBuffer
314    );
315
316typedef
317EFI_STATUS
318(EFIAPI *EFI_PXE_BASE_CODE_UDP_WRITE) (
319    IN struct _EFI_PXE_BASE_CODE        *This,
320    IN UINT16                           OpFlags,
321    IN EFI_IP_ADDRESS                   *DestIp,
322    IN EFI_PXE_BASE_CODE_UDP_PORT       *DestPort,
323    IN EFI_IP_ADDRESS                   *GatewayIp,  OPTIONAL
324    IN EFI_IP_ADDRESS                   *SrcIp,      OPTIONAL
325    IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort,    OPTIONAL
326    IN UINTN                            *HeaderSize, OPTIONAL
327    IN VOID                             *HeaderPtr,  OPTIONAL
328    IN UINTN                            *BufferSize,
329    IN VOID                             *BufferPtr
330    );
331
332typedef
333EFI_STATUS
334(EFIAPI *EFI_PXE_BASE_CODE_UDP_READ) (
335    IN struct _EFI_PXE_BASE_CODE        *This,
336    IN UINT16                           OpFlags,
337    IN OUT EFI_IP_ADDRESS               *DestIp,      OPTIONAL
338    IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *DestPort,    OPTIONAL
339    IN OUT EFI_IP_ADDRESS               *SrcIp,       OPTIONAL
340    IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort,     OPTIONAL
341    IN UINTN                            *HeaderSize,  OPTIONAL
342    IN VOID                             *HeaderPtr,   OPTIONAL
343    IN OUT UINTN                        *BufferSize,
344    IN VOID                             *BufferPtr
345    );
346
347typedef
348EFI_STATUS
349(EFIAPI *EFI_PXE_BASE_CODE_SET_IP_FILTER) (
350    IN struct _EFI_PXE_BASE_CODE    *This,
351    IN EFI_PXE_BASE_CODE_IP_FILTER  *NewFilter
352    );
353
354typedef
355EFI_STATUS
356(EFIAPI *EFI_PXE_BASE_CODE_ARP) (
357    IN struct _EFI_PXE_BASE_CODE    *This,
358    IN EFI_IP_ADDRESS               *IpAddr,
359    IN EFI_MAC_ADDRESS              *MacAddr      OPTIONAL
360    );
361
362typedef
363EFI_STATUS
364(EFIAPI *EFI_PXE_BASE_CODE_SET_PARAMETERS) (
365    IN struct _EFI_PXE_BASE_CODE    *This,
366    IN BOOLEAN                      *NewAutoArp,    OPTIONAL
367    IN BOOLEAN                      *NewSendGUID,   OPTIONAL
368    IN UINT8                        *NewTTL,        OPTIONAL
369    IN UINT8                        *NewToS,        OPTIONAL
370    IN BOOLEAN                      *NewMakeCallback    OPTIONAL
371    );
372
373typedef
374EFI_STATUS
375(EFIAPI *EFI_PXE_BASE_CODE_SET_STATION_IP) (
376    IN struct _EFI_PXE_BASE_CODE    *This,
377    IN EFI_IP_ADDRESS               *NewStationIp,  OPTIONAL
378    IN EFI_IP_ADDRESS               *NewSubnetMask  OPTIONAL
379    );
380
381typedef
382EFI_STATUS
383(EFIAPI *EFI_PXE_BASE_CODE_SET_PACKETS) (
384    IN struct _EFI_PXE_BASE_CODE    *This,
385    BOOLEAN                         *NewDhcpDiscoverValid,  OPTIONAL
386    BOOLEAN                         *NewDhcpAckReceived,    OPTIONAL
387    BOOLEAN                         *NewProxyOfferReceived, OPTIONAL
388    BOOLEAN                         *NewPxeDiscoverValid,   OPTIONAL
389    BOOLEAN                         *NewPxeReplyReceived,   OPTIONAL
390    BOOLEAN                         *NewPxeBisReplyReceived,OPTIONAL
391    IN EFI_PXE_BASE_CODE_PACKET     *NewDhcpDiscover, OPTIONAL
392    IN EFI_PXE_BASE_CODE_PACKET     *NewDhcpAck,      OPTIONAL
393    IN EFI_PXE_BASE_CODE_PACKET     *NewProxyOffer,   OPTIONAL
394    IN EFI_PXE_BASE_CODE_PACKET     *NewPxeDiscover,  OPTIONAL
395    IN EFI_PXE_BASE_CODE_PACKET     *NewPxeReply,     OPTIONAL
396    IN EFI_PXE_BASE_CODE_PACKET     *NewPxeBisReply   OPTIONAL
397    );
398
399//
400// PXE Base Code Protocol structure
401//
402
403#define EFI_PXE_BASE_CODE_INTERFACE_REVISION    0x00010000
404
405typedef struct _EFI_PXE_BASE_CODE {
406    UINT64                              Revision;
407    EFI_PXE_BASE_CODE_START             Start;
408    EFI_PXE_BASE_CODE_STOP              Stop;
409    EFI_PXE_BASE_CODE_DHCP              Dhcp;
410    EFI_PXE_BASE_CODE_DISCOVER          Discover;
411    EFI_PXE_BASE_CODE_MTFTP             Mtftp;
412    EFI_PXE_BASE_CODE_UDP_WRITE         UdpWrite;
413    EFI_PXE_BASE_CODE_UDP_READ          UdpRead;
414    EFI_PXE_BASE_CODE_SET_IP_FILTER     SetIpFilter;
415    EFI_PXE_BASE_CODE_ARP               Arp;
416    EFI_PXE_BASE_CODE_SET_PARAMETERS    SetParameters;
417    EFI_PXE_BASE_CODE_SET_STATION_IP    SetStationIp;
418    EFI_PXE_BASE_CODE_SET_PACKETS       SetPackets;
419    EFI_PXE_BASE_CODE_MODE              *Mode;
420} EFI_PXE_BASE_CODE;
421
422//
423// Call Back Definitions
424//
425
426#define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL \
427    { 0x245dca21, 0xfb7b, 0x11d3, {0x8f, 0x01, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
428
429//
430// Revision Number
431//
432
433#define EFI_PXE_BASE_CODE_CALLBACK_INTERFACE_REVISION   0x00010000
434
435INTERFACE_DECL(_EFI_PXE_BASE_CODE_CALLBACK);
436
437typedef enum {
438    EFI_PXE_BASE_CODE_FUNCTION_FIRST,
439    EFI_PXE_BASE_CODE_FUNCTION_DHCP,
440    EFI_PXE_BASE_CODE_FUNCTION_DISCOVER,
441    EFI_PXE_BASE_CODE_FUNCTION_MTFTP,
442    EFI_PXE_BASE_CODE_FUNCTION_UDP_WRITE,
443    EFI_PXE_BASE_CODE_FUNCTION_UDP_READ,
444    EFI_PXE_BASE_CODE_FUNCTION_ARP,
445    EFI_PXE_BASE_CODE_FUNCTION_IGMP,
446    EFI_PXE_BASE_CODE_PXE_FUNCTION_LAST
447} EFI_PXE_BASE_CODE_FUNCTION;
448
449typedef enum {
450    EFI_PXE_BASE_CODE_CALLBACK_STATUS_FIRST,
451    EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
452    EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT,
453    EFI_PXE_BASE_CODE_CALLBACK_STATUS_LAST
454} EFI_PXE_BASE_CODE_CALLBACK_STATUS;
455
456typedef
457EFI_PXE_BASE_CODE_CALLBACK_STATUS
458(EFIAPI *EFI_PXE_CALLBACK) (
459    IN struct _EFI_PXE_BASE_CODE_CALLBACK   *This,
460    IN EFI_PXE_BASE_CODE_FUNCTION           Function,
461    IN BOOLEAN                              Received,
462    IN UINT32                               PacketLen,
463    IN EFI_PXE_BASE_CODE_PACKET             *Packet     OPTIONAL
464    );
465
466typedef struct _EFI_PXE_BASE_CODE_CALLBACK {
467    UINT64                      Revision;
468    EFI_PXE_CALLBACK            Callback;
469} EFI_PXE_BASE_CODE_CALLBACK;
470
471#endif /* _EFIPXEBC_H */
472