xref: /freebsd/stand/efi/include/efipxebc.h (revision 069ac184)
1 #ifndef _EFIPXEBC_H
2 #define _EFIPXEBC_H
3 
4 /*++
5 
6 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
7 This software and associated documentation (if any) is furnished
8 under a license and may only be used or copied in accordance
9 with the terms of the license. Except as permitted by such
10 license, no part of this software or documentation may be
11 reproduced, stored in a retrieval system, or transmitted in any
12 form or by any means without the express written consent of
13 Intel Corporation.
14 
15 Module Name:
16 
17     efipxebc.h
18 
19 Abstract:
20 
21     EFI PXE Base Code Protocol
22 
23 
24 
25 Revision 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 
36 INTERFACE_DECL(_EFI_PXE_BASE_CODE);
37 
38 #define DEFAULT_TTL 8
39 #define DEFAULT_ToS 0
40 //
41 // Address definitions
42 //
43 
44 typedef union {
45     UINT32      Addr[4];
46     EFI_IPv4_ADDRESS    v4;
47     EFI_IPv6_ADDRESS    v6;
48 } EFI_IP_ADDRESS;
49 
50 typedef UINT16 EFI_PXE_BASE_CODE_UDP_PORT;
51 
52 //
53 // Packet definitions
54 //
55 
56 typedef 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 
80 typedef 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 
86 typedef 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 
102 typedef 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
111 typedef 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 
127 typedef struct {
128     EFI_IP_ADDRESS       IpAddr;
129     EFI_MAC_ADDRESS      MacAddr;
130 } EFI_PXE_BASE_CODE_ARP_ENTRY;
131 
132 typedef 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 
182 typedef struct {
183     UINT16                      Type;
184     BOOLEAN                     AcceptAnyResponse;
185     UINT8                       Reserved;
186     EFI_IP_ADDRESS              IpAddr;
187 } EFI_PXE_BASE_CODE_SRVLIST;
188 
189 typedef 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 
203 typedef 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 
215 typedef 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 
230 typedef 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 
271 typedef
272 EFI_STATUS
273 (EFIAPI *EFI_PXE_BASE_CODE_START) (
274     IN struct _EFI_PXE_BASE_CODE    *This,
275     IN BOOLEAN                      UseIpv6
276     );
277 
278 typedef
279 EFI_STATUS
280 (EFIAPI *EFI_PXE_BASE_CODE_STOP) (
281     IN struct _EFI_PXE_BASE_CODE    *This
282     );
283 
284 typedef
285 EFI_STATUS
286 (EFIAPI *EFI_PXE_BASE_CODE_DHCP) (
287     IN struct _EFI_PXE_BASE_CODE    *This,
288     IN BOOLEAN                      SortOffers
289     );
290 
291 typedef
292 EFI_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 
301 typedef
302 EFI_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 
316 typedef
317 EFI_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 
332 typedef
333 EFI_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 
347 typedef
348 EFI_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 
354 typedef
355 EFI_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 
362 typedef
363 EFI_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 
373 typedef
374 EFI_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 
381 typedef
382 EFI_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 
405 typedef 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 
435 INTERFACE_DECL(_EFI_PXE_BASE_CODE_CALLBACK);
436 
437 typedef 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 
449 typedef 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 
456 typedef
457 EFI_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 
466 typedef 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