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
		
			
				
	
	
		
			293 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Functions declaration related with DHCPv4 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_UEFI_HTTP_BOOT_DHCP4_H__
 | |
| #define __EFI_UEFI_HTTP_BOOT_DHCP4_H__
 | |
| 
 | |
| #define HTTP_BOOT_DHCP4_OPTION_MAX_NUM         16
 | |
| #define HTTP_BOOT_DHCP4_OPTION_MAX_SIZE        312
 | |
| #define HTTP_BOOT_DHCP4_PACKET_MAX_SIZE        1472
 | |
| 
 | |
| #define HTTP_BOOT_DHCP4_OPCODE_REQUEST         1
 | |
| #define HTTP_BOOT_DHCP4_OPCODE_REPLY           2
 | |
| #define HTTP_BOOT_DHCP4_MSG_TYPE_REQUEST       3
 | |
| #define HTTP_BOOT_DHCP4_MAGIC                  0x63538263 // network byte order
 | |
| 
 | |
| //
 | |
| // Dhcp Options
 | |
| //
 | |
| #define HTTP_BOOT_DHCP4_TAG_PAD                0    // Pad Option
 | |
| #define HTTP_BOOT_DHCP4_TAG_EOP                255  // End Option
 | |
| #define HTTP_BOOT_DHCP4_TAG_NETMASK            1    // Subnet Mask
 | |
| #define HTTP_BOOT_DHCP4_TAG_TIME_OFFSET        2    // Time Offset from UTC
 | |
| #define HTTP_BOOT_DHCP4_TAG_ROUTER             3    // Router option,
 | |
| #define HTTP_BOOT_DHCP4_TAG_TIME_SERVER        4    // Time Server
 | |
| #define HTTP_BOOT_DHCP4_TAG_NAME_SERVER        5    // Name Server
 | |
| #define HTTP_BOOT_DHCP4_TAG_DNS_SERVER         6    // Domain Name Server
 | |
| #define HTTP_BOOT_DHCP4_TAG_HOSTNAME           12   // Host Name
 | |
| #define HTTP_BOOT_DHCP4_TAG_BOOTFILE_LEN       13   // Boot File Size
 | |
| #define HTTP_BOOT_DHCP4_TAG_DUMP               14   // Merit Dump File
 | |
| #define HTTP_BOOT_DHCP4_TAG_DOMAINNAME         15   // Domain Name
 | |
| #define HTTP_BOOT_DHCP4_TAG_ROOTPATH           17   // Root path
 | |
| #define HTTP_BOOT_DHCP4_TAG_EXTEND_PATH        18   // Extensions Path
 | |
| #define HTTP_BOOT_DHCP4_TAG_EMTU               22   // Maximum Datagram Reassembly Size
 | |
| #define HTTP_BOOT_DHCP4_TAG_TTL                23   // Default IP Time-to-live
 | |
| #define HTTP_BOOT_DHCP4_TAG_BROADCAST          28   // Broadcast Address
 | |
| #define HTTP_BOOT_DHCP4_TAG_NIS_DOMAIN         40   // Network Information Service Domain
 | |
| #define HTTP_BOOT_DHCP4_TAG_NIS_SERVER         41   // Network Information Servers
 | |
| #define HTTP_BOOT_DHCP4_TAG_NTP_SERVER         42   // Network Time Protocol Servers
 | |
| #define HTTP_BOOT_DHCP4_TAG_VENDOR             43   // Vendor Specific Information
 | |
| #define HTTP_BOOT_DHCP4_TAG_REQUEST_IP         50   // Requested IP Address
 | |
| #define HTTP_BOOT_DHCP4_TAG_LEASE              51   // IP Address Lease Time
 | |
| #define HTTP_BOOT_DHCP4_TAG_OVERLOAD           52   // Option Overload
 | |
| #define HTTP_BOOT_DHCP4_TAG_MSG_TYPE           53   // DHCP Message Type
 | |
| #define HTTP_BOOT_DHCP4_TAG_SERVER_ID          54   // Server Identifier
 | |
| #define HTTP_BOOT_DHCP4_TAG_PARA_LIST          55   // Parameter Request List
 | |
| #define HTTP_BOOT_DHCP4_TAG_MAXMSG             57   // Maximum DHCP Message Size
 | |
| #define HTTP_BOOT_DHCP4_TAG_T1                 58   // Renewal (T1) Time Value
 | |
| #define HTTP_BOOT_DHCP4_TAG_T2                 59   // Rebinding (T2) Time Value
 | |
| #define HTTP_BOOT_DHCP4_TAG_CLASS_ID           60   // Vendor class identifier
 | |
| #define HTTP_BOOT_DHCP4_TAG_CLIENT_ID          61   // Client-identifier
 | |
| #define HTTP_BOOT_DHCP4_TAG_TFTP               66   // TFTP server name
 | |
