]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/HttpBootDxe/HttpBootDhcp4.h
NetworkPkg: Add URI configuration form to HTTP boot driver.
[mirror_edk2.git] / NetworkPkg / HttpBootDxe / HttpBootDhcp4.h
CommitLineData
d933e70a
JW
1/** @file\r
2 Functions declaration related with DHCPv4 for HTTP boot driver.\r
3\r
fa848a40 4Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
d933e70a
JW
5This program and the accompanying materials are licensed and made available under \r
6the terms and conditions of the BSD License that accompanies this distribution. \r
7The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php. \r
9 \r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#ifndef __EFI_UEFI_HTTP_BOOT_DHCP4_H__\r
16#define __EFI_UEFI_HTTP_BOOT_DHCP4_H__\r
17\r
18#define HTTP_BOOT_DHCP4_OPTION_MAX_NUM 16\r
19#define HTTP_BOOT_DHCP4_OPTION_MAX_SIZE 312\r
20#define HTTP_BOOT_DHCP4_PACKET_MAX_SIZE 1472\r
21\r
22#define HTTP_BOOT_DHCP4_OPCODE_REQUEST 1\r
23#define HTTP_BOOT_DHCP4_OPCODE_REPLY 2\r
24#define HTTP_BOOT_DHCP4_MSG_TYPE_REQUEST 3\r
25#define HTTP_BOOT_DHCP4_MAGIC 0x63538263 // network byte order\r
26\r
27//\r
28// Dhcp Options\r
29//\r
30#define HTTP_BOOT_DHCP4_TAG_PAD 0 // Pad Option\r
31#define HTTP_BOOT_DHCP4_TAG_EOP 255 // End Option\r
32#define HTTP_BOOT_DHCP4_TAG_NETMASK 1 // Subnet Mask\r
33#define HTTP_BOOT_DHCP4_TAG_TIME_OFFSET 2 // Time Offset from UTC\r
34#define HTTP_BOOT_DHCP4_TAG_ROUTER 3 // Router option,\r
35#define HTTP_BOOT_DHCP4_TAG_TIME_SERVER 4 // Time Server\r
36#define HTTP_BOOT_DHCP4_TAG_NAME_SERVER 5 // Name Server\r
37#define HTTP_BOOT_DHCP4_TAG_DNS_SERVER 6 // Domain Name Server\r
38#define HTTP_BOOT_DHCP4_TAG_HOSTNAME 12 // Host Name\r
39#define HTTP_BOOT_DHCP4_TAG_BOOTFILE_LEN 13 // Boot File Size\r
40#define HTTP_BOOT_DHCP4_TAG_DUMP 14 // Merit Dump File\r
41#define HTTP_BOOT_DHCP4_TAG_DOMAINNAME 15 // Domain Name\r
42#define HTTP_BOOT_DHCP4_TAG_ROOTPATH 17 // Root path\r
43#define HTTP_BOOT_DHCP4_TAG_EXTEND_PATH 18 // Extensions Path\r
44#define HTTP_BOOT_DHCP4_TAG_EMTU 22 // Maximum Datagram Reassembly Size\r
45#define HTTP_BOOT_DHCP4_TAG_TTL 23 // Default IP Time-to-live\r
46#define HTTP_BOOT_DHCP4_TAG_BROADCAST 28 // Broadcast Address\r
47#define HTTP_BOOT_DHCP4_TAG_NIS_DOMAIN 40 // Network Information Service Domain\r
48#define HTTP_BOOT_DHCP4_TAG_NIS_SERVER 41 // Network Information Servers\r
49#define HTTP_BOOT_DHCP4_TAG_NTP_SERVER 42 // Network Time Protocol Servers\r
50#define HTTP_BOOT_DHCP4_TAG_VENDOR 43 // Vendor Specific Information\r
51#define HTTP_BOOT_DHCP4_TAG_REQUEST_IP 50 // Requested IP Address\r
52#define HTTP_BOOT_DHCP4_TAG_LEASE 51 // IP Address Lease Time\r
53#define HTTP_BOOT_DHCP4_TAG_OVERLOAD 52 // Option Overload\r
54#define HTTP_BOOT_DHCP4_TAG_MSG_TYPE 53 // DHCP Message Type\r
55#define HTTP_BOOT_DHCP4_TAG_SERVER_ID 54 // Server Identifier\r
56#define HTTP_BOOT_DHCP4_TAG_PARA_LIST 55 // Parameter Request List\r
57#define HTTP_BOOT_DHCP4_TAG_MAXMSG 57 // Maximum DHCP Message Size\r
58#define HTTP_BOOT_DHCP4_TAG_T1 58 // Renewal (T1) Time Value\r
59#define HTTP_BOOT_DHCP4_TAG_T2 59 // Rebinding (T2) Time Value\r
60#define HTTP_BOOT_DHCP4_TAG_CLASS_ID 60 // Vendor class identifier\r
61#define HTTP_BOOT_DHCP4_TAG_CLIENT_ID 61 // Client-identifier\r
62#define HTTP_BOOT_DHCP4_TAG_TFTP 66 // TFTP server name\r
63#define HTTP_BOOT_DHCP4_TAG_BOOTFILE 67 // Bootfile name\r
64#define HTTP_BOOT_DHCP4_TAG_ARCH 93\r
65#define HTTP_BOOT_DHCP4_TAG_UNDI 94\r
66#define HTTP_BOOT_DHCP4_TAG_UUID 97\r
67\r
68#define HTTP_BOOT_DHCP4_OVERLOAD_FILE 1\r
69#define HTTP_BOOT_DHCP4_OVERLOAD_SERVER_NAME 2\r
70\r
71///\r
72/// HTTP Tag definition that identifies the processor \r
73/// and programming environment of the client system.\r
74/// These identifiers are defined by IETF:\r
75/// http://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml\r
76///\r
77#if defined (MDE_CPU_IA32)\r
78#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE 0x000F\r
79#elif defined (MDE_CPU_X64)\r
80#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE 0x0010\r
81#elif defined (MDE_CPU_ARM)\r
82#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE 0x0012\r
83#elif defined (MDE_CPU_AARCH64)\r
84#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE 0x0013\r
85#elif defined (MDE_CPU_EBC)\r
86#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE 0x0011\r
87#endif\r
88\r
89/// DHCP offer types among HTTP boot.\r
90/// Dhcp4 and Dhcp6 share this definition, and corresponding\r
91/// relatioinship is as follows:\r
92/// Dhcp4Discover <> Dhcp6Solicit\r
93/// Dhcp4Offer <> Dhcp6Advertise\r
94/// Dhcp4Request <> Dhcp6Request\r
95/// Dhcp4Ack <> DHcp6Reply\r
96///\r
97typedef enum {\r
98 //\r
fa848a40 99 // <IP address, IP expressed URI>\r
d933e70a
JW
100 //\r
101 HttpOfferTypeDhcpIpUri,\r
102 //\r
fa848a40
FS
103 // <IP address, IP expressed URI, Name-server>\r
104 //\r
105 HttpOfferTypeDhcpIpUriDns,\r
106 //\r
d933e70a
JW
107 // <IP address, Domain-name expressed URI, Name-server>\r
108 //\r
109 HttpOfferTypeDhcpNameUriDns,\r
110 //\r
111 // <IP address, Name-server>\r
112 //\r
113 HttpOfferTypeDhcpDns,\r
114 //\r
115 // <IP address>\r
116 //\r
117 HttpOfferTypeDhcpOnly,\r
118 //\r
119 // <Domain-name expressed URI> or\r
120 // <Domain-name expressed URI, Name-server (will be ignored)>\r
121 //\r
122 HttpOfferTypeProxyNameUri,\r
123 //\r
124 // <IP expressed URI> or\r
125 // <IP expressed URI, Name-server (will be ignored)>\r
126 //\r
127 HttpOfferTypeProxyIpUri,\r
128 //\r
129 // <IP address, Domain-name expressed URI>\r
130 //\r
131 HttpOfferTypeDhcpNameUri,\r
132 HttpOfferTypeMax\r
133} HTTP_BOOT_OFFER_TYPE;\r
134\r
135#define HTTP_BOOT_DHCP_RETRIES 4\r
136#define HTTP_BOOT_OFFER_MAX_NUM 16\r
137\r
138// The array index of the DHCP4 option tag interested\r
139//\r
140#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE_LEN 0\r
141#define HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD 1\r
142#define HTTP_BOOT_DHCP4_TAG_INDEX_MSG_TYPE 2\r
143#define HTTP_BOOT_DHCP4_TAG_INDEX_SERVER_ID 3\r
144#define HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID 4\r
145#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE 5\r
146#define HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER 6\r
147#define HTTP_BOOT_DHCP4_TAG_INDEX_MAX 7\r
148\r
149#pragma pack(1)\r
150\r
151typedef struct {\r
152 UINT8 ParaList[135];\r
153} HTTP_BOOT_DHCP4_OPTION_PARA;\r
154\r
155typedef struct {\r
156 UINT16 Size;\r
157} HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE;\r
158\r
159typedef struct {\r
160 UINT8 Type;\r
161 UINT8 MajorVer;\r
162 UINT8 MinorVer;\r
163} HTTP_BOOT_DHCP4_OPTION_UNDI;\r
164\r
165typedef struct {\r
166 UINT8 Type;\r
167} HTTP_BOOT_DHCP4_OPTION_MESG;\r
168\r
169typedef struct {\r
170 UINT16 Type;\r
171} HTTP_BOOT_DHCP4_OPTION_ARCH;\r
172\r
173typedef struct {\r
174 UINT8 ClassIdentifier[11];\r
175 UINT8 ArchitecturePrefix[5];\r
176 UINT8 ArchitectureType[5];\r
177 UINT8 Lit3[1];\r
178 UINT8 InterfaceName[4];\r
179 UINT8 Lit4[1];\r
180 UINT8 UndiMajor[3];\r
181 UINT8 UndiMinor[3];\r
182} HTTP_BOOT_DHCP4_OPTION_CLID;\r
183\r
184typedef struct {\r
185 UINT8 Type;\r
186 UINT8 Guid[16];\r
187} HTTP_BOOT_DHCP4_OPTION_UUID;\r
188\r
189typedef struct {\r
190 UINT16 Type;\r
191 UINT16 Layer;\r
192} HTTP_BOOT_OPTION_BOOT_ITEM;\r
193\r
194#pragma pack()\r
195\r
196typedef union {\r
197 HTTP_BOOT_DHCP4_OPTION_PARA *Para;\r
198 HTTP_BOOT_DHCP4_OPTION_UNDI *Undi;\r
199 HTTP_BOOT_DHCP4_OPTION_ARCH *Arch;\r
200 HTTP_BOOT_DHCP4_OPTION_CLID *Clid;\r
201 HTTP_BOOT_DHCP4_OPTION_UUID *Uuid;\r
202 HTTP_BOOT_DHCP4_OPTION_MESG *Mesg;\r
203 HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;\r
204} HTTP_BOOT_DHCP4_OPTION_ENTRY;\r
205\r
206#define GET_NEXT_DHCP_OPTION(Opt) \\r
207 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \\r
208 sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)\r
209\r
210#define GET_OPTION_BUFFER_LEN(Pkt) \\r
211 ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)\r
212\r
213#define DEFAULT_CLASS_ID_DATA "HTTPClient:Arch:xxxxx:UNDI:003000"\r
214#define DEFAULT_UNDI_TYPE 1\r
215#define DEFAULT_UNDI_MAJOR 3\r
216#define DEFAULT_UNDI_MINOR 0\r
217\r
218typedef struct {\r
219 UINT32 Reserved;\r
220} HTTP_BOOT_VENDOR_OPTION;\r
221\r
222typedef union {\r
223 EFI_DHCP4_PACKET Offer;\r
224 EFI_DHCP4_PACKET Ack;\r
225 UINT8 Buffer[HTTP_BOOT_DHCP4_PACKET_MAX_SIZE];\r
226} HTTP_BOOT_DHCP4_PACKET;\r
227\r
228typedef struct {\r
229 //\r
230 // URI component\r
231 //\r
232 CHAR8 *Scheme;\r
233 CHAR8 *Authority;\r
234 CHAR8 *Path;\r
235 CHAR8 *Query;\r
236 CHAR8 *Fragment; /// TODO: may not required in HTTP URL\r
237\r
238 CHAR8 *RegName; /// Point to somewhere in Authority\r
239 BOOLEAN AddrIsOk;\r
240 EFI_IP_ADDRESS Address;\r
241 UINT16 Port;\r
242} HTTP_BOOT_URI_CONTENT;\r
243\r
244typedef struct {\r
245 HTTP_BOOT_DHCP4_PACKET Packet;\r
246 HTTP_BOOT_OFFER_TYPE OfferType;\r
247 VOID *UriParser;\r
248 EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_TAG_INDEX_MAX];\r
249} HTTP_BOOT_DHCP4_PACKET_CACHE;\r
250\r
b659408b
ZL
251/**\r
252 Select an DHCPv4 or DHCP6 offer, and record SelectIndex and SelectProxyType.\r
253\r
254 @param[in] Private Pointer to HTTP boot driver private data.\r
255\r
256**/\r
257VOID\r
258HttpBootSelectDhcpOffer (\r
259 IN HTTP_BOOT_PRIVATE_DATA *Private\r
260 );\r
261\r
d933e70a
JW
262/**\r
263 Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other Http boot information.\r
264\r
265 @param[in] Private Pointer to HTTP_BOOT private data.\r
266\r
267 @retval EFI_SUCCESS The D.O.R.A process successfully finished.\r
268 @retval Others Failed to finish the D.O.R.A process.\r
269\r
270**/\r
271EFI_STATUS\r
272HttpBootDhcp4Dora (\r
273 IN HTTP_BOOT_PRIVATE_DATA *Private\r
274 );\r
275\r
276/**\r
277 This function will register the default DNS addresses to the network device.\r
278 \r
279 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA.\r
280 @param[in] DataLength Size of the buffer pointed to by DnsServerData in bytes.\r
281 @param[in] DnsServerData Point a list of DNS server address in an array\r
282 of EFI_IPv4_ADDRESS instances.\r
283\r
284 @retval EFI_SUCCESS The DNS configuration has been configured successfully.\r
285 @retval Others Failed to configure the address.\r
286\r
287**/\r
288EFI_STATUS\r
289HttpBootRegisterIp4Dns (\r
290 IN HTTP_BOOT_PRIVATE_DATA *Private,\r
291 IN UINTN DataLength,\r
292 IN VOID *DnsServerData\r
293 );\r
294\r
295#endif\r