]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/HttpBootDxe/HttpBootDhcp4.h
BaseTools: Add /arch:IA32 option in VS2012 and VS2013
[mirror_edk2.git] / NetworkPkg / HttpBootDxe / HttpBootDhcp4.h
CommitLineData
c4545d76
FS
1/** @file
2 Functions declaration related with DHCPv4 for HTTP boot driver.
3
4Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
5This program and the accompanying materials are licensed and made available under
6the terms and conditions of the BSD License that accompanies this distribution.
7The full text of the license may be found at
8http://opensource.org/licenses/bsd-license.php.
9
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11WITHOUT 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
5e0cdec1
ZL
85#elif defined (MDE_CPU_EBC)
86#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE 0x0011
c4545d76
FS
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///
97typedef enum {
98 //
99 // <IP address, IP expressed URI> or
100 // <IP address, IP expressed URI, Name-server (will be ignored)>
101 //
102 HttpOfferTypeDhcpIpUri,
103 //
104 // <IP address, Domain-name expressed URI, Name-server>
105 //
106 HttpOfferTypeDhcpNameUriDns,
107 //
108 // <IP address, Name-server>
109 //
110 HttpOfferTypeDhcpDns,
111 //
112 // <IP address>
113 //
114 HttpOfferTypeDhcpOnly,
115 //
116 // <Domain-name expressed URI> or
117 // <Domain-name expressed URI, Name-server (will be ignored)>
118 //
119 HttpOfferTypeProxyNameUri,
120 //
121 // <IP expressed URI> or
122 // <IP expressed URI, Name-server (will be ignored)>
123 //
124 HttpOfferTypeProxyIpUri,
125 //
126 // <IP address, Domain-name expressed URI>
127 //
128 HttpOfferTypeDhcpNameUri,
129 HttpOfferTypeMax
130} HTTP_BOOT_OFFER_TYPE;
131
132#define HTTP_BOOT_DHCP_RETRIES 4
133#define HTTP_BOOT_OFFER_MAX_NUM 16
134
135// The array index of the DHCP4 option tag interested
136//
137#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
138#define HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD 1
139#define HTTP_BOOT_DHCP4_TAG_INDEX_MSG_TYPE 2
140#define HTTP_BOOT_DHCP4_TAG_INDEX_SERVER_ID 3
141#define HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID 4
142#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE 5
143#define HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER 6
144#define HTTP_BOOT_DHCP4_TAG_INDEX_MAX 7
145
146#pragma pack(1)
147
148typedef struct {
149 UINT8 ParaList[135];
150} HTTP_BOOT_DHCP4_OPTION_PARA;
151
152typedef struct {
153 UINT16 Size;
154} HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE;
155
156typedef struct {
157 UINT8 Type;
158 UINT8 MajorVer;
159 UINT8 MinorVer;
160} HTTP_BOOT_DHCP4_OPTION_UNDI;
161
162typedef struct {
163 UINT8 Type;
164} HTTP_BOOT_DHCP4_OPTION_MESG;
165
166typedef struct {
167 UINT16 Type;
168} HTTP_BOOT_DHCP4_OPTION_ARCH;
169
170typedef struct {
171 UINT8 ClassIdentifier[11];
172 UINT8 ArchitecturePrefix[5];
173 UINT8 ArchitectureType[5];
174 UINT8 Lit3[1];
175 UINT8 InterfaceName[4];
176 UINT8 Lit4[1];
177 UINT8 UndiMajor[3];
178 UINT8 UndiMinor[3];
179} HTTP_BOOT_DHCP4_OPTION_CLID;
180
181typedef struct {
182 UINT8 Type;
183 UINT8 Guid[16];
184} HTTP_BOOT_DHCP4_OPTION_UUID;
185
186typedef struct {
187 UINT16 Type;
188 UINT16 Layer;
189} HTTP_BOOT_OPTION_BOOT_ITEM;
190
191#pragma pack()
192
193typedef union {
194 HTTP_BOOT_DHCP4_OPTION_PARA *Para;
195 HTTP_BOOT_DHCP4_OPTION_UNDI *Undi;
196 HTTP_BOOT_DHCP4_OPTION_ARCH *Arch;
197 HTTP_BOOT_DHCP4_OPTION_CLID *Clid;
198 HTTP_BOOT_DHCP4_OPTION_UUID *Uuid;
199 HTTP_BOOT_DHCP4_OPTION_MESG *Mesg;
200 HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;
201} HTTP_BOOT_DHCP4_OPTION_ENTRY;
202
203#define GET_NEXT_DHCP_OPTION(Opt) \
204 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \
205 sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
206
207#define GET_OPTION_BUFFER_LEN(Pkt) \
208 ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
209
210#define DEFAULT_CLASS_ID_DATA "HTTPClient:Arch:xxxxx:UNDI:003000"
211#define DEFAULT_UNDI_TYPE 1
212#define DEFAULT_UNDI_MAJOR 3
213#define DEFAULT_UNDI_MINOR 0
214
215typedef struct {
216 UINT32 Reserved;
217} HTTP_BOOT_VENDOR_OPTION;
218
219typedef union {
220 EFI_DHCP4_PACKET Offer;
221 EFI_DHCP4_PACKET Ack;
222 UINT8 Buffer[HTTP_BOOT_DHCP4_PACKET_MAX_SIZE];
223} HTTP_BOOT_DHCP4_PACKET;
224
225typedef struct {
226 //
227 // URI component
228 //
229 CHAR8 *Scheme;
230 CHAR8 *Authority;
231 CHAR8 *Path;
232 CHAR8 *Query;
233 CHAR8 *Fragment; /// TODO: may not required in HTTP URL
234
235 CHAR8 *RegName; /// Point to somewhere in Authority
236 BOOLEAN AddrIsOk;
237 EFI_IP_ADDRESS Address;
238 UINT16 Port;
239} HTTP_BOOT_URI_CONTENT;
240
241typedef struct {
242 HTTP_BOOT_DHCP4_PACKET Packet;
243 HTTP_BOOT_OFFER_TYPE OfferType;
244 VOID *UriParser;
245 EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_TAG_INDEX_MAX];
246} HTTP_BOOT_DHCP4_PACKET_CACHE;
247
248/**
249 Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other Http boot information.
250
251 @param[in] Private Pointer to HTTP_BOOT private data.
252
253 @retval EFI_SUCCESS The D.O.R.A process successfully finished.
254 @retval Others Failed to finish the D.O.R.A process.
255
256**/
257EFI_STATUS
258HttpBootDhcp4Dora (
259 IN HTTP_BOOT_PRIVATE_DATA *Private
260 );
261
262/**
263 This function will register the default DNS addresses to the network device.
264
265 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA.
266 @param[in] DataLength Size of the buffer pointed to by DnsServerData in bytes.
267 @param[in] DnsServerData Point a list of DNS server address in an array
268 of EFI_IPv4_ADDRESS instances.
269
270 @retval EFI_SUCCESS The DNS configuration has been configured successfully.
271 @retval Others Failed to configure the address.
272
273**/
274EFI_STATUS
275HttpBootRegisterIp4Dns (
276 IN HTTP_BOOT_PRIVATE_DATA *Private,
277 IN UINTN DataLength,
278 IN VOID *DnsServerData
279 );
280
281#endif