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