Vishal Bhoj | 82c8071 | 2015-12-15 21:13:33 +0530 | [diff] [blame] | 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 |
|