2 This EFI_PXE_BASE_CODE_PROTOCOL and EFI_LOAD_FILE_PROTOCOL.
3 interfaces declaration.
5 Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
7 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #ifndef __EFI_PXEBC_IMPL_H__
12 #define __EFI_PXEBC_IMPL_H__
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>
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>
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
;
56 #include "PxeBcDriver.h"
57 #include "PxeBcDhcp4.h"
58 #include "PxeBcDhcp6.h"
59 #include "PxeBcMtftp.h"
60 #include "PxeBcBoot.h"
61 #include "PxeBcSupport.h"
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
73 #define PXEBC_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
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)
81 #define PXE_ENABLED 0x01
82 #define PXE_DISABLED 0x00
85 PXEBC_DHCP4_PACKET_CACHE Dhcp4
;
86 PXEBC_DHCP6_PACKET_CACHE Dhcp6
;
87 } PXEBC_DHCP_PACKET_CACHE
;
89 struct _PXEBC_PRIVATE_PROTOCOL
{
93 struct _PXEBC_VIRTUAL_NIC
{
95 EFI_HANDLE Controller
;
96 EFI_LOAD_FILE_PROTOCOL LoadFile
;
97 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
98 PXEBC_PRIVATE_DATA
*Private
;
101 struct _PXEBC_PRIVATE_DATA
{
103 EFI_HANDLE Controller
;
106 PXEBC_PRIVATE_PROTOCOL Id
;
107 EFI_SIMPLE_NETWORK_PROTOCOL
*Snp
;
109 PXEBC_VIRTUAL_NIC
*Ip4Nic
;
110 PXEBC_VIRTUAL_NIC
*Ip6Nic
;
114 EFI_HANDLE Dhcp4Child
;
115 EFI_HANDLE Mtftp4Child
;
116 EFI_HANDLE Udp4ReadChild
;
117 EFI_HANDLE Udp4WriteChild
;
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
;
128 EFI_HANDLE Dhcp6Child
;
129 EFI_HANDLE Mtftp6Child
;
130 EFI_HANDLE Udp6ReadChild
;
131 EFI_HANDLE Udp6WriteChild
;
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
;
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
;
147 EFI_PXE_BASE_CODE_MODE Mode
;
148 EFI_PXE_BASE_CODE_FUNCTION Function
;
153 EFI_UDP4_CONFIG_DATA Udp4CfgData
;
154 EFI_UDP6_CONFIG_DATA Udp6CfgData
;
155 EFI_IP4_CONFIG_DATA Ip4CfgData
;
156 EFI_IP6_CONFIG_DATA Ip6CfgData
;
158 EFI_EVENT UdpTimeOutEvent
;
159 EFI_EVENT ArpUpdateEvent
;
160 EFI_IP4_COMPLETION_TOKEN IcmpToken
;
161 EFI_IP6_COMPLETION_TOKEN Icmp6Token
;
164 BOOLEAN IsOfferSorted
;
165 BOOLEAN IsProxyRecved
;
166 BOOLEAN IsDoDiscover
;
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
;
177 UINT32 Ip4MaxPacketSize
;
178 UINT32 Ip6MaxPacketSize
;
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
;
190 // OfferIndex records the index of DhcpOffer[] buffer, and OfferCount records the num of each type of offer.
195 // OfferBuffer: [ProxyBinl, ProxyBinl, DhcpOnly, ProxyPxe10, DhcpOnly, DhcpPxe10, DhcpBinl, ProxyBinl]
196 // (OfferBuffer is 0-based.)
198 // And assume that (DhcpPxe10 is the first priority actually.)
201 // SelectProxyType: PXEBC_OFFER_TYPE_PROXY_BINL
202 // (SelectIndex is 1-based, and 0 means no one is selected.)
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)]
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]
213 // (OfferIndex is 0-based.)
217 UINT32 SelectProxyType
;
218 PXEBC_DHCP_PACKET_CACHE OfferBuffer
[PXEBC_OFFER_MAX_NUM
];
220 UINT32 OfferCount
[PxeOfferTypeMax
];
221 UINT32 OfferIndex
[PxeOfferTypeMax
][PXEBC_OFFER_MAX_NUM
];
224 extern EFI_PXE_BASE_CODE_PROTOCOL gPxeBcProtocolTemplate
;
225 extern EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL gPxeBcCallBackTemplate
;
226 extern EFI_LOAD_FILE_PROTOCOL gLoadFileProtocolTemplate
;