]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h
Make MdeModulePkg GCC clean.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / PxeBcDxe / Bc.h
CommitLineData
772db4bb 1/** @file
2
3Copyright (c) 2004 - 2007, Intel Corporation
4All rights reserved. This program and the accompanying materials
5are licensed and made available under the terms and conditions of the BSD License
6which accompanies this distribution. The full text of the license may be found at
7http://opensource.org/licenses/bsd-license.php
8
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12Module Name:
13 bc.h
14
15Abstract:
16
17
18**/
19
20#ifndef _BC_H
21#define _BC_H
22
23#include <PiDxe.h>\r
24\r
25#include <Guid/SmBios.h>\r
26#include <Protocol/Bis.h>\r
27#include <Protocol/PxeBaseCode.h>\r
28#include <Protocol/PxeBaseCodeCallBack.h>\r
29#include <Protocol/NetworkInterfaceIdentifier.h>\r
30#include <Protocol/SimpleNetwork.h>\r
31#include <Protocol/LoadFile.h>\r
32#include <Protocol/DevicePath.h>
33#include <Protocol/Tcp.h>\r
34\r
35#include <Library/DebugLib.h>\r
36#include <Library/BaseMemoryLib.h>
37#include <Library/MemoryAllocationLib.h>\r
38#include <Library/UefiDriverEntryPoint.h>\r
39#include <Library/UefiBootServicesTableLib.h>\r
40#include <Library/BaseLib.h>\r
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
84b5c78e 54#define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'd')
772db4bb 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
71typedef 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
91typedef 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//
84b5c78e 169#define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'l')
772db4bb 170
171typedef 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
184EFI_BIS_PROTOCOL *
185PxebcBisStart (
186 PXE_BASECODE_DEVICE *Private,
187 BIS_APPLICATION_HANDLE *BisAppHandle,
188 EFI_BIS_DATA **BisDataSigInfo
189 )
190;
191
192VOID
193PxebcBisStop (
194 EFI_BIS_PROTOCOL *Bis,
195 BIS_APPLICATION_HANDLE BisAppHandle,
196 EFI_BIS_DATA *BisDataSigInfo
197 )
198;
199
200BOOLEAN
201PxebcBisVerify (
202 PXE_BASECODE_DEVICE *Private,
203 VOID *FileBuffer,
204 UINTN FileBufferLength,
205 VOID *CredentialBuffer,
206 UINTN CredentialBufferLength
207 )
208;
209
210BOOLEAN
211PxebcBisDetect (
212 PXE_BASECODE_DEVICE *Private
213 )
214;
215
216//
217// Global Variables
218//
219extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName;
220
221//
222// //////////////////////////////////////////////////////////
223//
224// prototypes
225//
226
227/**
228 Initialize the base code drivers and install the driver binding
229
230 Standard EFI Image Entry
231
232 @retval EFI_SUCCESS This driver was successfully bound
233
234**/
235EFI_STATUS
236EFIAPI
237InitializeBCDriver (
238 IN EFI_HANDLE ImageHandle,
239 IN EFI_SYSTEM_TABLE *SystemTable
240 )
241;
242
243EFI_STATUS
244EFIAPI
245BcStart (
246 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
247 IN BOOLEAN UseIpv6
248 )
249;
250
251EFI_STATUS
252EFIAPI
253BcStop (
254 IN EFI_PXE_BASE_CODE_PROTOCOL *This
255 )
256;
257
258EFI_STATUS
259EFIAPI
260BcDhcp (
261 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
262 IN BOOLEAN SortOffers
263 )
264;
265
266EFI_STATUS
267EFIAPI
268BcDiscover (
269 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
270 IN UINT16 Type,
271 IN UINT16 *Layer,
272 IN BOOLEAN UseBis,
273 IN EFI_PXE_BASE_CODE_DISCOVER_INFO * Info OPTIONAL
274 )
275;
276
277EFI_STATUS
278EFIAPI
279BcMtftp (
280 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
281 IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation,
282 IN OUT VOID *BufferPtr,
283 IN BOOLEAN Overwrite,
284 IN OUT UINT64 *BufferSize,
285 IN UINTN *BlockSize OPTIONAL,
286 IN EFI_IP_ADDRESS * ServerIp,
287 IN UINT8 *Filename,
288 IN EFI_PXE_BASE_CODE_MTFTP_INFO * Info OPTIONAL,
289 IN BOOLEAN DontUseBuffer
290 )
291;
292
293EFI_STATUS
294EFIAPI
295BcUdpWrite (
296 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
297 IN UINT16 OpFlags,
298 IN EFI_IP_ADDRESS *DestIp,
299 IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort,
300 IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL
301 IN EFI_IP_ADDRESS *SrcIp, OPTIONAL
302 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL
303 IN UINTN *HeaderSize, OPTIONAL
304 IN VOID *HeaderPtr, OPTIONAL
305 IN UINTN *BufferSize,
306 IN VOID *BufferPtr
307 )
308;
309
310EFI_STATUS
311EFIAPI
312BcUdpRead (
313 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
314 IN UINT16 OpFlags,
315 IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL
316 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL
317 IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL
318 IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL
319 IN UINTN *HeaderSize, OPTIONAL
320 IN VOID *HeaderPtr, OPTIONAL
321 IN OUT UINTN *BufferSize,
322 IN VOID *BufferPtr
323 )
324;
325
326EFI_STATUS
327EFIAPI
328BcTcpWrite (
329 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
330 IN UINT16 OpFlags,
331 IN UINT16 *UrgentPointer,
332 IN UINT32 *SequenceNumber,
333 IN UINT32 *AckNumber,
334 IN UINT16 *HlenResCode,
335 IN UINT16 *Window,
336 IN EFI_IP_ADDRESS *DestIp,
337 IN EFI_PXE_BASE_CODE_TCP_PORT *DestPort,
338 IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL
339 IN EFI_IP_ADDRESS *SrcIp, OPTIONAL
340 IN OUT EFI_PXE_BASE_CODE_TCP_PORT *SrcPort, OPTIONAL
341 IN UINTN *HeaderSize, OPTIONAL
342 IN VOID *HeaderPtr, OPTIONAL
343 IN UINTN *BufferSize,
344 IN VOID *BufferPtr
345 )
346;
347
348EFI_STATUS
349EFIAPI
350BcTcpRead (
351 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
352 IN UINT16 OpFlags,
353 IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL
354 IN OUT EFI_PXE_BASE_CODE_TCP_PORT *DestPort, OPTIONAL
355 IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL
356 IN OUT EFI_PXE_BASE_CODE_TCP_PORT *SrcPort, OPTIONAL
357 IN UINTN *HeaderSize, OPTIONAL
358 IN VOID *HeaderPtr, OPTIONAL
359 IN OUT UINTN *BufferSize,
360 IN VOID *BufferPtr
361 )
362;
363
364EFI_STATUS
365EFIAPI
366BcArp (
367 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
368 IN EFI_IP_ADDRESS * IpAddr,
369 IN EFI_MAC_ADDRESS * MacAddr OPTIONAL
370 )
371;
372
373EFI_STATUS
374EFIAPI
375BcIpFilter (
376 IN EFI_PXE_BASE_CODE_PROTOCOL *This,
377 IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter
378 )
379;
380
381EFI_STATUS
382EFIAPI
383BcSetParameters (
384 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
385 IN BOOLEAN *NewAutoArp, OPTIONAL
386 IN BOOLEAN *NewSendGUID, OPTIONAL
387 IN UINT8 *NewTTL, OPTIONAL
388 IN UINT8 *NewToS, OPTIONAL
389 IN BOOLEAN *NewMakeCallback OPTIONAL
390 )
391;
392
393EFI_STATUS
394EFIAPI
395BcSetStationIP (
396 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
397 IN EFI_IP_ADDRESS * NewStationIp, OPTIONAL
398 IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL
399 )
400;
401
402EFI_STATUS
403EFIAPI
404BcSetPackets (
405 IN EFI_PXE_BASE_CODE_PROTOCOL * This,
406 BOOLEAN *NewDhcpDiscoverValid, OPTIONAL
407 BOOLEAN *NewDhcpAckReceived, OPTIONAL
408 BOOLEAN *NewProxyOfferReceived, OPTIONAL
409 BOOLEAN *NewPxeDiscoverValid, OPTIONAL
410 BOOLEAN *NewPxeReplyReceived, OPTIONAL
411 BOOLEAN *NewPxeBisReplyReceived, OPTIONAL
412 IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover, OPTIONAL
413 IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck, OPTIONAL
414 IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer, OPTIONAL
415 IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover, OPTIONAL
416 IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply, OPTIONAL
417 IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL
418 )
419;
420
421EFI_STATUS
422EFIAPI
423LoadFile (
424 IN EFI_LOAD_FILE_PROTOCOL *This,
425 IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
426 IN BOOLEAN BootPolicy,
427 IN OUT UINTN *BufferSize,
428 IN VOID *Buffer
429 )
430;
431
432EFI_STATUS
433PxeBcLibGetSmbiosSystemGuidAndSerialNumber (
434 IN EFI_GUID *SystemGuid,
435 OUT CHAR8 **SystemSerialNumber
436 )
437;
438
439#ifdef EFI_SIZE_REDUCTION_APPLIED
440 #define COMPONENT_NAME_CODE(code)
441 #define COMPONENT_NAME NULL
442#else
443 #define COMPONENT_NAME_CODE(code) code
444 #define COMPONENT_NAME &gPxeBcComponentName
445#endif
446
447
448//
449// Define SMBIOS tables.
450//
451#pragma pack(1)
452typedef struct {
453 UINT8 AnchorString[4];
454 UINT8 EntryPointStructureChecksum;
455 UINT8 EntryPointLength;
456 UINT8 MajorVersion;
457 UINT8 MinorVersion;
458 UINT16 MaxStructureSize;
459 UINT8 EntryPointRevision;
460 UINT8 FormattedArea[5];
461 UINT8 IntermediateAnchorString[5];
462 UINT8 IntermediateChecksum;
463 UINT16 TableLength;
464 UINT32 TableAddress;
465 UINT16 NumberOfSmbiosStructures;
466 UINT8 SmbiosBcdRevision;
467} SMBIOS_STRUCTURE_TABLE;
468
469//
470// Please note that SMBIOS structures can be odd byte aligned since the
471// unformated section of each record is a set of arbitrary size strings.
472//
473typedef struct {
474 UINT8 Type;
475 UINT8 Length;
476 UINT8 Handle[2];
477} SMBIOS_HEADER;
478
479typedef UINT8 SMBIOS_STRING;
480
481typedef struct {
482 SMBIOS_HEADER Hdr;
483 SMBIOS_STRING Vendor;
484 SMBIOS_STRING BiosVersion;
485 UINT8 BiosSegment[2];
486 SMBIOS_STRING BiosReleaseDate;
487 UINT8 BiosSize;
488 UINT8 BiosCharacteristics[8];
489} SMBIOS_TYPE0;
490
491typedef struct {
492 SMBIOS_HEADER Hdr;
493 SMBIOS_STRING Manufacturer;
494 SMBIOS_STRING ProductName;
495 SMBIOS_STRING Version;
496 SMBIOS_STRING SerialNumber;
497
498 //
499 // always byte copy this data to prevent alignment faults!
500 //
501 EFI_GUID Uuid;
502
503 UINT8 WakeUpType;
504} SMBIOS_TYPE1;
505
506typedef struct {
507 SMBIOS_HEADER Hdr;
508 SMBIOS_STRING Manufacturer;
509 SMBIOS_STRING ProductName;
510 SMBIOS_STRING Version;
511 SMBIOS_STRING SerialNumber;
512} SMBIOS_TYPE2;
513
514typedef struct {
515 SMBIOS_HEADER Hdr;
516 SMBIOS_STRING Manufacturer;
517 UINT8 Type;
518 SMBIOS_STRING Version;
519 SMBIOS_STRING SerialNumber;
520 SMBIOS_STRING AssetTag;
521 UINT8 BootupState;
522 UINT8 PowerSupplyState;
523 UINT8 ThermalState;
524 UINT8 SecurityStatus;
525 UINT8 OemDefined[4];
526} SMBIOS_TYPE3;
527
528typedef struct {
529 SMBIOS_HEADER Hdr;
530 UINT8 Socket;
531 UINT8 ProcessorType;
532 UINT8 ProcessorFamily;
533 SMBIOS_STRING ProcessorManufacture;
534 UINT8 ProcessorId[8];
535 SMBIOS_STRING ProcessorVersion;
536 UINT8 Voltage;
537 UINT8 ExternalClock[2];
538 UINT8 MaxSpeed[2];
539 UINT8 CurrentSpeed[2];
540 UINT8 Status;
541 UINT8 ProcessorUpgrade;
542 UINT8 L1CacheHandle[2];
543 UINT8 L2CacheHandle[2];
544 UINT8 L3CacheHandle[2];
545} SMBIOS_TYPE4;
546
547typedef union {
548 SMBIOS_HEADER *Hdr;
549 SMBIOS_TYPE0 *Type0;
550 SMBIOS_TYPE1 *Type1;
551 SMBIOS_TYPE2 *Type2;
552 SMBIOS_TYPE3 *Type3;
553 SMBIOS_TYPE4 *Type4;
554 UINT8 *Raw;
555} SMBIOS_STRUCTURE_POINTER;
556#pragma pack()
557
558#include "ip.h"
559#include "dhcp.h"
560#include "tftp.h"
561
562#endif /* _BC_H */
563
564/* EOF - bc.h */