2 Dhcp and Discover routines for PxeBc.
4 Copyright (c) 2013, Red Hat, Inc.
5 Copyright (c) 2007 - 2011, 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
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.
16 #ifndef __EFI_PXEBC_DHCP_H__
17 #define __EFI_PXEBC_DHCP_H__
19 #define PXEBC_DHCP4_MAX_OPTION_NUM 16
20 #define PXEBC_DHCP4_MAX_OPTION_SIZE 312
21 #define PXEBC_DHCP4_MAX_PACKET_SIZE 1472
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
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
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
73 // Sub-Options in Dhcp Vendor Option
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
89 #define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT 4
90 #define PXEBC_DHCP4_DISCOVER_RETRIES 4
92 #define PXEBC_MAX_MENU_NUM 24
93 #define PXEBC_MAX_OFFER_NUM 16
95 #define PXEBC_BOOT_REQUEST_TIMEOUT 1
96 #define PXEBC_BOOT_REQUEST_RETRIES 4
98 #define PXEBC_DHCP4_OVERLOAD_FILE 1
99 #define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2
102 // The array index of the DHCP4 option tag interested
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
114 // The type of DHCP OFFER, arranged by priority, PXE10 has the highest priority.
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
123 #define BIT(x) (1 << x)
124 #define CTRL(x) (0x1F & (x))
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))
135 // Discoverty options
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))
143 #define IS_VALID_BOOT_PROMPT(x) \
144 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
146 #define IS_VALID_BOOT_MENU(x) \
147 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT (PXEBC_VENDOR_TAG_BOOT_MENU))
149 #define IS_VALID_MTFTP_VENDOR_OPTION(x) \
150 (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == MTFTP_VENDOR_OPTION_BIT_MAP)
152 #define IS_VALID_DISCOVER_VENDOR_OPTION(x) (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)
154 #define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \
155 (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))
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))
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))
166 #define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) ((x)[(y) / 32]) | BIT ((y) % 32))
171 } PXEBC_DHCP4_OPTION_PARA
;
175 } PXEBC_DHCP4_OPTION_MAX_MESG_SIZE
;
181 } PXEBC_DHCP4_OPTION_UNDI
;
185 } PXEBC_DHCP4_OPTION_MESG
;
189 } PXEBC_DHCP4_OPTION_ARCH
;
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
197 UINT8 ClassIdentifier
[10];
198 UINT8 ArchitecturePrefix
[5];
199 UINT8 ArchitectureType
[5];
201 UINT8 InterfaceName
[4];
205 } PXEBC_DHCP4_OPTION_CLID
;
210 } PXEBC_DHCP4_OPTION_UUID
;
215 } PXEBC_OPTION_BOOT_ITEM
;
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
;
232 EFI_IPv4_ADDRESS IpAddr
[1];
233 } PXEBC_BOOT_SVR_ENTRY
;
239 } PXEBC_BOOT_MENU_ENTRY
;
248 EFI_IPv4_ADDRESS MtftpIp
;
254 EFI_IPv4_ADDRESS DiscoverMcastIp
;
255 EFI_IPv4_ADDRESS McastIpBase
;
260 PXEBC_BOOT_SVR_ENTRY
*BootSvr
;
262 PXEBC_BOOT_MENU_ENTRY
*BootMenu
;
264 PXEBC_MENU_PROMPT
*MenuPrompt
;
268 } PXEBC_VENDOR_OPTION
;
270 #define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE)
273 EFI_DHCP4_PACKET Offer
;
274 EFI_DHCP4_PACKET Ack
;
275 UINT8 Buffer
[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE
];
276 } PXEBC_DHCP4_PACKET
;
279 PXEBC_DHCP4_PACKET Packet
;
282 EFI_DHCP4_PACKET_OPTION
*Dhcp4Option
[PXEBC_DHCP4_TAG_INDEX_MAX
];
283 PXEBC_VENDOR_OPTION PxeVendorOption
;
284 } PXEBC_CACHED_DHCP4_PACKET
;
286 #define GET_NEXT_DHCP_OPTION(Opt) \
287 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
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)
292 #define GET_NEXT_BOOT_SVR_ENTRY(Ent) \
293 (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS))
297 This function initialize the DHCP4 message instance.
299 This function will pad each item of dhcp4 message packet.
301 @param Seed Pointer to the message instance of the DHCP4 packet.
302 @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
306 PxeBcInitSeedPacket (
307 IN EFI_DHCP4_PACKET
*Seed
,
308 IN EFI_UDP4_PROTOCOL
*Udp4
313 Parse the cached dhcp packet.
315 @param CachedPacket Pointer to cached dhcp packet.
317 @retval TRUE Succeed to parse and validation.
318 @retval FALSE Fail to parse or validation.
322 PxeBcParseCachedDhcpPacket (
323 IN PXEBC_CACHED_DHCP4_PACKET
*CachedPacket
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
331 @param Private Pointer to PxeBc private data.
333 @retval EFI_SUCCESS Operational successful.
334 @retval EFI_NO_RESPONSE Offer dhcp service failed.
338 PxeBcCheckSelectedOffer (
339 IN PXEBC_PRIVATE_DATA
*Private
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
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
359 @param Dhcp4Event The event that occurs in the current state, which usually means a
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.
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
368 @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the current process and
369 return to the Dhcp4Init or Dhcp4InitReboot state.
375 IN EFI_DHCP4_PROTOCOL
* This
,
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
385 Discover the boot of service and initialize the vendor option if exists.
387 @param Private Pointer to PxeBc private data.
388 @param Type PxeBc option boot item type
389 @param Layer PxeBc option boot item layer
390 @param UseBis Use BIS or not
391 @param DestIp Ip address for server
392 @param IpCount The total count of the server ip address
393 @param SrvList Server list
394 @param IsDiscv Discover the vendor or not
395 @param Reply The dhcp4 packet of Pxe reply
397 @retval EFI_SUCCESS Operation succeeds.
398 @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed.
399 @retval EFI_NOT_FOUND There is no vendor option exists.
400 @retval EFI_TIMEOUT Send Pxe Discover time out.
404 PxeBcDiscvBootService (
405 IN PXEBC_PRIVATE_DATA
* Private
,
409 IN EFI_IP_ADDRESS
* DestIp
,
411 IN EFI_PXE_BASE_CODE_SRVLIST
* SrvList
,
413 OUT EFI_DHCP4_PACKET
* Reply OPTIONAL
418 Initialize the DHCP options and build the option list.
420 @param Private Pointer to PxeBc private data.
421 @param OptList Pointer to a DHCP option list.
423 @param IsDhcpDiscover Discover dhcp option or not.
425 @return The index item number of the option list.
429 PxeBcBuildDhcpOptions (
430 IN PXEBC_PRIVATE_DATA
*Private
,
431 IN EFI_DHCP4_PACKET_OPTION
**OptList
,
432 IN BOOLEAN IsDhcpDiscover
437 Create the boot options.
439 @param OptList Pointer to the list of the options
440 @param Type the type of option
441 @param Layer the layer of the boot options
442 @param OptLen length of opotion
446 PxeBcCreateBootOptions (
447 IN EFI_DHCP4_PACKET_OPTION
*OptList
,
455 Parse interested dhcp options.
457 @param Buffer Pointer to the dhcp options packet.
458 @param Length The length of the dhcp options.
459 @param OptTag The option OpCode.
461 @return NULL if the buffer length is 0 and OpCode is not
462 PXEBC_DHCP4_TAG_EOP, or the pointer to the buffer.
465 EFI_DHCP4_PACKET_OPTION
*
466 PxeBcParseExtendOptions (
474 This function is to parse and check vendor options.
476 @param Dhcp4Option Pointer to dhcp options
477 @param VendorOption Pointer to vendor options
479 @return TRUE if valid for vendor options, or FALSE.
483 PxeBcParseVendorOptions (
484 IN EFI_DHCP4_PACKET_OPTION
*Dhcp4Option
,
485 IN PXEBC_VENDOR_OPTION
*VendorOption
490 Choose the boot prompt.
492 @param Private Pointer to PxeBc private data.
494 @retval EFI_SUCCESS Select boot prompt done.
495 @retval EFI_TIMEOUT Select boot prompt time out.
496 @retval EFI_NOT_FOUND The proxy offer is not Pxe10.
497 @retval EFI_ABORTED User cancel the operation.
498 @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
502 PxeBcSelectBootPrompt (
503 IN PXEBC_PRIVATE_DATA
*Private
508 Select the boot menu.
510 @param Private Pointer to PxeBc private data.
511 @param Type The type of the menu.
512 @param UseDefaultItem Use default item or not.
514 @retval EFI_ABORTED User cancel operation.
515 @retval EFI_SUCCESS Select the boot menu success.
516 @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
520 PxeBcSelectBootMenu (
521 IN PXEBC_PRIVATE_DATA
*Private
,
523 IN BOOLEAN UseDefaultItem