1/** @file 2 Functions declaration related with DHCPv6 for HTTP boot driver. 3 4Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> 5This program and the accompanying materials are licensed and made available under 6the terms and conditions of the BSD License that accompanies this distribution. 7The full text of the license may be found at 8http://opensource.org/licenses/bsd-license.php. 9 10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13**/ 14 15 16#ifndef __EFI_HTTP_BOOT_DHCP6_H__ 17#define __EFI_HTTP_BOOT_DHCP6_H__ 18 19#define HTTP_BOOT_OFFER_MAX_NUM 16 20#define HTTP_BOOT_DHCP6_OPTION_MAX_NUM 16 21#define HTTP_BOOT_DHCP6_OPTION_MAX_SIZE 312 22#define HTTP_BOOT_DHCP6_PACKET_MAX_SIZE 1472 23#define HTTP_BOOT_IP6_ROUTE_TABLE_TIMEOUT 10 24#define HTTP_BOOT_DEFAULT_HOPLIMIT 64 25#define HTTP_BOOT_DEFAULT_LIFETIME 50000 26 27 28#define HTTP_BOOT_DHCP6_OPT_CLIENT_ID 1 29#define HTTP_BOOT_DHCP6_OPT_SERVER_ID 2 30#define HTTP_BOOT_DHCP6_OPT_IA_NA 3 31#define HTTP_BOOT_DHCP6_OPT_IA_TA 4 32#define HTTP_BOOT_DHCP6_OPT_IAADDR 5 33#define HTTP_BOOT_DHCP6_OPT_ORO 6 34#define HTTP_BOOT_DHCP6_OPT_PREFERENCE 7 35#define HTTP_BOOT_DHCP6_OPT_ELAPSED_TIME 8 36#define HTTP_BOOT_DHCP6_OPT_REPLAY_MSG 9 37#define HTTP_BOOT_DHCP6_OPT_AUTH 11 38#define HTTP_BOOT_DHCP6_OPT_UNICAST 12 39#define HTTP_BOOT_DHCP6_OPT_STATUS_CODE 13 40#define HTTP_BOOT_DHCP6_OPT_RAPID_COMMIT 14 41#define HTTP_BOOT_DHCP6_OPT_USER_CLASS 15 42#define HTTP_BOOT_DHCP6_OPT_VENDOR_CLASS 16 43#define HTTP_BOOT_DHCP6_OPT_VENDOR_OPTS 17 44#define HTTP_BOOT_DHCP6_OPT_INTERFACE_ID 18 45#define HTTP_BOOT_DHCP6_OPT_RECONFIG_MSG 19 46#define HTTP_BOOT_DHCP6_OPT_RECONFIG_ACCEPT 20 47#define HTTP_BOOT_DHCP6_OPT_DNS_SERVERS 23 48#define HTTP_BOOT_DHCP6_OPT_BOOT_FILE_URL 59 // Assigned by IANA, RFC 5970 49#define HTTP_BOOT_DHCP6_OPT_BOOT_FILE_PARAM 60 // Assigned by IANA, RFC 5970 50#define HTTP_BOOT_DHCP6_OPT_ARCH 61 // Assigned by IANA, RFC 5970 51#define HTTP_BOOT_DHCP6_OPT_UNDI 62 // Assigned by IANA, RFC 5970 52#define HTTP_BOOT_DHCP6_ENTERPRISE_NUM 343 // TODO: IANA TBD: temporarily using Intel's 53#define HTTP_BOOT_DHCP6_MAX_BOOT_FILE_SIZE 65535 // It's a limitation of bit length, 65535*512 bytes. 54 55#define HTTP_BOOT_DHCP6_IDX_IA_NA 0 56#define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL 1 57#define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_PARAM 2 58#define HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS 3 59#define HTTP_BOOT_DHCP6_IDX_DNS_SERVER 4 60#define HTTP_BOOT_DHCP6_IDX_MAX 5 61 62#pragma pack(1) 63typedef struct { 64 UINT16 OpCode[256]; 65} HTTP_BOOT_DHCP6_OPTION_ORO; 66 67typedef struct { 68 UINT8 Type; 69 UINT8 MajorVer; 70 UINT8 MinorVer; 71} HTTP_BOOT_DHCP6_OPTION_UNDI; 72 73typedef struct { 74 UINT16 Type; 75} HTTP_BOOT_DHCP6_OPTION_ARCH; 76 77typedef struct { 78 UINT8 ClassIdentifier[10]; 79 UINT8 ArchitecturePrefix[5]; 80 UINT8 ArchitectureType[5]; 81 UINT8 Lit3[1]; 82 UINT8 InterfaceName[4]; 83 UINT8 Lit4[1]; 84 UINT8 UndiMajor[3]; 85 UINT8 UndiMinor[3]; 86} HTTP_BOOT_CLASS_ID; 87 88typedef struct { 89 UINT32 Vendor; 90 UINT16 ClassLen; 91 HTTP_BOOT_CLASS_ID ClassId; 92} HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS; 93 94#pragma pack() 95 96typedef union { 97 HTTP_BOOT_DHCP6_OPTION_ORO *Oro; 98 HTTP_BOOT_DHCP6_OPTION_UNDI *Undi; 99 HTTP_BOOT_DHCP6_OPTION_ARCH *Arch; 100 HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS *VendorClass; 101} HTTP_BOOT_DHCP6_OPTION_ENTRY; 102 103typedef union { 104 EFI_DHCP6_PACKET Offer; 105 EFI_DHCP6_PACKET Ack; 106 UINT8 Buffer[HTTP_BOOT_DHCP6_PACKET_MAX_SIZE]; 107} HTTP_BOOT_DHCP6_PACKET; 108 109typedef struct { 110 HTTP_BOOT_DHCP6_PACKET Packet; 111 HTTP_BOOT_OFFER_TYPE OfferType; 112 EFI_DHCP6_PACKET_OPTION *OptList[HTTP_BOOT_DHCP6_IDX_MAX]; 113 VOID *UriParser; 114} HTTP_BOOT_DHCP6_PACKET_CACHE; 115 116#define GET_NEXT_DHCP6_OPTION(Opt) \ 117 (EFI_DHCP6_PACKET_OPTION *) ((UINT8 *) (Opt) + \ 118 sizeof (EFI_DHCP6_PACKET_OPTION) + (NTOHS ((Opt)->OpLen)) - 1) 119 120#define GET_DHCP6_OPTION_SIZE(Pkt) \ 121 ((Pkt)->Length - sizeof (EFI_DHCP6_HEADER)) 122 123/** 124 Start the S.A.R.R DHCPv6 process to acquire the IPv6 address and other Http boot information. 125 126 @param[in] Private Pointer to HTTP_BOOT private data. 127 128 @retval EFI_SUCCESS The S.A.R.R process successfully finished. 129 @retval Others Failed to finish the S.A.R.R process. 130 131**/ 132EFI_STATUS 133HttpBootDhcp6Sarr ( 134 IN HTTP_BOOT_PRIVATE_DATA *Private 135 ); 136 137/** 138 Set the IP6 policy to Automatic. 139 140 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA. 141 142 @retval EFI_SUCCESS Switch the IP policy succesfully. 143 @retval Others Unexpect error happened. 144 145**/ 146EFI_STATUS 147HttpBootSetIp6Policy ( 148 IN HTTP_BOOT_PRIVATE_DATA *Private 149 ); 150 151/** 152 This function will register the default DNS addresses to the network device. 153 154 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA. 155 @param[in] DataLength Size of the buffer pointed to by DnsServerData in bytes. 156 @param[in] DnsServerData Point a list of DNS server address in an array 157 of EFI_IPv6_ADDRESS instances. 158 159 @retval EFI_SUCCESS The DNS configuration has been configured successfully. 160 @retval Others Failed to configure the address. 161 162**/ 163EFI_STATUS 164HttpBootSetIp6Dns ( 165 IN HTTP_BOOT_PRIVATE_DATA *Private, 166 IN UINTN DataLength, 167 IN VOID *DnsServerData 168 ); 169 170/** 171 This function will register the IPv6 gateway address to the network device. 172 173 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA. 174 175 @retval EFI_SUCCESS The new IP configuration has been configured successfully. 176 @retval Others Failed to configure the address. 177 178**/ 179EFI_STATUS 180HttpBootSetIp6Gateway ( 181 IN HTTP_BOOT_PRIVATE_DATA *Private 182 ); 183 184/** 185 This function will register the station IP address. 186 187 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA. 188 189 @retval EFI_SUCCESS The new IP address has been configured successfully. 190 @retval Others Failed to configure the address. 191 192**/ 193EFI_STATUS 194HttpBootSetIp6Address ( 195 IN HTTP_BOOT_PRIVATE_DATA *Private 196 ); 197 198#endif 199