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