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
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.
23 #define EFI_MIN(_a, _b) ((_a) < (_b) ? (_a) : (_b))
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 \
33 #define WAIT_TX_TIMEOUT 1000
35 #define SUPPORT_IPV6 0
37 #define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32('p','x','e','d')
40 // Determine the classes of IPv4 address
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) )
48 // Definitions for internet group management protocol version 2 message
50 // Per RFC 2236, November 1997
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
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
68 #define IGMP_DEFAULT_MAX_RESPONSE_TIME 10 // 10 second default
71 #define MAX_MCAST_GROUPS 8 // most we allow ourselves to join at once
77 BOOLEAN ShowErrorMessages
;
78 EFI_PXE_BASE_CODE_PROTOCOL EfiBc
;
79 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*CallbackProtocolPtr
;
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
;
89 UINTN MCastGroupCount
;
90 EFI_EVENT Igmpv1TimeoutEvent
;
91 BOOLEAN UseIgmpv1Reporting
;
92 EFI_EVENT IgmpGroupEvent
[MAX_MCAST_GROUPS
];
100 UINT32 MCastGroup
[MAX_MCAST_GROUPS
];
103 BOOLEAN GoodStationIp
;
106 VOID
*DhcpPacketBuffer
;
108 VOID
*BootServerReceiveBuffer
;
109 EFI_IP_ADDRESS ServerIp
;
115 VOID
*ReceiveBuffers
;
116 VOID
*TransmitBuffer
;
117 UINTN NumOffersReceived
;
121 // arrays for different types of offers
123 UINT8 ServerCount
[4];
124 UINT8 OfferCount
[4][MAX_OFFERS
];
127 UINT8 BinlProxies
[MAX_OFFERS
];
130 UINT8
*TftpAckBuffer
;
131 UINT8
*TftpErrorBuffer
;
132 IGMPV2_MESSAGE IgmpMessage
;
133 BOOLEAN BigBlkNumFlag
;
136 } PXE_BASECODE_DEVICE
;
141 #define DHCP_ONLY_IX 0
146 #define PXE_RND_PORT_LOW 2070
148 #define PXE_MAX_PRINT_BUFFER 128
153 #define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32('p','x','e','l')
158 EFI_LOAD_FILE_PROTOCOL LoadFile
;
159 PXE_BASECODE_DEVICE
*Private
;
162 #define EFI_BASE_CODE_DEV_FROM_THIS(a) CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE);
164 #define EFI_LOAD_FILE_DEV_FROM_THIS(a) CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE)
168 PxeBcDriverSupported (
169 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
170 IN EFI_HANDLE Controller
,
171 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
177 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
178 IN EFI_HANDLE Controller
,
179 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
185 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
186 IN EFI_HANDLE Controller
,
187 IN UINTN NumberOfChildren
,
188 IN EFI_HANDLE
*ChildHandleBuffer
192 // EFI Component Name Functions
196 PxeBcComponentNameGetDriverName (
197 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
199 OUT CHAR16
**DriverName
204 PxeBcComponentNameGetControllerName (
205 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
206 IN EFI_HANDLE ControllerHandle
,
207 IN EFI_HANDLE ChildHandle OPTIONAL
,
209 OUT CHAR16
**ControllerName
214 PXE_BASECODE_DEVICE
*Private
,
215 BIS_APPLICATION_HANDLE
*BisAppHandle
,
216 EFI_BIS_DATA
**BisDataSigInfo
222 EFI_BIS_PROTOCOL
*Bis
,
223 BIS_APPLICATION_HANDLE BisAppHandle
,
224 EFI_BIS_DATA
*BisDataSigInfo
230 PXE_BASECODE_DEVICE
*Private
,
232 UINTN FileBufferLength
,
233 VOID
*CredentialBuffer
,
234 UINTN CredentialBufferLength
240 PXE_BASECODE_DEVICE
*Private
247 extern EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding
;
248 extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName
;
251 // //////////////////////////////////////////////////////////
258 IN EFI_HANDLE ImageHandle
,
259 IN EFI_SYSTEM_TABLE
*SystemTable
266 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
274 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
281 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
282 IN BOOLEAN SortOffers
289 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
293 IN EFI_PXE_BASE_CODE_DISCOVER_INFO
* Info OPTIONAL
300 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
301 IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation
,
302 IN OUT VOID
*BufferPtr
,
303 IN BOOLEAN Overwrite
,
304 IN OUT UINT64
*BufferSize
,
305 IN UINTN
*BlockSize OPTIONAL
,
306 IN EFI_IP_ADDRESS
* ServerIp
,
308 IN EFI_PXE_BASE_CODE_MTFTP_INFO
* Info OPTIONAL
,
309 IN BOOLEAN DontUseBuffer
316 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
318 IN EFI_IP_ADDRESS
*DestIp
,
319 IN EFI_PXE_BASE_CODE_UDP_PORT
*DestPort
,
320 IN EFI_IP_ADDRESS
*GatewayIp
, OPTIONAL
321 IN EFI_IP_ADDRESS
*SrcIp
, OPTIONAL
322 IN OUT EFI_PXE_BASE_CODE_UDP_PORT
*SrcPort
, OPTIONAL
323 IN UINTN
*HeaderSize
, OPTIONAL
324 IN VOID
*HeaderPtr
, OPTIONAL
325 IN UINTN
*BufferSize
,
333 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
335 IN OUT EFI_IP_ADDRESS
*DestIp
, OPTIONAL
336 IN OUT EFI_PXE_BASE_CODE_UDP_PORT
*DestPort
, OPTIONAL
337 IN OUT EFI_IP_ADDRESS
*SrcIp
, OPTIONAL
338 IN OUT EFI_PXE_BASE_CODE_UDP_PORT
*SrcPort
, OPTIONAL
339 IN UINTN
*HeaderSize
, OPTIONAL
340 IN VOID
*HeaderPtr
, OPTIONAL
341 IN OUT UINTN
*BufferSize
,
349 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
350 IN EFI_IP_ADDRESS
* IpAddr
,
351 IN EFI_MAC_ADDRESS
* MacAddr OPTIONAL
358 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
359 IN EFI_PXE_BASE_CODE_IP_FILTER
*NewFilter
366 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
367 IN BOOLEAN
*NewAutoArp
, OPTIONAL
368 IN BOOLEAN
*NewSendGUID
, OPTIONAL
369 IN UINT8
*NewTTL
, OPTIONAL
370 IN UINT8
*NewToS
, OPTIONAL
371 IN BOOLEAN
*NewMakeCallback OPTIONAL
378 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
379 IN EFI_IP_ADDRESS
* NewStationIp
, OPTIONAL
380 IN EFI_IP_ADDRESS
* NewSubnetMask OPTIONAL
387 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
388 BOOLEAN
*NewDhcpDiscoverValid
, OPTIONAL
389 BOOLEAN
*NewDhcpAckReceived
, OPTIONAL
390 BOOLEAN
*NewProxyOfferReceived
, OPTIONAL
391 BOOLEAN
*NewPxeDiscoverValid
, OPTIONAL
392 BOOLEAN
*NewPxeReplyReceived
, OPTIONAL
393 BOOLEAN
*NewPxeBisReplyReceived
, OPTIONAL
394 IN EFI_PXE_BASE_CODE_PACKET
* NewDhcpDiscover
, OPTIONAL
395 IN EFI_PXE_BASE_CODE_PACKET
* NewDhcpAck
, OPTIONAL
396 IN EFI_PXE_BASE_CODE_PACKET
* NewProxyOffer
, OPTIONAL
397 IN EFI_PXE_BASE_CODE_PACKET
* NewPxeDiscover
, OPTIONAL
398 IN EFI_PXE_BASE_CODE_PACKET
* NewPxeReply
, OPTIONAL
399 IN EFI_PXE_BASE_CODE_PACKET
* NewPxeBisReply OPTIONAL
406 IN EFI_LOAD_FILE_PROTOCOL
*This
,
407 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
,
408 IN BOOLEAN BootPolicy
,
409 IN OUT UINTN
*BufferSize
,
415 PxeBcLibGetSmbiosSystemGuidAndSerialNumber (
416 IN EFI_GUID
*SystemGuid
,
417 OUT CHAR8
**SystemSerialNumber
424 IN CONST CHAR8
*Format
,
430 // Define SMBIOS tables.
434 UINT8 AnchorString
[4];
435 UINT8 EntryPointStructureChecksum
;
436 UINT8 EntryPointLength
;
439 UINT16 MaxStructureSize
;
440 UINT8 EntryPointRevision
;
441 UINT8 FormattedArea
[5];
442 UINT8 IntermediateAnchorString
[5];
443 UINT8 IntermediateChecksum
;
446 UINT16 NumberOfSmbiosStructures
;
447 UINT8 SmbiosBcdRevision
;
448 } SMBIOS_STRUCTURE_TABLE
;
451 // Please note that SMBIOS structures can be odd byte aligned since the
452 // unformated section of each record is a set of arbitrary size strings.
460 typedef UINT8 SMBIOS_STRING
;
464 SMBIOS_STRING Vendor
;
465 SMBIOS_STRING BiosVersion
;
466 UINT8 BiosSegment
[2];
467 SMBIOS_STRING BiosReleaseDate
;
469 UINT8 BiosCharacteristics
[8];
474 SMBIOS_STRING Manufacturer
;
475 SMBIOS_STRING ProductName
;
476 SMBIOS_STRING Version
;
477 SMBIOS_STRING SerialNumber
;
480 // always byte copy this data to prevent alignment faults!
489 SMBIOS_STRING Manufacturer
;
490 SMBIOS_STRING ProductName
;
491 SMBIOS_STRING Version
;
492 SMBIOS_STRING SerialNumber
;
497 SMBIOS_STRING Manufacturer
;
499 SMBIOS_STRING Version
;
500 SMBIOS_STRING SerialNumber
;
501 SMBIOS_STRING AssetTag
;
503 UINT8 PowerSupplyState
;
505 UINT8 SecurityStatus
;
513 UINT8 ProcessorFamily
;
514 SMBIOS_STRING ProcessorManufacture
;
515 UINT8 ProcessorId
[8];
516 SMBIOS_STRING ProcessorVersion
;
518 UINT8 ExternalClock
[2];
520 UINT8 CurrentSpeed
[2];
522 UINT8 ProcessorUpgrade
;
523 UINT8 L1CacheHandle
[2];
524 UINT8 L2CacheHandle
[2];
525 UINT8 L3CacheHandle
[2];
536 } SMBIOS_STRUCTURE_POINTER
;
549 Initialize ARP packet header.