blob: 38bf26564d0865f40e63bce52b9ca700a2621cdc [file] [log] [blame]
Vishal Bhoj82c80712015-12-15 21:13:33 +05301/** @file
2 Functions declaration related with DHCPv6 for UefiPxeBc Driver.
3
4 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
5
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14**/
15
16#ifndef __EFI_PXEBC_DHCP6_H__
17#define __EFI_PXEBC_DHCP6_H__
18
19#define PXEBC_DHCP6_OPTION_MAX_NUM 16
20#define PXEBC_DHCP6_OPTION_MAX_SIZE 312
21#define PXEBC_DHCP6_PACKET_MAX_SIZE 1472
22#define PXEBC_IP6_POLICY_MAX 0xff
23#define PXEBC_IP6_ROUTE_TABLE_TIMEOUT 10
24
25#define PXEBC_DHCP6_S_PORT 547
26#define PXEBC_DHCP6_C_PORT 546
27
28#define PXEBC_DHCP6_OPT_CLIENT_ID 1
29#define PXEBC_DHCP6_OPT_SERVER_ID 2
30#define PXEBC_DHCP6_OPT_IA_NA 3
31#define PXEBC_DHCP6_OPT_IA_TA 4
32#define PXEBC_DHCP6_OPT_IAADDR 5
33#define PXEBC_DHCP6_OPT_ORO 6
34#define PXEBC_DHCP6_OPT_PREFERENCE 7
35#define PXEBC_DHCP6_OPT_ELAPSED_TIME 8
36#define PXEBC_DHCP6_OPT_REPLAY_MSG 9
37#define PXEBC_DHCP6_OPT_AUTH 11
38#define PXEBC_DHCP6_OPT_UNICAST 12
39#define PXEBC_DHCP6_OPT_STATUS_CODE 13
40#define PXEBC_DHCP6_OPT_RAPID_COMMIT 14
41#define PXEBC_DHCP6_OPT_USER_CLASS 15
42#define PXEBC_DHCP6_OPT_VENDOR_CLASS 16
43#define PXEBC_DHCP6_OPT_VENDOR_OPTS 17
44#define PXEBC_DHCP6_OPT_INTERFACE_ID 18
45#define PXEBC_DHCP6_OPT_RECONFIG_MSG 19
46#define PXEBC_DHCP6_OPT_RECONFIG_ACCEPT 20
47#define PXEBC_DHCP6_OPT_BOOT_FILE_URL 59 // Assigned by IANA, RFC 5970
48#define PXEBC_DHCP6_OPT_BOOT_FILE_PARAM 60 // Assigned by IANA, RFC 5970
49#define PXEBC_DHCP6_OPT_ARCH 61 // Assigned by IANA, RFC 5970
50#define PXEBC_DHCP6_OPT_UNDI 62 // Assigned by IANA, RFC 5970
51#define PXEBC_DHCP6_ENTERPRISE_NUM 343 // TODO: IANA TBD: temporarily using Intel's
52#define PXEBC_DHCP6_MAX_BOOT_FILE_SIZE 65535 // It's a limitation of bit length, 65535*512 bytes.
53
54
55#define PXEBC_DHCP6_IDX_IA_NA 0
56#define PXEBC_DHCP6_IDX_BOOT_FILE_URL 1
57#define PXEBC_DHCP6_IDX_BOOT_FILE_PARAM 2
58#define PXEBC_DHCP6_IDX_VENDOR_CLASS 3
59#define PXEBC_DHCP6_IDX_MAX 4
60
61#define PXEBC_DHCP6_BOOT_FILE_URL_PREFIX "tftp://"
62#define PXEBC_TFTP_URL_SEPARATOR '/'
63#define PXEBC_ADDR_START_DELIMITER '['
64#define PXEBC_ADDR_END_DELIMITER ']'
65
66#define GET_NEXT_DHCP6_OPTION(Opt) \
67 (EFI_DHCP6_PACKET_OPTION *) ((UINT8 *) (Opt) + \
68 sizeof (EFI_DHCP6_PACKET_OPTION) + (NTOHS ((Opt)->OpLen)) - 1)
69
70#define GET_DHCP6_OPTION_SIZE(Pkt) \
71 ((Pkt)->Length - sizeof (EFI_DHCP6_HEADER))
72
73#define IS_PROXY_OFFER(Type) \
74 ((Type) == PxeOfferTypeProxyBinl || \
75 (Type) == PxeOfferTypeProxyPxe10 || \
76 (Type) == PxeOfferTypeProxyWfm11a)
77
78
79#pragma pack(1)
80typedef struct {
81 UINT16 OpCode[256];
82} PXEBC_DHCP6_OPTION_ORO;
83
84typedef struct {
85 UINT8 Type;
86 UINT8 MajorVer;
87 UINT8 MinorVer;
88} PXEBC_DHCP6_OPTION_UNDI;
89
90typedef struct {
91 UINT16 Type;
92} PXEBC_DHCP6_OPTION_ARCH;
93
94typedef struct {
95 UINT8 ClassIdentifier[10];
96 UINT8 ArchitecturePrefix[5];
97 UINT8 ArchitectureType[5];
98 UINT8 Lit3[1];
99 UINT8 InterfaceName[4];
100 UINT8 Lit4[1];
101 UINT8 UndiMajor[3];
102 UINT8 UndiMinor[3];
103} PXEBC_CLASS_ID;
104
105typedef struct {
106 UINT32 Vendor;
107 UINT16 ClassLen;
108 PXEBC_CLASS_ID ClassId;
109} PXEBC_DHCP6_OPTION_VENDOR_CLASS;
110
111#pragma pack()
112
113typedef union {
114 PXEBC_DHCP6_OPTION_ORO *Oro;
115 PXEBC_DHCP6_OPTION_UNDI *Undi;
116 PXEBC_DHCP6_OPTION_ARCH *Arch;
117 PXEBC_DHCP6_OPTION_VENDOR_CLASS *VendorClass;
118} PXEBC_DHCP6_OPTION_ENTRY;
119
120typedef struct {
121 LIST_ENTRY Link;
122 EFI_DHCP6_PACKET_OPTION *Option;
123 UINT8 Precedence;
124} PXEBC_DHCP6_OPTION_NODE;
125
126typedef union {
127 EFI_DHCP6_PACKET Offer;
128 EFI_DHCP6_PACKET Ack;
129 UINT8 Buffer[PXEBC_DHCP6_PACKET_MAX_SIZE];
130} PXEBC_DHCP6_PACKET;
131
132typedef struct {
133 PXEBC_DHCP6_PACKET Packet;
134 PXEBC_OFFER_TYPE OfferType;
135 EFI_DHCP6_PACKET_OPTION *OptList[PXEBC_DHCP6_IDX_MAX];
136} PXEBC_DHCP6_PACKET_CACHE;
137
138
139/**
140 Free all the nodes in the boot file list.
141
142 @param[in] Head The pointer to the head of the list.
143
144**/
145VOID
146PxeBcFreeBootFileOption (
147 IN LIST_ENTRY *Head
148 );
149
150
151/**
152 Parse the Boot File URL option.
153
154 @param[out] FileName The pointer to the boot file name.
155 @param[in, out] SrvAddr The pointer to the boot server address.
156 @param[in] BootFile The pointer to the boot file URL option data.
157 @param[in] Length Length of the boot file URL option data.
158
159 @retval EFI_ABORTED User canceled the operation.
160 @retval EFI_SUCCESS Selected the boot menu successfully.
161 @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
162
163**/
164EFI_STATUS
165PxeBcExtractBootFileUrl (
166 OUT UINT8 **FileName,
167 IN OUT EFI_IPv6_ADDRESS *SrvAddr,
168 IN CHAR8 *BootFile,
169 IN UINT16 Length
170 );
171
172
173/**
174 Parse the Boot File Parameter option.
175
176 @param[in] BootFilePara The pointer to the boot file parameter option data.
177 @param[out] BootFileSize The pointer to the parsed boot file size.
178
179 @retval EFI_SUCCESS Successfully obtained the boot file size from parameter option.
180 @retval EFI_NOT_FOUND Failed to extract the boot file size from parameter option.
181
182**/
183EFI_STATUS
184PxeBcExtractBootFileParam (
185 IN CHAR8 *BootFilePara,
186 OUT UINT16 *BootFileSize
187 );
188
189
190/**
191 Parse the cached DHCPv6 packet, including all the options.
192
193 @param[in] Cache6 The pointer to a cached DHCPv6 packet.
194
195 @retval EFI_SUCCESS Parsed the DHCPv6 packet successfully.
196 @retval EFI_DEVICE_ERROR Failed to parse and invalid packet.
197
198**/
199EFI_STATUS
200PxeBcParseDhcp6Packet (
201 IN PXEBC_DHCP6_PACKET_CACHE *Cache6
202 );
203
204
205/**
206 Register the ready address by Ip6Config protocol.
207
208 @param[in] Private The pointer to the PxeBc private data.
209 @param[in] Address The pointer to the ready address.
210
211 @retval EFI_SUCCESS Registered the address succesfully.
212 @retval Others Failed to register the address.
213
214**/
215EFI_STATUS
216PxeBcRegisterIp6Address (
217 IN PXEBC_PRIVATE_DATA *Private,
218 IN EFI_IPv6_ADDRESS *Address
219 );
220
221
222/**
223 Unregister the address by Ip6Config protocol.
224
225 @param[in] Private The pointer to the PxeBc private data.
226
227**/
228VOID
229PxeBcUnregisterIp6Address (
230 IN PXEBC_PRIVATE_DATA *Private
231 );
232
233
234/**
235 Build and send out the request packet for the bootfile, and parse the reply.
236
237 @param[in] Private The pointer to the PxeBc private data.
238 @param[in] Type PxeBc option boot item type.
239 @param[in] Layer The pointer to the option boot item layer.
240 @param[in] UseBis Use BIS or not.
241 @param[in] DestIp The pointer to the server address.
242
243 @retval EFI_SUCCESS Successfully discovered theboot file.
244 @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.
245 @retval EFI_NOT_FOUND Can't get the PXE reply packet.
246 @retval Others Failed to discover boot file.
247
248**/
249EFI_STATUS
250PxeBcDhcp6Discover (
251 IN PXEBC_PRIVATE_DATA *Private,
252 IN UINT16 Type,
253 IN UINT16 *Layer,
254 IN BOOLEAN UseBis,
255 IN EFI_IP_ADDRESS *DestIp
256 );
257
258/**
259 Set the IP6 policy to Automatic.
260
261 @param[in] Private The pointer to PXEBC_PRIVATE_DATA.
262
263 @retval EFI_SUCCESS Switch the IP policy succesfully.
264 @retval Others Unexpect error happened.
265
266**/
267EFI_STATUS
268PxeBcSetIp6Policy (
269 IN PXEBC_PRIVATE_DATA *Private
270 );
271
272/**
273 This function will register the station IP address and flush IP instance to start using the new IP address.
274
275 @param[in] Private The pointer to PXEBC_PRIVATE_DATA.
276
277 @retval EFI_SUCCESS The new IP address has been configured successfully.
278 @retval Others Failed to configure the address.
279
280**/
281EFI_STATUS
282PxeBcSetIp6Address (
283 IN PXEBC_PRIVATE_DATA *Private
284 );
285
286/**
287 Start the DHCPv6 S.A.R.R. process to acquire the IPv6 address and other PXE boot information.
288
289 @param[in] Private The pointer to the PxeBc private data.
290 @param[in] Dhcp6 The pointer to EFI_DHCP6_PROTOCOL.
291
292 @retval EFI_SUCCESS The S.A.R.R. process successfully finished.
293 @retval Others Failed to finish the S.A.R.R. process.
294
295**/
296EFI_STATUS
297PxeBcDhcp6Sarr (
298 IN PXEBC_PRIVATE_DATA *Private,
299 IN EFI_DHCP6_PROTOCOL *Dhcp6
300 );
301
302#endif
303