]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.h
Fix a bug about the iSCSI DHCP dependency issue.
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcDhcp4.h
CommitLineData
a3bcde70
HT
1/** @file\r
2 Functions declaration related with DHCPv4 for UefiPxeBc Driver.\r
3\r
30a95d4d 4 Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>\r
a3bcde70
HT
5\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php.\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#ifndef __EFI_PXEBC_DHCP4_H__\r
17#define __EFI_PXEBC_DHCP4_H__\r
18\r
19#define PXEBC_DHCP4_OPTION_MAX_NUM 16\r
20#define PXEBC_DHCP4_OPTION_MAX_SIZE 312\r
21#define PXEBC_DHCP4_PACKET_MAX_SIZE 1472\r
22#define PXEBC_DHCP4_S_PORT 67\r
23#define PXEBC_DHCP4_C_PORT 68\r
24#define PXEBC_BS_DOWNLOAD_PORT 69\r
25#define PXEBC_BS_DISCOVER_PORT 4011\r
26#define PXEBC_DHCP4_OPCODE_REQUEST 1\r
27#define PXEBC_DHCP4_OPCODE_REPLY 2\r
28#define PXEBC_DHCP4_MSG_TYPE_REQUEST 3\r
29#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte order\r
30\r
31//\r
32// Dhcp Options\r
33//\r
34#define PXEBC_DHCP4_TAG_PAD 0 // Pad Option\r
35#define PXEBC_DHCP4_TAG_EOP 255 // End Option\r
36#define PXEBC_DHCP4_TAG_NETMASK 1 // Subnet Mask\r
37#define PXEBC_DHCP4_TAG_TIME_OFFSET 2 // Time Offset from UTC\r
38#define PXEBC_DHCP4_TAG_ROUTER 3 // Router option,\r
39#define PXEBC_DHCP4_TAG_TIME_SERVER 4 // Time Server\r
40#define PXEBC_DHCP4_TAG_NAME_SERVER 5 // Name Server\r
41#define PXEBC_DHCP4_TAG_DNS_SERVER 6 // Domain Name Server\r
42#define PXEBC_DHCP4_TAG_HOSTNAME 12 // Host Name\r
43#define PXEBC_DHCP4_TAG_BOOTFILE_LEN 13 // Boot File Size\r
44#define PXEBC_DHCP4_TAG_DUMP 14 // Merit Dump File\r
45#define PXEBC_DHCP4_TAG_DOMAINNAME 15 // Domain Name\r
46#define PXEBC_DHCP4_TAG_ROOTPATH 17 // Root path\r
47#define PXEBC_DHCP4_TAG_EXTEND_PATH 18 // Extensions Path\r
48#define PXEBC_DHCP4_TAG_EMTU 22 // Maximum Datagram Reassembly Size\r
49#define PXEBC_DHCP4_TAG_TTL 23 // Default IP Time-to-live\r
50#define PXEBC_DHCP4_TAG_BROADCAST 28 // Broadcast Address\r
51#define PXEBC_DHCP4_TAG_NIS_DOMAIN 40 // Network Information Service Domain\r
52#define PXEBC_DHCP4_TAG_NIS_SERVER 41 // Network Information Servers\r
53#define PXEBC_DHCP4_TAG_NTP_SERVER 42 // Network Time Protocol Servers\r
54#define PXEBC_DHCP4_TAG_VENDOR 43 // Vendor Specific Information\r
55#define PXEBC_DHCP4_TAG_REQUEST_IP 50 // Requested IP Address\r
56#define PXEBC_DHCP4_TAG_LEASE 51 // IP Address Lease Time\r
57#define PXEBC_DHCP4_TAG_OVERLOAD 52 // Option Overload\r
58#define PXEBC_DHCP4_TAG_MSG_TYPE 53 // DHCP Message Type\r
59#define PXEBC_DHCP4_TAG_SERVER_ID 54 // Server Identifier\r
60#define PXEBC_DHCP4_TAG_PARA_LIST 55 // Parameter Request List\r
61#define PXEBC_DHCP4_TAG_MAXMSG 57 // Maximum DHCP Message Size\r
62#define PXEBC_DHCP4_TAG_T1 58 // Renewal (T1) Time Value\r
63#define PXEBC_DHCP4_TAG_T2 59 // Rebinding (T2) Time Value\r
64#define PXEBC_DHCP4_TAG_CLASS_ID 60 // Vendor class identifier\r
65#define PXEBC_DHCP4_TAG_CLIENT_ID 61 // Client-identifier\r
66#define PXEBC_DHCP4_TAG_TFTP 66 // TFTP server name\r
67#define PXEBC_DHCP4_TAG_BOOTFILE 67 // Bootfile name\r
68#define PXEBC_PXE_DHCP4_TAG_ARCH 93\r
69#define PXEBC_PXE_DHCP4_TAG_UNDI 94\r
70#define PXEBC_PXE_DHCP4_TAG_UUID 97\r
71//\r
72// Sub-Options in Dhcp Vendor Option\r
73//\r
74#define PXEBC_VENDOR_TAG_MTFTP_IP 1\r
75#define PXEBC_VENDOR_TAG_MTFTP_CPORT 2\r
76#define PXEBC_VENDOR_TAG_MTFTP_SPORT 3\r
77#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT 4\r
78#define PXEBC_VENDOR_TAG_MTFTP_DELAY 5\r
79#define PXEBC_VENDOR_TAG_DISCOVER_CTRL 6\r
80#define PXEBC_VENDOR_TAG_DISCOVER_MCAST 7\r
81#define PXEBC_VENDOR_TAG_BOOT_SERVERS 8\r
82#define PXEBC_VENDOR_TAG_BOOT_MENU 9\r
83#define PXEBC_VENDOR_TAG_MENU_PROMPT 10\r
84#define PXEBC_VENDOR_TAG_MCAST_ALLOC 11\r
85#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES 12\r
86#define PXEBC_VENDOR_TAG_BOOT_ITEM 71\r
87\r
88#define PXEBC_BOOT_REQUEST_TIMEOUT 1\r
89#define PXEBC_BOOT_REQUEST_RETRIES 4\r
90\r
91#define PXEBC_DHCP4_OVERLOAD_FILE 1\r
92#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2\r
93\r
94\r
95//\r
96// The array index of the DHCP4 option tag interested\r
97//\r
98#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0\r
99#define PXEBC_DHCP4_TAG_INDEX_VENDOR 1\r
100#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD 2\r
101#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE 3\r
102#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID 4\r
103#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID 5\r
104#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE 6\r
105#define PXEBC_DHCP4_TAG_INDEX_MAX 7\r
106\r
107//\r
108// Dhcp4 and Dhcp6 share this definition, and corresponding\r
109// relatioinship is as follows:\r
110//\r
111// Dhcp4Discover <> Dhcp6Solicit\r
112// Dhcp4Offer <> Dhcp6Advertise\r
113// Dhcp4Request <> Dhcp6Request\r
114// Dhcp4Ack <> DHcp6Reply\r
115//\r
116typedef enum {\r
117 PxeOfferTypeDhcpOnly,\r
118 PxeOfferTypeDhcpPxe10,\r
119 PxeOfferTypeDhcpWfm11a,\r
120 PxeOfferTypeDhcpBinl,\r
121 PxeOfferTypeProxyPxe10,\r
122 PxeOfferTypeProxyWfm11a,\r
123 PxeOfferTypeProxyBinl,\r
124 PxeOfferTypeBootp,\r
125 PxeOfferTypeMax\r
126} PXEBC_OFFER_TYPE;\r
127\r
128#define BIT(x) (1 << x)\r
129#define CTRL(x) (0x1F & (x))\r
130#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:?????:????:??????"\r
131#define DEFAULT_UNDI_TYPE 1\r
132#define DEFAULT_UNDI_MAJOR 3\r
133#define DEFAULT_UNDI_MINOR 0\r
134\r
135#define MTFTP_VENDOR_OPTION_BIT_MAP \\r
136 (BIT (PXEBC_VENDOR_TAG_MTFTP_IP) | \\r
137 BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \\r
138 BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \\r
139 BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \\r
140 BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY))\r
141\r
142#define DISCOVER_VENDOR_OPTION_BIT_MAP \\r
143 (BIT (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \\r
144 BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \\r
145 BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \\r
146 BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \\r
147 BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))\r
148\r
9063c328 149#define IS_VALID_BOOT_SERVERS(x) \\r
150 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS)) \\r
151 == BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS)) \r
152\r
a3bcde70
HT
153#define IS_VALID_BOOT_PROMPT(x) \\r
154 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) \\r
155 == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))\r
156\r
157#define IS_VALID_BOOT_MENU(x) \\r
158 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) \\r
159 == BIT (PXEBC_VENDOR_TAG_BOOT_MENU))\r
160\r
161#define IS_VALID_MTFTP_VENDOR_OPTION(x) \\r
162 (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) \\r
163 == MTFTP_VENDOR_OPTION_BIT_MAP)\r
164\r
165#define IS_VALID_DISCOVER_VENDOR_OPTION(x) \\r
166 (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)\r
167\r
168#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \\r
169 (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) \\r
170 == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))\r
171\r
172#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \\r
173 (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & \\r
174 BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \\r
175 == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32))\r
176\r
177#define SET_VENDOR_OPTION_BIT_MAP(x, y) \\r
178 (*(x + ((y) / 32)) = (UINT32) ((UINT32) ((x)[(y) / 32]) | BIT ((y) % 32)))\r
179\r
180#define GET_NEXT_DHCP_OPTION(Opt) \\r
181 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \\r
182 sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)\r
183\r
184#define GET_OPTION_BUFFER_LEN(Pkt) \\r
185 ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)\r
186\r
187#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \\r
188 (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + \\r
189 ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS))\r
190\r
191#define IS_PROXY_DHCP_OFFER(Offer) \\r
192 EFI_IP4_EQUAL (&(Offer)->Dhcp4.Header.YourAddr, &mZeroIp4Addr)\r
193\r
194#define IS_DISABLE_BCAST_DISCOVER(x) \\r
195 (((x) & BIT (0)) == BIT (0))\r
196\r
197#define IS_DISABLE_MCAST_DISCOVER(x) \\r
198 (((x) & BIT (1)) == BIT (1))\r
199\r
200#define IS_ENABLE_USE_SERVER_LIST(x) \\r
201 (((x) & BIT (2)) == BIT (2))\r
202\r
30a95d4d 203#define IS_DISABLE_PROMPT_MENU(x) \\r
a3bcde70
HT
204 (((x) & BIT (3)) == BIT (3))\r
205\r
206\r
207#pragma pack(1)\r
208typedef struct {\r
209 UINT8 ParaList[135];\r
210} PXEBC_DHCP4_OPTION_PARA;\r
211\r
212typedef struct {\r
213 UINT16 Size;\r
214} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE;\r
215\r
216typedef struct {\r
217 UINT8 Type;\r
218 UINT8 MajorVer;\r
219 UINT8 MinorVer;\r
220} PXEBC_DHCP4_OPTION_UNDI;\r
221\r
222typedef struct {\r
223 UINT8 Type;\r
224} PXEBC_DHCP4_OPTION_MESG;\r
225\r
226typedef struct {\r
227 UINT16 Type;\r
228} PXEBC_DHCP4_OPTION_ARCH;\r
229\r
230typedef struct {\r
231 UINT8 ClassIdentifier[10];\r
232 UINT8 ArchitecturePrefix[5];\r
233 UINT8 ArchitectureType[5];\r
234 UINT8 Lit3[1];\r
235 UINT8 InterfaceName[4];\r
236 UINT8 Lit4[1];\r
237 UINT8 UndiMajor[3];\r
238 UINT8 UndiMinor[3];\r
239} PXEBC_DHCP4_OPTION_CLID;\r
240\r
241typedef struct {\r
242 UINT8 Type;\r
243 UINT8 Guid[16];\r
244} PXEBC_DHCP4_OPTION_UUID;\r
245\r
246typedef struct {\r
247 UINT16 Type;\r
248 UINT16 Layer;\r
249} PXEBC_OPTION_BOOT_ITEM;\r
250\r
251#pragma pack()\r
252\r
253typedef union {\r
254 PXEBC_DHCP4_OPTION_PARA *Para;\r
255 PXEBC_DHCP4_OPTION_UNDI *Undi;\r
256 PXEBC_DHCP4_OPTION_ARCH *Arch;\r
257 PXEBC_DHCP4_OPTION_CLID *Clid;\r
258 PXEBC_DHCP4_OPTION_UUID *Uuid;\r
259 PXEBC_DHCP4_OPTION_MESG *Mesg;\r
260 PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;\r
261} PXEBC_DHCP4_OPTION_ENTRY;\r
262\r
9063c328 263#pragma pack(1)\r
a3bcde70
HT
264typedef struct {\r
265 UINT16 Type;\r
266 UINT8 IpCnt;\r
267 EFI_IPv4_ADDRESS IpAddr[1];\r
268} PXEBC_BOOT_SVR_ENTRY;\r
269\r
270typedef struct {\r
271 UINT16 Type;\r
272 UINT8 DescLen;\r
273 UINT8 DescStr[1];\r
274} PXEBC_BOOT_MENU_ENTRY;\r
275\r
276typedef struct {\r
277 UINT8 Timeout;\r
278 UINT8 Prompt[1];\r
279} PXEBC_MENU_PROMPT;\r
9063c328 280#pragma pack()\r
a3bcde70
HT
281\r
282typedef struct {\r
283 UINT32 BitMap[8];\r
284 EFI_IPv4_ADDRESS MtftpIp;\r
285 UINT16 MtftpCPort;\r
286 UINT16 MtftpSPort;\r
287 UINT8 MtftpTimeout;\r
288 UINT8 MtftpDelay;\r
289 UINT8 DiscoverCtrl;\r
290 EFI_IPv4_ADDRESS DiscoverMcastIp;\r
291 EFI_IPv4_ADDRESS McastIpBase;\r
292 UINT16 McastIpBlock;\r
293 UINT16 McastIpRange;\r
294 UINT16 BootSrvType;\r
295 UINT16 BootSrvLayer;\r
296 PXEBC_BOOT_SVR_ENTRY *BootSvr;\r
297 UINT8 BootSvrLen;\r
298 PXEBC_BOOT_MENU_ENTRY *BootMenu;\r
299 UINT8 BootMenuLen;\r
300 PXEBC_MENU_PROMPT *MenuPrompt;\r
301 UINT8 MenuPromptLen;\r
302 UINT32 *CredType;\r
303 UINT8 CredTypeLen;\r
304} PXEBC_VENDOR_OPTION;\r
305\r
306typedef union {\r
307 EFI_DHCP4_PACKET Offer;\r
308 EFI_DHCP4_PACKET Ack;\r
309 UINT8 Buffer[PXEBC_DHCP4_PACKET_MAX_SIZE];\r
310} PXEBC_DHCP4_PACKET;\r
311\r
312typedef struct {\r
313 PXEBC_DHCP4_PACKET Packet;\r
314 PXEBC_OFFER_TYPE OfferType;\r
315 EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_TAG_INDEX_MAX];\r
316 PXEBC_VENDOR_OPTION VendorOpt;\r
317} PXEBC_DHCP4_PACKET_CACHE;\r
318\r
319\r
320/**\r
321 Create a template DHCPv4 packet as a seed.\r
322\r
323 @param[out] Seed Pointer to the seed packet.\r
324 @param[in] Udp4 Pointer to EFI_UDP4_PROTOCOL.\r
325\r
326**/\r
327VOID\r
328PxeBcSeedDhcp4Packet (\r
329 OUT EFI_DHCP4_PACKET *Seed,\r
330 IN EFI_UDP4_PROTOCOL *Udp4\r
331 );\r
332\r
333\r
334/**\r
335 Parse the cached DHCPv4 packet, including all the options.\r
336\r
337 @param[in] Cache4 Pointer to cached DHCPv4 packet.\r
338\r
339 @retval EFI_SUCCESS Parsed the DHCPv4 packet successfully.\r
340 @retval EFI_DEVICE_ERROR Failed to parse and invalid packet.\r
341\r
342**/\r
343EFI_STATUS\r
344PxeBcParseDhcp4Packet (\r
345 IN PXEBC_DHCP4_PACKET_CACHE *Cache4\r
346 );\r
347\r
348\r
349/**\r
350 Build and send out the request packet for the bootfile, and parse the reply.\r
351\r
352 @param[in] Private Pointer to PxeBc private data.\r
353 @param[in] Type PxeBc option boot item type.\r
354 @param[in] Layer Pointer to option boot item layer.\r
355 @param[in] UseBis Use BIS or not.\r
356 @param[in] DestIp Pointer to the server address.\r
357 @param[in] IpCount The total count of the server address.\r
358 @param[in] SrvList Pointer to EFI_PXE_BASE_CODE_SRVLIST.\r
359\r
360 @retval EFI_SUCCESS Successfully discovered boot file.\r
361 @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.\r
362 @retval EFI_NOT_FOUND Can't get the PXE reply packet.\r
363 @retval Others Failed to discover boot file.\r
364\r
365**/\r
366EFI_STATUS\r
367PxeBcDhcp4Discover (\r
368 IN PXEBC_PRIVATE_DATA *Private,\r
369 IN UINT16 Type,\r
370 IN UINT16 *Layer,\r
371 IN BOOLEAN UseBis,\r
372 IN EFI_IP_ADDRESS *DestIp,\r
373 IN UINT16 IpCount,\r
374 IN EFI_PXE_BASE_CODE_SRVLIST *SrvList\r
375 );\r
376\r
377\r
378/**\r
379 Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other PXE boot information.\r
380\r
381 @param[in] Private Pointer to PxeBc private data.\r
382 @param[in] Dhcp4 Pointer to the EFI_DHCP4_PROTOCOL\r
383\r
384 @retval EFI_SUCCESS The D.O.R.A process successfully finished.\r
385 @retval Others Failed to finish the D.O.R.A process.\r
386\r
387**/\r
388EFI_STATUS\r
389PxeBcDhcp4Dora (\r
390 IN PXEBC_PRIVATE_DATA *Private,\r
391 IN EFI_DHCP4_PROTOCOL *Dhcp4\r
392 );\r
393\r
394#endif\r
395\r