]> git.proxmox.com Git - mirror_edk2.git/blob - EdkModulePkg/Universal/Network/PxeBc/Dxe/Bc.h
a391709c9e150ed1d411c0b3e47c732501dd0f29
[mirror_edk2.git] / EdkModulePkg / Universal / Network / PxeBc / Dxe / Bc.h
1 /*++
2
3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13 bc.h
14
15 Abstract:
16
17 --*/
18
19 #ifndef _BC_H
20 #define _BC_H
21
22 #ifndef EFI_MIN
23 #define EFI_MIN(_a, _b) ((_a) < (_b) ? (_a) : (_b))
24 #endif
25
26 #define CALLBACK_INTERVAL 100 // ten times a second
27 #define FILTER_BITS (EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP | \
28 EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST | \
29 EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS | \
30 EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST \
31 )
32
33 #define WAIT_TX_TIMEOUT 1000
34
35 #define SUPPORT_IPV6 0
36
37 #define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32('p','x','e','d')
38
39 //
40 // Determine the classes of IPv4 address
41 //
42 #define IS_CLASSA_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0x80) == 0x00)
43 #define IS_CLASSB_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xc0) == 0x80)
44 #define IS_CLASSC_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xe0) == 0xc0)
45 #define IS_INADDR_UNICAST(x) ((IS_CLASSA_IPADDR(x) || IS_CLASSB_IPADDR(x) || IS_CLASSC_IPADDR(x)) && (((EFI_IP_ADDRESS*)x)->Addr[0] != 0) )
46
47 //
48 // Definitions for internet group management protocol version 2 message
49 // structure
50 // Per RFC 2236, November 1997
51 //
52 #pragma pack(1)
53
54 typedef struct {
55 UINT8 Type;
56 UINT8 MaxRespTime; // in tenths of a second
57 UINT16 Checksum; // ones complement of ones complement sum of
58 // 16 bit words of message
59 UINT32 GroupAddress; // for general query, all systems group,
60 // for group specific, the group
61 } IGMPV2_MESSAGE;
62
63 #define IGMP_TYPE_QUERY 0x11
64 #define IGMP_TYPE_REPORT 0x16
65 #define IGMP_TYPE_V1REPORT 0x12
66 #define IGMP_TYPE_LEAVE_GROUP 0x17
67
68 #define IGMP_DEFAULT_MAX_RESPONSE_TIME 10 // 10 second default
69 #pragma pack()
70
71 #define MAX_MCAST_GROUPS 8 // most we allow ourselves to join at once
72 #define MAX_OFFERS 16
73
74 typedef struct {
75 UINTN Signature;
76 EFI_LOCK Lock;
77 BOOLEAN ShowErrorMessages;
78 EFI_PXE_BASE_CODE_PROTOCOL EfiBc;
79 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *CallbackProtocolPtr;
80 EFI_HANDLE Handle;
81
82 EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *NiiPtr;
83 EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNetwork;
84 UINT8 *TransmitBufferPtr;
85 UINT8 *ReceiveBufferPtr;
86 EFI_PXE_BASE_CODE_FUNCTION Function;
87
88 UINTN OldestArpEntry;
89 UINTN MCastGroupCount;
90 EFI_EVENT Igmpv1TimeoutEvent;
91 BOOLEAN UseIgmpv1Reporting;
92 EFI_EVENT IgmpGroupEvent[MAX_MCAST_GROUPS];
93 UINT16 RandomPort;
94
95 #if SUPPORT_IPV6
96 //
97 // TBD
98 //
99 #else
100 UINT32 MCastGroup[MAX_MCAST_GROUPS];
101 #endif
102
103 BOOLEAN GoodStationIp;
104 BOOLEAN DidTransmit;
105 UINTN IpLength;
106 VOID *DhcpPacketBuffer;
107 UINTN FileSize;
108 VOID *BootServerReceiveBuffer;
109 EFI_IP_ADDRESS ServerIp;
110
111 //
112 // work area
113 // for dhcp
114 //
115 VOID *ReceiveBuffers;
116 VOID *TransmitBuffer;
117 UINTN NumOffersReceived;
118 UINT16 TotalSeconds;
119
120 //
121 // arrays for different types of offers
122 //
123 UINT8 ServerCount[4];
124 UINT8 OfferCount[4][MAX_OFFERS];
125 UINT8 GotBootp;
126 UINT8 GotProxy[4];
127 UINT8 BinlProxies[MAX_OFFERS];
128
129 UINT8 *ArpBuffer;
130 UINT8 *TftpAckBuffer;
131 UINT8 *TftpErrorBuffer;
132 IGMPV2_MESSAGE IgmpMessage;
133 BOOLEAN BigBlkNumFlag;
134 UINT8 Timeout;
135 UINT16 RandomSeed;
136 } PXE_BASECODE_DEVICE;
137
138 //
139 // type index
140 //
141 #define DHCP_ONLY_IX 0
142 #define PXE10_IX 1
143 #define WfM11a_IX 2
144 #define BINL_IX 3
145
146 #define PXE_RND_PORT_LOW 2070
147
148 #define PXE_MAX_PRINT_BUFFER 128
149
150 //
151 //
152 //
153 #define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32('p','x','e','l')
154
155 typedef struct {
156 UINTN Signature;
157 EFI_LOCK Lock;
158 EFI_LOAD_FILE_PROTOCOL LoadFile;
159 PXE_BASECODE_DEVICE *Private;
160 } LOADFILE_DEVICE;
161
162 #define EFI_BASE_CODE_DEV_FROM_THIS(a) CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE);
163
164 #define EFI_LOAD_FILE_DEV_FROM_THIS(a) CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE)
165
166 EFI_BIS_PROTOCOL *
167 PxebcBisStart (
168 PXE_BASECODE_DEVICE *Private,
169 BIS_APPLICATION_HANDLE *BisAppHandle,
170 EFI_BIS_DATA **BisDataSigInfo
171 )
172 ;
173
174 VOID
175 PxebcBisStop (
176 EFI_BIS_PROTOCOL *Bis,
177 BIS_APPLICATION_HANDLE BisAppHandle,
178 EFI_BIS_DATA *BisDataSigInfo
179 )
180 ;
181
182 BOOLEAN
183 PxebcBisVerify (
184 PXE_BASECODE_DEVICE *Private,
185 VOID *FileBuffer,
186 UINTN FileBufferLength,
187 VOID *CredentialBuffer,
188 UINTN CredentialBufferLength
189 )
190 ;
191
192 BOOLEAN
193 PxebcBisDetect (
194 PXE_BASECODE_DEVICE *Private
195 )
196 ;
197
198 //
199 // Global Variables
200 //
201 extern EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding;
202 extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName;
203
204 //
205 // //////////////////////////////////////////////////////////
206 //
207 // prototypes
208 //
209 EFI_STATUS
210 EFIAPI
211 InitializeBCDriver (
212 IN EFI_HANDLE ImageHandle,
213 IN EFI_SYSTEM_TABLE *SystemTable
214 )
215 ;
216
217 EFI_STATUS
218 EFIAPI
219 BcStart (
220 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
221 IN BOOLEAN UseIpv6
222 )
223 ;
224
225 EFI_STATUS
226 EFIAPI
227 BcStop (
228 IN EFI_PXE_BASE_CODE_PROTOCOL *This
229 )
230 ;
231
232 EFI_STATUS
233 EFIAPI
234 BcDhcp (
235 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
236 IN BOOLEAN SortOffers
237 )
238 ;
239
240 EFI_STATUS
241 EFIAPI
242 BcDiscover (
243 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
244 IN UINT16 Type,
245 IN UINT16 *Layer,
246 IN BOOLEAN UseBis,
247 IN EFI_PXE_BASE_CODE_DISCOVER_INFO * Info OPTIONAL
248 )
249 ;
250
251 EFI_STATUS
252 EFIAPI
253 BcMtftp (
254 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
255 IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation,
256 IN OUT VOID *BufferPtr,
257 IN BOOLEAN Overwrite,
258 IN OUT UINT64 *BufferSize,
259 IN UINTN *BlockSize OPTIONAL,
260 IN EFI_IP_ADDRESS * ServerIp,
261 IN UINT8 *Filename,
262 IN EFI_PXE_BASE_CODE_MTFTP_INFO * Info OPTIONAL,
263 IN BOOLEAN DontUseBuffer
264 )
265 ;
266
267 EFI_STATUS
268 EFIAPI
269 BcUdpWrite (
270 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
271 IN UINT16 OpFlags,
272 IN EFI_IP_ADDRESS *DestIp,
273 IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort,
274 IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL
275 IN EFI_IP_ADDRESS *SrcIp, OPTIONAL
276 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL
277 IN UINTN *HeaderSize, OPTIONAL
278 IN VOID *HeaderPtr, OPTIONAL
279 IN UINTN *BufferSize,
280 IN VOID *BufferPtr
281 )
282 ;
283
284 EFI_STATUS
285 EFIAPI
286 BcUdpRead (
287 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
288 IN UINT16 OpFlags,
289 IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL
290 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL
291 IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL
292 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL
293 IN UINTN *HeaderSize, OPTIONAL
294 IN VOID *HeaderPtr, OPTIONAL
295 IN OUT UINTN *BufferSize,
296 IN VOID *BufferPtr
297 )
298 ;
299
300 EFI_STATUS
301 EFIAPI
302 BcArp (
303 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
304 IN EFI_IP_ADDRESS * IpAddr,
305 IN EFI_MAC_ADDRESS * MacAddr OPTIONAL
306 )
307 ;
308
309 EFI_STATUS
310 EFIAPI
311 BcIpFilter (
312 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
313 IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter
314 )
315 ;
316
317 EFI_STATUS
318 EFIAPI
319 BcSetParameters (
320 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
321 IN BOOLEAN *NewAutoArp, OPTIONAL
322 IN BOOLEAN *NewSendGUID, OPTIONAL
323 IN UINT8 *NewTTL, OPTIONAL
324 IN UINT8 *NewToS, OPTIONAL
325 IN BOOLEAN *NewMakeCallback OPTIONAL
326 )
327 ;
328
329 EFI_STATUS
330 EFIAPI
331 BcSetStationIP (
332 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
333 IN EFI_IP_ADDRESS * NewStationIp, OPTIONAL
334 IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL
335 )
336 ;
337
338 EFI_STATUS
339 EFIAPI
340 BcSetPackets (
341 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
342 BOOLEAN *NewDhcpDiscoverValid, OPTIONAL
343 BOOLEAN *NewDhcpAckReceived, OPTIONAL
344 BOOLEAN *NewProxyOfferReceived, OPTIONAL
345 BOOLEAN *NewPxeDiscoverValid, OPTIONAL
346 BOOLEAN *NewPxeReplyReceived, OPTIONAL
347 BOOLEAN *NewPxeBisReplyReceived, OPTIONAL
348 IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover, OPTIONAL
349 IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck, OPTIONAL
350 IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer, OPTIONAL
351 IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover, OPTIONAL
352 IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply, OPTIONAL
353 IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL
354 )
355 ;
356
357 EFI_STATUS
358 EFIAPI
359 LoadFile (
360 IN EFI_LOAD_FILE_PROTOCOL *This,
361 IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
362 IN BOOLEAN BootPolicy,
363 IN OUT UINTN *BufferSize,
364 IN VOID *Buffer
365 )
366 ;
367
368 EFI_STATUS
369 PxeBcLibGetSmbiosSystemGuidAndSerialNumber (
370 IN EFI_GUID *SystemGuid,
371 OUT CHAR8 **SystemSerialNumber
372 )
373 ;
374
375 UINTN
376 EFIAPI
377 AsciiPrint (
378 IN CONST CHAR8 *Format,
379 ...
380 )
381 ;
382
383 //
384 // Define SMBIOS tables.
385 //
386 #pragma pack(1)
387 typedef struct {
388 UINT8 AnchorString[4];
389 UINT8 EntryPointStructureChecksum;
390 UINT8 EntryPointLength;
391 UINT8 MajorVersion;
392 UINT8 MinorVersion;
393 UINT16 MaxStructureSize;
394 UINT8 EntryPointRevision;
395 UINT8 FormattedArea[5];
396 UINT8 IntermediateAnchorString[5];
397 UINT8 IntermediateChecksum;
398 UINT16 TableLength;
399 UINT32 TableAddress;
400 UINT16 NumberOfSmbiosStructures;
401 UINT8 SmbiosBcdRevision;
402 } SMBIOS_STRUCTURE_TABLE;
403
404 //
405 // Please note that SMBIOS structures can be odd byte aligned since the
406 // unformated section of each record is a set of arbitrary size strings.
407 //
408 typedef struct {
409 UINT8 Type;
410 UINT8 Length;
411 UINT8 Handle[2];
412 } SMBIOS_HEADER;
413
414 typedef UINT8 SMBIOS_STRING;
415
416 typedef struct {
417 SMBIOS_HEADER Hdr;
418 SMBIOS_STRING Vendor;
419 SMBIOS_STRING BiosVersion;
420 UINT8 BiosSegment[2];
421 SMBIOS_STRING BiosReleaseDate;
422 UINT8 BiosSize;
423 UINT8 BiosCharacteristics[8];
424 } SMBIOS_TYPE0;
425
426 typedef struct {
427 SMBIOS_HEADER Hdr;
428 SMBIOS_STRING Manufacturer;
429 SMBIOS_STRING ProductName;
430 SMBIOS_STRING Version;
431 SMBIOS_STRING SerialNumber;
432
433 //
434 // always byte copy this data to prevent alignment faults!
435 //
436 EFI_GUID Uuid;
437
438 UINT8 WakeUpType;
439 } SMBIOS_TYPE1;
440
441 typedef struct {
442 SMBIOS_HEADER Hdr;
443 SMBIOS_STRING Manufacturer;
444 SMBIOS_STRING ProductName;
445 SMBIOS_STRING Version;
446 SMBIOS_STRING SerialNumber;
447 } SMBIOS_TYPE2;
448
449 typedef struct {
450 SMBIOS_HEADER Hdr;
451 SMBIOS_STRING Manufacturer;
452 UINT8 Type;
453 SMBIOS_STRING Version;
454 SMBIOS_STRING SerialNumber;
455 SMBIOS_STRING AssetTag;
456 UINT8 BootupState;
457 UINT8 PowerSupplyState;
458 UINT8 ThermalState;
459 UINT8 SecurityStatus;
460 UINT8 OemDefined[4];
461 } SMBIOS_TYPE3;
462
463 typedef struct {
464 SMBIOS_HEADER Hdr;
465 UINT8 Socket;
466 UINT8 ProcessorType;
467 UINT8 ProcessorFamily;
468 SMBIOS_STRING ProcessorManufacture;
469 UINT8 ProcessorId[8];
470 SMBIOS_STRING ProcessorVersion;
471 UINT8 Voltage;
472 UINT8 ExternalClock[2];
473 UINT8 MaxSpeed[2];
474 UINT8 CurrentSpeed[2];
475 UINT8 Status;
476 UINT8 ProcessorUpgrade;
477 UINT8 L1CacheHandle[2];
478 UINT8 L2CacheHandle[2];
479 UINT8 L3CacheHandle[2];
480 } SMBIOS_TYPE4;
481
482 typedef union {
483 SMBIOS_HEADER *Hdr;
484 SMBIOS_TYPE0 *Type0;
485 SMBIOS_TYPE1 *Type1;
486 SMBIOS_TYPE2 *Type2;
487 SMBIOS_TYPE3 *Type3;
488 SMBIOS_TYPE4 *Type4;
489 UINT8 *Raw;
490 } SMBIOS_STRUCTURE_POINTER;
491 #pragma pack()
492
493 #include "ip.h"
494 #include "dhcp.h"
495 #include "tftp.h"
496
497 #endif /* _BC_H */
498
499 /* EOF - bc.h */