1 /** @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) 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 } PXEBC_DHCP6_OPTION_UNDI; 89 90 typedef struct { 91 UINT16 Type; 92 } PXEBC_DHCP6_OPTION_ARCH; 93 94 typedef 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 105 typedef struct { 106 UINT32 Vendor; 107 UINT16 ClassLen; 108 PXEBC_CLASS_ID ClassId; 109 } PXEBC_DHCP6_OPTION_VENDOR_CLASS; 110 111 #pragma pack() 112 113 typedef 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 120 typedef struct { 121 LIST_ENTRY Link; 122 EFI_DHCP6_PACKET_OPTION *Option; 123 UINT8 Precedence; 124 } PXEBC_DHCP6_OPTION_NODE; 125 126 typedef union { 127 EFI_DHCP6_PACKET Offer; 128 EFI_DHCP6_PACKET Ack; 129 UINT8 Buffer[PXEBC_DHCP6_PACKET_MAX_SIZE]; 130 } PXEBC_DHCP6_PACKET; 131 132 typedef 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 **/ 145 VOID 146 PxeBcFreeBootFileOption ( 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 **/ 164 EFI_STATUS 165 PxeBcExtractBootFileUrl ( 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 **/ 183 EFI_STATUS 184 PxeBcExtractBootFileParam ( 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 **/ 199 EFI_STATUS 200 PxeBcParseDhcp6Packet ( 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 **/ 215 EFI_STATUS 216 PxeBcRegisterIp6Address ( 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 **/ 228 VOID 229 PxeBcUnregisterIp6Address ( 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 **/ 249 EFI_STATUS 250 PxeBcDhcp6Discover ( 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 **/ 267 EFI_STATUS 268 PxeBcSetIp6Policy ( 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 **/ 281 EFI_STATUS 282 PxeBcSetIp6Address ( 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 **/ 296 EFI_STATUS 297 PxeBcDhcp6Sarr ( 298 IN PXEBC_PRIVATE_DATA *Private, 299 IN EFI_DHCP6_PROTOCOL *Dhcp6 300 ); 301 302 #endif 303 304