HttpBootDhcp4.h 7.6 KB

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