]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.h
NetworkPkg: Apply uncrustify changes
[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
f75a7f56 4 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
a3bcde70 5\r
ecf98fbc 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a3bcde70
HT
7\r
8**/\r
9\r
10#ifndef __EFI_PXEBC_DHCP4_H__\r
11#define __EFI_PXEBC_DHCP4_H__\r
12\r
d1050b9d
MK
13#define PXEBC_DHCP4_OPTION_MAX_NUM 16\r
14#define PXEBC_DHCP4_OPTION_MAX_SIZE 312\r
15#define PXEBC_DHCP4_PACKET_MAX_SIZE (sizeof (EFI_PXE_BASE_CODE_PACKET))\r
16#define PXEBC_DHCP4_S_PORT 67\r
17#define PXEBC_DHCP4_C_PORT 68\r
18#define PXEBC_BS_DOWNLOAD_PORT 69\r
19#define PXEBC_BS_DISCOVER_PORT 4011\r
20#define PXEBC_DHCP4_OPCODE_REQUEST 1\r
21#define PXEBC_DHCP4_OPCODE_REPLY 2\r
22#define PXEBC_DHCP4_MSG_TYPE_REQUEST 3\r
23#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte order\r
a3bcde70 24\r
a3bcde70
HT
25//\r
26// Sub-Options in Dhcp Vendor Option\r
27//\r
28#define PXEBC_VENDOR_TAG_MTFTP_IP 1\r
29#define PXEBC_VENDOR_TAG_MTFTP_CPORT 2\r
30#define PXEBC_VENDOR_TAG_MTFTP_SPORT 3\r
31#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT 4\r
32#define PXEBC_VENDOR_TAG_MTFTP_DELAY 5\r
33#define PXEBC_VENDOR_TAG_DISCOVER_CTRL 6\r
34#define PXEBC_VENDOR_TAG_DISCOVER_MCAST 7\r
35#define PXEBC_VENDOR_TAG_BOOT_SERVERS 8\r
36#define PXEBC_VENDOR_TAG_BOOT_MENU 9\r
37#define PXEBC_VENDOR_TAG_MENU_PROMPT 10\r
38#define PXEBC_VENDOR_TAG_MCAST_ALLOC 11\r
39#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES 12\r
40#define PXEBC_VENDOR_TAG_BOOT_ITEM 71\r
41\r
d1050b9d
MK
42#define PXEBC_BOOT_REQUEST_TIMEOUT 1\r
43#define PXEBC_BOOT_REQUEST_RETRIES 4\r
a3bcde70 44\r
d1050b9d
MK
45#define PXEBC_DHCP4_OVERLOAD_FILE 1\r
46#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2\r
a3bcde70
HT
47\r
48//\r
49// The array index of the DHCP4 option tag interested\r
50//\r
d1050b9d
MK
51#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0\r
52#define PXEBC_DHCP4_TAG_INDEX_VENDOR 1\r
53#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD 2\r
54#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE 3\r
55#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID 4\r
56#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID 5\r
57#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE 6\r
58#define PXEBC_DHCP4_TAG_INDEX_MAX 7\r
a3bcde70
HT
59\r
60//\r
61// Dhcp4 and Dhcp6 share this definition, and corresponding\r
5add2c55 62// relationship is as follows:\r
a3bcde70
HT
63//\r
64// Dhcp4Discover <> Dhcp6Solicit\r
65// Dhcp4Offer <> Dhcp6Advertise\r
66// Dhcp4Request <> Dhcp6Request\r
67// Dhcp4Ack <> DHcp6Reply\r
68//\r
69typedef enum {\r
70 PxeOfferTypeDhcpOnly,\r
71 PxeOfferTypeDhcpPxe10,\r
72 PxeOfferTypeDhcpWfm11a,\r
73 PxeOfferTypeDhcpBinl,\r
74 PxeOfferTypeProxyPxe10,\r
75 PxeOfferTypeProxyWfm11a,\r
76 PxeOfferTypeProxyBinl,\r
77 PxeOfferTypeBootp,\r
78 PxeOfferTypeMax\r
79} PXEBC_OFFER_TYPE;\r
80\r
d1050b9d
MK
81#define BIT(x) (1 << x)\r
82#define CTRL(x) (0x1F & (x))\r
83#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000"\r
84#define DEFAULT_UNDI_TYPE 1\r
85#define DEFAULT_UNDI_MAJOR 3\r
86#define DEFAULT_UNDI_MINOR 0\r
a3bcde70
HT
87\r
88#define MTFTP_VENDOR_OPTION_BIT_MAP \\r
89 (BIT (PXEBC_VENDOR_TAG_MTFTP_IP) | \\r
90 BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \\r
91 BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \\r
92 BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \\r
93 BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY))\r
94\r
95#define DISCOVER_VENDOR_OPTION_BIT_MAP \\r
96 (BIT (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \\r
97 BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \\r
98 BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \\r
99 BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \\r
100 BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))\r
101\r
9063c328 102#define IS_VALID_BOOT_SERVERS(x) \\r
103 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS)) \\r
f75a7f56 104 == BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS))\r
9063c328 105\r
a3bcde70
HT
106#define IS_VALID_BOOT_PROMPT(x) \\r
107 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) \\r
108 == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))\r
109\r
110#define IS_VALID_BOOT_MENU(x) \\r
111 ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) \\r
112 == BIT (PXEBC_VENDOR_TAG_BOOT_MENU))\r
113\r
114#define IS_VALID_MTFTP_VENDOR_OPTION(x) \\r
115 (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) \\r
116 == MTFTP_VENDOR_OPTION_BIT_MAP)\r
117\r
118#define IS_VALID_DISCOVER_VENDOR_OPTION(x) \\r
119 (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)\r
120\r
121#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \\r
122 (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) \\r
123 == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))\r
124\r
125#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \\r
126 (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & \\r
127 BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \\r
128 == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32))\r
129\r
130#define SET_VENDOR_OPTION_BIT_MAP(x, y) \\r
131 (*(x + ((y) / 32)) = (UINT32) ((UINT32) ((x)[(y) / 32]) | BIT ((y) % 32)))\r
132\r
133#define GET_NEXT_DHCP_OPTION(Opt) \\r
134 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \\r
135 sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)\r
136\r
137#define GET_OPTION_BUFFER_LEN(Pkt) \\r
138 ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)\r
139\r
140#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \\r
141 (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + \\r
142 ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS))\r
143\r
144#define IS_PROXY_DHCP_OFFER(Offer) \\r
145 EFI_IP4_EQUAL (&(Offer)->Dhcp4.Header.YourAddr, &mZeroIp4Addr)\r
146\r
147#define IS_DISABLE_BCAST_DISCOVER(x) \\r
148 (((x) & BIT (0)) == BIT (0))\r
149\r
150#define IS_DISABLE_MCAST_DISCOVER(x) \\r
151 (((x) & BIT (1)) == BIT (1))\r
152\r
153#define IS_ENABLE_USE_SERVER_LIST(x) \\r
154 (((x) & BIT (2)) == BIT (2))\r
155\r
30a95d4d 156#define IS_DISABLE_PROMPT_MENU(x) \\r
a3bcde70
HT
157 (((x) & BIT (3)) == BIT (3))\r
158\r
a3bcde70
HT
159#pragma pack(1)\r
160typedef struct {\r
d1050b9d 161 UINT8 ParaList[135];\r
a3bcde70
HT
162} PXEBC_DHCP4_OPTION_PARA;\r
163\r
164typedef struct {\r
d1050b9d 165 UINT16 Size;\r
a3bcde70
HT
166} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE;\r
167\r
168typedef struct {\r
d1050b9d
MK
169 UINT8 Type;\r
170 UINT8 MajorVer;\r
171 UINT8 MinorVer;\r
a3bcde70
HT
172} PXEBC_DHCP4_OPTION_UNDI;\r
173\r
174typedef struct {\r
d1050b9d 175 UINT8 Type;\r
a3bcde70
HT
176} PXEBC_DHCP4_OPTION_MESG;\r
177\r
178typedef struct {\r
d1050b9d 179 UINT16 Type;\r
a3bcde70
HT
180} PXEBC_DHCP4_OPTION_ARCH;\r
181\r
182typedef struct {\r
d1050b9d
MK
183 UINT8 ClassIdentifier[10];\r
184 UINT8 ArchitecturePrefix[5];\r
185 UINT8 ArchitectureType[5];\r
186 UINT8 Lit3[1];\r
187 UINT8 InterfaceName[4];\r
188 UINT8 Lit4[1];\r
189 UINT8 UndiMajor[3];\r
190 UINT8 UndiMinor[3];\r
a3bcde70
HT
191} PXEBC_DHCP4_OPTION_CLID;\r
192\r
193typedef struct {\r
d1050b9d
MK
194 UINT8 Type;\r
195 UINT8 Guid[16];\r
a3bcde70
HT
196} PXEBC_DHCP4_OPTION_UUID;\r
197\r
198typedef struct {\r
d1050b9d
MK
199 UINT16 Type;\r
200 UINT16 Layer;\r
a3bcde70
HT
201} PXEBC_OPTION_BOOT_ITEM;\r
202\r
203#pragma pack()\r
204\r
205typedef union {\r
d1050b9d
MK
206 PXEBC_DHCP4_OPTION_PARA *Para;\r
207 PXEBC_DHCP4_OPTION_UNDI *Undi;\r
208 PXEBC_DHCP4_OPTION_ARCH *Arch;\r
209 PXEBC_DHCP4_OPTION_CLID *Clid;\r
210 PXEBC_DHCP4_OPTION_UUID *Uuid;\r
211 PXEBC_DHCP4_OPTION_MESG *Mesg;\r
212 PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;\r
a3bcde70
HT
213} PXEBC_DHCP4_OPTION_ENTRY;\r
214\r
9063c328 215#pragma pack(1)\r
a3bcde70 216typedef struct {\r
d1050b9d
MK
217 UINT16 Type;\r
218 UINT8 IpCnt;\r
219 EFI_IPv4_ADDRESS IpAddr[1];\r
a3bcde70
HT
220} PXEBC_BOOT_SVR_ENTRY;\r
221\r
222typedef struct {\r
d1050b9d
MK
223 UINT16 Type;\r
224 UINT8 DescLen;\r
225 UINT8 DescStr[1];\r
a3bcde70
HT
226} PXEBC_BOOT_MENU_ENTRY;\r
227\r
228typedef struct {\r
d1050b9d
MK
229 UINT8 Timeout;\r
230 UINT8 Prompt[1];\r
a3bcde70 231} PXEBC_MENU_PROMPT;\r
9063c328 232#pragma pack()\r
a3bcde70
HT
233\r
234typedef struct {\r
d1050b9d
MK
235 UINT32 BitMap[8];\r
236 EFI_IPv4_ADDRESS MtftpIp;\r
237 UINT16 MtftpCPort;\r
238 UINT16 MtftpSPort;\r
239 UINT8 MtftpTimeout;\r
240 UINT8 MtftpDelay;\r
241 UINT8 DiscoverCtrl;\r
242 EFI_IPv4_ADDRESS DiscoverMcastIp;\r
243 EFI_IPv4_ADDRESS McastIpBase;\r
244 UINT16 McastIpBlock;\r
245 UINT16 McastIpRange;\r
246 UINT16 BootSrvType;\r
247 UINT16 BootSrvLayer;\r
248 PXEBC_BOOT_SVR_ENTRY *BootSvr;\r
249 UINT8 BootSvrLen;\r
250 PXEBC_BOOT_MENU_ENTRY *BootMenu;\r
251 UINT8 BootMenuLen;\r
252 PXEBC_MENU_PROMPT *MenuPrompt;\r
253 UINT8 MenuPromptLen;\r
254 UINT32 *CredType;\r
255 UINT8 CredTypeLen;\r
a3bcde70
HT
256} PXEBC_VENDOR_OPTION;\r
257\r
632dcfd6
FS
258#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_PACKET_MAX_SIZE)\r
259\r
a3bcde70 260typedef union {\r
d1050b9d
MK
261 EFI_DHCP4_PACKET Offer;\r
262 EFI_DHCP4_PACKET Ack;\r
263 UINT8 Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE];\r
a3bcde70
HT
264} PXEBC_DHCP4_PACKET;\r
265\r
266typedef struct {\r
d1050b9d
MK
267 PXEBC_DHCP4_PACKET Packet;\r
268 PXEBC_OFFER_TYPE OfferType;\r
269 EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_TAG_INDEX_MAX];\r
270 PXEBC_VENDOR_OPTION VendorOpt;\r
a3bcde70
HT
271} PXEBC_DHCP4_PACKET_CACHE;\r
272\r
a3bcde70
HT
273/**\r
274 Create a template DHCPv4 packet as a seed.\r
275\r
276 @param[out] Seed Pointer to the seed packet.\r
277 @param[in] Udp4 Pointer to EFI_UDP4_PROTOCOL.\r
278\r
279**/\r
280VOID\r
281PxeBcSeedDhcp4Packet (\r
d1050b9d
MK
282 OUT EFI_DHCP4_PACKET *Seed,\r
283 IN EFI_UDP4_PROTOCOL *Udp4\r
a3bcde70
HT
284 );\r
285\r
a3bcde70
HT
286/**\r
287 Parse the cached DHCPv4 packet, including all the options.\r
288\r
289 @param[in] Cache4 Pointer to cached DHCPv4 packet.\r
290\r
291 @retval EFI_SUCCESS Parsed the DHCPv4 packet successfully.\r
292 @retval EFI_DEVICE_ERROR Failed to parse and invalid packet.\r
293\r
294**/\r
295EFI_STATUS\r
296PxeBcParseDhcp4Packet (\r
d1050b9d 297 IN PXEBC_DHCP4_PACKET_CACHE *Cache4\r
a3bcde70
HT
298 );\r
299\r
a3bcde70
HT
300/**\r
301 Build and send out the request packet for the bootfile, and parse the reply.\r
302\r
303 @param[in] Private Pointer to PxeBc private data.\r
304 @param[in] Type PxeBc option boot item type.\r
305 @param[in] Layer Pointer to option boot item layer.\r
306 @param[in] UseBis Use BIS or not.\r
307 @param[in] DestIp Pointer to the server address.\r
308 @param[in] IpCount The total count of the server address.\r
309 @param[in] SrvList Pointer to EFI_PXE_BASE_CODE_SRVLIST.\r
310\r
311 @retval EFI_SUCCESS Successfully discovered boot file.\r
312 @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.\r
313 @retval EFI_NOT_FOUND Can't get the PXE reply packet.\r
314 @retval Others Failed to discover boot file.\r
315\r
316**/\r
317EFI_STATUS\r
318PxeBcDhcp4Discover (\r
d1050b9d
MK
319 IN PXEBC_PRIVATE_DATA *Private,\r
320 IN UINT16 Type,\r
321 IN UINT16 *Layer,\r
322 IN BOOLEAN UseBis,\r
323 IN EFI_IP_ADDRESS *DestIp,\r
324 IN UINT16 IpCount,\r
325 IN EFI_PXE_BASE_CODE_SRVLIST *SrvList\r
a3bcde70
HT
326 );\r
327\r
ac99793b
ZL
328/**\r
329 Switch the Ip4 policy to static.\r
330\r
331 @param[in] Private The pointer to PXEBC_PRIVATE_DATA.\r
332\r
333 @retval EFI_SUCCESS The policy is already configured to static.\r
334 @retval Others Other error as indicated..\r
335\r
336**/\r
337EFI_STATUS\r
f75a7f56 338PxeBcSetIp4Policy (\r
d1050b9d 339 IN PXEBC_PRIVATE_DATA *Private\r
ac99793b
ZL
340 );\r
341\r
a3bcde70
HT
342/**\r
343 Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other PXE boot information.\r
344\r
345 @param[in] Private Pointer to PxeBc private data.\r
346 @param[in] Dhcp4 Pointer to the EFI_DHCP4_PROTOCOL\r
347\r
348 @retval EFI_SUCCESS The D.O.R.A process successfully finished.\r
349 @retval Others Failed to finish the D.O.R.A process.\r
350\r
351**/\r
352EFI_STATUS\r
353PxeBcDhcp4Dora (\r
d1050b9d
MK
354 IN PXEBC_PRIVATE_DATA *Private,\r
355 IN EFI_DHCP4_PROTOCOL *Dhcp4\r
a3bcde70
HT
356 );\r
357\r
358#endif\r