]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/HttpBootDxe/HttpBootDhcp4.h
CryptoPkg: Make the function headers of Pkcs7GetAttachedContent follow Doxygen.
[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
85#endif
86
87/// DHCP offer types among HTTP boot.
88/// Dhcp4 and Dhcp6 share this definition, and corresponding
89/// relatioinship is as follows:
90/// Dhcp4Discover <> Dhcp6Solicit
91/// Dhcp4Offer <> Dhcp6Advertise
92/// Dhcp4Request <> Dhcp6Request
93/// Dhcp4Ack <> DHcp6Reply
94///
95typedef enum {
96 //
97 // <IP address, IP expressed URI> or
98 // <IP address, IP expressed URI, Name-server (will be ignored)>
99 //
100 HttpOfferTypeDhcpIpUri,
101 //
102 // <IP address, Domain-name expressed URI, Name-server>
103 //
104 HttpOfferTypeDhcpNameUriDns,
105 //
106 // <IP address, Name-server>
107 //
108 HttpOfferTypeDhcpDns,
109 //
110 // <IP address>
111 //
112 HttpOfferTypeDhcpOnly,
113 //
114 // <Domain-name expressed URI> or
115 // <Domain-name expressed URI, Name-server (will be ignored)>
116 //
117 HttpOfferTypeProxyNameUri,
118 //
119 // <IP expressed URI> or
120 // <IP expressed URI, Name-server (will be ignored)>
121 //
122 HttpOfferTypeProxyIpUri,
123 //
124 // <IP address, Domain-name expressed URI>
125 //
126 HttpOfferTypeDhcpNameUri,
127 HttpOfferTypeMax
128} HTTP_BOOT_OFFER_TYPE;
129
130#define HTTP_BOOT_DHCP_RETRIES 4
131#define HTTP_BOOT_OFFER_MAX_NUM 16
132
133// The array index of the DHCP4 option tag interested
134//
135#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
136#define HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD 1
137#define HTTP_BOOT_DHCP4_TAG_INDEX_MSG_TYPE 2
138#define HTTP_BOOT_DHCP4_TAG_INDEX_SERVER_ID 3
139#define HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID 4
140#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE 5
141#define HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER 6
142#define HTTP_BOOT_DHCP4_TAG_INDEX_MAX 7
143
144#pragma pack(1)
145
146typedef struct {
147 UINT8 ParaList[135];
148} HTTP_BOOT_DHCP4_OPTION_PARA;
149
150typedef struct {
151 UINT16 Size;
152} HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE;
153
154typedef struct {
155 UINT8 Type;
156 UINT8 MajorVer;
157 UINT8 MinorVer;
158} HTTP_BOOT_DHCP4_OPTION_UNDI;
159
160typedef struct {
161 UINT8 Type;
162} HTTP_BOOT_DHCP4_OPTION_MESG;
163
164typedef struct {
165 UINT16 Type;
166} HTTP_BOOT_DHCP4_OPTION_ARCH;
167
168typedef struct {
169 UINT8 ClassIdentifier[11];
170 UINT8 ArchitecturePrefix[5];
171 UINT8 ArchitectureType[5];
172 UINT8 Lit3[1];
173 UINT8 InterfaceName[4];
174 UINT8 Lit4[1];
175 UINT8 UndiMajor[3];
176 UINT8 UndiMinor[3];
177} HTTP_BOOT_DHCP4_OPTION_CLID;
178
179typedef struct {
180 UINT8 Type;
181 UINT8 Guid[16];
182} HTTP_BOOT_DHCP4_OPTION_UUID;
183
184typedef struct {
185 UINT16 Type;
186 UINT16 Layer;
187} HTTP_BOOT_OPTION_BOOT_ITEM;
188
189#pragma pack()
190
191typedef union {
192 HTTP_BOOT_DHCP4_OPTION_PARA *Para;
193 HTTP_BOOT_DHCP4_OPTION_UNDI *Undi;
194 HTTP_BOOT_DHCP4_OPTION_ARCH *Arch;
195 HTTP_BOOT_DHCP4_OPTION_CLID *Clid;
196 HTTP_BOOT_DHCP4_OPTION_UUID *Uuid;
197 HTTP_BOOT_DHCP4_OPTION_MESG *Mesg;
198 HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;
199} HTTP_BOOT_DHCP4_OPTION_ENTRY;
200
201#define GET_NEXT_DHCP_OPTION(Opt) \
202 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \
203 sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
204
205#define GET_OPTION_BUFFER_LEN(Pkt) \
206 ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
207
208#define DEFAULT_CLASS_ID_DATA "HTTPClient:Arch:xxxxx:UNDI:003000"
209#define DEFAULT_UNDI_TYPE 1
210#define DEFAULT_UNDI_MAJOR 3
211#define DEFAULT_UNDI_MINOR 0
212
213typedef struct {
214 UINT32 Reserved;
215} HTTP_BOOT_VENDOR_OPTION;
216
217typedef union {
218 EFI_DHCP4_PACKET Offer;
219 EFI_DHCP4_PACKET Ack;
220 UINT8 Buffer[HTTP_BOOT_DHCP4_PACKET_MAX_SIZE];
221} HTTP_BOOT_DHCP4_PACKET;
222
223typedef struct {
224 //
225 // URI component
226 //
227 CHAR8 *Scheme;
228 CHAR8 *Authority;
229 CHAR8 *Path;
230 CHAR8 *Query;
231 CHAR8 *Fragment; /// TODO: may not required in HTTP URL
232
233 CHAR8 *RegName; /// Point to somewhere in Authority
234 BOOLEAN AddrIsOk;
235 EFI_IP_ADDRESS Address;
236 UINT16 Port;
237} HTTP_BOOT_URI_CONTENT;
238
239typedef struct {
240 HTTP_BOOT_DHCP4_PACKET Packet;
241 HTTP_BOOT_OFFER_TYPE OfferType;
242 VOID *UriParser;
243 EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_TAG_INDEX_MAX];
244} HTTP_BOOT_DHCP4_PACKET_CACHE;
245
246/**
247 Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other Http boot information.
248
249 @param[in] Private Pointer to HTTP_BOOT private data.
250
251 @retval EFI_SUCCESS The D.O.R.A process successfully finished.
252 @retval Others Failed to finish the D.O.R.A process.
253
254**/
255EFI_STATUS
256HttpBootDhcp4Dora (
257 IN HTTP_BOOT_PRIVATE_DATA *Private
258 );
259
260/**
261 This function will register the default DNS addresses to the network device.
262
263 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA.
264 @param[in] DataLength Size of the buffer pointed to by DnsServerData in bytes.
265 @param[in] DnsServerData Point a list of DNS server address in an array
266 of EFI_IPv4_ADDRESS instances.
267
268 @retval EFI_SUCCESS The DNS configuration has been configured successfully.
269 @retval Others Failed to configure the address.
270
271**/
272EFI_STATUS
273HttpBootRegisterIp4Dns (
274 IN HTTP_BOOT_PRIVATE_DATA *Private,
275 IN UINTN DataLength,
276 IN VOID *DnsServerData
277 );
278
279#endif