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 <IndustryStandard/SmBios.h>
27 #include <Protocol/Bis.h>
28 #include <Protocol/PxeBaseCode.h>
29 #include <Protocol/PxeBaseCodeCallBack.h>
30 #include <Protocol/NetworkInterfaceIdentifier.h>
31 #include <Protocol/SimpleNetwork.h>
32 #include <Protocol/LoadFile.h>
33 #include <Protocol/DevicePath.h>
34 #include <Protocol/Tcp.h>
35 #include <Protocol/LoadedImage.h>
37 #include <Library/DebugLib.h>
38 #include <Library/BaseMemoryLib.h>
39 #include <Library/MemoryAllocationLib.h>
40 #include <Library/UefiDriverEntryPoint.h>
41 #include <Library/UefiBootServicesTableLib.h>
42 #include <Library/BaseLib.h>
43 #include <Library/UefiLib.h>
45 #define CALLBACK_INTERVAL 100 // ten times a second
46 #define FILTER_BITS (EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP | \
47 EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST | \
48 EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS | \
49 EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST \
52 #define WAIT_TX_TIMEOUT 1000
54 #define SUPPORT_IPV6 0
56 #define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'd')
59 // Determine the classes of IPv4 address
61 #define IS_CLASSA_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0x80) == 0x00)
62 #define IS_CLASSB_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xc0) == 0x80)
63 #define IS_CLASSC_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xe0) == 0xc0)
64 #define IS_INADDR_UNICAST(x) ((IS_CLASSA_IPADDR(x) || IS_CLASSB_IPADDR(x) || IS_CLASSC_IPADDR(x)) && (((EFI_IP_ADDRESS*)x)->Addr[0] != 0) )
67 // Definitions for internet group management protocol version 2 message
69 // Per RFC 2236, November 1997
75 UINT8 MaxRespTime
; // in tenths of a second
76 UINT16 Checksum
; // ones complement of ones complement sum of
77 // 16 bit words of message
78 UINT32 GroupAddress
; // for general query, all systems group,
79 // for group specific, the group
82 #define IGMP_TYPE_QUERY 0x11
83 #define IGMP_TYPE_REPORT 0x16
84 #define IGMP_TYPE_V1REPORT 0x12
85 #define IGMP_TYPE_LEAVE_GROUP 0x17
87 #define IGMP_DEFAULT_MAX_RESPONSE_TIME 10 // 10 second default
90 #define MAX_MCAST_GROUPS 8 // most we allow ourselves to join at once
96 BOOLEAN ShowErrorMessages
;
98 EFI_PXE_BASE_CODE_PROTOCOL EfiBc
;
99 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*CallbackProtocolPtr
;
102 EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
*NiiPtr
;
103 EFI_SIMPLE_NETWORK_PROTOCOL
*SimpleNetwork
;
104 UINT8
*TransmitBufferPtr
;
105 UINT8
*ReceiveBufferPtr
;
106 EFI_PXE_BASE_CODE_FUNCTION Function
;
108 UINTN OldestArpEntry
;
109 UINTN MCastGroupCount
;
110 EFI_EVENT Igmpv1TimeoutEvent
;
111 BOOLEAN UseIgmpv1Reporting
;
112 EFI_EVENT IgmpGroupEvent
[MAX_MCAST_GROUPS
];
120 UINT32 MCastGroup
[MAX_MCAST_GROUPS
];
123 BOOLEAN GoodStationIp
;
126 VOID
*DhcpPacketBuffer
;
128 VOID
*BootServerReceiveBuffer
;
129 EFI_IP_ADDRESS ServerIp
;
135 VOID
*ReceiveBuffers
;
136 VOID
*TransmitBuffer
;
137 UINTN NumOffersReceived
;
141 // arrays for different types of offers
143 UINT8 ServerCount
[4];
144 UINT8 OfferCount
[4][MAX_OFFERS
];
147 UINT8 BinlProxies
[MAX_OFFERS
];
150 UINT8
*TftpAckBuffer
;
151 UINT8
*TftpErrorBuffer
;
152 IGMPV2_MESSAGE IgmpMessage
;
153 BOOLEAN BigBlkNumFlag
;
156 } PXE_BASECODE_DEVICE
;
161 #define DHCP_ONLY_IX 0
166 #define PXE_RND_PORT_LOW 2070
171 #define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'l')
176 EFI_LOAD_FILE_PROTOCOL LoadFile
;
177 PXE_BASECODE_DEVICE
*Private
;
180 #define EFI_BASE_CODE_DEV_FROM_THIS(a) CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE);
182 #define EFI_BASE_CODE_DEV_FROM_TCP(a) CR (a, PXE_BASECODE_DEVICE, Tcp, PXE_BASECODE_DEVICE_SIGNATURE);
184 #define EFI_LOAD_FILE_DEV_FROM_THIS(a) CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE)
188 PXE_BASECODE_DEVICE
*Private
,
189 BIS_APPLICATION_HANDLE
*BisAppHandle
,
190 EFI_BIS_DATA
**BisDataSigInfo
195 EFI_BIS_PROTOCOL
*Bis
,
196 BIS_APPLICATION_HANDLE BisAppHandle
,
197 EFI_BIS_DATA
*BisDataSigInfo
202 PXE_BASECODE_DEVICE
*Private
,
204 UINTN FileBufferLength
,
205 VOID
*CredentialBuffer
,
206 UINTN CredentialBufferLength
211 PXE_BASECODE_DEVICE
*Private
217 extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName
;
218 extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2
;
221 // //////////////////////////////////////////////////////////
227 Initialize the base code drivers and install the driver binding
229 Standard EFI Image Entry
231 @retval EFI_SUCCESS This driver was successfully bound
237 IN EFI_HANDLE ImageHandle
,
238 IN EFI_SYSTEM_TABLE
*SystemTable
244 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
251 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
257 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
258 IN BOOLEAN SortOffers
264 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
268 IN EFI_PXE_BASE_CODE_DISCOVER_INFO
* Info OPTIONAL
274 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
275 IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation
,
276 IN OUT VOID
*BufferPtr
,
277 IN BOOLEAN Overwrite
,
278 IN OUT UINT64
*BufferSize
,
279 IN UINTN
*BlockSize OPTIONAL
,
280 IN EFI_IP_ADDRESS
* ServerIp
,
282 IN EFI_PXE_BASE_CODE_MTFTP_INFO
* Info OPTIONAL
,
283 IN BOOLEAN DontUseBuffer
289 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
291 IN EFI_IP_ADDRESS
*DestIp
,
292 IN EFI_PXE_BASE_CODE_UDP_PORT
*DestPort
,
293 IN EFI_IP_ADDRESS
*GatewayIp
, OPTIONAL
294 IN EFI_IP_ADDRESS
*SrcIp
, OPTIONAL
295 IN OUT EFI_PXE_BASE_CODE_UDP_PORT
*SrcPort
, OPTIONAL
296 IN UINTN
*HeaderSize
, OPTIONAL
297 IN VOID
*HeaderPtr
, OPTIONAL
298 IN UINTN
*BufferSize
,
305 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
307 IN OUT EFI_IP_ADDRESS
*DestIp
, OPTIONAL
308 IN OUT EFI_PXE_BASE_CODE_UDP_PORT
*DestPort
, OPTIONAL
309 IN OUT EFI_IP_ADDRESS
*SrcIp
, OPTIONAL
310 IN OUT EFI_PXE_BASE_CODE_UDP_PORT
*SrcPort
, OPTIONAL
311 IN UINTN
*HeaderSize
, OPTIONAL
312 IN VOID
*HeaderPtr
, OPTIONAL
313 IN OUT UINTN
*BufferSize
,
320 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
322 IN UINT16
*UrgentPointer
,
323 IN UINT32
*SequenceNumber
,
324 IN UINT32
*AckNumber
,
325 IN UINT16
*HlenResCode
,
327 IN EFI_IP_ADDRESS
*DestIp
,
328 IN EFI_PXE_BASE_CODE_TCP_PORT
*DestPort
,
329 IN EFI_IP_ADDRESS
*GatewayIp
, OPTIONAL
330 IN EFI_IP_ADDRESS
*SrcIp
, OPTIONAL
331 IN OUT EFI_PXE_BASE_CODE_TCP_PORT
*SrcPort
, OPTIONAL
332 IN UINTN
*HeaderSize
, OPTIONAL
333 IN VOID
*HeaderPtr
, OPTIONAL
334 IN UINTN
*BufferSize
,
341 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
343 IN OUT EFI_IP_ADDRESS
*DestIp
, OPTIONAL
344 IN OUT EFI_PXE_BASE_CODE_TCP_PORT
*DestPort
, OPTIONAL
345 IN OUT EFI_IP_ADDRESS
*SrcIp
, OPTIONAL
346 IN OUT EFI_PXE_BASE_CODE_TCP_PORT
*SrcPort
, OPTIONAL
347 IN UINTN
*HeaderSize
, OPTIONAL
348 IN VOID
*HeaderPtr
, OPTIONAL
349 IN OUT UINTN
*BufferSize
,
356 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
357 IN EFI_IP_ADDRESS
* IpAddr
,
358 IN EFI_MAC_ADDRESS
* MacAddr OPTIONAL
364 IN EFI_PXE_BASE_CODE_PROTOCOL
*This
,
365 IN EFI_PXE_BASE_CODE_IP_FILTER
*NewFilter
371 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
372 IN BOOLEAN
*NewAutoArp
, OPTIONAL
373 IN BOOLEAN
*NewSendGUID
, OPTIONAL
374 IN UINT8
*NewTTL
, OPTIONAL
375 IN UINT8
*NewToS
, OPTIONAL
376 IN BOOLEAN
*NewMakeCallback OPTIONAL
382 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
383 IN EFI_IP_ADDRESS
* NewStationIp
, OPTIONAL
384 IN EFI_IP_ADDRESS
* NewSubnetMask OPTIONAL
390 IN EFI_PXE_BASE_CODE_PROTOCOL
* This
,
391 BOOLEAN
*NewDhcpDiscoverValid
, OPTIONAL
392 BOOLEAN
*NewDhcpAckReceived
, OPTIONAL
393 BOOLEAN
*NewProxyOfferReceived
, OPTIONAL
394 BOOLEAN
*NewPxeDiscoverValid
, OPTIONAL
395 BOOLEAN
*NewPxeReplyReceived
, OPTIONAL
396 BOOLEAN
*NewPxeBisReplyReceived
, OPTIONAL
397 IN EFI_PXE_BASE_CODE_PACKET
* NewDhcpDiscover
, OPTIONAL
398 IN EFI_PXE_BASE_CODE_PACKET
* NewDhcpAck
, OPTIONAL
399 IN EFI_PXE_BASE_CODE_PACKET
* NewProxyOffer
, OPTIONAL
400 IN EFI_PXE_BASE_CODE_PACKET
* NewPxeDiscover
, OPTIONAL
401 IN EFI_PXE_BASE_CODE_PACKET
* NewPxeReply
, OPTIONAL
402 IN EFI_PXE_BASE_CODE_PACKET
* NewPxeBisReply OPTIONAL
408 IN EFI_LOAD_FILE_PROTOCOL
*This
,
409 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
,
410 IN BOOLEAN BootPolicy
,
411 IN OUT UINTN
*BufferSize
,
416 PxeBcLibGetSmbiosSystemGuidAndSerialNumber (
417 IN EFI_GUID
*SystemGuid
,
418 OUT CHAR8
**SystemSerialNumber