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