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