• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Dhcp and Discover routines for PxeBc.
3 
4 Copyright (c) 2013, Red Hat, Inc.
5 Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution.  The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef __EFI_PXEBC_DHCP_H__
17 #define __EFI_PXEBC_DHCP_H__
18 
19 #define PXEBC_DHCP4_MAX_OPTION_NUM         16
20 #define PXEBC_DHCP4_MAX_OPTION_SIZE        312
21 #define PXEBC_DHCP4_MAX_PACKET_SIZE        1472
22 
23 #define PXEBC_DHCP4_S_PORT                 67
24 #define PXEBC_DHCP4_C_PORT                 68
25 #define PXEBC_BS_DOWNLOAD_PORT             69
26 #define PXEBC_BS_DISCOVER_PORT             4011
27 
28 #define PXEBC_DHCP4_OPCODE_REQUEST         1
29 #define PXEBC_DHCP4_OPCODE_REPLY           2
30 #define PXEBC_DHCP4_MSG_TYPE_REQUEST       3
31 #define PXEBC_DHCP4_MAGIC                  0x63538263 // network byte order
32 //
33 // Dhcp Options
34 //
35 #define PXEBC_DHCP4_TAG_PAD                0    // Pad Option
36 #define PXEBC_DHCP4_TAG_EOP                255  // End Option
37 #define PXEBC_DHCP4_TAG_NETMASK            1    // Subnet Mask
38 #define PXEBC_DHCP4_TAG_TIME_OFFSET        2    // Time Offset from UTC
39 #define PXEBC_DHCP4_TAG_ROUTER             3    // Router option,
40 #define PXEBC_DHCP4_TAG_TIME_SERVER        4    // Time Server
41 #define PXEBC_DHCP4_TAG_NAME_SERVER        5    // Name Server
42 #define PXEBC_DHCP4_TAG_DNS_SERVER         6    // Domain Name Server
43 #define PXEBC_DHCP4_TAG_HOSTNAME           12   // Host Name
44 #define PXEBC_DHCP4_TAG_BOOTFILE_LEN       13   // Boot File Size
45 #define PXEBC_DHCP4_TAG_DUMP               14   // Merit Dump File
46 #define PXEBC_DHCP4_TAG_DOMAINNAME         15   // Domain Name
47 #define PXEBC_DHCP4_TAG_ROOTPATH           17   // Root path
48 #define PXEBC_DHCP4_TAG_EXTEND_PATH        18   // Extensions Path
49 #define PXEBC_DHCP4_TAG_EMTU               22   // Maximum Datagram Reassembly Size
50 #define PXEBC_DHCP4_TAG_TTL                23   // Default IP Time-to-live
51 #define PXEBC_DHCP4_TAG_BROADCAST          28   // Broadcast Address
52 #define PXEBC_DHCP4_TAG_NIS_DOMAIN         40   // Network Information Service Domain
53 #define PXEBC_DHCP4_TAG_NIS_SERVER         41   // Network Information Servers
54 #define PXEBC_DHCP4_TAG_NTP_SERVER         42   // Network Time Protocol Servers
55 #define PXEBC_DHCP4_TAG_VENDOR             43   // Vendor Specific Information
56 #define PXEBC_DHCP4_TAG_REQUEST_IP         50   // Requested IP Address
57 #define PXEBC_DHCP4_TAG_LEASE              51   // IP Address Lease Time
58 #define PXEBC_DHCP4_TAG_OVERLOAD           52   // Option Overload
59 #define PXEBC_DHCP4_TAG_MSG_TYPE           53   // DHCP Message Type
60 #define PXEBC_DHCP4_TAG_SERVER_ID          54   // Server Identifier
61 #define PXEBC_DHCP4_TAG_PARA_LIST          55   // Parameter Request List
62 #define PXEBC_DHCP4_TAG_MAXMSG             57   // Maximum DHCP Message Size
63 #define PXEBC_DHCP4_TAG_T1                 58   // Renewal (T1) Time Value
64 #define PXEBC_DHCP4_TAG_T2                 59   // Rebinding (T2) Time Value
65 #define PXEBC_DHCP4_TAG_CLASS_ID           60   // Vendor class identifier
66 #define PXEBC_DHCP4_TAG_CLIENT_ID          61   // Client-identifier
67 #define PXEBC_DHCP4_TAG_TFTP               66   // TFTP server name
68 #define PXEBC_DHCP4_TAG_BOOTFILE           67   // Bootfile name
69 #define PXEBC_PXE_DHCP4_TAG_ARCH           93
70 #define PXEBC_PXE_DHCP4_TAG_UNDI           94
71 #define PXEBC_PXE_DHCP4_TAG_UUID           97
72 //
73 // Sub-Options in Dhcp Vendor Option
74 //
75 #define PXEBC_VENDOR_TAG_MTFTP_IP          1
76 #define PXEBC_VENDOR_TAG_MTFTP_CPORT       2
77 #define PXEBC_VENDOR_TAG_MTFTP_SPORT       3
78 #define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT     4
79 #define PXEBC_VENDOR_TAG_MTFTP_DELAY       5
80 #define PXEBC_VENDOR_TAG_DISCOVER_CTRL     6
81 #define PXEBC_VENDOR_TAG_DISCOVER_MCAST    7
82 #define PXEBC_VENDOR_TAG_BOOT_SERVERS      8
83 #define PXEBC_VENDOR_TAG_BOOT_MENU         9
84 #define PXEBC_VENDOR_TAG_MENU_PROMPT       10
85 #define PXEBC_VENDOR_TAG_MCAST_ALLOC       11
86 #define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES  12
87 #define PXEBC_VENDOR_TAG_BOOT_ITEM         71
88 
89 #define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT  4
90 #define PXEBC_DHCP4_DISCOVER_RETRIES       4
91 
92 #define PXEBC_MAX_MENU_NUM                 24
93 #define PXEBC_MAX_OFFER_NUM                16
94 
95 #define PXEBC_BOOT_REQUEST_TIMEOUT         1
96 #define PXEBC_BOOT_REQUEST_RETRIES         4
97 
98 #define PXEBC_DHCP4_OVERLOAD_FILE          1
99 #define PXEBC_DHCP4_OVERLOAD_SERVER_NAME   2
100 
101 //
102 // The array index of the DHCP4 option tag interested
103 //
104 #define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
105 #define PXEBC_DHCP4_TAG_INDEX_VENDOR       1
106 #define PXEBC_DHCP4_TAG_INDEX_OVERLOAD     2
107 #define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE     3
108 #define PXEBC_DHCP4_TAG_INDEX_SERVER_ID    4
109 #define PXEBC_DHCP4_TAG_INDEX_CLASS_ID     5
110 #define PXEBC_DHCP4_TAG_INDEX_BOOTFILE     6
111 #define PXEBC_DHCP4_TAG_INDEX_MAX          7
112 
113 //
114 // The type of DHCP OFFER, arranged by priority, PXE10 has the highest priority.
115 //
116 #define DHCP4_PACKET_TYPE_PXE10            0
117 #define DHCP4_PACKET_TYPE_WFM11A           1
118 #define DHCP4_PACKET_TYPE_BINL             2
119 #define DHCP4_PACKET_TYPE_DHCP_ONLY        3
120 #define DHCP4_PACKET_TYPE_BOOTP            4
121 #define DHCP4_PACKET_TYPE_MAX              5
122 
123 #define BIT(x)  (1 << x)
124 #define CTRL(x) (0x1F & (x))
125 
126 //
127 // WfM11a options
128 //
129 #define MTFTP_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_MTFTP_IP) | \
130                                      BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \
131                                      BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \
132                                      BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \
133                                      BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY))
134 //
135 // Discoverty options
136 //
137 #define DISCOVER_VENDOR_OPTION_BIT_MAP  (BIT (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \
138                                          BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \
139                                          BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \
140                                          BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \
141                                          BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
142 
143 #define IS_VALID_BOOT_PROMPT(x) \
144   ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
145 
146 #define IS_VALID_BOOT_MENU(x) \
147   ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT (PXEBC_VENDOR_TAG_BOOT_MENU))
148 
149 #define IS_VALID_MTFTP_VENDOR_OPTION(x) \
150     (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == MTFTP_VENDOR_OPTION_BIT_MAP)
151 
152 #define IS_VALID_DISCOVER_VENDOR_OPTION(x)  (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)
153 
154 #define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \
155     (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))
156 
157 #define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \
158     (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \
159       == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32))
160 
161 #define IS_DISABLE_BCAST_DISCOVER(x)    (((x) & BIT (0)) == BIT (0))
162 #define IS_DISABLE_MCAST_DISCOVER(x)    (((x) & BIT (1)) == BIT (1))
163 #define IS_ENABLE_USE_SERVER_LIST(x)    (((x) & BIT (2)) == BIT (2))
164 #define IS_DISABLE_PROMPT_MENU(x)       (((x) & BIT (3)) == BIT (3))
165 
166 #define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) ((x)[(y) / 32]) | BIT ((y) % 32))
167 
168 #pragma pack(1)
169 typedef struct {
170   UINT8 ParaList[135];
171 } PXEBC_DHCP4_OPTION_PARA;
172 
173 typedef struct {
174   UINT16  Size;
175 } PXEBC_DHCP4_OPTION_MAX_MESG_SIZE;
176 
177 typedef struct {
178   UINT8 Type;
179   UINT8 MajorVer;
180   UINT8 MinorVer;
181 } PXEBC_DHCP4_OPTION_UNDI;
182 
183 typedef struct {
184   UINT8 Type;
185 } PXEBC_DHCP4_OPTION_MESG;
186 
187 typedef struct {
188   UINT16  Type;
189 } PXEBC_DHCP4_OPTION_ARCH;
190 
191 #define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000"
192 #define DEFAULT_UNDI_TYPE     1
193 #define DEFAULT_UNDI_MAJOR    3
194 #define DEFAULT_UNDI_MINOR    0
195 
196 typedef struct {
197   UINT8 ClassIdentifier[10];
198   UINT8 ArchitecturePrefix[5];
199   UINT8 ArchitectureType[5];
200   UINT8 Lit3[1];
201   UINT8 InterfaceName[4];
202   UINT8 Lit4[1];
203   UINT8 UndiMajor[3];
204   UINT8 UndiMinor[3];
205 } PXEBC_DHCP4_OPTION_CLID;
206 
207 typedef struct {
208   UINT8 Type;
209   UINT8 Guid[16];
210 } PXEBC_DHCP4_OPTION_UUID;
211 
212 typedef struct {
213   UINT16  Type;
214   UINT16  Layer;
215 } PXEBC_OPTION_BOOT_ITEM;
216 
217 #pragma pack()
218 
219 typedef union {
220   PXEBC_DHCP4_OPTION_PARA           *Para;
221   PXEBC_DHCP4_OPTION_UNDI           *Undi;
222   PXEBC_DHCP4_OPTION_ARCH           *Arch;
223   PXEBC_DHCP4_OPTION_CLID           *Clid;
224   PXEBC_DHCP4_OPTION_UUID           *Uuid;
225   PXEBC_DHCP4_OPTION_MESG           *Mesg;
226   PXEBC_DHCP4_OPTION_MAX_MESG_SIZE  *MaxMesgSize;
227 } PXEBC_DHCP4_OPTION_ENTRY;
228 
229 typedef struct {
230   UINT16            Type;
231   UINT8             IpCnt;
232   EFI_IPv4_ADDRESS  IpAddr[1];
233 } PXEBC_BOOT_SVR_ENTRY;
234 
235 typedef struct {
236   UINT16  Type;
237   UINT8   DescLen;
238   UINT8   DescStr[1];
239 } PXEBC_BOOT_MENU_ENTRY;
240 
241 typedef struct {
242   UINT8 Timeout;
243   UINT8 Prompt[1];
244 } PXEBC_MENU_PROMPT;
245 
246 typedef struct {
247   UINT32                BitMap[8];
248   EFI_IPv4_ADDRESS      MtftpIp;
249   UINT16                MtftpCPort;
250   UINT16                MtftpSPort;
251   UINT8                 MtftpTimeout;
252   UINT8                 MtftpDelay;
253   UINT8                 DiscoverCtrl;
254   EFI_IPv4_ADDRESS      DiscoverMcastIp;
255   EFI_IPv4_ADDRESS      McastIpBase;
256   UINT16                McastIpBlock;
257   UINT16                McastIpRange;
258   UINT16                BootSrvType;
259   UINT16                BootSrvLayer;
260   PXEBC_BOOT_SVR_ENTRY  *BootSvr;
261   UINT8                 BootSvrLen;
262   PXEBC_BOOT_MENU_ENTRY *BootMenu;
263   UINT8                 BootMenuLen;
264   PXEBC_MENU_PROMPT     *MenuPrompt;
265   UINT8                 MenuPromptLen;
266   UINT32                *CredType;
267   UINT8                 CredTypeLen;
268 } PXEBC_VENDOR_OPTION;
269 
270 #define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE  (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE)
271 
272 typedef union {
273   EFI_DHCP4_PACKET  Offer;
274   EFI_DHCP4_PACKET  Ack;
275   UINT8             Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE];
276 } PXEBC_DHCP4_PACKET;
277 
278 typedef struct {
279   PXEBC_DHCP4_PACKET      Packet;
280   BOOLEAN                 IsPxeOffer;
281   UINT8                   OfferType;
282   EFI_DHCP4_PACKET_OPTION *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX];
283   PXEBC_VENDOR_OPTION    PxeVendorOption;
284 } PXEBC_CACHED_DHCP4_PACKET;
285 
286 #define GET_NEXT_DHCP_OPTION(Opt) \
287   (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
288 
289 #define GET_OPTION_BUFFER_LEN(Pkt)  ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
290 #define IS_PROXY_DHCP_OFFER(Offer)  EFI_IP4_EQUAL (&((Offer)->Dhcp4.Header.YourAddr), &mZeroIp4Addr)
291 
292 #define GET_NEXT_BOOT_SVR_ENTRY(Ent) \
293   (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS))
294 
295 
296 /**
297   This function initialize the DHCP4 message instance.
298 
299   This function will pad each item of dhcp4 message packet.
300 
301   @param  Seed    Pointer to the message instance of the DHCP4 packet.
302   @param  Udp4    Pointer to the EFI_UDP4_PROTOCOL instance.
303 
304 **/
305 VOID
306 PxeBcInitSeedPacket (
307   IN EFI_DHCP4_PACKET  *Seed,
308   IN EFI_UDP4_PROTOCOL *Udp4
309   );
310 
311 
312 /**
313   Parse the cached dhcp packet.
314 
315   @param  CachedPacket  Pointer to cached dhcp packet.
316 
317   @retval TRUE          Succeed to parse and validation.
318   @retval FALSE         Fail to parse or validation.
319 
320 **/
321 BOOLEAN
322 PxeBcParseCachedDhcpPacket (
323   IN PXEBC_CACHED_DHCP4_PACKET  *CachedPacket
324   );
325 
326 /**
327   This function is to check the selected proxy offer (include BINL dhcp offer and
328   DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code
329   mode structure.
330 
331   @param  Private          Pointer to PxeBc private data.
332 
333   @retval EFI_SUCCESS      Operational successful.
334   @retval EFI_NO_RESPONSE  Offer dhcp service failed.
335 
336 **/
337 EFI_STATUS
338 PxeBcCheckSelectedOffer (
339   IN PXEBC_PRIVATE_DATA  *Private
340   );
341 
342 
343 /**
344   Callback routine.
345 
346   EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver
347   to intercept events that occurred in the configuration process. This structure
348   provides advanced control of each state transition of the DHCP process. The
349   returned status code determines the behavior of the EFI DHCPv4 Protocol driver.
350   There are three possible returned values, which are described in the following
351   table.
352 
353   @param  This                  Pointer to the EFI DHCPv4 Protocol instance that is used to
354                                 configure this callback function.
355   @param  Context               Pointer to the context that is initialized by
356                                 EFI_DHCP4_PROTOCOL.Configure().
357   @param  CurrentState          The current operational state of the EFI DHCPv4 Protocol
358                                 driver.
359   @param  Dhcp4Event            The event that occurs in the current state, which usually means a
360                                 state transition.
361   @param  Packet                The DHCP packet that is going to be sent or already received.
362   @param  NewPacket             The packet that is used to replace the above Packet.
363 
364   @retval EFI_SUCCESS           Tells the EFI DHCPv4 Protocol driver to continue the DHCP process.
365   @retval EFI_NOT_READY         Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol
366                                 driver will continue to wait for more DHCPOFFER packets until the retry
367                                 timeout expires.
368   @retval EFI_ABORTED           Tells the EFI DHCPv4 Protocol driver to abort the current process and
369                                 return to the Dhcp4Init or Dhcp4InitReboot state.
370 
371 **/
372 EFI_STATUS
373 EFIAPI
374 PxeBcDhcpCallBack (
375   IN EFI_DHCP4_PROTOCOL                * This,
376   IN VOID                              *Context,
377   IN EFI_DHCP4_STATE                   CurrentState,
378   IN EFI_DHCP4_EVENT                   Dhcp4Event,
379   IN EFI_DHCP4_PACKET                  * Packet OPTIONAL,
380   OUT EFI_DHCP4_PACKET                 **NewPacket OPTIONAL
381   );
382 
383 /**
384   Switch the Ip4 policy to static.
385 
386   @param[in]  Private             The pointer to PXEBC_PRIVATE_DATA.
387 
388   @retval     EFI_SUCCESS         The policy is already configured to static.
389   @retval     Others              Other error as indicated..
390 
391 **/
392 EFI_STATUS
393 PxeBcSetIp4Policy (
394   IN PXEBC_PRIVATE_DATA            *Private
395   );
396 
397 /**
398   Discover the boot of service and initialize the vendor option if exists.
399 
400   @param  Private               Pointer to PxeBc private data.
401   @param  Type                  PxeBc option boot item type
402   @param  Layer                 PxeBc option boot item layer
403   @param  UseBis                Use BIS or not
404   @param  DestIp                Ip address for server
405   @param  IpCount               The total count of the server ip address
406   @param  SrvList               Server list
407   @param  IsDiscv               Discover the vendor or not
408   @param  Reply                 The dhcp4 packet of Pxe reply
409 
410   @retval EFI_SUCCESS           Operation succeeds.
411   @retval EFI_OUT_OF_RESOURCES  Allocate memory pool failed.
412   @retval EFI_NOT_FOUND         There is no vendor option exists.
413   @retval EFI_TIMEOUT           Send Pxe Discover time out.
414 
415 **/
416 EFI_STATUS
417 PxeBcDiscvBootService (
418   IN PXEBC_PRIVATE_DATA                * Private,
419   IN UINT16                            Type,
420   IN UINT16                            *Layer,
421   IN BOOLEAN                           UseBis,
422   IN EFI_IP_ADDRESS                    * DestIp,
423   IN UINT16                            IpCount,
424   IN EFI_PXE_BASE_CODE_SRVLIST         * SrvList,
425   IN BOOLEAN                           IsDiscv,
426   OUT EFI_DHCP4_PACKET                 * Reply OPTIONAL
427   );
428 
429 
430 /**
431   Initialize the DHCP options and build the option list.
432 
433   @param  Private          Pointer to PxeBc private data.
434   @param  OptList          Pointer to a DHCP option list.
435 
436   @param  IsDhcpDiscover   Discover dhcp option or not.
437 
438   @return The index item number of the option list.
439 
440 **/
441 UINT32
442 PxeBcBuildDhcpOptions (
443   IN PXEBC_PRIVATE_DATA            *Private,
444   IN EFI_DHCP4_PACKET_OPTION       **OptList,
445   IN BOOLEAN                       IsDhcpDiscover
446   );
447 
448 
449 /**
450   Create the boot options.
451 
452   @param  OptList    Pointer to the list of the options
453   @param  Type       the type of option
454   @param  Layer      the layer of the boot options
455   @param  OptLen     length of opotion
456 
457 **/
458 VOID
459 PxeBcCreateBootOptions (
460   IN  EFI_DHCP4_PACKET_OPTION          *OptList,
461   IN  UINT16                           Type,
462   IN  UINT16                           *Layer,
463   OUT UINT32                           *OptLen
464   );
465 
466 
467 /**
468   Parse interested dhcp options.
469 
470   @param  Buffer     Pointer to the dhcp options packet.
471   @param  Length     The length of the dhcp options.
472   @param  OptTag     The option OpCode.
473 
474   @return NULL if the buffer length is 0 and OpCode is not
475           PXEBC_DHCP4_TAG_EOP, or the pointer to the buffer.
476 
477 **/
478 EFI_DHCP4_PACKET_OPTION *
479 PxeBcParseExtendOptions (
480   IN UINT8                         *Buffer,
481   IN UINT32                        Length,
482   IN UINT8                         OptTag
483   );
484 
485 
486 /**
487   This function is to parse and check vendor options.
488 
489   @param  Dhcp4Option           Pointer to dhcp options
490   @param  VendorOption          Pointer to vendor options
491 
492   @return TRUE if valid for vendor options, or FALSE.
493 
494 **/
495 BOOLEAN
496 PxeBcParseVendorOptions (
497   IN EFI_DHCP4_PACKET_OPTION       *Dhcp4Option,
498   IN PXEBC_VENDOR_OPTION           *VendorOption
499   );
500 
501 
502 /**
503   Choose the boot prompt.
504 
505   @param  Private              Pointer to PxeBc private data.
506 
507   @retval EFI_SUCCESS          Select boot prompt done.
508   @retval EFI_TIMEOUT          Select boot prompt time out.
509   @retval EFI_NOT_FOUND        The proxy offer is not Pxe10.
510   @retval EFI_ABORTED          User cancel the operation.
511   @retval EFI_NOT_READY        Read the input key from the keybroad has not finish.
512 
513 **/
514 EFI_STATUS
515 PxeBcSelectBootPrompt (
516   IN PXEBC_PRIVATE_DATA              *Private
517   );
518 
519 
520 /**
521   Select the boot menu.
522 
523   @param  Private         Pointer to PxeBc private data.
524   @param  Type            The type of the menu.
525   @param  UseDefaultItem  Use default item or not.
526 
527   @retval EFI_ABORTED     User cancel operation.
528   @retval EFI_SUCCESS     Select the boot menu success.
529   @retval EFI_NOT_READY   Read the input key from the keybroad has not finish.
530 
531 **/
532 EFI_STATUS
533 PxeBcSelectBootMenu (
534   IN  PXEBC_PRIVATE_DATA              *Private,
535   OUT UINT16                          *Type,
536   IN  BOOLEAN                         UseDefaultItem
537   );
538 
539 #endif
540 
541