--- /dev/null
+/** @file\r
+ Functions declaration related with DHCPv6 for UefiPxeBc Driver.\r
+\r
+ Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php.\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __EFI_PXEBC_DHCP6_H__\r
+#define __EFI_PXEBC_DHCP6_H__\r
+\r
+#define PXEBC_DHCP6_OPTION_MAX_NUM 16\r
+#define PXEBC_DHCP6_OPTION_MAX_SIZE 312\r
+#define PXEBC_DHCP6_PACKET_MAX_SIZE 1472\r
+#define PXEBC_DHCP6_MAPPING_TIMEOUT 50000000 // 5 seconds, unit is 10nanosecond.\r
+#define PXEBC_IP6_POLICY_MAX 0xff\r
+\r
+#define PXEBC_DHCP6_S_PORT 547\r
+#define PXEBC_DHCP6_C_PORT 546\r
+\r
+#define PXEBC_DHCP6_OPT_CLIENT_ID 1\r
+#define PXEBC_DHCP6_OPT_SERVER_ID 2\r
+#define PXEBC_DHCP6_OPT_IA_NA 3\r
+#define PXEBC_DHCP6_OPT_IA_TA 4\r
+#define PXEBC_DHCP6_OPT_IAADDR 5\r
+#define PXEBC_DHCP6_OPT_ORO 6\r
+#define PXEBC_DHCP6_OPT_PREFERENCE 7\r
+#define PXEBC_DHCP6_OPT_ELAPSED_TIME 8\r
+#define PXEBC_DHCP6_OPT_REPLAY_MSG 9\r
+#define PXEBC_DHCP6_OPT_AUTH 11\r
+#define PXEBC_DHCP6_OPT_UNICAST 12\r
+#define PXEBC_DHCP6_OPT_STATUS_CODE 13\r
+#define PXEBC_DHCP6_OPT_RAPID_COMMIT 14\r
+#define PXEBC_DHCP6_OPT_USER_CLASS 15\r
+#define PXEBC_DHCP6_OPT_VENDOR_CLASS 16\r
+#define PXEBC_DHCP6_OPT_VENDOR_OPTS 17\r
+#define PXEBC_DHCP6_OPT_INTERFACE_ID 18\r
+#define PXEBC_DHCP6_OPT_RECONFIG_MSG 19\r
+#define PXEBC_DHCP6_OPT_RECONFIG_ACCEPT 20\r
+#define PXEBC_DHCP6_OPT_BOOT_FILE_URL 59 // Assigned by IANA, RFC 5970\r
+#define PXEBC_DHCP6_OPT_BOOT_FILE_PARAM 60 // Assigned by IANA, RFC 5970\r
+#define PXEBC_DHCP6_OPT_ARCH 61 // Assigned by IANA, RFC 5970\r
+#define PXEBC_DHCP6_OPT_UNDI 62 // Assigned by IANA, RFC 5970\r
+#define PXEBC_DHCP6_ENTERPRISE_NUM 343 // TODO: IANA TBD: temporarily using Intel's\r
+#define PXEBC_DHCP6_MAX_BOOT_FILE_SIZE 65535 // It's a limitation of bit length, 65535*512 bytes.\r
+\r
+\r
+#define PXEBC_DHCP6_IDX_IA_NA 0\r
+#define PXEBC_DHCP6_IDX_BOOT_FILE_URL 1\r
+#define PXEBC_DHCP6_IDX_BOOT_FILE_PARAM 2\r
+#define PXEBC_DHCP6_IDX_VENDOR_CLASS 3\r
+#define PXEBC_DHCP6_IDX_MAX 4\r
+\r
+#define PXEBC_DHCP6_BOOT_FILE_URL_PREFIX "tftp://"\r
+#define PXEBC_TFTP_URL_SEPARATOR '/'\r
+#define PXEBC_ADDR_START_DELIMITER '['\r
+#define PXEBC_ADDR_END_DELIMITER ']'\r
+\r
+#define GET_NEXT_DHCP6_OPTION(Opt) \\r
+ (EFI_DHCP6_PACKET_OPTION *) ((UINT8 *) (Opt) + \\r
+ sizeof (EFI_DHCP6_PACKET_OPTION) + (NTOHS ((Opt)->OpLen)) - 1)\r
+\r
+#define GET_DHCP6_OPTION_SIZE(Pkt) \\r
+ ((Pkt)->Length - sizeof (EFI_DHCP6_HEADER))\r
+\r
+#define IS_PROXY_OFFER(Type) \\r
+ ((Type) == PxeOfferTypeProxyBinl || \\r
+ (Type) == PxeOfferTypeProxyPxe10 || \\r
+ (Type) == PxeOfferTypeProxyWfm11a)\r
+\r
+\r
+#pragma pack(1)\r
+typedef struct {\r
+ UINT16 OpCode[256];\r
+} PXEBC_DHCP6_OPTION_ORO;\r
+\r
+typedef struct {\r
+ UINT8 Type;\r
+ UINT8 MajorVer;\r
+ UINT8 MinorVer;\r
+ UINT8 Reserved;\r
+} PXEBC_DHCP6_OPTION_UNDI;\r
+\r
+typedef struct {\r
+ UINT16 Type;\r
+} PXEBC_DHCP6_OPTION_ARCH;\r
+\r
+typedef struct {\r
+ UINT8 ClassIdentifier[10];\r
+ UINT8 ArchitecturePrefix[5];\r
+ UINT8 ArchitectureType[5];\r
+ UINT8 Lit3[1];\r
+ UINT8 InterfaceName[4];\r
+ UINT8 Lit4[1];\r
+ UINT8 UndiMajor[3];\r
+ UINT8 UndiMinor[3];\r
+} PXEBC_CLASS_ID;\r
+\r
+typedef struct {\r
+ UINT32 Vendor;\r
+ UINT16 ClassLen;\r
+ PXEBC_CLASS_ID ClassId;\r
+} PXEBC_DHCP6_OPTION_VENDOR_CLASS;\r
+\r
+#pragma pack()\r
+\r
+typedef union {\r
+ PXEBC_DHCP6_OPTION_ORO *Oro;\r
+ PXEBC_DHCP6_OPTION_UNDI *Undi;\r
+ PXEBC_DHCP6_OPTION_ARCH *Arch;\r
+ PXEBC_DHCP6_OPTION_VENDOR_CLASS *VendorClass;\r
+} PXEBC_DHCP6_OPTION_ENTRY;\r
+\r
+typedef struct {\r
+ LIST_ENTRY Link;\r
+ EFI_DHCP6_PACKET_OPTION *Option;\r
+ UINT8 Precedence;\r
+} PXEBC_DHCP6_OPTION_NODE;\r
+\r
+typedef union {\r
+ EFI_DHCP6_PACKET Offer;\r
+ EFI_DHCP6_PACKET Ack;\r
+ UINT8 Buffer[PXEBC_DHCP6_PACKET_MAX_SIZE];\r
+} PXEBC_DHCP6_PACKET;\r
+\r
+typedef struct {\r
+ PXEBC_DHCP6_PACKET Packet;\r
+ PXEBC_OFFER_TYPE OfferType;\r
+ EFI_DHCP6_PACKET_OPTION *OptList[PXEBC_DHCP6_IDX_MAX];\r
+} PXEBC_DHCP6_PACKET_CACHE;\r
+\r
+\r
+/**\r
+ Free all the nodes in the boot file list.\r
+\r
+ @param[in] Head The pointer to the head of the list.\r
+\r
+**/\r
+VOID\r
+PxeBcFreeBootFileOption (\r
+ IN LIST_ENTRY *Head\r
+ );\r
+\r
+\r
+/**\r
+ Parse the Boot File URL option.\r
+\r
+ @param[out] FileName The pointer to the boot file name.\r
+ @param[in, out] SrvAddr The pointer to the boot server address.\r
+ @param[in] BootFile The pointer to the boot file URL option data.\r
+ @param[in] Length Length of the boot file URL option data.\r
+\r
+ @retval EFI_ABORTED User canceled the operation.\r
+ @retval EFI_SUCCESS Selected the boot menu successfully.\r
+ @retval EFI_NOT_READY Read the input key from the keybroad has not finish.\r
+\r
+**/\r
+EFI_STATUS\r
+PxeBcExtractBootFileUrl (\r
+ OUT UINT8 **FileName,\r
+ IN OUT EFI_IPv6_ADDRESS *SrvAddr,\r
+ IN CHAR8 *BootFile,\r
+ IN UINT16 Length\r
+ );\r
+\r
+\r
+/**\r
+ Parse the Boot File Parameter option.\r
+\r
+ @param[in] BootFilePara The pointer to the boot file parameter option data.\r
+ @param[out] BootFileSize The pointer to the parsed boot file size.\r
+\r
+ @retval EFI_SUCCESS Successfully obtained the boot file size from parameter option.\r
+ @retval EFI_NOT_FOUND Failed to extract the boot file size from parameter option.\r
+\r
+**/\r
+EFI_STATUS\r
+PxeBcExtractBootFileParam (\r
+ IN CHAR8 *BootFilePara,\r
+ OUT UINT16 *BootFileSize\r
+ );\r
+\r
+\r
+/**\r
+ Parse the cached DHCPv6 packet, including all the options.\r
+\r
+ @param[in] Cache6 The pointer to a cached DHCPv6 packet.\r
+\r
+ @retval EFI_SUCCESS Parsed the DHCPv6 packet successfully.\r
+ @retval EFI_DEVICE_ERROR Failed to parse and invalid packet.\r
+\r
+**/\r
+EFI_STATUS\r
+PxeBcParseDhcp6Packet (\r
+ IN PXEBC_DHCP6_PACKET_CACHE *Cache6\r
+ );\r
+\r
+\r
+/**\r
+ Register the ready address by Ip6Config protocol.\r
+\r
+ @param[in] Private The pointer to the PxeBc private data.\r
+ @param[in] Address The pointer to the ready address.\r
+\r
+ @retval EFI_SUCCESS Registered the address succesfully.\r
+ @retval Others Failed to register the address.\r
+\r
+**/\r
+EFI_STATUS\r
+PxeBcRegisterIp6Address (\r
+ IN PXEBC_PRIVATE_DATA *Private,\r
+ IN EFI_IPv6_ADDRESS *Address\r
+ );\r
+\r
+\r
+/**\r
+ Unregister the address by Ip6Config protocol.\r
+\r
+ @param[in] Private The pointer to the PxeBc private data.\r
+\r
+**/\r
+VOID\r
+PxeBcUnregisterIp6Address (\r
+ IN PXEBC_PRIVATE_DATA *Private\r
+ );\r
+\r
+\r
+/**\r
+ Build and send out the request packet for the bootfile, and parse the reply.\r
+\r
+ @param[in] Private The pointer to the PxeBc private data.\r
+ @param[in] Type PxeBc option boot item type.\r
+ @param[in] Layer The pointer to the option boot item layer.\r
+ @param[in] UseBis Use BIS or not.\r
+ @param[in] DestIp The pointer to the server address.\r
+\r
+ @retval EFI_SUCCESS Successfully discovered theboot file.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resource.\r
+ @retval EFI_NOT_FOUND Can't get the PXE reply packet.\r
+ @retval Others Failed to discover boot file.\r
+\r
+**/\r
+EFI_STATUS\r
+PxeBcDhcp6Discover (\r
+ IN PXEBC_PRIVATE_DATA *Private,\r
+ IN UINT16 Type,\r
+ IN UINT16 *Layer,\r
+ IN BOOLEAN UseBis,\r
+ IN EFI_IP_ADDRESS *DestIp\r
+ );\r
+\r
+\r
+/**\r
+ Start the DHCPv6 S.A.R.R. process to acquire the IPv6 address and other PXE boot information.\r
+\r
+ @param[in] Private The pointer to the PxeBc private data.\r
+ @param[in] Dhcp6 The pointer to EFI_DHCP6_PROTOCOL.\r
+\r
+ @retval EFI_SUCCESS The S.A.R.R. process successfully finished.\r
+ @retval Others Failed to finish the S.A.R.R. process.\r
+\r
+**/\r
+EFI_STATUS\r
+PxeBcDhcp6Sarr (\r
+ IN PXEBC_PRIVATE_DATA *Private,\r
+ IN EFI_DHCP6_PROTOCOL *Dhcp6\r
+ );\r
+\r
+#endif\r
+\r