]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.h
Clean up the private GUID definition in module Level.
[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
4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
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
149#define IS_VALID_BOOT_PROMPT(x) \\r
150 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) \\r
151 == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))\r
152\r
153#define IS_VALID_BOOT_MENU(x) \\r
154 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) \\r
155 == BIT (PXEBC_VENDOR_TAG_BOOT_MENU))\r
156\r
157#define IS_VALID_MTFTP_VENDOR_OPTION(x) \\r
158 (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) \\r
159 == MTFTP_VENDOR_OPTION_BIT_MAP)\r
160\r
161#define IS_VALID_DISCOVER_VENDOR_OPTION(x) \\r
162 (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)\r
163\r
164#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \\r
165 (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) \\r
166 == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))\r
167\r
168#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \\r
169 (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & \\r
170 BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \\r
171 == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32))\r
172\r
173#define SET_VENDOR_OPTION_BIT_MAP(x, y) \\r
174 (*(x + ((y) / 32)) = (UINT32) ((UINT32) ((x)[(y) / 32]) | BIT ((y) % 32)))\r
175\r
176#define GET_NEXT_DHCP_OPTION(Opt) \\r
177 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \\r
178 sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)\r
179\r
180#define GET_OPTION_BUFFER_LEN(Pkt) \\r
181 ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)\r
182\r
183#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \\r
184 (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + \\r
185 ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS))\r
186\r
187#define IS_PROXY_DHCP_OFFER(Offer) \\r
188 EFI_IP4_EQUAL (&(Offer)->Dhcp4.Header.YourAddr, &mZeroIp4Addr)\r
189\r
190#define IS_DISABLE_BCAST_DISCOVER(x) \\r
191 (((x) & BIT (0)) == BIT (0))\r
192\r
193#define IS_DISABLE_MCAST_DISCOVER(x) \\r
194 (((x) & BIT (1)) == BIT (1))\r
195\r
196#define IS_ENABLE_USE_SERVER_LIST(x) \\r
197 (((x) & BIT (2)) == BIT (2))\r
198\r
199#define IS_ENABLE_BOOT_FILE_NAME(x) \\r
200 (((x) & BIT (3)) == BIT (3))\r
201\r
202\r
203#pragma pack(1)\r
204typedef struct {\r
205 UINT8 ParaList[135];\r
206} PXEBC_DHCP4_OPTION_PARA;\r
207\r
208typedef struct {\r
209 UINT16 Size;\r
210} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE;\r
211\r
212typedef struct {\r
213 UINT8 Type;\r
214 UINT8 MajorVer;\r
215 UINT8 MinorVer;\r
216} PXEBC_DHCP4_OPTION_UNDI;\r
217\r
218typedef struct {\r
219 UINT8 Type;\r
220} PXEBC_DHCP4_OPTION_MESG;\r
221\r
222typedef struct {\r
223 UINT16 Type;\r
224} PXEBC_DHCP4_OPTION_ARCH;\r
225\r
226typedef struct {\r
227 UINT8 ClassIdentifier[10];\r
228 UINT8 ArchitecturePrefix[5];\r
229 UINT8 ArchitectureType[5];\r
230 UINT8 Lit3[1];\r
231 UINT8 InterfaceName[4];\r
232 UINT8 Lit4[1];\r
233 UINT8 UndiMajor[3];\r
234 UINT8 UndiMinor[3];\r
235} PXEBC_DHCP4_OPTION_CLID;\r
236\r
237typedef struct {\r
238 UINT8 Type;\r
239 UINT8 Guid[16];\r
240} PXEBC_DHCP4_OPTION_UUID;\r
241\r
242typedef struct {\r
243 UINT16 Type;\r
244 UINT16 Layer;\r
245} PXEBC_OPTION_BOOT_ITEM;\r
246\r
247#pragma pack()\r
248\r
249typedef union {\r
250 PXEBC_DHCP4_OPTION_PARA *Para;\r
251 PXEBC_DHCP4_OPTION_UNDI *Undi;\r
252 PXEBC_DHCP4_OPTION_ARCH *Arch;\r
253 PXEBC_DHCP4_OPTION_CLID *Clid;\r
254 PXEBC_DHCP4_OPTION_UUID *Uuid;\r
255 PXEBC_DHCP4_OPTION_MESG *Mesg;\r
256 PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;\r
257} PXEBC_DHCP4_OPTION_ENTRY;\r
258\r
259typedef struct {\r
260 UINT16 Type;\r
261 UINT8 IpCnt;\r
262 EFI_IPv4_ADDRESS IpAddr[1];\r
263} PXEBC_BOOT_SVR_ENTRY;\r
264\r
265typedef struct {\r
266 UINT16 Type;\r
267 UINT8 DescLen;\r
268 UINT8 DescStr[1];\r
269} PXEBC_BOOT_MENU_ENTRY;\r
270\r
271typedef struct {\r
272 UINT8 Timeout;\r
273 UINT8 Prompt[1];\r
274} PXEBC_MENU_PROMPT;\r
275\r
276typedef struct {\r
277 UINT32 BitMap[8];\r
278 EFI_IPv4_ADDRESS MtftpIp;\r
279 UINT16 MtftpCPort;\r
280 UINT16 MtftpSPort;\r
281 UINT8 MtftpTimeout;\r
282 UINT8 MtftpDelay;\r
283 UINT8 DiscoverCtrl;\r
284 EFI_IPv4_ADDRESS DiscoverMcastIp;\r
285 EFI_IPv4_ADDRESS McastIpBase;\r
286 UINT16 McastIpBlock;\r
287 UINT16 McastIpRange;\r
288 UINT16 BootSrvType;\r
289 UINT16 BootSrvLayer;\r
290 PXEBC_BOOT_SVR_ENTRY *BootSvr;\r
291 UINT8 BootSvrLen;\r
292 PXEBC_BOOT_MENU_ENTRY *BootMenu;\r
293 UINT8 BootMenuLen;\r
294 PXEBC_MENU_PROMPT *MenuPrompt;\r
295 UINT8 MenuPromptLen;\r
296 UINT32 *CredType;\r
297 UINT8 CredTypeLen;\r
298} PXEBC_VENDOR_OPTION;\r
299\r
300typedef union {\r
301 EFI_DHCP4_PACKET Offer;\r
302 EFI_DHCP4_PACKET Ack;\r
303 UINT8 Buffer[PXEBC_DHCP4_PACKET_MAX_SIZE];\r
304} PXEBC_DHCP4_PACKET;\r
305\r
306typedef struct {\r
307 PXEBC_DHCP4_PACKET Packet;\r
308 PXEBC_OFFER_TYPE OfferType;\r
309 EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_TAG_INDEX_MAX];\r
310 PXEBC_VENDOR_OPTION VendorOpt;\r
311} PXEBC_DHCP4_PACKET_CACHE;\r
312\r
313\r
314/**\r
315 Create a template DHCPv4 packet as a seed.\r
316\r
317 @param[out] Seed Pointer to the seed packet.\r
318 @param[in] Udp4 Pointer to EFI_UDP4_PROTOCOL.\r
319\r
320**/\r
321VOID\r
322PxeBcSeedDhcp4Packet (\r
323 OUT EFI_DHCP4_PACKET *Seed,\r
324 IN EFI_UDP4_PROTOCOL *Udp4\r
325 );\r
326\r
327\r
328/**\r
329 Parse the cached DHCPv4 packet, including all the options.\r
330\r
331 @param[in] Cache4 Pointer to cached DHCPv4 packet.\r
332\r
333 @retval EFI_SUCCESS Parsed the DHCPv4 packet successfully.\r
334 @retval EFI_DEVICE_ERROR Failed to parse and invalid packet.\r
335\r
336**/\r
337EFI_STATUS\r
338PxeBcParseDhcp4Packet (\r
339 IN PXEBC_DHCP4_PACKET_CACHE *Cache4\r
340 );\r
341\r
342\r
343/**\r
344 Build and send out the request packet for the bootfile, and parse the reply.\r
345\r
346 @param[in] Private Pointer to PxeBc private data.\r
347 @param[in] Type PxeBc option boot item type.\r
348 @param[in] Layer Pointer to option boot item layer.\r
349 @param[in] UseBis Use BIS or not.\r
350 @param[in] DestIp Pointer to the server address.\r
351 @param[in] IpCount The total count of the server address.\r
352 @param[in] SrvList Pointer to EFI_PXE_BASE_CODE_SRVLIST.\r
353\r
354 @retval EFI_SUCCESS Successfully discovered boot file.\r
355 @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.\r
356 @retval EFI_NOT_FOUND Can't get the PXE reply packet.\r
357 @retval Others Failed to discover boot file.\r
358\r
359**/\r
360EFI_STATUS\r
361PxeBcDhcp4Discover (\r
362 IN PXEBC_PRIVATE_DATA *Private,\r
363 IN UINT16 Type,\r
364 IN UINT16 *Layer,\r
365 IN BOOLEAN UseBis,\r
366 IN EFI_IP_ADDRESS *DestIp,\r
367 IN UINT16 IpCount,\r
368 IN EFI_PXE_BASE_CODE_SRVLIST *SrvList\r
369 );\r
370\r
371\r
372/**\r
373 Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other PXE boot information.\r
374\r
375 @param[in] Private Pointer to PxeBc private data.\r
376 @param[in] Dhcp4 Pointer to the EFI_DHCP4_PROTOCOL\r
377\r
378 @retval EFI_SUCCESS The D.O.R.A process successfully finished.\r
379 @retval Others Failed to finish the D.O.R.A process.\r
380\r
381**/\r
382EFI_STATUS\r
383PxeBcDhcp4Dora (\r
384 IN PXEBC_PRIVATE_DATA *Private,\r
385 IN EFI_DHCP4_PROTOCOL *Dhcp4\r
386 );\r
387\r
388#endif\r
389\r