From c4545d769fc26d6bb70c4236eab26df498ed784e Mon Sep 17 00:00:00 2001 From: Fu Siyuan Date: Tue, 7 Jul 2015 09:29:28 +0000 Subject: NetworkPkg: Add UEFI HTTP boot driver. This patch add the implementation for UEFI HTTP boot driver. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Fu Siyuan Reviewed-by: Ye Ting git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17857 6f19259b-4bc3-4df7-8a09-765794883524 --- NetworkPkg/HttpBootDxe/HttpBootDhcp4.h | 279 +++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 NetworkPkg/HttpBootDxe/HttpBootDhcp4.h (limited to 'NetworkPkg/HttpBootDxe/HttpBootDhcp4.h') diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp4.h b/NetworkPkg/HttpBootDxe/HttpBootDhcp4.h new file mode 100644 index 0000000000..42a3874444 --- /dev/null +++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp4.h @@ -0,0 +1,279 @@ +/** @file + Functions declaration related with DHCPv4 for HTTP boot driver. + +Copyright (c) 2015, Intel Corporation. All rights reserved.
+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 +#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 { + // + // or + // + // + HttpOfferTypeDhcpIpUri, + // + // + // + HttpOfferTypeDhcpNameUriDns, + // + // + // + HttpOfferTypeDhcpDns, + // + // + // + HttpOfferTypeDhcpOnly, + // + // or + // + // + HttpOfferTypeProxyNameUri, + // + // or + // + // + HttpOfferTypeProxyIpUri, + // + // + // + 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; + +/** + 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 -- cgit v1.2.3