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
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.
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>
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>
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 \
50 #define WAIT_TX_TIMEOUT 1000
52 #define SUPPORT_IPV6 0
54 #define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'd')
57 // Determine the classes of IPv4 address
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) )
65 // Definitions for internet group management protocol version 2 message
67 // Per RFC 2236, November 1997
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
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
85 #define IGMP_DEFAULT_MAX_RESPONSE_TIME 10 // 10 second default
88 #define MAX_MCAST_GROUPS 8 // most we allow ourselves to join at once
94 BOOLEAN ShowErrorMessages
;
96 EFI_PXE_BASE_CODE_PROTOCOL EfiBc
;
97 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*CallbackProtocolPtr
;
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
;
106 UINTN OldestArpEntry
;
107 UINTN MCastGroupCount
;
108 EFI_EVENT Igmpv1TimeoutEvent
;
109 BOOLEAN UseIgmpv1Reporting
;
110 EFI_EVENT IgmpGroupEvent
[MAX_MCAST_GROUPS
];
118 UINT32 MCastGroup
[MAX_MCAST_GROUPS
];
121 BOOLEAN GoodStationIp
;
124 VOID
*DhcpPacketBuffer
;
126 VOID
*BootServerReceiveBuffer
;
127 EFI_IP_ADDRESS ServerIp
;
133 VOID
*ReceiveBuffers
;
134 VOID
*TransmitBuffer
;
135 UINTN NumOffersReceived
;
139 // arrays for different types of offers
141 UINT8 ServerCount
[4];
142 UINT8 OfferCount
[4][MAX_OFFERS
];
145 UINT8 BinlProxies
[MAX_OFFERS
];
148 UINT8
*TftpAckBuffer
;
149 UINT8
*TftpErrorBuffer
;
150 IGMPV2_MESSAGE IgmpMessage
;
151 BOOLEAN BigBlkNumFlag
;
154 } PXE_BASECODE_DEVICE
;
159 #define DHCP_ONLY_IX 0
164 #define PXE_RND_PORT_LOW 2070
169 #define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'l')
174 EFI_LOAD_FILE_PROTOCOL LoadFile
;
175 PXE_BASECODE_DEVICE
*Private
;
178 #define EFI_BASE_CODE_DEV_FROM_THIS(a) CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE);
180 #define EFI_BASE_CODE_DEV_FROM_TCP(a) CR (a, PXE_BASECODE_DEVICE, Tcp, PXE_BASECODE_DEVICE_SIGNATURE);
182 #define EFI_LOAD_FILE_DEV_FROM_THIS(a) CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE)
186 PXE_BASECODE_DEVICE
*Private
,
187 BIS_APPLICATION_HANDLE
*BisAppHandle
,
188 EFI_BIS_DATA
**BisDataSigInfo
194 EFI_BIS_PROTOCOL
*Bis
,
195 BIS_APPLICATION_HANDLE BisAppHandle
,
196 EFI_BIS_DATA
*BisDataSigInfo
202 PXE_BASECODE_DEVICE
*Private
,
204 UINTN FileBufferLength
,
205 VOID
*CredentialBuffer
,
206 UINTN CredentialBufferLength
212 PXE_BASECODE_DEVICE
*Private
219 extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName
;
222 // //////////////////////////////////////////////////////////
228 Initialize the base code drivers and install the driver binding
230 Standard EFI Image Entry
232 @retval EFI_SUCCESS This driver was successfully bound
238 IN EFI_HANDLE ImageHandle
,
239 IN EFI_SYSTEM_TABLE
*SystemTable
246 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
254 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
261 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
262 IN BOOLEAN SortOffers
269 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
273 IN EFI_PXE_BASE_CODE_DISCOVER_INFO
* Info OPTIONAL
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
,
288 IN EFI_PXE_BASE_CODE_MTFTP_INFO
* Info OPTIONAL
,
289 IN BOOLEAN DontUseBuffer
296 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
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
,
313 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
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
,
329 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
331 IN UINT16
*UrgentPointer
,
332 IN UINT32
*SequenceNumber
,
333 IN UINT32
*AckNumber
,
334 IN UINT16
*HlenResCode
,
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
,
351 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
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
,
367 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
368 IN EFI_IP_ADDRESS
* IpAddr
,
369 IN EFI_MAC_ADDRESS
* MacAddr OPTIONAL
376 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
377 IN EFI_PXE_BASE_CODE_IP_FILTER
*NewFilter
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
396 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
397 IN EFI_IP_ADDRESS
* NewStationIp
, OPTIONAL
398 IN EFI_IP_ADDRESS
* NewSubnetMask OPTIONAL
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
424 IN EFI_LOAD_FILE_PROTOCOL
*This
,
425 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
,
426 IN BOOLEAN BootPolicy
,
427 IN OUT UINTN
*BufferSize
,
433 PxeBcLibGetSmbiosSystemGuidAndSerialNumber (
434 IN EFI_GUID
*SystemGuid
,
435 OUT CHAR8
**SystemSerialNumber
439 #ifdef EFI_SIZE_REDUCTION_APPLIED
440 #define COMPONENT_NAME_CODE(code)
441 #define COMPONENT_NAME NULL
443 #define COMPONENT_NAME_CODE(code) code
444 #define COMPONENT_NAME &gPxeBcComponentName
449 // Define SMBIOS tables.
453 UINT8 AnchorString
[4];
454 UINT8 EntryPointStructureChecksum
;
455 UINT8 EntryPointLength
;
458 UINT16 MaxStructureSize
;
459 UINT8 EntryPointRevision
;
460 UINT8 FormattedArea
[5];
461 UINT8 IntermediateAnchorString
[5];
462 UINT8 IntermediateChecksum
;
465 UINT16 NumberOfSmbiosStructures
;
466 UINT8 SmbiosBcdRevision
;
467 } SMBIOS_STRUCTURE_TABLE
;
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.
479 typedef UINT8 SMBIOS_STRING
;
483 SMBIOS_STRING Vendor
;
484 SMBIOS_STRING BiosVersion
;
485 UINT8 BiosSegment
[2];
486 SMBIOS_STRING BiosReleaseDate
;
488 UINT8 BiosCharacteristics
[8];
493 SMBIOS_STRING Manufacturer
;
494 SMBIOS_STRING ProductName
;
495 SMBIOS_STRING Version
;
496 SMBIOS_STRING SerialNumber
;
499 // always byte copy this data to prevent alignment faults!
508 SMBIOS_STRING Manufacturer
;
509 SMBIOS_STRING ProductName
;
510 SMBIOS_STRING Version
;
511 SMBIOS_STRING SerialNumber
;
516 SMBIOS_STRING Manufacturer
;
518 SMBIOS_STRING Version
;
519 SMBIOS_STRING SerialNumber
;
520 SMBIOS_STRING AssetTag
;
522 UINT8 PowerSupplyState
;
524 UINT8 SecurityStatus
;
532 UINT8 ProcessorFamily
;
533 SMBIOS_STRING ProcessorManufacture
;
534 UINT8 ProcessorId
[8];
535 SMBIOS_STRING ProcessorVersion
;
537 UINT8 ExternalClock
[2];
539 UINT8 CurrentSpeed
[2];
541 UINT8 ProcessorUpgrade
;
542 UINT8 L1CacheHandle
[2];
543 UINT8 L2CacheHandle
[2];
544 UINT8 L3CacheHandle
[2];
555 } SMBIOS_STRUCTURE_POINTER
;