1 /** @file 2 Functions declaration related with DHCPv4 for HTTP boot driver. 3 4 Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials are licensed and made available under 6 the terms and conditions of the BSD License that accompanies this distribution. 7 The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php. 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef __EFI_UEFI_HTTP_BOOT_DHCP4_H__ 16 #define __EFI_UEFI_HTTP_BOOT_DHCP4_H__ 17 18 #define HTTP_BOOT_DHCP4_OPTION_MAX_NUM 16 19 #define HTTP_BOOT_DHCP4_OPTION_MAX_SIZE 312 20 #define HTTP_BOOT_DHCP4_PACKET_MAX_SIZE 1472 21 22 #define HTTP_BOOT_DHCP4_OPCODE_REQUEST 1 23 #define HTTP_BOOT_DHCP4_OPCODE_REPLY 2 24 #define HTTP_BOOT_DHCP4_MSG_TYPE_REQUEST 3 25 #define HTTP_BOOT_DHCP4_MAGIC 0x63538263 // network byte order 26 27 #define HTTP_BOOT_DHCP4_OVERLOAD_FILE 1 28 #define HTTP_BOOT_DHCP4_OVERLOAD_SERVER_NAME 2 29 30 /// 31 /// HTTP Tag definition that identifies the processor 32 /// and programming environment of the client system. 33 /// These identifiers are defined by IETF: 34 /// http://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml 35 /// 36 #if defined (MDE_CPU_IA32) 37 #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_IA32 38 #elif defined (MDE_CPU_X64) 39 #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_X64 40 #elif defined (MDE_CPU_ARM) 41 #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_ARM 42 #elif defined (MDE_CPU_AARCH64) 43 #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_AARCH64 44 #elif defined (MDE_CPU_EBC) 45 #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_EBC 46 #endif 47 48 /// DHCP offer types among HTTP boot. 49 /// Dhcp4 and Dhcp6 share this definition, and corresponding 50 /// relatioinship is as follows: 51 /// Dhcp4Discover <> Dhcp6Solicit 52 /// Dhcp4Offer <> Dhcp6Advertise 53 /// Dhcp4Request <> Dhcp6Request 54 /// Dhcp4Ack <> DHcp6Reply 55 /// 56 typedef enum { 57 // 58 // <IP address, IP expressed URI> 59 // 60 HttpOfferTypeDhcpIpUri, 61 // 62 // <IP address, IP expressed URI, Name-server> 63 // 64 HttpOfferTypeDhcpIpUriDns, 65 // 66 // <IP address, Domain-name expressed URI, Name-server> 67 // 68 HttpOfferTypeDhcpNameUriDns, 69 // 70 // <IP address, Name-server> 71 // 72 HttpOfferTypeDhcpDns, 73 // 74 // <IP address> 75 // 76 HttpOfferTypeDhcpOnly, 77 // 78 // <Domain-name expressed URI> or 79 // <Domain-name expressed URI, Name-server (will be ignored)> 80 // 81 HttpOfferTypeProxyNameUri, 82 // 83 // <IP expressed URI> or 84 // <IP expressed URI, Name-server (will be ignored)> 85 // 86 HttpOfferTypeProxyIpUri, 87 // 88 // <IP address, Domain-name expressed URI> 89 // 90 HttpOfferTypeDhcpNameUri, 91 HttpOfferTypeMax 92 } HTTP_BOOT_OFFER_TYPE; 93 94 #define HTTP_BOOT_DHCP_RETRIES 4 95 #define HTTP_BOOT_OFFER_MAX_NUM 16 96 97 // The array index of the DHCP4 option tag interested 98 // 99 #define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE_LEN 0 100 #define HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD 1 101 #define HTTP_BOOT_DHCP4_TAG_INDEX_MSG_TYPE 2 102 #define HTTP_BOOT_DHCP4_TAG_INDEX_SERVER_ID 3 103 #define HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID 4 104 #define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE 5 105 #define HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER 6 106 #define HTTP_BOOT_DHCP4_TAG_INDEX_MAX 7 107 108 #pragma pack(1) 109 110 typedef struct { 111 UINT8 ParaList[135]; 112 } HTTP_BOOT_DHCP4_OPTION_PARA; 113 114 typedef struct { 115 UINT16 Size; 116 } HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE; 117 118 typedef struct { 119 UINT8 Type; 120 UINT8 MajorVer; 121 UINT8 MinorVer; 122 } HTTP_BOOT_DHCP4_OPTION_UNDI; 123 124 typedef struct { 125 UINT8 Type; 126 } HTTP_BOOT_DHCP4_OPTION_MESG; 127 128 typedef struct { 129 UINT16 Type; 130 } HTTP_BOOT_DHCP4_OPTION_ARCH; 131 132 typedef struct { 133 UINT8 ClassIdentifier[11]; 134 UINT8 ArchitecturePrefix[5]; 135 UINT8 ArchitectureType[5]; 136 UINT8 Lit3[1]; 137 UINT8 InterfaceName[4]; 138 UINT8 Lit4[1]; 139 UINT8 UndiMajor[3]; 140 UINT8 UndiMinor[3]; 141 } HTTP_BOOT_DHCP4_OPTION_CLID; 142 143 typedef struct { 144 UINT8 Type; 145 UINT8 Guid[16]; 146 } HTTP_BOOT_DHCP4_OPTION_UUID; 147 148 typedef struct { 149 UINT16 Type; 150 UINT16 Layer; 151 } HTTP_BOOT_OPTION_BOOT_ITEM; 152 153 #pragma pack() 154 155 typedef union { 156 HTTP_BOOT_DHCP4_OPTION_PARA *Para; 157 HTTP_BOOT_DHCP4_OPTION_UNDI *Undi; 158 HTTP_BOOT_DHCP4_OPTION_ARCH *Arch; 159 HTTP_BOOT_DHCP4_OPTION_CLID *Clid; 160 HTTP_BOOT_DHCP4_OPTION_UUID *Uuid; 161 HTTP_BOOT_DHCP4_OPTION_MESG *Mesg; 162 HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize; 163 } HTTP_BOOT_DHCP4_OPTION_ENTRY; 164 165 #define GET_NEXT_DHCP_OPTION(Opt) \ 166 (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + \ 167 sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1) 168 169 #define GET_OPTION_BUFFER_LEN(Pkt) \ 170 ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4) 171 172 #define DEFAULT_CLASS_ID_DATA "HTTPClient:Arch:xxxxx:UNDI:003000" 173 #define DEFAULT_UNDI_TYPE 1 174 #define DEFAULT_UNDI_MAJOR 3 175 #define DEFAULT_UNDI_MINOR 0 176 177 typedef struct { 178 UINT32 Reserved; 179 } HTTP_BOOT_VENDOR_OPTION; 180 181 #define HTTP_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + HTTP_BOOT_DHCP4_PACKET_MAX_SIZE) 182 183 typedef union { 184 EFI_DHCP4_PACKET Offer; 185 EFI_DHCP4_PACKET Ack; 186 UINT8 Buffer[HTTP_CACHED_DHCP4_PACKET_MAX_SIZE]; 187 } HTTP_BOOT_DHCP4_PACKET; 188 189 typedef struct { 190 // 191 // URI component 192 // 193 CHAR8 *Scheme; 194 CHAR8 *Authority; 195 CHAR8 *Path; 196 CHAR8 *Query; 197 CHAR8 *Fragment; /// TODO: may not required in HTTP URL 198 199 CHAR8 *RegName; /// Point to somewhere in Authority 200 BOOLEAN AddrIsOk; 201 EFI_IP_ADDRESS Address; 202 UINT16 Port; 203 } HTTP_BOOT_URI_CONTENT; 204 205 typedef struct { 206 HTTP_BOOT_DHCP4_PACKET Packet; 207 HTTP_BOOT_OFFER_TYPE OfferType; 208 VOID *UriParser; 209 EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_TAG_INDEX_MAX]; 210 } HTTP_BOOT_DHCP4_PACKET_CACHE; 211 212 /** 213 Select an DHCPv4 or DHCP6 offer, and record SelectIndex and SelectProxyType. 214 215 @param[in] Private Pointer to HTTP boot driver private data. 216 217 **/ 218 VOID 219 HttpBootSelectDhcpOffer ( 220 IN HTTP_BOOT_PRIVATE_DATA *Private 221 ); 222 223 /** 224 Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other Http boot information. 225 226 @param[in] Private Pointer to HTTP_BOOT private data. 227 228 @retval EFI_SUCCESS The D.O.R.A process successfully finished. 229 @retval Others Failed to finish the D.O.R.A process. 230 231 **/ 232 EFI_STATUS 233 HttpBootDhcp4Dora ( 234 IN HTTP_BOOT_PRIVATE_DATA *Private 235 ); 236 237 /** 238 This function will register the default DNS addresses to the network device. 239 240 @param[in] Private The pointer to HTTP_BOOT_PRIVATE_DATA. 241 @param[in] DataLength Size of the buffer pointed to by DnsServerData in bytes. 242 @param[in] DnsServerData Point a list of DNS server address in an array 243 of EFI_IPv4_ADDRESS instances. 244 245 @retval EFI_SUCCESS The DNS configuration has been configured successfully. 246 @retval Others Failed to configure the address. 247 248 **/ 249 EFI_STATUS 250 HttpBootRegisterIp4Dns ( 251 IN HTTP_BOOT_PRIVATE_DATA *Private, 252 IN UINTN DataLength, 253 IN VOID *DnsServerData 254 ); 255 256 #endif 257