Add new features to support Http boot over ipv6 stack. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo <lubo.zhang@intel.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18743 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			199 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Functions declaration related with DHCPv6 for HTTP boot driver.
 | |
| 
 | |
| Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
 | |
| This program and the accompanying materials are licensed and made available under 
 | |
| the terms and conditions of the BSD License that accompanies this distribution.  
 | |
| The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php.                                          
 | |
|     
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| 
 | |
| #ifndef __EFI_HTTP_BOOT_DHCP6_H__
 | |
| #define __EFI_HTTP_BOOT_DHCP6_H__
 | |
| 
 | |
| #define HTTP_BOOT_OFFER_MAX_NUM                16
 | |
| #define HTTP_BOOT_DHCP6_OPTION_MAX_NUM         16
 | |
| #define HTTP_BOOT_DHCP6_OPTION_MAX_SIZE        312
 | |
| #define HTTP_BOOT_DHCP6_PACKET_MAX_SIZE        1472
 | |
| #define HTTP_BOOT_IP6_ROUTE_TABLE_TIMEOUT      10
 | |
| #define HTTP_BOOT_DEFAULT_HOPLIMIT             64
 | |
| #define HTTP_BOOT_DEFAULT_LIFETIME             50000
 | |
| 
 | |
| 
 | |
| #define HTTP_BOOT_DHCP6_OPT_CLIENT_ID         1
 | |
| #define HTTP_BOOT_DHCP6_OPT_SERVER_ID         2
 | |
| #define HTTP_BOOT_DHCP6_OPT_IA_NA             3
 | |
| #define HTTP_BOOT_DHCP6_OPT_IA_TA             4
 | |
| #define HTTP_BOOT_DHCP6_OPT_IAADDR            5
 | |
| #define HTTP_BOOT_DHCP6_OPT_ORO               6
 | |
| #define HTTP_BOOT_DHCP6_OPT_PREFERENCE        7
 | |
| #define HTTP_BOOT_DHCP6_OPT_ELAPSED_TIME      8
 | |
| #define HTTP_BOOT_DHCP6_OPT_REPLAY_MSG        9
 | |
| #define HTTP_BOOT_DHCP6_OPT_AUTH              11
 | |
| #define HTTP_BOOT_DHCP6_OPT_UNICAST           12
 | |
| #define HTTP_BOOT_DHCP6_OPT_STATUS_CODE       13
 | |
| #define HTTP_BOOT_DHCP6_OPT_RAPID_COMMIT      14
 | |
| #define HTTP_BOOT_DHCP6_OPT_USER_CLASS        15
 | |
| #define HTTP_BOOT_DHCP6_OPT_VENDOR_CLASS      16
 | |
| #define HTTP_BOOT_DHCP6_OPT_VENDOR_OPTS       17
 | |
| #define HTTP_BOOT_DHCP6_OPT_INTERFACE_ID      18
 | |
| #define HTTP_BOOT_DHCP6_OPT_RECONFIG_MSG      19
 | |
| #define HTTP_BOOT_DHCP6_OPT_RECONFIG_ACCEPT   20
 | |
| #define HTTP_BOOT_DHCP6_OPT_DNS_SERVERS       23
 | |
| #define HTTP_BOOT_DHCP6_OPT_BOOT_FILE_URL     59    // Assigned by IANA, RFC 5970
 | |
| #define HTTP_BOOT_DHCP6_OPT_BOOT_FILE_PARAM   60    // Assigned by IANA, RFC 5970
 | |
| #define HTTP_BOOT_DHCP6_OPT_ARCH              61    // Assigned by IANA, RFC 5970
 | |
| #define HTTP_BOOT_DHCP6_OPT_UNDI              62    // Assigned by IANA, RFC 5970
 | |
| #define HTTP_BOOT_DHCP6_ENTERPRISE_NUM        343   // TODO: IANA TBD: temporarily using Intel's
 | |
| #define HTTP_BOOT_DHCP6_MAX_BOOT_FILE_SIZE    65535 //   It's a limitation of bit length, 65535*512 bytes.
 | |
| 
 | |
| #define HTTP_BOOT_DHCP6_IDX_IA_NA             0
 | |
| #define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL     1
 | |
| #define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_PARAM   2
 | |
| #define HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS      3
 | |
| #define HTTP_BOOT_DHCP6_IDX_DNS_SERVER        4
 | |
| #define HTTP_BOOT_DHCP6_IDX_MAX               5
 | |
| 
 | |
| #pragma pack(1)
 | |
| typedef struct {
 | |
|   UINT16 OpCode[256];
 | |
| } HTTP_BOOT_DHCP6_OPTION_ORO;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8 Type;
 | |
|   UINT8 MajorVer;
 | |
|   UINT8 MinorVer;
 | |
| } HTTP_BOOT_DHCP6_OPTION_UNDI;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT16 Type;
 | |
| } HTTP_BOOT_DHCP6_OPTION_ARCH;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8 ClassIdentifier[10];
 | |
