]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/HttpBootDxe/HttpBootDhcp4.h
NetworkPkg: Replace BSD License with BSD+Patent License
[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
f75a7f56 4Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
ecf98fbc 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
d933e70a
JW
6\r
7**/\r
8\r
9#ifndef __EFI_UEFI_HTTP_BOOT_DHCP4_H__\r
10#define __EFI_UEFI_HTTP_BOOT_DHCP4_H__\r
11\r
12#define HTTP_BOOT_DHCP4_OPTION_MAX_NUM 16\r
13#define HTTP_BOOT_DHCP4_OPTION_MAX_SIZE 312\r
14#define HTTP_BOOT_DHCP4_PACKET_MAX_SIZE 1472\r
15\r
16#define HTTP_BOOT_DHCP4_OPCODE_REQUEST 1\r
17#define HTTP_BOOT_DHCP4_OPCODE_REPLY 2\r
18#define HTTP_BOOT_DHCP4_MSG_TYPE_REQUEST 3\r
19#define HTTP_BOOT_DHCP4_MAGIC 0x63538263 // network byte order\r
20\r
d933e70a
JW
21#define HTTP_BOOT_DHCP4_OVERLOAD_FILE 1\r
22#define HTTP_BOOT_DHCP4_OVERLOAD_SERVER_NAME 2\r
23\r
24///\r
f75a7f56 25/// HTTP Tag definition that identifies the processor\r
d933e70a
JW
26/// and programming environment of the client system.\r
27/// These identifiers are defined by IETF:\r
28/// http://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml\r
29///\r
30#if defined (MDE_CPU_IA32)\r
142c00c3 31#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_IA32\r
d933e70a 32#elif defined (MDE_CPU_X64)\r
142c00c3 33#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_X64\r
d933e70a 34#elif defined (MDE_CPU_ARM)\r
142c00c3 35#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_ARM\r
d933e70a 36#elif defined (MDE_CPU_AARCH64)\r
142c00c3 37#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_AARCH64\r
d933e70a 38#elif defined (MDE_CPU_EBC)\r
142c00c3 39#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_EBC\r
d933e70a
JW
40#endif\r
41\r
42/// DHCP offer types among HTTP boot.\r
43/// Dhcp4 and Dhcp6 share this definition, and corresponding\r
44/// relatioinship is as follows:\r
45/// Dhcp4Discover <> Dhcp6Solicit\r
46/// Dhcp4Offer <> Dhcp6Advertise\r
47/// Dhcp4Request <> Dhcp6Request\r
48/// Dhcp4Ack <> DHcp6Reply\r
49///\r
50typedef enum {\r
51 //\r
fa848a40 52 // <IP address, IP expressed URI>\r
d933e70a
JW
53 //\r
54 HttpOfferTypeDhcpIpUri,\r
55 //\r
fa848a40
FS
56 // <IP address, IP expressed URI, Name-server>\r
57 //\r
58 HttpOfferTypeDhcpIpUriDns,\r
59 //\r
d933e70a
JW
60 // <IP address, Domain-name expressed URI, Name-server>\r
61 //\r
62 HttpOfferTypeDhcpNameUriDns,\r
63 //\r
64 // <IP address, Name-server>\r
65 //\r
66 HttpOfferTypeDhcpDns,\r
67 //\r
68 // <IP address>\r
69 //\r
70 HttpOfferTypeDhcpOnly,\r
71 //\r
72 // <Domain-name expressed URI> or\r
73 // <Domain-name expressed URI, Name-server (will be ignored)>\r
74 //\r
75 HttpOfferTypeProxyNameUri,\r
76 //\r
77 // <IP expressed URI> or\r
78 // <IP expressed URI, Name-server (will be ignored)>\r
79 //\r
80 HttpOfferTypeProxyIpUri,\r
81 //\r
82 // <IP address, Domain-name expressed URI>\r
83 //\r
84 HttpOfferTypeDhcpNameUri,\r
85 HttpOfferTypeMax\r
86} HTTP_BOOT_OFFER_TYPE;\r
87\r
88#define HTTP_BOOT_DHCP_RETRIES 4\r
89#define HTTP_BOOT_OFFER_MAX_NUM 16\r
90\r
91// The array index of the DHCP4 option tag interested\r
92//\r
93#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE_LEN 0\r
94#define HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD 1\r
95#define HTTP_BOOT_DHCP4_TAG_INDEX_MSG_TYPE 2\r
96#define HTTP_BOOT_DHCP4_TAG_INDEX_SERVER_ID 3\r
97#define HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID 4\r
98#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE 5\r
99#define HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER 6\r
100#define HTTP_BOOT_DHCP4_TAG_INDEX_MAX 7\r
101\r
102#pragma pack(1)\r
103\r
104typedef struct {\r
105 UINT8 ParaList[135];\r
106} HTTP_BOOT_DHCP4_OPTION_PARA;\r
107\r
108typedef struct {\r
109 UINT16 Size;\r
110} HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE;\r
111\r
112typedef struct {\r
113 UINT8 Type;\r
114 UINT8 MajorVer;\r
115 UINT8 MinorVer;\r
116} HTTP_BOOT_DHCP4_OPTION_UNDI;\r
117\r
118typedef struct {\r
119 UINT8 Type;\r
120} HTTP_BOOT_DHCP4_OPTION_MESG;\r
121\r
122typedef struct {\r
123 UINT16 Type;\r
124} HTTP_BOOT_DHCP4_OPTION_ARCH;\r
125\r
126typedef struct {\r
127 UINT8 ClassIdentifier[11];\r
128 UINT8 ArchitecturePrefix[5];\r
129 UINT8 ArchitectureType[5];\r
130 UINT8 Lit3[1];\r
131 UINT8 InterfaceName[4];\r
132 UINT8 Lit4[1];\r
133 UINT8 UndiMajor[3];\r
134 UINT8 UndiMinor[3];\r
135} HTTP_BOOT_DHCP4_OPTION_CLID;\r
136\r
137typedef struct {\r
138 UINT8 Type;\r
139 UINT8 Guid[16];\r
140} HTTP_BOOT_DHCP4_OPTION_UUID;\r
141\r
142typedef struct {\r
143 UINT16 Type;\r
144 UINT16 Layer;\r
145} HTTP_BOOT_OPTION_BOOT_ITEM;\r
146\r
147#pragma pack()\r
148\r
149typedef union {\r
150 HTTP_BOOT_DHCP4_OPTION_PARA *Para;\r
151 HTTP_BOOT_DHCP4_OPTION_UNDI *Undi;\r
152 HTTP_BOOT_DHCP4_OPTION_ARCH *Arch;\r
153 HTTP_BOOT_DHCP4_OPTION_CLID *Clid;\r
154 HTTP_BOOT_DHCP4_OPTION_UUID *Uuid;\r
155 HTTP_BOOT_DHCP4_OPTION_MESG *Mesg;\r
156 HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;\r
157} HTTP_BOOT_DHCP4_OPTION_ENTRY;\r
158\r
159#define GET_NEXT_DHCP_OPTION(Opt) \\r
160 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \\r
161 sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)\r
162\r
163#define GET_OPTION_BUFFER_LEN(Pkt) \\r
164 ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)\r
165\r
166#define DEFAULT_CLASS_ID_DATA "HTTPClient:Arch:xxxxx:UNDI:003000"\r
167#define DEFAULT_UNDI_TYPE 1\r
168#define DEFAULT_UNDI_MAJOR 3\r
169#define DEFAULT_UNDI_MINOR 0\r
170\r
171typedef struct {\r
172 UINT32 Reserved;\r
173} HTTP_BOOT_VENDOR_OPTION;\r
174\r
632dcfd6
FS
175#define HTTP_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + HTTP_BOOT_DHCP4_PACKET_MAX_SIZE)\r
176\r
d933e70a
JW
177typedef union {\r
178 EFI_DHCP4_PACKET Offer;\r
179 EFI_DHCP4_PACKET Ack;\r
632dcfd6 180 UINT8 Buffer[HTTP_CACHED_DHCP4_PACKET_MAX_SIZE];\r
d933e70a
JW
181} HTTP_BOOT_DHCP4_PACKET;\r
182\r
183typedef struct {\r
184 //\r
185 // URI component\r
186 //\r
187 CHAR8 *Scheme;\r
188 CHAR8 *Authority;\r
189 CHAR8 *Path;\r
190 CHAR8 *Query;\r
191 CHAR8 *Fragment; /// TODO: may not required in HTTP URL\r
192\r
193 CHAR8 *RegName; /// Point to somewhere in Authority\r
194 BOOLEAN AddrIsOk;\r
195 EFI_IP_ADDRESS Address;\r
196 UINT16 Port;\r
197} HTTP_BOOT_URI_CONTENT;\r
198\r
199typedef struct {\r
200 HTTP_BOOT_DHCP4_PACKET Packet;\r
201 HTTP_BOOT_OFFER_TYPE OfferType;\r
202 VOID *UriParser;\r
203 EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_TAG_INDEX_MAX];\r
204} HTTP_BOOT_DHCP4_PACKET_CACHE;\r
205\r
b659408b
ZL
206/**\r
207 Select an DHCPv4 or DHCP6 offer, and record SelectIndex and SelectProxyType.\r
208\r
209 @param[in] Private Pointer to HTTP boot driver private data.\r
210\r
211**/\r
212VOID\r
213HttpBootSelectDhcpOffer (\r
214 IN HTTP_BOOT_PRIVATE_DATA *Private\r
215 );\r
216\r
d933e70a
JW
217/**\r
218 Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other Http boot information.\r
219\r
220 @param[in] Private Pointer to HTTP_BOOT private data.\r
221\r
222 @retval EFI_SUCCESS The D.O.R.A process successfully finished.\r
223 @retval Others Failed to finish the D.O.R.A process.\r
224\r
225**/\r
226EFI_STATUS\r
227HttpBootDhcp4Dora (\r
228 IN HTTP_BOOT_PRIVATE_DATA *Private\r
229 );\r
230\r
231/**\r
232 This function will register the default DNS addresses to the network device.\r
f75a7f56 233\r
d933e70a
JW
234 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA.\r
235 @param[in] DataLength Size of the buffer pointed to by DnsServerData in bytes.\r
236 @param[in] DnsServerData Point a list of DNS server address in an array\r
237 of EFI_IPv4_ADDRESS instances.\r
238\r
239 @retval EFI_SUCCESS The DNS configuration has been configured successfully.\r
240 @retval Others Failed to configure the address.\r
241\r
242**/\r
243EFI_STATUS\r
244HttpBootRegisterIp4Dns (\r
245 IN HTTP_BOOT_PRIVATE_DATA *Private,\r
246 IN UINTN DataLength,\r
247 IN VOID *DnsServerData\r
248 );\r
249\r
250#endif\r