]> git.proxmox.com Git - mirror_edk2.git/blob - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.h
Add NetworkPkg (P.UDK2010.UP3.Network.P1)
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcDhcp6.h
1 /** @file
2 Functions declaration related with DHCPv6 for UefiPxeBc Driver.
3
4 Copyright (c) 2009 - 2010, 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_DHCP6_MAPPING_TIMEOUT 50000000 // 5 seconds, unit is 10nanosecond.
23 #define PXEBC_IP6_POLICY_MAX 0xff
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)
80 typedef struct {
81 UINT16 OpCode[256];
82 } PXEBC_DHCP6_OPTION_ORO;
83
84 typedef struct {
85 UINT8 Type;
86 UINT8 MajorVer;
87 UINT8 MinorVer;
88 UINT8 Reserved;
89 } PXEBC_DHCP6_OPTION_UNDI;
90
91 typedef struct {
92 UINT16 Type;
93 } PXEBC_DHCP6_OPTION_ARCH;
94
95 typedef struct {
96 UINT8 ClassIdentifier[10];
97 UINT8 ArchitecturePrefix[5];
98 UINT8 ArchitectureType[5];
99 UINT8 Lit3[1];
100 UINT8 InterfaceName[4];
101 UINT8 Lit4[1];
102 UINT8 UndiMajor[3];
103 UINT8 UndiMinor[3];
104 } PXEBC_CLASS_ID;
105
106 typedef struct {
107 UINT32 Vendor;
108 UINT16 ClassLen;
109 PXEBC_CLASS_ID ClassId;
110 } PXEBC_DHCP6_OPTION_VENDOR_CLASS;
111
112 #pragma pack()
113
114 typedef union {
115 PXEBC_DHCP6_OPTION_ORO *Oro;
116 PXEBC_DHCP6_OPTION_UNDI *Undi;
117 PXEBC_DHCP6_OPTION_ARCH *Arch;
118 PXEBC_DHCP6_OPTION_VENDOR_CLASS *VendorClass;
119 } PXEBC_DHCP6_OPTION_ENTRY;
120
121 typedef struct {
122 LIST_ENTRY Link;
123 EFI_DHCP6_PACKET_OPTION *Option;
124 UINT8 Precedence;
125 } PXEBC_DHCP6_OPTION_NODE;
126
127 typedef union {
128 EFI_DHCP6_PACKET Offer;
129 EFI_DHCP6_PACKET Ack;
130 UINT8 Buffer[PXEBC_DHCP6_PACKET_MAX_SIZE];
131 } PXEBC_DHCP6_PACKET;
132
133 typedef struct {
134 PXEBC_DHCP6_PACKET Packet;
135 PXEBC_OFFER_TYPE OfferType;
136 EFI_DHCP6_PACKET_OPTION *OptList[PXEBC_DHCP6_IDX_MAX];
137 } PXEBC_DHCP6_PACKET_CACHE;
138
139
140 /**
141 Free all the nodes in the boot file list.
142
143 @param[in] Head The pointer to the head of the list.
144
145 **/
146 VOID
147 PxeBcFreeBootFileOption (
148 IN LIST_ENTRY *Head
149 );
150
151
152 /**
153 Parse the Boot File URL option.
154
155 @param[out] FileName The pointer to the boot file name.
156 @param[in, out] SrvAddr The pointer to the boot server address.
157 @param[in] BootFile The pointer to the boot file URL option data.
158 @param[in] Length Length of the boot file URL option data.
159
160 @retval EFI_ABORTED User canceled the operation.
161 @retval EFI_SUCCESS Selected the boot menu successfully.
162 @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
163
164 **/
165 EFI_STATUS
166 PxeBcExtractBootFileUrl (
167 OUT UINT8 **FileName,
168 IN OUT EFI_IPv6_ADDRESS *SrvAddr,
169 IN CHAR8 *BootFile,
170 IN UINT16 Length
171 );
172
173
174 /**
175 Parse the Boot File Parameter option.
176
177 @param[in] BootFilePara The pointer to the boot file parameter option data.
178 @param[out] BootFileSize The pointer to the parsed boot file size.
179
180 @retval EFI_SUCCESS Successfully obtained the boot file size from parameter option.
181 @retval EFI_NOT_FOUND Failed to extract the boot file size from parameter option.
182
183 **/
184 EFI_STATUS
185 PxeBcExtractBootFileParam (
186 IN CHAR8 *BootFilePara,
187 OUT UINT16 *BootFileSize
188 );
189
190
191 /**
192 Parse the cached DHCPv6 packet, including all the options.
193
194 @param[in] Cache6 The pointer to a cached DHCPv6 packet.
195
196 @retval EFI_SUCCESS Parsed the DHCPv6 packet successfully.
197 @retval EFI_DEVICE_ERROR Failed to parse and invalid packet.
198
199 **/
200 EFI_STATUS
201 PxeBcParseDhcp6Packet (
202 IN PXEBC_DHCP6_PACKET_CACHE *Cache6
203 );
204
205
206 /**
207 Register the ready address by Ip6Config protocol.
208
209 @param[in] Private The pointer to the PxeBc private data.
210 @param[in] Address The pointer to the ready address.
211
212 @retval EFI_SUCCESS Registered the address succesfully.
213 @retval Others Failed to register the address.
214
215 **/
216 EFI_STATUS
217 PxeBcRegisterIp6Address (
218 IN PXEBC_PRIVATE_DATA *Private,
219 IN EFI_IPv6_ADDRESS *Address
220 );
221
222
223 /**
224 Unregister the address by Ip6Config protocol.
225
226 @param[in] Private The pointer to the PxeBc private data.
227
228 **/
229 VOID
230 PxeBcUnregisterIp6Address (
231 IN PXEBC_PRIVATE_DATA *Private
232 );
233
234
235 /**
236 Build and send out the request packet for the bootfile, and parse the reply.
237
238 @param[in] Private The pointer to the PxeBc private data.
239 @param[in] Type PxeBc option boot item type.
240 @param[in] Layer The pointer to the option boot item layer.
241 @param[in] UseBis Use BIS or not.
242 @param[in] DestIp The pointer to the server address.
243
244 @retval EFI_SUCCESS Successfully discovered theboot file.
245 @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.
246 @retval EFI_NOT_FOUND Can't get the PXE reply packet.
247 @retval Others Failed to discover boot file.
248
249 **/
250 EFI_STATUS
251 PxeBcDhcp6Discover (
252 IN PXEBC_PRIVATE_DATA *Private,
253 IN UINT16 Type,
254 IN UINT16 *Layer,
255 IN BOOLEAN UseBis,
256 IN EFI_IP_ADDRESS *DestIp
257 );
258
259
260 /**
261 Start the DHCPv6 S.A.R.R. process to acquire the IPv6 address and other PXE boot information.
262
263 @param[in] Private The pointer to the PxeBc private data.
264 @param[in] Dhcp6 The pointer to EFI_DHCP6_PROTOCOL.
265
266 @retval EFI_SUCCESS The S.A.R.R. process successfully finished.
267 @retval Others Failed to finish the S.A.R.R. process.
268
269 **/
270 EFI_STATUS
271 PxeBcDhcp6Sarr (
272 IN PXEBC_PRIVATE_DATA *Private,
273 IN EFI_DHCP6_PROTOCOL *Dhcp6
274 );
275
276 #endif
277