Home | History | Annotate | Download | only in UefiPxeBcDxe
      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