| #define HTTP_BOOT_DHCP4_TAG_BOOTFILE           67   // Bootfile name
 | |
| #define HTTP_BOOT_DHCP4_TAG_ARCH               93
 | |
| #define HTTP_BOOT_DHCP4_TAG_UNDI               94
 | |
| #define HTTP_BOOT_DHCP4_TAG_UUID               97
 | |
| 
 | |
| #define HTTP_BOOT_DHCP4_OVERLOAD_FILE          1
 | |
| #define HTTP_BOOT_DHCP4_OVERLOAD_SERVER_NAME   2
 | |
| 
 | |
| ///
 | |
| /// HTTP Tag definition that identifies the processor 
 | |
| /// and programming environment of the client system.
 | |
| /// These identifiers are defined by IETF:
 | |
| /// http://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml
 | |
| ///
 | |
| #if defined (MDE_CPU_IA32)
 | |
| #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE    0x000F
 | |
| #elif defined (MDE_CPU_X64)
 | |
| #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE    0x0010
 | |
| #elif defined (MDE_CPU_ARM)
 | |
| #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE    0x0012
 | |
| #elif defined (MDE_CPU_AARCH64)
 | |
| #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE    0x0013
 | |
| #elif defined (MDE_CPU_EBC)
 | |
| #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE    0x0011
 | |
| #endif
 | |
| 
 | |
| /// DHCP offer types among HTTP boot.
 | |
| /// Dhcp4 and Dhcp6 share this definition, and corresponding
 | |
| /// relatioinship is as follows:
 | |
| ///   Dhcp4Discover <> Dhcp6Solicit
 | |
| ///   Dhcp4Offer    <> Dhcp6Advertise
 | |
| ///   Dhcp4Request  <> Dhcp6Request
 | |
| ///   Dhcp4Ack      <> DHcp6Reply
 | |
| ///
 | |
| typedef enum {
 | |
|   //
 | |
|   // <IP address, IP expressed URI> or
 | |
|   // <IP address, IP expressed URI, Name-server (will be ignored)>
 | |
|   //
 | |
|   HttpOfferTypeDhcpIpUri,
 | |
|   //
 | |
|   // <IP address, Domain-name expressed URI, Name-server>
 | |
|   //
 | |
|   HttpOfferTypeDhcpNameUriDns,
 | |
|   //
 | |
|   // <IP address, Name-server>
 | |
|   //
 | |
|   HttpOfferTypeDhcpDns,
 | |
|   //
 | |
|   // <IP address>
 | |
|   //
 | |
|   HttpOfferTypeDhcpOnly,
 | |
|   //
 | |
|   // <Domain-name expressed URI> or
 | |
|   // <Domain-name expressed URI, Name-server (will be ignored)>
 | |
|   //
 | |
|   HttpOfferTypeProxyNameUri,
 | |
|   //
 | |
|   // <IP expressed URI> or
 | |
|   // <IP expressed URI, Name-server (will be ignored)>
 | |
|   //
 | |
|   HttpOfferTypeProxyIpUri,
 | |
|   //
 | |
|   // <IP address, Domain-name expressed URI>
 | |
|   //
 | |
|   HttpOfferTypeDhcpNameUri,
 | |
|   HttpOfferTypeMax
 | |
| } HTTP_BOOT_OFFER_TYPE;
 | |
| 
 | |
| #define HTTP_BOOT_DHCP_RETRIES            4
 | |
| #define HTTP_BOOT_OFFER_MAX_NUM           16
 | |
| 
 | |
| // The array index of the DHCP4 option tag interested
 | |
| //
 | |
| #define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
 | |
| #define HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD     1
 | |
| #define HTTP_BOOT_DHCP4_TAG_INDEX_MSG_TYPE     2
 | |
| #define HTTP_BOOT_DHCP4_TAG_INDEX_SERVER_ID    3
 | |
| #define HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID     4
 | |
| #define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE     5
 | |
| #define HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER   6
 | |
| #define HTTP_BOOT_DHCP4_TAG_INDEX_MAX          7
 | |
| 
 | |
| #pragma pack(1)
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8 ParaList[135];
 | |
| } HTTP_BOOT_DHCP4_OPTION_PARA;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT16  Size;
 | |
| } HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8 Type;
 | |
|   UINT8 MajorVer;
 | |
|   UINT8 MinorVer;
 | |
| } HTTP_BOOT_DHCP4_OPTION_UNDI;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8 Type;
 | |
| } HTTP_BOOT_DHCP4_OPTION_MESG;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT16 Type;
 | |
| } HTTP_BOOT_DHCP4_OPTION_ARCH;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8 ClassIdentifier[11];
 | |
|   UINT8 ArchitecturePrefix[5];
 | |
|   UINT8 ArchitectureType[5];
 | |
