| /** @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 <IndustryStandard/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 <Protocol/LoadedImage.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 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 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; | |
| extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2; | |
| // | |
| // ////////////////////////////////////////////////////////// | |
| // | |
| // 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 | |
| ); | |
| #include "Ip.h" | |
| #include "Dhcp.h" | |
| #include "Tftp.h" | |
| #endif /* _BC_H */ | |
| /* EOF - bc.h */ |