|   UINT8 ArchitecturePrefix[5];
 | |
|   UINT8 ArchitectureType[5];
 | |
|   UINT8 Lit3[1];
 | |
|   UINT8 InterfaceName[4];
 | |
|   UINT8 Lit4[1];
 | |
|   UINT8 UndiMajor[3];
 | |
|   UINT8 UndiMinor[3];
 | |
| } HTTP_BOOT_CLASS_ID;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32             Vendor;
 | |
|   UINT16             ClassLen;
 | |
|   HTTP_BOOT_CLASS_ID ClassId;
 | |
| } HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS;
 | |
| 
 | |
| #pragma pack()
 | |
| 
 | |
| typedef union {
 | |
|   HTTP_BOOT_DHCP6_OPTION_ORO            *Oro;
 | |
|   HTTP_BOOT_DHCP6_OPTION_UNDI           *Undi;
 | |
|   HTTP_BOOT_DHCP6_OPTION_ARCH           *Arch;
 | |
|   HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS   *VendorClass;
 | |
| } HTTP_BOOT_DHCP6_OPTION_ENTRY;
 | |
| 
 | |
| typedef union {
 | |
|   EFI_DHCP6_PACKET        Offer;
 | |
|   EFI_DHCP6_PACKET        Ack;
 | |
|   UINT8                   Buffer[HTTP_BOOT_DHCP6_PACKET_MAX_SIZE];
 | |
| } HTTP_BOOT_DHCP6_PACKET;
 | |
| 
 | |
| typedef struct {
 | |
|   HTTP_BOOT_DHCP6_PACKET      Packet;
 | |
|   HTTP_BOOT_OFFER_TYPE        OfferType;
 | |
|   EFI_DHCP6_PACKET_OPTION     *OptList[HTTP_BOOT_DHCP6_IDX_MAX];
 | |
|   VOID                        *UriParser;
 | |
| } HTTP_BOOT_DHCP6_PACKET_CACHE;
 | |
| 
 | |
| #define GET_NEXT_DHCP6_OPTION(Opt) \
 | |
|   (EFI_DHCP6_PACKET_OPTION *) ((UINT8 *) (Opt) + \
 | |
|   sizeof (EFI_DHCP6_PACKET_OPTION) + (NTOHS ((Opt)->OpLen)) - 1)
 | |
| 
 | |
| #define GET_DHCP6_OPTION_SIZE(Pkt)  \
 | |
|   ((Pkt)->Length - sizeof (EFI_DHCP6_HEADER))
 | |
| 
 | |
| /**
 | |
|   Start the S.A.R.R DHCPv6 process to acquire the IPv6 address and other Http boot information.
 | |
| 
 | |
|   @param[in]  Private           Pointer to HTTP_BOOT private data.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The S.A.R.R process successfully finished.
 | |
|   @retval Others                Failed to finish the S.A.R.R process.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| HttpBootDhcp6Sarr (
 | |
|   IN HTTP_BOOT_PRIVATE_DATA         *Private
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Set the IP6 policy to Automatic.
 | |
| 
 | |
|   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.
 | |
| 
 | |
|   @retval     EFI_SUCCESS         Switch the IP policy succesfully.
 | |
|   @retval     Others              Unexpect error happened.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| HttpBootSetIp6Policy (
 | |
|   IN HTTP_BOOT_PRIVATE_DATA        *Private
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function will register the default DNS addresses to the network device.
 | |
|   
 | |
|   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.
 | |
|   @param[in]  DataLength          Size of the buffer pointed to by DnsServerData in bytes.
 | |
|   @param[in]  DnsServerData       Point a list of DNS server address in an array
 | |
|                                   of EFI_IPv6_ADDRESS instances.
 | |
| 
 | |
|   @retval     EFI_SUCCESS         The DNS configuration has been configured successfully.
 | |
|   @retval     Others              Failed to configure the address.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| HttpBootSetIp6Dns (
 | |
|   IN HTTP_BOOT_PRIVATE_DATA         *Private,
 | |
|   IN UINTN                          DataLength,
 | |
|   IN VOID                           *DnsServerData
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function will register the IPv6 gateway address to the network device.
 | |
|   
 | |
|   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.
 | |
| 
 | |
|   @retval     EFI_SUCCESS         The new IP configuration has been configured successfully.
 | |
|   @retval     Others              Failed to configure the address.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| HttpBootSetIp6Gateway (
 | |
|   IN HTTP_BOOT_PRIVATE_DATA         *Private
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function will register the station IP address.
 | |
|   
 | |
|   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.
 | |
| 
 | |
|   @retval     EFI_SUCCESS         The new IP address has been configured successfully.
 | |
|   @retval     Others              Failed to configure the address.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| HttpBootSetIp6Address (
 | |
|   IN HTTP_BOOT_PRIVATE_DATA         *Private
 | |
|   );
 | |
| 
 | |
| #endif
 |