|   UINT8 Lit3[1];
 | |
|   UINT8 InterfaceName[4];
 | |
|   UINT8 Lit4[1];
 | |
|   UINT8 UndiMajor[3];
 | |
|   UINT8 UndiMinor[3];
 | |
| } HTTP_BOOT_DHCP4_OPTION_CLID;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8 Type;
 | |
|   UINT8 Guid[16];
 | |
| } HTTP_BOOT_DHCP4_OPTION_UUID;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT16 Type;
 | |
|   UINT16 Layer;
 | |
| } HTTP_BOOT_OPTION_BOOT_ITEM;
 | |
| 
 | |
| #pragma pack()
 | |
| 
 | |
| typedef union {
 | |
|   HTTP_BOOT_DHCP4_OPTION_PARA           *Para;
 | |
|   HTTP_BOOT_DHCP4_OPTION_UNDI           *Undi;
 | |
|   HTTP_BOOT_DHCP4_OPTION_ARCH           *Arch;
 | |
|   HTTP_BOOT_DHCP4_OPTION_CLID           *Clid;
 | |
|   HTTP_BOOT_DHCP4_OPTION_UUID           *Uuid;
 | |
|   HTTP_BOOT_DHCP4_OPTION_MESG           *Mesg;
 | |
|   HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE  *MaxMesgSize;
 | |
| } HTTP_BOOT_DHCP4_OPTION_ENTRY;
 | |
| 
 | |
| #define GET_NEXT_DHCP_OPTION(Opt) \
 | |
|   (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \
 | |
|    sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
 | |
| 
 | |
| #define GET_OPTION_BUFFER_LEN(Pkt) \
 | |
|   ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
 | |
| 
 | |
| #define DEFAULT_CLASS_ID_DATA "HTTPClient:Arch:xxxxx:UNDI:003000"
 | |
| #define DEFAULT_UNDI_TYPE     1
 | |
| #define DEFAULT_UNDI_MAJOR    3
 | |
| #define DEFAULT_UNDI_MINOR    0
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32         Reserved;
 | |
| } HTTP_BOOT_VENDOR_OPTION;
 | |
| 
 | |
| typedef union {
 | |
|   EFI_DHCP4_PACKET        Offer;
 | |
|   EFI_DHCP4_PACKET        Ack;
 | |
|   UINT8                   Buffer[HTTP_BOOT_DHCP4_PACKET_MAX_SIZE];
 | |
| } HTTP_BOOT_DHCP4_PACKET;
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // URI component
 | |
|   //
 | |
|   CHAR8                   *Scheme;
 | |
|   CHAR8                   *Authority;
 | |
|   CHAR8                   *Path;
 | |
|   CHAR8                   *Query;
 | |
|   CHAR8                   *Fragment; /// TODO: may not required in HTTP URL
 | |
| 
 | |
|   CHAR8                   *RegName; /// Point to somewhere in Authority
 | |
|   BOOLEAN                 AddrIsOk;
 | |
|   EFI_IP_ADDRESS          Address;
 | |
|   UINT16                  Port;
 | |
| } HTTP_BOOT_URI_CONTENT;
 | |
| 
 | |
| typedef struct {
 | |
|   HTTP_BOOT_DHCP4_PACKET      Packet;
 | |
|   HTTP_BOOT_OFFER_TYPE        OfferType;
 | |
|   VOID                        *UriParser;
 | |
|   EFI_DHCP4_PACKET_OPTION     *OptList[HTTP_BOOT_DHCP4_TAG_INDEX_MAX];
 | |
| } HTTP_BOOT_DHCP4_PACKET_CACHE;
 | |
| 
 | |
| /**
 | |
|   Select an DHCPv4 or DHCP6 offer, and record SelectIndex and SelectProxyType.
 | |
| 
 | |
|   @param[in]  Private             Pointer to HTTP boot driver private data.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| HttpBootSelectDhcpOffer (
 | |
|   IN HTTP_BOOT_PRIVATE_DATA  *Private
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other Http boot information.
 | |
| 
 | |
|   @param[in]  Private           Pointer to HTTP_BOOT private data.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The D.O.R.A process successfully finished.
 | |
|   @retval Others                Failed to finish the D.O.R.A process.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| HttpBootDhcp4Dora (
 | |
|   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_IPv4_ADDRESS instances.
 | |
| 
 | |
|   @retval     EFI_SUCCESS         The DNS configuration has been configured successfully.
 | |
|   @retval     Others              Failed to configure the address.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| HttpBootRegisterIp4Dns (
 | |
|   IN HTTP_BOOT_PRIVATE_DATA         *Private,
 | |
|   IN UINTN                          DataLength,
 | |
|   IN VOID                           *DnsServerData
 | |
|   );
 | |
| 
 | |
| #endif
 |