| /** @file | |
| Functions declaration related with DHCPv4 for HTTP boot driver. | |
| Copyright (c) 2015 - 2016, 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> | |
| // | |
| HttpOfferTypeDhcpIpUri, | |
| // | |
| // <IP address, IP expressed URI, Name-server> | |
| // | |
| HttpOfferTypeDhcpIpUriDns, | |
| // | |
| // <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 |