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
|
---|