1 /** @file
2   EFI PXE Base Code Protocol definitions, which is used to access PXE-compatible
3   devices for network access and network booting.
4 
5 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
6 Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
7 
8 SPDX-License-Identifier: BSD-2-Clause-Patent
9 
10   @par Revision Reference:
11   This Protocol is introduced in EFI Specification 1.10.
12 
13 **/
14 #ifndef __PXE_BASE_CODE_PROTOCOL_H__
15 #define __PXE_BASE_CODE_PROTOCOL_H__
16 
17 ///
18 /// PXE Base Code protocol.
19 ///
20 #define EFI_PXE_BASE_CODE_PROTOCOL_GUID \
21   { \
22     0x03c4e603, 0xac28, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
23   }
24 
25 typedef struct _EFI_PXE_BASE_CODE_PROTOCOL  EFI_PXE_BASE_CODE_PROTOCOL;
26 
27 ///
28 /// Protocol defined in EFI1.1.
29 ///
30 typedef EFI_PXE_BASE_CODE_PROTOCOL  EFI_PXE_BASE_CODE;
31 
32 ///
33 /// Default IP TTL and ToS.
34 ///
35 #define DEFAULT_TTL 16
36 #define DEFAULT_ToS 0
37 
38 ///
39 /// ICMP error format.
40 ///
41 typedef struct {
42   UINT8   Type;
43   UINT8   Code;
44   UINT16  Checksum;
45   union {
46     UINT32  reserved;
47     UINT32  Mtu;
48     UINT32  Pointer;
49     struct {
50       UINT16  Identifier;
51       UINT16  Sequence;
52     } Echo;
53   } u;
54   UINT8 Data[494];
55 } EFI_PXE_BASE_CODE_ICMP_ERROR;
56 
57 ///
58 /// TFTP error format.
59 ///
60 typedef struct {
61   UINT8 ErrorCode;
62   CHAR8 ErrorString[127];
63 } EFI_PXE_BASE_CODE_TFTP_ERROR;
64 
65 ///
66 /// IP Receive Filter definitions.
67 ///
68 #define EFI_PXE_BASE_CODE_MAX_IPCNT 8
69 
70 ///
71 /// IP Receive Filter structure.
72 ///
73 typedef struct {
74   UINT8           Filters;
75   UINT8           IpCnt;
76   UINT16          reserved;
77   EFI_IP_ADDRESS  IpList[EFI_PXE_BASE_CODE_MAX_IPCNT];
78 } EFI_PXE_BASE_CODE_IP_FILTER;
79 
80 #define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP            0x0001
81 #define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST             0x0002
82 #define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS           0x0004
83 #define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST 0x0008
84 
85 ///
86 /// ARP cache entries.
87 ///
88 typedef struct {
89   EFI_IP_ADDRESS  IpAddr;
90   EFI_MAC_ADDRESS MacAddr;
91 } EFI_PXE_BASE_CODE_ARP_ENTRY;
92 
93 ///
94 /// ARP route table entries.
95 ///
96 typedef struct {
97   EFI_IP_ADDRESS  IpAddr;
98   EFI_IP_ADDRESS  SubnetMask;
99   EFI_IP_ADDRESS  GwAddr;
100 } EFI_PXE_BASE_CODE_ROUTE_ENTRY;
101 
102 //
103 // UDP definitions
104 //
105 typedef UINT16  EFI_PXE_BASE_CODE_UDP_PORT;
106 
107 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP    0x0001
108 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT  0x0002
109 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP   0x0004
110 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT 0x0008
111 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER    0x0010
112 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT  0x0020
113 
114 //
115 // Discover() definitions
116 //
117 #define EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP         0
118 #define EFI_PXE_BASE_CODE_BOOT_TYPE_MS_WINNT_RIS      1
119 #define EFI_PXE_BASE_CODE_BOOT_TYPE_INTEL_LCM         2
120 #define EFI_PXE_BASE_CODE_BOOT_TYPE_DOSUNDI           3
121 #define EFI_PXE_BASE_CODE_BOOT_TYPE_NEC_ESMPRO        4
122 #define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_WSoD          5
123 #define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_LCCM          6
124 #define EFI_PXE_BASE_CODE_BOOT_TYPE_CA_UNICENTER_TNG  7
125 #define EFI_PXE_BASE_CODE_BOOT_TYPE_HP_OPENVIEW       8
126 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_9         9
127 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_10        10
128 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_11        11
129 #define EFI_PXE_BASE_CODE_BOOT_TYPE_NOT_USED_12       12
130 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_INSTALL    13
131 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_BOOT       14
132 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REMBO             15
133 #define EFI_PXE_BASE_CODE_BOOT_TYPE_BEOBOOT           16
134 //
135 // 17 through 32767 are reserved
136 // 32768 through 65279 are for vendor use
137 // 65280 through 65534 are reserved
138 //
139 #define EFI_PXE_BASE_CODE_BOOT_TYPE_PXETEST   65535
140 
141 #define EFI_PXE_BASE_CODE_BOOT_LAYER_MASK     0x7FFF
142 #define EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL  0x0000
143 
144 //
145 // PXE Tag definition that identifies the processor
146 // and programming environment of the client system.
147 // These identifiers are defined by IETF:
148 // http://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml
149 //
150 #if defined (MDE_CPU_IA32)
151 #define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE    0x0006
152 #elif defined (MDE_CPU_X64)
153 #define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE    0x0007
154 #elif defined (MDE_CPU_ARM)
155 #define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE    0x000A
156 #elif defined (MDE_CPU_AARCH64)
157 #define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE    0x000B
158 #elif defined (MDE_CPU_RISCV64)
159 #define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE    0x001B
160 #endif
161 
162 
163 ///
164 /// Discover() server list structure.
165 ///
166 typedef struct {
167   UINT16          Type;
168   BOOLEAN         AcceptAnyResponse;
169   UINT8           Reserved;
170   EFI_IP_ADDRESS  IpAddr;
171 } EFI_PXE_BASE_CODE_SRVLIST;
172 
173 ///
174 /// Discover() information override structure.
175 ///
176 typedef struct {
177   BOOLEAN                   UseMCast;
178   BOOLEAN                   UseBCast;
179   BOOLEAN                   UseUCast;
180   BOOLEAN                   MustUseList;
181   EFI_IP_ADDRESS            ServerMCastIp;
182   UINT16                    IpCnt;
183   EFI_PXE_BASE_CODE_SRVLIST SrvList[1];
184 } EFI_PXE_BASE_CODE_DISCOVER_INFO;
185 
186 ///
187 /// TFTP opcode definitions.
188 ///
189 typedef enum {
190   EFI_PXE_BASE_CODE_TFTP_FIRST,
191   EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
192   EFI_PXE_BASE_CODE_TFTP_READ_FILE,
193   EFI_PXE_BASE_CODE_TFTP_WRITE_FILE,
194   EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY,
195   EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE,
196   EFI_PXE_BASE_CODE_MTFTP_READ_FILE,
197   EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY,
198   EFI_PXE_BASE_CODE_MTFTP_LAST
199 } EFI_PXE_BASE_CODE_TFTP_OPCODE;
200 
201 ///
202 /// MTFTP information. This information is required
203 /// to start or join a multicast TFTP session. It is also required to
204 /// perform the "get file size" and "read directory" operations of MTFTP.
205 ///
206 typedef struct {
207   EFI_IP_ADDRESS              MCastIp;
208   EFI_PXE_BASE_CODE_UDP_PORT  CPort;
209   EFI_PXE_BASE_CODE_UDP_PORT  SPort;
210   UINT16                      ListenTimeout;
211   UINT16                      TransmitTimeout;
212 } EFI_PXE_BASE_CODE_MTFTP_INFO;
213 
214 ///
215 /// DHCPV4 Packet structure.
216 ///
217 typedef struct {
218   UINT8   BootpOpcode;
219   UINT8   BootpHwType;
220   UINT8   BootpHwAddrLen;
221   UINT8   BootpGateHops;
222   UINT32  BootpIdent;
223   UINT16  BootpSeconds;
224   UINT16  BootpFlags;
225   UINT8   BootpCiAddr[4];
226   UINT8   BootpYiAddr[4];
227   UINT8   BootpSiAddr[4];
228   UINT8   BootpGiAddr[4];
229   UINT8   BootpHwAddr[16];
230   UINT8   BootpSrvName[64];
231   UINT8   BootpBootFile[128];
232   UINT32  DhcpMagik;
233   UINT8   DhcpOptions[56];
234 } EFI_PXE_BASE_CODE_DHCPV4_PACKET;
235 
236 ///
237 /// DHCPV6 Packet structure.
238 ///
239 typedef struct {
240   UINT32  MessageType:8;
241   UINT32  TransactionId:24;
242   UINT8   DhcpOptions[1024];
243 } EFI_PXE_BASE_CODE_DHCPV6_PACKET;
244 
245 ///
246 /// Packet structure.
247 ///
248 typedef union {
249   UINT8                           Raw[1472];
250   EFI_PXE_BASE_CODE_DHCPV4_PACKET Dhcpv4;
251   EFI_PXE_BASE_CODE_DHCPV6_PACKET Dhcpv6;
252 } EFI_PXE_BASE_CODE_PACKET;
253 
254 //
255 // PXE Base Code Mode structure
256 //
257 #define EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES   8
258 #define EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES 8
259 
260 ///
261 /// EFI_PXE_BASE_CODE_MODE.
262 /// The data values in this structure are read-only and
263 /// are updated by the code that produces the
264 /// EFI_PXE_BASE_CODE_PROTOCOL functions.
265 ///
266 typedef struct {
267   BOOLEAN                       Started;
268   BOOLEAN                       Ipv6Available;
269   BOOLEAN                       Ipv6Supported;
270   BOOLEAN                       UsingIpv6;
271   BOOLEAN                       BisSupported;
272   BOOLEAN                       BisDetected;
273   BOOLEAN                       AutoArp;
274   BOOLEAN                       SendGUID;
275   BOOLEAN                       DhcpDiscoverValid;
276   BOOLEAN                       DhcpAckReceived;
277   BOOLEAN                       ProxyOfferReceived;
278   BOOLEAN                       PxeDiscoverValid;
279   BOOLEAN                       PxeReplyReceived;
280   BOOLEAN                       PxeBisReplyReceived;
281   BOOLEAN                       IcmpErrorReceived;
282   BOOLEAN                       TftpErrorReceived;
283   BOOLEAN                       MakeCallbacks;
284   UINT8                         TTL;
285   UINT8                         ToS;
286   EFI_IP_ADDRESS                StationIp;
287   EFI_IP_ADDRESS                SubnetMask;
288   EFI_PXE_BASE_CODE_PACKET      DhcpDiscover;
289   EFI_PXE_BASE_CODE_PACKET      DhcpAck;
290   EFI_PXE_BASE_CODE_PACKET      ProxyOffer;
291   EFI_PXE_BASE_CODE_PACKET      PxeDiscover;
292   EFI_PXE_BASE_CODE_PACKET      PxeReply;
293   EFI_PXE_BASE_CODE_PACKET      PxeBisReply;
294   EFI_PXE_BASE_CODE_IP_FILTER   IpFilter;
295   UINT32                        ArpCacheEntries;
296   EFI_PXE_BASE_CODE_ARP_ENTRY   ArpCache[EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES];
297   UINT32                        RouteTableEntries;
298   EFI_PXE_BASE_CODE_ROUTE_ENTRY RouteTable[EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES];
299   EFI_PXE_BASE_CODE_ICMP_ERROR  IcmpError;
300   EFI_PXE_BASE_CODE_TFTP_ERROR  TftpError;
301 } EFI_PXE_BASE_CODE_MODE;
302 
303 //
304 // PXE Base Code Interface Function definitions
305 //
306 
307 /**
308   Enables the use of the PXE Base Code Protocol functions.
309 
310   This function enables the use of the PXE Base Code Protocol functions. If the
311   Started field of the EFI_PXE_BASE_CODE_MODE structure is already TRUE, then
312   EFI_ALREADY_STARTED will be returned. If UseIpv6 is TRUE, then IPv6 formatted
313   addresses will be used in this session. If UseIpv6 is FALSE, then IPv4 formatted
314   addresses will be used in this session. If UseIpv6 is TRUE, and the Ipv6Supported
315   field of the EFI_PXE_BASE_CODE_MODE structure is FALSE, then EFI_UNSUPPORTED will
316   be returned. If there is not enough memory or other resources to start the PXE
317   Base Code Protocol, then EFI_OUT_OF_RESOURCES will be returned. Otherwise, the
318   PXE Base Code Protocol will be started, and all of the fields of the EFI_PXE_BASE_CODE_MODE
319   structure will be initialized as follows:
320     StartedSet to TRUE.
321     Ipv6SupportedUnchanged.
322     Ipv6AvailableUnchanged.
323     UsingIpv6Set to UseIpv6.
324     BisSupportedUnchanged.
325     BisDetectedUnchanged.
326     AutoArpSet to TRUE.
327     SendGUIDSet to FALSE.
328     TTLSet to DEFAULT_TTL.
329     ToSSet to DEFAULT_ToS.
330     DhcpCompletedSet to FALSE.
331     ProxyOfferReceivedSet to FALSE.
332     StationIpSet to an address of all zeros.
333     SubnetMaskSet to a subnet mask of all zeros.
334     DhcpDiscoverZero-filled.
335     DhcpAckZero-filled.
336     ProxyOfferZero-filled.
337     PxeDiscoverValidSet to FALSE.
338     PxeDiscoverZero-filled.
339     PxeReplyValidSet to FALSE.
340     PxeReplyZero-filled.
341     PxeBisReplyValidSet to FALSE.
342     PxeBisReplyZero-filled.
343     IpFilterSet the Filters field to 0 and the IpCnt field to 0.
344     ArpCacheEntriesSet to 0.
345     ArpCacheZero-filled.
346     RouteTableEntriesSet to 0.
347     RouteTableZero-filled.
348     IcmpErrorReceivedSet to FALSE.
349     IcmpErrorZero-filled.
350     TftpErroReceivedSet to FALSE.
351     TftpErrorZero-filled.
352     MakeCallbacksSet to TRUE if the PXE Base Code Callback Protocol is available.
353     Set to FALSE if the PXE Base Code Callback Protocol is not available.
354 
355   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
356   @param  UseIpv6               Specifies the type of IP addresses that are to be used during the session
357                                 that is being started. Set to TRUE for IPv6 addresses, and FALSE for
358                                 IPv4 addresses.
359 
360   @retval EFI_SUCCESS           The PXE Base Code Protocol was started.
361   @retval EFI_DEVICE_ERROR      The network device encountered an error during this oper
362   @retval EFI_UNSUPPORTED       UseIpv6 is TRUE, but the Ipv6Supported field of the
363                                 EFI_PXE_BASE_CODE_MODE structure is FALSE.
364   @retval EFI_ALREADY_STARTED   The PXE Base Code Protocol is already in the started state.
365   @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
366                                 EFI_PXE_BASE_CODE_PROTOCOL structure.
367   @retval EFI_OUT_OF_RESOURCES  Could not allocate enough memory or other resources to start the
368                                 PXE Base Code Protocol.
369 
370 **/
371 typedef
372 EFI_STATUS
373 (EFIAPI *EFI_PXE_BASE_CODE_START)(
374   IN EFI_PXE_BASE_CODE_PROTOCOL            *This,
375   IN BOOLEAN                               UseIpv6
376   );
377 
378 /**
379   Disables the use of the PXE Base Code Protocol functions.
380 
381   This function stops all activity on the network device. All the resources allocated
382   in Start() are released, the Started field of the EFI_PXE_BASE_CODE_MODE structure is
383   set to FALSE and EFI_SUCCESS is returned. If the Started field of the EFI_PXE_BASE_CODE_MODE
384   structure is already FALSE, then EFI_NOT_STARTED will be returned.
385 
386   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
387 
388   @retval EFI_SUCCESS           The PXE Base Code Protocol was stopped.
389   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is already in the stopped state.
390   @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
391                                 EFI_PXE_BASE_CODE_PROTOCOL structure.
392   @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
393 
394 **/
395 typedef
396 EFI_STATUS
397 (EFIAPI *EFI_PXE_BASE_CODE_STOP)(
398   IN EFI_PXE_BASE_CODE_PROTOCOL    *This
399   );
400 
401 /**
402   Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request / acknowledge) or DHCPv6
403   S.A.R.R (solicit / advertise / request / reply) sequence.
404 
405   This function attempts to complete the DHCP sequence. If this sequence is completed,
406   then EFI_SUCCESS is returned, and the DhcpCompleted, ProxyOfferReceived, StationIp,
407   SubnetMask, DhcpDiscover, DhcpAck, and ProxyOffer fields of the EFI_PXE_BASE_CODE_MODE
408   structure are filled in.
409   If SortOffers is TRUE, then the cached DHCP offer packets will be sorted before
410   they are tried. If SortOffers is FALSE, then the cached DHCP offer packets will
411   be tried in the order in which they are received. Please see the Preboot Execution
412   Environment (PXE) Specification for additional details on the implementation of DHCP.
413   This function can take at least 31 seconds to timeout and return control to the
414   caller. If the DHCP sequence does not complete, then EFI_TIMEOUT will be returned.
415   If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
416   then the DHCP sequence will be stopped and EFI_ABORTED will be returned.
417 
418   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
419   @param  SortOffers            TRUE if the offers received should be sorted. Set to FALSE to try the
420                                 offers in the order that they are received.
421 
422   @retval EFI_SUCCESS           Valid DHCP has completed.
423   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
424   @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
425                                 EFI_PXE_BASE_CODE_PROTOCOL structure.
426   @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
427   @retval EFI_OUT_OF_RESOURCES  Could not allocate enough memory to complete the DHCP Protocol.
428   @retval EFI_ABORTED           The callback function aborted the DHCP Protocol.
429   @retval EFI_TIMEOUT           The DHCP Protocol timed out.
430   @retval EFI_ICMP_ERROR        An ICMP error packet was received during the DHCP session.
431   @retval EFI_NO_RESPONSE       Valid PXE offer was not received.
432 
433 **/
434 typedef
435 EFI_STATUS
436 (EFIAPI *EFI_PXE_BASE_CODE_DHCP)(
437   IN EFI_PXE_BASE_CODE_PROTOCOL            *This,
438   IN BOOLEAN                               SortOffers
439   );
440 
441 /**
442   Attempts to complete the PXE Boot Server and/or boot image discovery sequence.
443 
444   This function attempts to complete the PXE Boot Server and/or boot image discovery
445   sequence. If this sequence is completed, then EFI_SUCCESS is returned, and the
446   PxeDiscoverValid, PxeDiscover, PxeReplyReceived, and PxeReply fields of the
447   EFI_PXE_BASE_CODE_MODE structure are filled in. If UseBis is TRUE, then the
448   PxeBisReplyReceived and PxeBisReply fields of the EFI_PXE_BASE_CODE_MODE structure
449   will also be filled in. If UseBis is FALSE, then PxeBisReplyValid will be set to FALSE.
450   In the structure referenced by parameter Info, the PXE Boot Server list, SrvList[],
451   has two uses: It is the Boot Server IP address list used for unicast discovery
452   (if the UseUCast field is TRUE), and it is the list used for Boot Server verification
453   (if the MustUseList field is TRUE). Also, if the MustUseList field in that structure
454   is TRUE and the AcceptAnyResponse field in the SrvList[] array is TRUE, any Boot
455   Server reply of that type will be accepted. If the AcceptAnyResponse field is
456   FALSE, only responses from Boot Servers with matching IP addresses will be accepted.
457   This function can take at least 10 seconds to timeout and return control to the
458   caller. If the Discovery sequence does not complete, then EFI_TIMEOUT will be
459   returned. Please see the Preboot Execution Environment (PXE) Specification for
460   additional details on the implementation of the Discovery sequence.
461   If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
462   then the Discovery sequence is stopped and EFI_ABORTED will be returned.
463 
464   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
465   @param  Type                  The type of bootstrap to perform.
466   @param  Layer                 The pointer to the boot server layer number to discover, which must be
467                                 PXE_BOOT_LAYER_INITIAL when a new server type is being
468                                 discovered.
469   @param  UseBis                TRUE if Boot Integrity Services are to be used. FALSE otherwise.
470   @param  Info                  The pointer to a data structure that contains additional information on the
471                                 type of discovery operation that is to be performed.
472 
473   @retval EFI_SUCCESS           The Discovery sequence has been completed.
474   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
475   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
476   @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
477   @retval EFI_OUT_OF_RESOURCES  Could not allocate enough memory to complete Discovery.
478   @retval EFI_ABORTED           The callback function aborted the Discovery sequence.
479   @retval EFI_TIMEOUT           The Discovery sequence timed out.
480   @retval EFI_ICMP_ERROR        An ICMP error packet was received during the PXE discovery
481                                 session.
482 
483 **/
484 typedef
485 EFI_STATUS
486 (EFIAPI *EFI_PXE_BASE_CODE_DISCOVER)(
487   IN EFI_PXE_BASE_CODE_PROTOCOL           *This,
488   IN UINT16                               Type,
489   IN UINT16                               *Layer,
490   IN BOOLEAN                              UseBis,
491   IN EFI_PXE_BASE_CODE_DISCOVER_INFO      *Info   OPTIONAL
492   );
493 
494 /**
495   Used to perform TFTP and MTFTP services.
496 
497   This function is used to perform TFTP and MTFTP services. This includes the
498   TFTP operations to get the size of a file, read a directory, read a file, and
499   write a file. It also includes the MTFTP operations to get the size of a file,
500   read a directory, and read a file. The type of operation is specified by Operation.
501   If the callback function that is invoked during the TFTP/MTFTP operation does
502   not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will
503   be returned.
504   For read operations, the return data will be placed in the buffer specified by
505   BufferPtr. If BufferSize is too small to contain the entire downloaded file,
506   then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set to zero
507   or the size of the requested file (the size of the requested file is only returned
508   if the TFTP server supports TFTP options). If BufferSize is large enough for the
509   read operation, then BufferSize will be set to the size of the downloaded file,
510   and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp() services
511   should use the get-file-size operations to determine the size of the downloaded
512   file prior to using the read-file operations--especially when downloading large
513   (greater than 64 MB) files--instead of making two calls to the read-file operation.
514   Following this recommendation will save time if the file is larger than expected
515   and the TFTP server does not support TFTP option extensions. Without TFTP option
516   extension support, the client has to download the entire file, counting and discarding
517   the received packets, to determine the file size.
518   For write operations, the data to be sent is in the buffer specified by BufferPtr.
519   BufferSize specifies the number of bytes to send. If the write operation completes
520   successfully, then EFI_SUCCESS will be returned.
521   For TFTP "get file size" operations, the size of the requested file or directory
522   is returned in BufferSize, and EFI_SUCCESS will be returned. If the TFTP server
523   does not support options, the file will be downloaded into a bit bucket and the
524   length of the downloaded file will be returned. For MTFTP "get file size" operations,
525   if the MTFTP server does not support the "get file size" option, EFI_UNSUPPORTED
526   will be returned.
527   This function can take up to 10 seconds to timeout and return control to the caller.
528   If the TFTP sequence does not complete, EFI_TIMEOUT will be returned.
529   If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
530   then the TFTP sequence is stopped and EFI_ABORTED will be returned.
531   The format of the data returned from a TFTP read directory operation is a null-terminated
532   filename followed by a null-terminated information string, of the form
533   "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f - note that
534   the seconds field can be a decimal number), where the date and time are UTC. For
535   an MTFTP read directory command, there is additionally a null-terminated multicast
536   IP address preceding the filename of the form %d.%d.%d.%d for IP v4. The final
537   entry is itself null-terminated, so that the final information string is terminated
538   with two null octets.
539 
540   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
541   @param  Operation             The type of operation to perform.
542   @param  BufferPtr             A pointer to the data buffer.
543   @param  Overwrite             Only used on write file operations. TRUE if a file on a remote server can
544                                 be overwritten.
545   @param  BufferSize            For get-file-size operations, *BufferSize returns the size of the
546                                 requested file.
547   @param  BlockSize             The requested block size to be used during a TFTP transfer.
548   @param  ServerIp              The TFTP / MTFTP server IP address.
549   @param  Filename              A Null-terminated ASCII string that specifies a directory name or a file
550                                 name.
551   @param  Info                  The pointer to the MTFTP information.
552   @param  DontUseBuffer         Set to FALSE for normal TFTP and MTFTP read file operation.
553 
554   @retval EFI_SUCCESS           The TFTP/MTFTP operation was completed.
555   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
556   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
557   @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
558   @retval EFI_BUFFER_TOO_SMALL  The buffer is not large enough to complete the read operation.
559   @retval EFI_ABORTED           The callback function aborted the TFTP/MTFTP operation.
560   @retval EFI_TIMEOUT           The TFTP/MTFTP operation timed out.
561   @retval EFI_ICMP_ERROR        An ICMP error packet was received during the MTFTP session.
562   @retval EFI_TFTP_ERROR        A TFTP error packet was received during the MTFTP session.
563 
564 **/
565 typedef
566 EFI_STATUS
567 (EFIAPI *EFI_PXE_BASE_CODE_MTFTP)(
568   IN EFI_PXE_BASE_CODE_PROTOCOL                *This,
569   IN EFI_PXE_BASE_CODE_TFTP_OPCODE             Operation,
570   IN OUT VOID                                  *BufferPtr OPTIONAL,
571   IN BOOLEAN                                   Overwrite,
572   IN OUT UINT64                                *BufferSize,
573   IN UINTN                                     *BlockSize OPTIONAL,
574   IN EFI_IP_ADDRESS                            *ServerIp,
575   IN UINT8                                     *Filename  OPTIONAL,
576   IN EFI_PXE_BASE_CODE_MTFTP_INFO              *Info      OPTIONAL,
577   IN BOOLEAN                                   DontUseBuffer
578   );
579 
580 /**
581   Writes a UDP packet to the network interface.
582 
583   This function writes a UDP packet specified by the (optional HeaderPtr and)
584   BufferPtr parameters to the network interface. The UDP header is automatically
585   built by this routine. It uses the parameters OpFlags, DestIp, DestPort, GatewayIp,
586   SrcIp, and SrcPort to build this header. If the packet is successfully built and
587   transmitted through the network interface, then EFI_SUCCESS will be returned.
588   If a timeout occurs during the transmission of the packet, then EFI_TIMEOUT will
589   be returned. If an ICMP error occurs during the transmission of the packet, then
590   the IcmpErrorReceived field is set to TRUE, the IcmpError field is filled in and
591   EFI_ICMP_ERROR will be returned. If the Callback Protocol does not return
592   EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will be returned.
593 
594   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
595   @param  OpFlags               The UDP operation flags.
596   @param  DestIp                The destination IP address.
597   @param  DestPort              The destination UDP port number.
598   @param  GatewayIp             The gateway IP address.
599   @param  SrcIp                 The source IP address.
600   @param  SrcPort               The source UDP port number.
601   @param  HeaderSize            An optional field which may be set to the length of a header at
602                                 HeaderPtr to be prefixed to the data at BufferPtr.
603   @param  HeaderPtr             If HeaderSize is not NULL, a pointer to a header to be prefixed to the
604                                 data at BufferPtr.
605   @param  BufferSize            A pointer to the size of the data at BufferPtr.
606   @param  BufferPtr             A pointer to the data to be written.
607 
608   @retval EFI_SUCCESS           The UDP Write operation was completed.
609   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
610   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
611   @retval EFI_BAD_BUFFER_SIZE   The buffer is too long to be transmitted.
612   @retval EFI_ABORTED           The callback function aborted the UDP Write operation.
613   @retval EFI_TIMEOUT           The UDP Write operation timed out.
614   @retval EFI_ICMP_ERROR        An ICMP error packet was received during the UDP write session.
615 
616 **/
617 typedef
618 EFI_STATUS
619 (EFIAPI *EFI_PXE_BASE_CODE_UDP_WRITE)(
620   IN EFI_PXE_BASE_CODE_PROTOCOL                *This,
621   IN UINT16                                    OpFlags,
622   IN EFI_IP_ADDRESS                            *DestIp,
623   IN EFI_PXE_BASE_CODE_UDP_PORT                *DestPort,
624   IN EFI_IP_ADDRESS                            *GatewayIp,  OPTIONAL
625   IN EFI_IP_ADDRESS                            *SrcIp,      OPTIONAL
626   IN OUT EFI_PXE_BASE_CODE_UDP_PORT            *SrcPort,    OPTIONAL
627   IN UINTN                                     *HeaderSize, OPTIONAL
628   IN VOID                                      *HeaderPtr,  OPTIONAL
629   IN UINTN                                     *BufferSize,
630   IN VOID                                      *BufferPtr
631   );
632 
633 /**
634   Reads a UDP packet from the network interface.
635 
636   This function reads a UDP packet from a network interface. The data contents
637   are returned in (the optional HeaderPtr and) BufferPtr, and the size of the
638   buffer received is returned in BufferSize. If the input BufferSize is smaller
639   than the UDP packet received (less optional HeaderSize), it will be set to the
640   required size, and EFI_BUFFER_TOO_SMALL will be returned. In this case, the
641   contents of BufferPtr are undefined, and the packet is lost. If a UDP packet is
642   successfully received, then EFI_SUCCESS will be returned, and the information
643   from the UDP header will be returned in DestIp, DestPort, SrcIp, and SrcPort if
644   they are not NULL.
645   Depending on the values of OpFlags and the DestIp, DestPort, SrcIp, and SrcPort
646   input values, different types of UDP packet receive filtering will be performed.
647   The following tables summarize these receive filter operations.
648 
649   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
650   @param  OpFlags               The UDP operation flags.
651   @param  DestIp                The destination IP address.
652   @param  DestPort              The destination UDP port number.
653   @param  SrcIp                 The source IP address.
654   @param  SrcPort               The source UDP port number.
655   @param  HeaderSize            An optional field which may be set to the length of a header at
656                                 HeaderPtr to be prefixed to the data at BufferPtr.
657   @param  HeaderPtr             If HeaderSize is not NULL, a pointer to a header to be prefixed to the
658                                 data at BufferPtr.
659   @param  BufferSize            A pointer to the size of the data at BufferPtr.
660   @param  BufferPtr             A pointer to the data to be read.
661 
662   @retval EFI_SUCCESS           The UDP Read operation was completed.
663   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
664   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
665   @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
666   @retval EFI_BUFFER_TOO_SMALL  The packet is larger than Buffer can hold.
667   @retval EFI_ABORTED           The callback function aborted the UDP Read operation.
668   @retval EFI_TIMEOUT           The UDP Read operation timed out.
669 
670 **/
671 typedef
672 EFI_STATUS
673 (EFIAPI *EFI_PXE_BASE_CODE_UDP_READ)(
674   IN EFI_PXE_BASE_CODE_PROTOCOL                *This,
675   IN UINT16                                    OpFlags,
676   IN OUT EFI_IP_ADDRESS                        *DestIp,     OPTIONAL
677   IN OUT EFI_PXE_BASE_CODE_UDP_PORT            *DestPort,   OPTIONAL
678   IN OUT EFI_IP_ADDRESS                        *SrcIp,      OPTIONAL
679   IN OUT EFI_PXE_BASE_CODE_UDP_PORT            *SrcPort,    OPTIONAL
680   IN UINTN                                     *HeaderSize, OPTIONAL
681   IN VOID                                      *HeaderPtr,  OPTIONAL
682   IN OUT UINTN                                 *BufferSize,
683   IN VOID                                      *BufferPtr
684   );
685 
686 /**
687   Updates the IP receive filters of a network device and enables software filtering.
688 
689   The NewFilter field is used to modify the network device's current IP receive
690   filter settings and to enable a software filter. This function updates the IpFilter
691   field of the EFI_PXE_BASE_CODE_MODE structure with the contents of NewIpFilter.
692   The software filter is used when the USE_FILTER in OpFlags is set to UdpRead().
693   The current hardware filter remains in effect no matter what the settings of OpFlags
694   are, so that the meaning of ANY_DEST_IP set in OpFlags to UdpRead() is from those
695   packets whose reception is enabled in hardware - physical NIC address (unicast),
696   broadcast address, logical address or addresses (multicast), or all (promiscuous).
697   UdpRead() does not modify the IP filter settings.
698   Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP receive
699   filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
700   If an application or driver wishes to preserve the IP receive filter settings,
701   it will have to preserve the IP receive filter settings before these calls, and
702   use SetIpFilter() to restore them after the calls. If incompatible filtering is
703   requested (for example, PROMISCUOUS with anything else), or if the device does not
704   support a requested filter setting and it cannot be accommodated in software
705   (for example, PROMISCUOUS not supported), EFI_INVALID_PARAMETER will be returned.
706   The IPlist field is used to enable IPs other than the StationIP. They may be
707   multicast or unicast. If IPcnt is set as well as EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP,
708   then both the StationIP and the IPs from the IPlist will be used.
709 
710   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
711   @param  NewFilter             The pointer to the new set of IP receive filters.
712 
713   @retval EFI_SUCCESS           The IP receive filter settings were updated.
714   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
715   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
716 
717 **/
718 typedef
719 EFI_STATUS
720 (EFIAPI *EFI_PXE_BASE_CODE_SET_IP_FILTER)(
721   IN EFI_PXE_BASE_CODE_PROTOCOL            *This,
722   IN EFI_PXE_BASE_CODE_IP_FILTER           *NewFilter
723   );
724 
725 /**
726   Uses the ARP protocol to resolve a MAC address.
727 
728   This function uses the ARP protocol to resolve a MAC address. The UsingIpv6 field
729   of the EFI_PXE_BASE_CODE_MODE structure is used to determine if IPv4 or IPv6
730   addresses are being used. The IP address specified by IpAddr is used to resolve
731   a MAC address. If the ARP protocol succeeds in resolving the specified address,
732   then the ArpCacheEntries and ArpCache fields of the EFI_PXE_BASE_CODE_MODE structure
733   are updated, and EFI_SUCCESS is returned. If MacAddr is not NULL, the resolved
734   MAC address is placed there as well.
735   If the PXE Base Code protocol is in the stopped state, then EFI_NOT_STARTED is
736   returned. If the ARP protocol encounters a timeout condition while attempting
737   to resolve an address, then EFI_TIMEOUT is returned. If the Callback Protocol
738   does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED is
739   returned.
740 
741   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
742   @param  IpAddr                The pointer to the IP address that is used to resolve a MAC address.
743   @param  MacAddr               If not NULL, a pointer to the MAC address that was resolved with the
744                                 ARP protocol.
745 
746   @retval EFI_SUCCESS           The IP or MAC address was resolved.
747   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
748   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
749   @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
750   @retval EFI_ABORTED           The callback function aborted the ARP Protocol.
751   @retval EFI_TIMEOUT           The ARP Protocol encountered a timeout condition.
752 
753 **/
754 typedef
755 EFI_STATUS
756 (EFIAPI *EFI_PXE_BASE_CODE_ARP)(
757   IN EFI_PXE_BASE_CODE_PROTOCOL            *This,
758   IN EFI_IP_ADDRESS                        *IpAddr,
759   IN EFI_MAC_ADDRESS                       *MacAddr OPTIONAL
760   );
761 
762 /**
763   Updates the parameters that affect the operation of the PXE Base Code Protocol.
764 
765   This function sets parameters that affect the operation of the PXE Base Code Protocol.
766   The parameter specified by NewAutoArp is used to control the generation of ARP
767   protocol packets. If NewAutoArp is TRUE, then ARP Protocol packets will be generated
768   as required by the PXE Base Code Protocol. If NewAutoArp is FALSE, then no ARP
769   Protocol packets will be generated. In this case, the only mappings that are
770   available are those stored in the ArpCache of the EFI_PXE_BASE_CODE_MODE structure.
771   If there are not enough mappings in the ArpCache to perform a PXE Base Code Protocol
772   service, then the service will fail. This function updates the AutoArp field of
773   the EFI_PXE_BASE_CODE_MODE structure to NewAutoArp.
774   The SetParameters() call must be invoked after a Callback Protocol is installed
775   to enable the use of callbacks.
776 
777   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
778   @param  NewAutoArp            If not NULL, a pointer to a value that specifies whether to replace the
779                                 current value of AutoARP.
780   @param  NewSendGUID           If not NULL, a pointer to a value that specifies whether to replace the
781                                 current value of SendGUID.
782   @param  NewTTL                If not NULL, a pointer to be used in place of the current value of TTL,
783                                 the "time to live" field of the IP header.
784   @param  NewToS                If not NULL, a pointer to be used in place of the current value of ToS,
785                                 the "type of service" field of the IP header.
786   @param  NewMakeCallback       If not NULL, a pointer to a value that specifies whether to replace the
787                                 current value of the MakeCallback field of the Mode structure.
788 
789   @retval EFI_SUCCESS           The new parameters values were updated.
790   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
791   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
792 
793 **/
794 typedef
795 EFI_STATUS
796 (EFIAPI *EFI_PXE_BASE_CODE_SET_PARAMETERS)(
797   IN EFI_PXE_BASE_CODE_PROTOCOL            *This,
798   IN BOOLEAN                               *NewAutoArp,     OPTIONAL
799   IN BOOLEAN                               *NewSendGUID,    OPTIONAL
800   IN UINT8                                 *NewTTL,         OPTIONAL
801   IN UINT8                                 *NewToS,         OPTIONAL
802   IN BOOLEAN                               *NewMakeCallback OPTIONAL
803   );
804 
805 /**
806   Updates the station IP address and/or subnet mask values of a network device.
807 
808   This function updates the station IP address and/or subnet mask values of a network
809   device.
810   The NewStationIp field is used to modify the network device's current IP address.
811   If NewStationIP is NULL, then the current IP address will not be modified. Otherwise,
812   this function updates the StationIp field of the EFI_PXE_BASE_CODE_MODE structure
813   with NewStationIp.
814   The NewSubnetMask field is used to modify the network device's current subnet
815   mask. If NewSubnetMask is NULL, then the current subnet mask will not be modified.
816   Otherwise, this function updates the SubnetMask field of the EFI_PXE_BASE_CODE_MODE
817   structure with NewSubnetMask.
818 
819   @param  This                  The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
820   @param  NewStationIp          The pointer to the new IP address to be used by the network device.
821   @param  NewSubnetMask         The pointer to the new subnet mask to be used by the network device.
822 
823   @retval EFI_SUCCESS           The new station IP address and/or subnet mask were updated.
824   @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
825   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
826 
827 **/
828 typedef
829 EFI_STATUS
830 (EFIAPI *EFI_PXE_BASE_CODE_SET_STATION_IP)(
831   IN EFI_PXE_BASE_CODE_PROTOCOL            *This,
832   IN EFI_IP_ADDRESS                        *NewStationIp,   OPTIONAL
833   IN EFI_IP_ADDRESS                        *NewSubnetMask   OPTIONAL
834   );
835 
836 /**
837   Updates the contents of the cached DHCP and Discover packets.
838 
839   The pointers to the new packets are used to update the contents of the cached
840   packets in the EFI_PXE_BASE_CODE_MODE structure.
841 
842   @param  This                   The pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
843   @param  NewDhcpDiscoverValid   The pointer to a value that will replace the current
844                                  DhcpDiscoverValid field.
845   @param  NewDhcpAckReceived     The pointer to a value that will replace the current
846                                  DhcpAckReceived field.
847   @param  NewProxyOfferReceived  The pointer to a value that will replace the current
848                                  ProxyOfferReceived field.
849   @param  NewPxeDiscoverValid    The pointer to a value that will replace the current
850                                  ProxyOfferReceived field.
851   @param  NewPxeReplyReceived    The pointer to a value that will replace the current
852                                  PxeReplyReceived field.
853   @param  NewPxeBisReplyReceived The pointer to a value that will replace the current
854                                  PxeBisReplyReceived field.
855   @param  NewDhcpDiscover        The pointer to the new cached DHCP Discover packet contents.
856   @param  NewDhcpAck             The pointer to the new cached DHCP Ack packet contents.
857   @param  NewProxyOffer          The pointer to the new cached Proxy Offer packet contents.
858   @param  NewPxeDiscover         The pointer to the new cached PXE Discover packet contents.
859   @param  NewPxeReply            The pointer to the new cached PXE Reply packet contents.
860   @param  NewPxeBisReply         The pointer to the new cached PXE BIS Reply packet contents.
861 
862   @retval EFI_SUCCESS            The cached packet contents were updated.
863   @retval EFI_NOT_STARTED        The PXE Base Code Protocol is in the stopped state.
864   @retval EFI_INVALID_PARAMETER  This is NULL or not point to a valid EFI_PXE_BASE_CODE_PROTOCOL structure.
865 
866 **/
867 typedef
868 EFI_STATUS
869 (EFIAPI *EFI_PXE_BASE_CODE_SET_PACKETS)(
870   IN EFI_PXE_BASE_CODE_PROTOCOL            *This,
871   BOOLEAN                                  *NewDhcpDiscoverValid,   OPTIONAL
872   BOOLEAN                                  *NewDhcpAckReceived,     OPTIONAL
873   BOOLEAN                                  *NewProxyOfferReceived,  OPTIONAL
874   BOOLEAN                                  *NewPxeDiscoverValid,    OPTIONAL
875   BOOLEAN                                  *NewPxeReplyReceived,    OPTIONAL
876   BOOLEAN                                  *NewPxeBisReplyReceived, OPTIONAL
877   IN EFI_PXE_BASE_CODE_PACKET              *NewDhcpDiscover,        OPTIONAL
878   IN EFI_PXE_BASE_CODE_PACKET              *NewDhcpAck,             OPTIONAL
879   IN EFI_PXE_BASE_CODE_PACKET              *NewProxyOffer,          OPTIONAL
880   IN EFI_PXE_BASE_CODE_PACKET              *NewPxeDiscover,         OPTIONAL
881   IN EFI_PXE_BASE_CODE_PACKET              *NewPxeReply,            OPTIONAL
882   IN EFI_PXE_BASE_CODE_PACKET              *NewPxeBisReply          OPTIONAL
883   );
884 
885 //
886 // PXE Base Code Protocol structure
887 //
888 #define EFI_PXE_BASE_CODE_PROTOCOL_REVISION   0x00010000
889 
890 //
891 // Revision defined in EFI1.1
892 //
893 #define EFI_PXE_BASE_CODE_INTERFACE_REVISION  EFI_PXE_BASE_CODE_PROTOCOL_REVISION
894 
895 ///
896 /// The EFI_PXE_BASE_CODE_PROTOCOL is used to control PXE-compatible devices.
897 /// An EFI_PXE_BASE_CODE_PROTOCOL will be layered on top of an
898 /// EFI_MANAGED_NETWORK_PROTOCOL protocol in order to perform packet level transactions.
899 /// The EFI_PXE_BASE_CODE_PROTOCOL handle also supports the
900 /// EFI_LOAD_FILE_PROTOCOL protocol. This provides a clean way to obtain control from the
901 /// boot manager if the boot path is from the remote device.
902 ///
903 struct _EFI_PXE_BASE_CODE_PROTOCOL {
904   ///
905   ///  The revision of the EFI_PXE_BASE_CODE_PROTOCOL. All future revisions must
906   ///  be backwards compatible. If a future version is not backwards compatible
907   ///  it is not the same GUID.
908   ///
909   UINT64                            Revision;
910   EFI_PXE_BASE_CODE_START           Start;
911   EFI_PXE_BASE_CODE_STOP            Stop;
912   EFI_PXE_BASE_CODE_DHCP            Dhcp;
913   EFI_PXE_BASE_CODE_DISCOVER        Discover;
914   EFI_PXE_BASE_CODE_MTFTP           Mtftp;
915   EFI_PXE_BASE_CODE_UDP_WRITE       UdpWrite;
916   EFI_PXE_BASE_CODE_UDP_READ        UdpRead;
917   EFI_PXE_BASE_CODE_SET_IP_FILTER   SetIpFilter;
918   EFI_PXE_BASE_CODE_ARP             Arp;
919   EFI_PXE_BASE_CODE_SET_PARAMETERS  SetParameters;
920   EFI_PXE_BASE_CODE_SET_STATION_IP  SetStationIp;
921   EFI_PXE_BASE_CODE_SET_PACKETS     SetPackets;
922   ///
923   /// The pointer to the EFI_PXE_BASE_CODE_MODE data for this device.
924   ///
925   EFI_PXE_BASE_CODE_MODE            *Mode;
926 };
927 
928 extern EFI_GUID gEfiPxeBaseCodeProtocolGuid;
929 
930 #endif
931