1 /** @file 2 Functions declaration related with DHCPv6 for UefiPxeBc Driver. 3 4 Copyright (c) 2009 - 2016, 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 (sizeof (EFI_PXE_BASE_CODE_PACKET)) 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_ENTERPRISE_NUM 343 // TODO: IANA TBD: temporarily using Intel's 29 #define PXEBC_DHCP6_MAX_BOOT_FILE_SIZE 65535 // It's a limitation of bit length, 65535*512 bytes. 30 31 32 #define PXEBC_DHCP6_IDX_IA_NA 0 33 #define PXEBC_DHCP6_IDX_BOOT_FILE_URL 1 34 #define PXEBC_DHCP6_IDX_BOOT_FILE_PARAM 2 35 #define PXEBC_DHCP6_IDX_VENDOR_CLASS 3 36 #define PXEBC_DHCP6_IDX_DNS_SERVER 4 37 #define PXEBC_DHCP6_IDX_MAX 5 38 39 #define PXEBC_DHCP6_BOOT_FILE_URL_PREFIX "tftp://" 40 #define PXEBC_TFTP_URL_SEPARATOR '/' 41 #define PXEBC_ADDR_START_DELIMITER '[' 42 #define PXEBC_ADDR_END_DELIMITER ']' 43 44 #define GET_NEXT_DHCP6_OPTION(Opt) \ 45 (EFI_DHCP6_PACKET_OPTION *) ((UINT8 *) (Opt) + \ 46 sizeof (EFI_DHCP6_PACKET_OPTION) + (NTOHS ((Opt)->OpLen)) - 1) 47 48 #define GET_DHCP6_OPTION_SIZE(Pkt) \ 49 ((Pkt)->Length - sizeof (EFI_DHCP6_HEADER)) 50 51 #define IS_PROXY_OFFER(Type) \ 52 ((Type) == PxeOfferTypeProxyBinl || \ 53 (Type) == PxeOfferTypeProxyPxe10 || \ 54 (Type) == PxeOfferTypeProxyWfm11a) 55 56 57 #pragma pack(1) 58 typedef struct { 59 UINT16 OpCode[256]; 60 } PXEBC_DHCP6_OPTION_ORO; 61 62 typedef struct { 63 UINT8 Type; 64 UINT8 MajorVer; 65 UINT8 MinorVer; 66 } PXEBC_DHCP6_OPTION_UNDI; 67 68 typedef struct { 69 UINT16 Type; 70 } PXEBC_DHCP6_OPTION_ARCH; 71 72 typedef struct { 73 UINT8 ClassIdentifier[10]; 74 UINT8 ArchitecturePrefix[5]; 75 UINT8 ArchitectureType[5]; 76 UINT8 Lit3[1]; 77 UINT8 InterfaceName[4]; 78 UINT8 Lit4[1]; 79 UINT8 UndiMajor[3]; 80 UINT8 UndiMinor[3]; 81 } PXEBC_CLASS_ID; 82 83 typedef struct { 84 UINT32 Vendor; 85 UINT16 ClassLen; 86 PXEBC_CLASS_ID ClassId; 87 } PXEBC_DHCP6_OPTION_VENDOR_CLASS; 88 89 #pragma pack() 90 91 typedef union { 92 PXEBC_DHCP6_OPTION_ORO *Oro; 93 PXEBC_DHCP6_OPTION_UNDI *Undi; 94 PXEBC_DHCP6_OPTION_ARCH *Arch; 95 PXEBC_DHCP6_OPTION_VENDOR_CLASS *VendorClass; 96 } PXEBC_DHCP6_OPTION_ENTRY; 97 98 typedef struct { 99 LIST_ENTRY Link; 100 EFI_DHCP6_PACKET_OPTION *Option; 101 UINT8 Precedence; 102 } PXEBC_DHCP6_OPTION_NODE; 103 104 #define PXEBC_CACHED_DHCP6_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP6_PACKET, Dhcp6) + PXEBC_DHCP6_PACKET_MAX_SIZE) 105 106 typedef union { 107 EFI_DHCP6_PACKET Offer; 108 EFI_DHCP6_PACKET Ack; 109 UINT8 Buffer[PXEBC_CACHED_DHCP6_PACKET_MAX_SIZE]; 110 } PXEBC_DHCP6_PACKET; 111 112 typedef struct { 113 PXEBC_DHCP6_PACKET Packet; 114 PXEBC_OFFER_TYPE OfferType; 115 EFI_DHCP6_PACKET_OPTION *OptList[PXEBC_DHCP6_IDX_MAX]; 116 } PXEBC_DHCP6_PACKET_CACHE; 117 118 119 /** 120 Free all the nodes in the boot file list. 121 122 @param[in] Head The pointer to the head of the list. 123 124 **/ 125 VOID 126 PxeBcFreeBootFileOption ( 127 IN LIST_ENTRY *Head 128 ); 129 130 131 /** 132 Parse the Boot File URL option. 133 134 @param[in] Private Pointer to PxeBc private data. 135 @param[out] FileName The pointer to the boot file name. 136 @param[in, out] SrvAddr The pointer to the boot server address. 137 @param[in] BootFile The pointer to the boot file URL option data. 138 @param[in] Length Length of the boot file URL option data. 139 140 @retval EFI_ABORTED User canceled the operation. 141 @retval EFI_SUCCESS Selected the boot menu successfully. 142 @retval EFI_NOT_READY Read the input key from the keybroad has not finish. 143 144 **/ 145 EFI_STATUS 146 PxeBcExtractBootFileUrl ( 147 IN PXEBC_PRIVATE_DATA *Private, 148 OUT UINT8 **FileName, 149 IN OUT EFI_IPv6_ADDRESS *SrvAddr, 150 IN CHAR8 *BootFile, 151 IN UINT16 Length 152 ); 153 154 155 /** 156 Parse the Boot File Parameter option. 157 158 @param[in] BootFilePara The pointer to the boot file parameter option data. 159 @param[out] BootFileSize The pointer to the parsed boot file size. 160 161 @retval EFI_SUCCESS Successfully obtained the boot file size from parameter option. 162 @retval EFI_NOT_FOUND Failed to extract the boot file size from parameter option. 163 164 **/ 165 EFI_STATUS 166 PxeBcExtractBootFileParam ( 167 IN CHAR8 *BootFilePara, 168 OUT UINT16 *BootFileSize 169 ); 170 171 172 /** 173 Parse the cached DHCPv6 packet, including all the options. 174 175 @param[in] Cache6 The pointer to a cached DHCPv6 packet. 176 177 @retval EFI_SUCCESS Parsed the DHCPv6 packet successfully. 178 @retval EFI_DEVICE_ERROR Failed to parse and invalid packet. 179 180 **/ 181 EFI_STATUS 182 PxeBcParseDhcp6Packet ( 183 IN PXEBC_DHCP6_PACKET_CACHE *Cache6 184 ); 185 186 187 /** 188 Register the ready address by Ip6Config protocol. 189 190 @param[in] Private The pointer to the PxeBc private data. 191 @param[in] Address The pointer to the ready address. 192 193 @retval EFI_SUCCESS Registered the address succesfully. 194 @retval Others Failed to register the address. 195 196 **/ 197 EFI_STATUS 198 PxeBcRegisterIp6Address ( 199 IN PXEBC_PRIVATE_DATA *Private, 200 IN EFI_IPv6_ADDRESS *Address 201 ); 202 203 204 /** 205 Unregister the address by Ip6Config protocol. 206 207 @param[in] Private The pointer to the PxeBc private data. 208 209 **/ 210 VOID 211 PxeBcUnregisterIp6Address ( 212 IN PXEBC_PRIVATE_DATA *Private 213 ); 214 215 216 /** 217 Build and send out the request packet for the bootfile, and parse the reply. 218 219 @param[in] Private The pointer to the PxeBc private data. 220 @param[in] Type PxeBc option boot item type. 221 @param[in] Layer The pointer to the option boot item layer. 222 @param[in] UseBis Use BIS or not. 223 @param[in] DestIp The pointer to the server address. 224 225 @retval EFI_SUCCESS Successfully discovered theboot file. 226 @retval EFI_OUT_OF_RESOURCES Failed to allocate resource. 227 @retval EFI_NOT_FOUND Can't get the PXE reply packet. 228 @retval Others Failed to discover boot file. 229 230 **/ 231 EFI_STATUS 232 PxeBcDhcp6Discover ( 233 IN PXEBC_PRIVATE_DATA *Private, 234 IN UINT16 Type, 235 IN UINT16 *Layer, 236 IN BOOLEAN UseBis, 237 IN EFI_IP_ADDRESS *DestIp 238 ); 239 240 /** 241 Set the IP6 policy to Automatic. 242 243 @param[in] Private The pointer to PXEBC_PRIVATE_DATA. 244 245 @retval EFI_SUCCESS Switch the IP policy succesfully. 246 @retval Others Unexpect error happened. 247 248 **/ 249 EFI_STATUS 250 PxeBcSetIp6Policy ( 251 IN PXEBC_PRIVATE_DATA *Private 252 ); 253 254 /** 255 This function will register the station IP address and flush IP instance to start using the new IP address. 256 257 @param[in] Private The pointer to PXEBC_PRIVATE_DATA. 258 259 @retval EFI_SUCCESS The new IP address has been configured successfully. 260 @retval Others Failed to configure the address. 261 262 **/ 263 EFI_STATUS 264 PxeBcSetIp6Address ( 265 IN PXEBC_PRIVATE_DATA *Private 266 ); 267 268 /** 269 Start the DHCPv6 S.A.R.R. process to acquire the IPv6 address and other PXE boot information. 270 271 @param[in] Private The pointer to the PxeBc private data. 272 @param[in] Dhcp6 The pointer to EFI_DHCP6_PROTOCOL. 273 274 @retval EFI_SUCCESS The S.A.R.R. process successfully finished. 275 @retval Others Failed to finish the S.A.R.R. process. 276 277 **/ 278 EFI_STATUS 279 PxeBcDhcp6Sarr ( 280 IN PXEBC_PRIVATE_DATA *Private, 281 IN EFI_DHCP6_PROTOCOL *Dhcp6 282 ); 283 284 #endif 285 286