| /** @file |
| |
| Copyright (c) 2004 - 2007, Intel Corporation |
| All rights reserved. This program and the accompanying materials |
| are licensed and made available under the terms and conditions of the BSD License |
| which accompanies this distribution. The full text of the license may be found at |
| http://opensource.org/licenses/bsd-license.php |
| |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. |
| |
| Module Name: |
| bc.h |
| |
| Abstract: |
| |
| |
| **/ |
| |
| #ifndef _BC_H |
| #define _BC_H |
| |
| #include <PiDxe.h>
|
|
|
| #include <Guid/SmBios.h>
|
| #include <Protocol/Bis.h>
|
| #include <Protocol/PxeBaseCode.h>
|
| #include <Protocol/PxeBaseCodeCallBack.h>
|
| #include <Protocol/NetworkInterfaceIdentifier.h>
|
| #include <Protocol/SimpleNetwork.h>
|
| #include <Protocol/LoadFile.h>
|
| #include <Protocol/DevicePath.h> |
| #include <Protocol/Tcp.h>
|
|
|
| #include <Library/DebugLib.h>
|
| #include <Library/BaseMemoryLib.h> |
| #include <Library/MemoryAllocationLib.h>
|
| #include <Library/UefiDriverEntryPoint.h>
|
| #include <Library/UefiBootServicesTableLib.h>
|
| #include <Library/BaseLib.h>
|
| #include <Library/UefiLib.h> |
| |
| #define CALLBACK_INTERVAL 100 // ten times a second |
| #define FILTER_BITS (EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP | \ |
| EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST | \ |
| EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS | \ |
| EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST \ |
| ) |
| |
| #define WAIT_TX_TIMEOUT 1000 |
| |
| #define SUPPORT_IPV6 0 |
| |
| #define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'd') |
| |
| // |
| // Determine the classes of IPv4 address |
| // |
| #define IS_CLASSA_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0x80) == 0x00) |
| #define IS_CLASSB_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xc0) == 0x80) |
| #define IS_CLASSC_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xe0) == 0xc0) |
| #define IS_INADDR_UNICAST(x) ((IS_CLASSA_IPADDR(x) || IS_CLASSB_IPADDR(x) || IS_CLASSC_IPADDR(x)) && (((EFI_IP_ADDRESS*)x)->Addr[0] != 0) ) |
| |
| // |
| // Definitions for internet group management protocol version 2 message |
| // structure |
| // Per RFC 2236, November 1997 |
| // |
| #pragma pack(1) |
| |
| typedef struct { |
| UINT8 Type; |
| UINT8 MaxRespTime; // in tenths of a second |
| UINT16 Checksum; // ones complement of ones complement sum of |
| // 16 bit words of message |
| UINT32 GroupAddress; // for general query, all systems group, |
| // for group specific, the group |
| } IGMPV2_MESSAGE; |
| |
| #define IGMP_TYPE_QUERY 0x11 |
| #define IGMP_TYPE_REPORT 0x16 |
| #define IGMP_TYPE_V1REPORT 0x12 |
| #define IGMP_TYPE_LEAVE_GROUP 0x17 |
| |
| #define IGMP_DEFAULT_MAX_RESPONSE_TIME 10 // 10 second default |
| #pragma pack() |
| |
| #define MAX_MCAST_GROUPS 8 // most we allow ourselves to join at once |
| #define MAX_OFFERS 16 |
| |
| typedef struct { |
| UINTN Signature; |
| EFI_LOCK Lock; |
| BOOLEAN ShowErrorMessages; |
| EFI_TCP_PROTOCOL Tcp; |
| EFI_PXE_BASE_CODE_PROTOCOL EfiBc; |
| EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *CallbackProtocolPtr; |
| EFI_HANDLE Handle; |
| |
| EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *NiiPtr; |
| EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNetwork; |
| UINT8 *TransmitBufferPtr; |
| UINT8 *ReceiveBufferPtr; |
| EFI_PXE_BASE_CODE_FUNCTION Function; |
| |
| UINTN OldestArpEntry; |
| UINTN MCastGroupCount; |
| EFI_EVENT Igmpv1TimeoutEvent; |
| BOOLEAN UseIgmpv1Reporting; |
| EFI_EVENT IgmpGroupEvent[MAX_MCAST_GROUPS]; |
| UINT16 RandomPort; |
| |
| #if SUPPORT_IPV6 |
| // |
| // TBD |
| // |
| #else |
| UINT32 MCastGroup[MAX_MCAST_GROUPS]; |
| #endif |
| |
| BOOLEAN GoodStationIp; |
| BOOLEAN DidTransmit; |
| UINTN IpLength; |
| VOID *DhcpPacketBuffer; |
| UINTN FileSize; |
| VOID *BootServerReceiveBuffer; |
| EFI_IP_ADDRESS ServerIp; |
| |
| // |
| // work area |
| // for dhcp |
| // |
| VOID *ReceiveBuffers; |
| VOID *TransmitBuffer; |
| UINTN NumOffersReceived; |
| UINT16 TotalSeconds; |
| |
| // |
| // arrays for different types of offers |
| // |
| UINT8 ServerCount[4]; |
| UINT8 OfferCount[4][MAX_OFFERS]; |
| UINT8 GotBootp; |
| UINT8 GotProxy[4]; |
| UINT8 BinlProxies[MAX_OFFERS]; |
| |
| UINT8 *ArpBuffer; |
| UINT8 *TftpAckBuffer; |
| UINT8 *TftpErrorBuffer; |
| IGMPV2_MESSAGE IgmpMessage; |
| BOOLEAN BigBlkNumFlag; |
| UINT8 Timeout; |
| UINT16 RandomSeed; |
| } PXE_BASECODE_DEVICE; |
| |
| // |
| // type index |
| // |
| #define DHCP_ONLY_IX 0 |
| #define PXE10_IX 1 |
| #define WfM11a_IX 2 |
| #define BINL_IX 3 |
| |
| #define PXE_RND_PORT_LOW 2070 |
| |
| // |
| // |
| // |
| #define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'l') |
| |
| typedef struct { |
| UINTN Signature; |
| EFI_LOCK Lock; |
| EFI_LOAD_FILE_PROTOCOL LoadFile; |
| PXE_BASECODE_DEVICE *Private; |
| } LOADFILE_DEVICE; |
| |
| #define EFI_BASE_CODE_DEV_FROM_THIS(a) CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE); |
| |
| #define EFI_BASE_CODE_DEV_FROM_TCP(a) CR (a, PXE_BASECODE_DEVICE, Tcp, PXE_BASECODE_DEVICE_SIGNATURE); |
| |
| #define EFI_LOAD_FILE_DEV_FROM_THIS(a) CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE) |
| |
| EFI_BIS_PROTOCOL * |
| PxebcBisStart ( |
| PXE_BASECODE_DEVICE *Private, |
| BIS_APPLICATION_HANDLE *BisAppHandle, |
| EFI_BIS_DATA **BisDataSigInfo |
| ) |
| ; |
| |
| VOID |
| PxebcBisStop ( |
| EFI_BIS_PROTOCOL *Bis, |
| BIS_APPLICATION_HANDLE BisAppHandle, |
| EFI_BIS_DATA *BisDataSigInfo |
| ) |
| ; |
| |
| BOOLEAN |
| PxebcBisVerify ( |
| PXE_BASECODE_DEVICE *Private, |
| VOID *FileBuffer, |
| UINTN FileBufferLength, |
| VOID *CredentialBuffer, |
| UINTN CredentialBufferLength |
| ) |
| ; |
| |
| BOOLEAN |
| PxebcBisDetect ( |
| PXE_BASECODE_DEVICE *Private |
| ) |
| ; |
| |
| // |
| // Global Variables |
| // |
| extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName; |
| |
| // |
| // ////////////////////////////////////////////////////////// |
| // |
| // prototypes |
| // |
| |
| /** |
| Initialize the base code drivers and install the driver binding |
| |
| Standard EFI Image Entry |
| |
| @retval EFI_SUCCESS This driver was successfully bound |
| |
| **/ |
| EFI_STATUS |
| EFIAPI |
| InitializeBCDriver ( |
| IN EFI_HANDLE ImageHandle, |
| IN EFI_SYSTEM_TABLE *SystemTable |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcStart ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL *This, |
| IN BOOLEAN UseIpv6 |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcStop ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL *This |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcDhcp ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL *This, |
| IN BOOLEAN SortOffers |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcDiscover ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL * This, |
| IN UINT16 Type, |
| IN UINT16 *Layer, |
| IN BOOLEAN UseBis, |
| IN EFI_PXE_BASE_CODE_DISCOVER_INFO * Info OPTIONAL |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcMtftp ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL * This, |
| IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, |
| IN OUT VOID *BufferPtr, |
| IN BOOLEAN Overwrite, |
| IN OUT UINT64 *BufferSize, |
| IN UINTN *BlockSize OPTIONAL, |
| IN EFI_IP_ADDRESS * ServerIp, |
| IN UINT8 *Filename, |
| IN EFI_PXE_BASE_CODE_MTFTP_INFO * Info OPTIONAL, |
| IN BOOLEAN DontUseBuffer |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcUdpWrite ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL *This, |
| IN UINT16 OpFlags, |
| IN EFI_IP_ADDRESS *DestIp, |
| IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, |
| IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL |
| IN EFI_IP_ADDRESS *SrcIp, OPTIONAL |
| IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL |
| IN UINTN *HeaderSize, OPTIONAL |
| IN VOID *HeaderPtr, OPTIONAL |
| IN UINTN *BufferSize, |
| IN VOID *BufferPtr |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcUdpRead ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL *This, |
| IN UINT16 OpFlags, |
| IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL |
| IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL |
| IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL |
| IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL |
| IN UINTN *HeaderSize, OPTIONAL |
| IN VOID *HeaderPtr, OPTIONAL |
| IN OUT UINTN *BufferSize, |
| IN VOID *BufferPtr |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcTcpWrite ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL *This, |
| IN UINT16 OpFlags, |
| IN UINT16 *UrgentPointer, |
| IN UINT32 *SequenceNumber, |
| IN UINT32 *AckNumber, |
| IN UINT16 *HlenResCode, |
| IN UINT16 *Window, |
| IN EFI_IP_ADDRESS *DestIp, |
| IN EFI_PXE_BASE_CODE_TCP_PORT *DestPort, |
| IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL |
| IN EFI_IP_ADDRESS *SrcIp, OPTIONAL |
| IN OUT EFI_PXE_BASE_CODE_TCP_PORT *SrcPort, OPTIONAL |
| IN UINTN *HeaderSize, OPTIONAL |
| IN VOID *HeaderPtr, OPTIONAL |
| IN UINTN *BufferSize, |
| IN VOID *BufferPtr |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcTcpRead ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL *This, |
| IN UINT16 OpFlags, |
| IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL |
| IN OUT EFI_PXE_BASE_CODE_TCP_PORT *DestPort, OPTIONAL |
| IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL |
| IN OUT EFI_PXE_BASE_CODE_TCP_PORT *SrcPort, OPTIONAL |
| IN UINTN *HeaderSize, OPTIONAL |
| IN VOID *HeaderPtr, OPTIONAL |
| IN OUT UINTN *BufferSize, |
| IN VOID *BufferPtr |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcArp ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL * This, |
| IN EFI_IP_ADDRESS * IpAddr, |
| IN EFI_MAC_ADDRESS * MacAddr OPTIONAL |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcIpFilter ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL *This, |
| IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcSetParameters ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL * This, |
| IN BOOLEAN *NewAutoArp, OPTIONAL |
| IN BOOLEAN *NewSendGUID, OPTIONAL |
| IN UINT8 *NewTTL, OPTIONAL |
| IN UINT8 *NewToS, OPTIONAL |
| IN BOOLEAN *NewMakeCallback OPTIONAL |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcSetStationIP ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL * This, |
| IN EFI_IP_ADDRESS * NewStationIp, OPTIONAL |
| IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| BcSetPackets ( |
| IN EFI_PXE_BASE_CODE_PROTOCOL * This, |
| BOOLEAN *NewDhcpDiscoverValid, OPTIONAL |
| BOOLEAN *NewDhcpAckReceived, OPTIONAL |
| BOOLEAN *NewProxyOfferReceived, OPTIONAL |
| BOOLEAN *NewPxeDiscoverValid, OPTIONAL |
| BOOLEAN *NewPxeReplyReceived, OPTIONAL |
| BOOLEAN *NewPxeBisReplyReceived, OPTIONAL |
| IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover, OPTIONAL |
| IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck, OPTIONAL |
| IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer, OPTIONAL |
| IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover, OPTIONAL |
| IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply, OPTIONAL |
| IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL |
| ) |
| ; |
| |
| EFI_STATUS |
| EFIAPI |
| LoadFile ( |
| IN EFI_LOAD_FILE_PROTOCOL *This, |
| IN EFI_DEVICE_PATH_PROTOCOL *FilePath, |
| IN BOOLEAN BootPolicy, |
| IN OUT UINTN *BufferSize, |
| IN VOID *Buffer |
| ) |
| ; |
| |
| EFI_STATUS |
| PxeBcLibGetSmbiosSystemGuidAndSerialNumber ( |
| IN EFI_GUID *SystemGuid, |
| OUT CHAR8 **SystemSerialNumber |
| ) |
| ; |
| |
| #ifdef EFI_SIZE_REDUCTION_APPLIED |
| #define COMPONENT_NAME_CODE(code) |
| #define COMPONENT_NAME NULL |
| #else |
| #define COMPONENT_NAME_CODE(code) code |
| #define COMPONENT_NAME &gPxeBcComponentName |
| #endif |
| |
| |
| // |
| // Define SMBIOS tables. |
| // |
| #pragma pack(1) |
| typedef struct { |
| UINT8 AnchorString[4]; |
| UINT8 EntryPointStructureChecksum; |
| UINT8 EntryPointLength; |
| UINT8 MajorVersion; |
| UINT8 MinorVersion; |
| UINT16 MaxStructureSize; |
| UINT8 EntryPointRevision; |
| UINT8 FormattedArea[5]; |
| UINT8 IntermediateAnchorString[5]; |
| UINT8 IntermediateChecksum; |
| UINT16 TableLength; |
| UINT32 TableAddress; |
| UINT16 NumberOfSmbiosStructures; |
| UINT8 SmbiosBcdRevision; |
| } SMBIOS_STRUCTURE_TABLE; |
| |
| // |
| // Please note that SMBIOS structures can be odd byte aligned since the |
| // unformated section of each record is a set of arbitrary size strings. |
| // |
| typedef struct { |
| UINT8 Type; |
| UINT8 Length; |
| UINT8 Handle[2]; |
| } SMBIOS_HEADER; |
| |
| typedef UINT8 SMBIOS_STRING; |
| |
| typedef struct { |
| SMBIOS_HEADER Hdr; |
| SMBIOS_STRING Vendor; |
| SMBIOS_STRING BiosVersion; |
| UINT8 BiosSegment[2]; |
| SMBIOS_STRING BiosReleaseDate; |
| UINT8 BiosSize; |
| UINT8 BiosCharacteristics[8]; |
| } SMBIOS_TYPE0; |
| |
| typedef struct { |
| SMBIOS_HEADER Hdr; |
| SMBIOS_STRING Manufacturer; |
| SMBIOS_STRING ProductName; |
| SMBIOS_STRING Version; |
| SMBIOS_STRING SerialNumber; |
| |
| // |
| // always byte copy this data to prevent alignment faults! |
| // |
| EFI_GUID Uuid; |
| |
| UINT8 WakeUpType; |
| } SMBIOS_TYPE1; |
| |
| typedef struct { |
| SMBIOS_HEADER Hdr; |
| SMBIOS_STRING Manufacturer; |
| SMBIOS_STRING ProductName; |
| SMBIOS_STRING Version; |
| SMBIOS_STRING SerialNumber; |
| } SMBIOS_TYPE2; |
| |
| typedef struct { |
| SMBIOS_HEADER Hdr; |
| SMBIOS_STRING Manufacturer; |
| UINT8 Type; |
| SMBIOS_STRING Version; |
| SMBIOS_STRING SerialNumber; |
| SMBIOS_STRING AssetTag; |
| UINT8 BootupState; |
| UINT8 PowerSupplyState; |
| UINT8 ThermalState; |
| UINT8 SecurityStatus; |
| UINT8 OemDefined[4]; |
| } SMBIOS_TYPE3; |
| |
| typedef struct { |
| SMBIOS_HEADER Hdr; |
| UINT8 Socket; |
| UINT8 ProcessorType; |
| UINT8 ProcessorFamily; |
| SMBIOS_STRING ProcessorManufacture; |
| UINT8 ProcessorId[8]; |
| SMBIOS_STRING ProcessorVersion; |
| UINT8 Voltage; |
| UINT8 ExternalClock[2]; |
| UINT8 MaxSpeed[2]; |
| UINT8 CurrentSpeed[2]; |
| UINT8 Status; |
| UINT8 ProcessorUpgrade; |
| UINT8 L1CacheHandle[2]; |
| UINT8 L2CacheHandle[2]; |
| UINT8 L3CacheHandle[2]; |
| } SMBIOS_TYPE4; |
| |
| typedef union { |
| SMBIOS_HEADER *Hdr; |
| SMBIOS_TYPE0 *Type0; |
| SMBIOS_TYPE1 *Type1; |
| SMBIOS_TYPE2 *Type2; |
| SMBIOS_TYPE3 *Type3; |
| SMBIOS_TYPE4 *Type4; |
| UINT8 *Raw; |
| } SMBIOS_STRUCTURE_POINTER; |
| #pragma pack() |
| |
| #include "ip.h" |
| #include "dhcp.h" |
| #include "tftp.h" |
| |
| #endif /* _BC_H */ |
| |
| /* EOF - bc.h */ |