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