PxeBcImpl.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /** @file
  2. This EFI_PXE_BASE_CODE_PROTOCOL and EFI_LOAD_FILE_PROTOCOL.
  3. interfaces declaration.
  4. Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #ifndef __EFI_PXEBC_IMPL_H__
  8. #define __EFI_PXEBC_IMPL_H__
  9. #include <Uefi.h>
  10. #include <Guid/SmBios.h>
  11. #include <IndustryStandard/SmBios.h>
  12. #include <IndustryStandard/Dhcp.h>
  13. #include <Protocol/NetworkInterfaceIdentifier.h>
  14. #include <Protocol/Arp.h>
  15. #include <Protocol/Ip4.h>
  16. #include <Protocol/Ip4Config2.h>
  17. #include <Protocol/Ip6.h>
  18. #include <Protocol/Ip6Config.h>
  19. #include <Protocol/Udp4.h>
  20. #include <Protocol/Udp6.h>
  21. #include <Protocol/Dhcp4.h>
  22. #include <Protocol/Dhcp6.h>
  23. #include <Protocol/Dns6.h>
  24. #include <Protocol/Mtftp4.h>
  25. #include <Protocol/Mtftp6.h>
  26. #include <Protocol/PxeBaseCode.h>
  27. #include <Protocol/LoadFile.h>
  28. #include <Protocol/PxeBaseCodeCallBack.h>
  29. #include <Protocol/ServiceBinding.h>
  30. #include <Protocol/DriverBinding.h>
  31. #include <Protocol/AdapterInformation.h>
  32. #include <Library/DebugLib.h>
  33. #include <Library/BaseMemoryLib.h>
  34. #include <Library/MemoryAllocationLib.h>
  35. #include <Library/UefiDriverEntryPoint.h>
  36. #include <Library/UefiBootServicesTableLib.h>
  37. #include <Library/UefiRuntimeServicesTableLib.h>
  38. #include <Library/UefiLib.h>
  39. #include <Library/BaseLib.h>
  40. #include <Library/NetLib.h>
  41. #include <Library/DpcLib.h>
  42. #include <Library/DevicePathLib.h>
  43. #include <Library/PcdLib.h>
  44. typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA;
  45. typedef struct _PXEBC_PRIVATE_PROTOCOL PXEBC_PRIVATE_PROTOCOL;
  46. typedef struct _PXEBC_VIRTUAL_NIC PXEBC_VIRTUAL_NIC;
  47. #include "PxeBcDriver.h"
  48. #include "PxeBcDhcp4.h"
  49. #include "PxeBcDhcp6.h"
  50. #include "PxeBcMtftp.h"
  51. #include "PxeBcBoot.h"
  52. #include "PxeBcSupport.h"
  53. #define PXEBC_DEFAULT_HOPLIMIT 64
  54. #define PXEBC_DEFAULT_LIFETIME 50000 // 50 ms, unit is microsecond
  55. #define PXEBC_UDP_TIMEOUT 30000000 // 3 seconds, unit is 100nanosecond
  56. #define PXEBC_DAD_ADDITIONAL_DELAY 30000000 // 3 seconds
  57. #define PXEBC_MTFTP_TIMEOUT 4
  58. #define PXEBC_MTFTP_RETRIES 6
  59. #define PXEBC_DHCP_RETRIES 4 // refers to mPxeDhcpTimeout, also by PXE2.1 spec.
  60. #define PXEBC_MENU_MAX_NUM 24
  61. #define PXEBC_OFFER_MAX_NUM 16
  62. #define PXEBC_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
  63. #define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P')
  64. #define PXEBC_VIRTUAL_NIC_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'V')
  65. #define PXEBC_PRIVATE_DATA_FROM_PXEBC(a) CR (a, PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE)
  66. #define PXEBC_PRIVATE_DATA_FROM_ID(a) CR (a, PXEBC_PRIVATE_DATA, Id, PXEBC_PRIVATE_DATA_SIGNATURE)
  67. #define PXEBC_VIRTUAL_NIC_FROM_LOADFILE(a) CR (a, PXEBC_VIRTUAL_NIC, LoadFile, PXEBC_VIRTUAL_NIC_SIGNATURE)
  68. #define PXE_ENABLED 0x01
  69. #define PXE_DISABLED 0x00
  70. typedef union {
  71. PXEBC_DHCP4_PACKET_CACHE Dhcp4;
  72. PXEBC_DHCP6_PACKET_CACHE Dhcp6;
  73. } PXEBC_DHCP_PACKET_CACHE;
  74. struct _PXEBC_PRIVATE_PROTOCOL {
  75. UINT64 Reserved;
  76. };
  77. struct _PXEBC_VIRTUAL_NIC {
  78. UINT32 Signature;
  79. EFI_HANDLE Controller;
  80. EFI_LOAD_FILE_PROTOCOL LoadFile;
  81. EFI_DEVICE_PATH_PROTOCOL *DevicePath;
  82. PXEBC_PRIVATE_DATA *Private;
  83. };
  84. struct _PXEBC_PRIVATE_DATA {
  85. UINT32 Signature;
  86. EFI_HANDLE Controller;
  87. EFI_HANDLE Image;
  88. PXEBC_PRIVATE_PROTOCOL Id;
  89. EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
  90. PXEBC_VIRTUAL_NIC *Ip4Nic;
  91. PXEBC_VIRTUAL_NIC *Ip6Nic;
  92. EFI_HANDLE ArpChild;
  93. EFI_HANDLE Ip4Child;
  94. EFI_HANDLE Dhcp4Child;
  95. EFI_HANDLE Mtftp4Child;
  96. EFI_HANDLE Udp4ReadChild;
  97. EFI_HANDLE Udp4WriteChild;
  98. EFI_ARP_PROTOCOL *Arp;
  99. EFI_IP4_PROTOCOL *Ip4;
  100. EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
  101. EFI_DHCP4_PROTOCOL *Dhcp4;
  102. EFI_MTFTP4_PROTOCOL *Mtftp4;
  103. EFI_UDP4_PROTOCOL *Udp4Read;
  104. EFI_UDP4_PROTOCOL *Udp4Write;
  105. EFI_HANDLE Ip6Child;
  106. EFI_HANDLE Dhcp6Child;
  107. EFI_HANDLE Mtftp6Child;
  108. EFI_HANDLE Udp6ReadChild;
  109. EFI_HANDLE Udp6WriteChild;
  110. EFI_IP6_PROTOCOL *Ip6;
  111. EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;
  112. EFI_DHCP6_PROTOCOL *Dhcp6;
  113. EFI_MTFTP6_PROTOCOL *Mtftp6;
  114. EFI_UDP6_PROTOCOL *Udp6Read;
  115. EFI_UDP6_PROTOCOL *Udp6Write;
  116. EFI_DNS6_PROTOCOL *Dns6;
  117. EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii;
  118. EFI_PXE_BASE_CODE_PROTOCOL PxeBc;
  119. EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL LoadFileCallback;
  120. EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *PxeBcCallback;
  121. EFI_DEVICE_PATH_PROTOCOL *DevicePath;
  122. EFI_PXE_BASE_CODE_MODE Mode;
  123. EFI_PXE_BASE_CODE_FUNCTION Function;
  124. UINT32 Ip6Policy;
  125. UINT32 SolicitTimes;
  126. UINT64 ElapsedTime;
  127. EFI_UDP4_CONFIG_DATA Udp4CfgData;
  128. EFI_UDP6_CONFIG_DATA Udp6CfgData;
  129. EFI_IP4_CONFIG_DATA Ip4CfgData;
  130. EFI_IP6_CONFIG_DATA Ip6CfgData;
  131. EFI_EVENT UdpTimeOutEvent;
  132. EFI_EVENT ArpUpdateEvent;
  133. EFI_IP4_COMPLETION_TOKEN IcmpToken;
  134. EFI_IP6_COMPLETION_TOKEN Icmp6Token;
  135. BOOLEAN IsAddressOk;
  136. BOOLEAN IsOfferSorted;
  137. BOOLEAN IsProxyRecved;
  138. BOOLEAN IsDoDiscover;
  139. EFI_IP_ADDRESS TmpStationIp;
  140. EFI_IP_ADDRESS StationIp;
  141. EFI_IP_ADDRESS SubnetMask;
  142. EFI_IP_ADDRESS GatewayIp;
  143. EFI_IP_ADDRESS ServerIp;
  144. EFI_IPv6_ADDRESS *DnsServer;
  145. UINT16 CurSrcPort;
  146. UINT32 IaId;
  147. UINT32 Ip4MaxPacketSize;
  148. UINT32 Ip6MaxPacketSize;
  149. UINT8 *BootFileName;
  150. UINTN BootFileSize;
  151. UINTN BlockSize;
  152. PXEBC_DHCP_PACKET_CACHE ProxyOffer;
  153. PXEBC_DHCP_PACKET_CACHE DhcpAck;
  154. PXEBC_DHCP_PACKET_CACHE PxeReply;
  155. EFI_DHCP6_PACKET *Dhcp6Request;
  156. EFI_DHCP4_PACKET SeedPacket;
  157. //
  158. // OfferIndex records the index of DhcpOffer[] buffer, and OfferCount records the num of each type of offer.
  159. //
  160. // It supposed that
  161. //
  162. // OfferNum: 8
  163. // OfferBuffer: [ProxyBinl, ProxyBinl, DhcpOnly, ProxyPxe10, DhcpOnly, DhcpPxe10, DhcpBinl, ProxyBinl]
  164. // (OfferBuffer is 0-based.)
  165. //
  166. // And assume that (DhcpPxe10 is the first priority actually.)
  167. //
  168. // SelectIndex: 2
  169. // SelectProxyType: PXEBC_OFFER_TYPE_PROXY_BINL
  170. // (SelectIndex is 1-based, and 0 means no one is selected.)
  171. //
  172. // So it should be
  173. //
  174. // DhcpOnly DhcpPxe10 DhcpWfm11a DhcpBinl ProxyPxe10 ProxyWfm11a ProxyBinl Bootp
  175. // OfferCount: [ 2(n), 1(n), 0(n), 1(n), 1(1), 0(1), 3(n), 1(1)]
  176. //
  177. // OfferIndex: {[ 2, 5, 0, 6, 3, 0, *0, 0]
  178. // [ 4, 0, 0, 0, 0, 0, 1, 0]
  179. // [ 0, 0, 0, 0, 0, 0, 7, 0]
  180. // ... ]}
  181. // (OfferIndex is 0-based.)
  182. //
  183. //
  184. UINT32 SelectIndex;
  185. UINT32 SelectProxyType;
  186. PXEBC_DHCP_PACKET_CACHE OfferBuffer[PXEBC_OFFER_MAX_NUM];
  187. UINT32 OfferNum;
  188. UINT32 OfferCount[PxeOfferTypeMax];
  189. UINT32 OfferIndex[PxeOfferTypeMax][PXEBC_OFFER_MAX_NUM];
  190. };
  191. extern EFI_PXE_BASE_CODE_PROTOCOL gPxeBcProtocolTemplate;
  192. extern EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL gPxeBcCallBackTemplate;
  193. extern EFI_LOAD_FILE_PROTOCOL gLoadFileProtocolTemplate;
  194. #endif