]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h
1. Import UEFI PxeBc module in MdeModulePkg
[mirror_edk2.git] / MdeModulePkg / Universal / Network / PxeBcDxe / Bc.h
index f4a19bad60896c0305204155ba171450cf5e2d8e..8d09ee6e7141335cf1ce10346483123c2c71367e 100644 (file)
-/** @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
-
+/** @file\r
+\r
+Copyright (c) 2004 - 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+  bc.h\r
+\r
+Abstract:\r
+\r
+\r
+**/\r
+\r
+#ifndef _BC_H\r
+#define _BC_H\r
+\r
 #include <PiDxe.h>\r
 \r
 #include <Guid/SmBios.h>\r
+#include <IndustryStandard/Smbios.h>\r
 #include <Protocol/Bis.h>\r
 #include <Protocol/PxeBaseCode.h>\r
 #include <Protocol/PxeBaseCodeCallBack.h>\r
 #include <Protocol/NetworkInterfaceIdentifier.h>\r
 #include <Protocol/SimpleNetwork.h>\r
 #include <Protocol/LoadFile.h>\r
-#include <Protocol/DevicePath.h>
+#include <Protocol/DevicePath.h>\r
 #include <Protocol/Tcp.h>\r
 \r
 #include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>
+#include <Library/BaseMemoryLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiDriverEntryPoint.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/BaseLib.h>\r
-#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 */
+#include <Library/UefiLib.h>\r
+\r
+#define CALLBACK_INTERVAL             100 // ten times a second\r
+#define FILTER_BITS                   (EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP | \\r
+                     EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST | \\r
+                     EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS | \\r
+                     EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST \\r
+          )\r
+\r
+#define WAIT_TX_TIMEOUT               1000\r
+\r
+#define SUPPORT_IPV6                  0\r
+\r
+#define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'd')\r
+\r
+//\r
+// Determine the classes of IPv4 address\r
+//\r
+#define  IS_CLASSA_IPADDR(x)  ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0x80) == 0x00)\r
+#define  IS_CLASSB_IPADDR(x)  ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xc0) == 0x80)\r
+#define  IS_CLASSC_IPADDR(x)  ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xe0) == 0xc0)\r
+#define  IS_INADDR_UNICAST(x) ((IS_CLASSA_IPADDR(x) || IS_CLASSB_IPADDR(x) || IS_CLASSC_IPADDR(x)) && (((EFI_IP_ADDRESS*)x)->Addr[0] != 0) )\r
+\r
+//\r
+// Definitions for internet group management protocol version 2 message\r
+// structure\r
+// Per RFC 2236, November 1997\r
+//\r
+#pragma pack(1)\r
+\r
+typedef struct {\r
+  UINT8   Type;\r
+  UINT8   MaxRespTime;  // in tenths of a second\r
+  UINT16  Checksum;     // ones complement of ones complement sum of\r
+                        // 16 bit words of message\r
+  UINT32  GroupAddress; // for general query, all systems group,\r
+                        // for group specific, the group\r
+} IGMPV2_MESSAGE;\r
+\r
+#define IGMP_TYPE_QUERY                 0x11\r
+#define IGMP_TYPE_REPORT                0x16\r
+#define IGMP_TYPE_V1REPORT              0x12\r
+#define IGMP_TYPE_LEAVE_GROUP           0x17\r
+\r
+#define IGMP_DEFAULT_MAX_RESPONSE_TIME  10  // 10 second default\r
+#pragma pack()\r
+\r
+#define MAX_MCAST_GROUPS  8                 // most we allow ourselves to join at once\r
+#define MAX_OFFERS        16\r
+\r
+typedef struct {\r
+  UINTN                                     Signature;\r
+  EFI_LOCK                                  Lock;\r
+  BOOLEAN                                   ShowErrorMessages;\r
+  EFI_TCP_PROTOCOL                          Tcp;\r
+  EFI_PXE_BASE_CODE_PROTOCOL                EfiBc;\r
+  EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL       *CallbackProtocolPtr;\r
+  EFI_HANDLE                                Handle;\r
+\r
+  EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *NiiPtr;\r
+  EFI_SIMPLE_NETWORK_PROTOCOL               *SimpleNetwork;\r
+  UINT8                                     *TransmitBufferPtr;\r
+  UINT8                                     *ReceiveBufferPtr;\r
+  EFI_PXE_BASE_CODE_FUNCTION                Function;\r
+\r
+  UINTN                                     OldestArpEntry;\r
+  UINTN                                     MCastGroupCount;\r
+  EFI_EVENT                                 Igmpv1TimeoutEvent;\r
+  BOOLEAN                                   UseIgmpv1Reporting;\r
+  EFI_EVENT                                 IgmpGroupEvent[MAX_MCAST_GROUPS];\r
+  UINT16                                    RandomPort;\r
+\r
+#if SUPPORT_IPV6\r
+  //\r
+  // TBD\r
+  //\r
+#else\r
+  UINT32          MCastGroup[MAX_MCAST_GROUPS];\r
+#endif\r
+\r
+  BOOLEAN         GoodStationIp;\r
+  BOOLEAN         DidTransmit;\r
+  UINTN           IpLength;\r
+  VOID            *DhcpPacketBuffer;\r
+  UINTN           FileSize;\r
+  VOID            *BootServerReceiveBuffer;\r
+  EFI_IP_ADDRESS  ServerIp;\r
+\r
+  //\r
+  // work area\r
+  // for dhcp\r
+  //\r
+  VOID            *ReceiveBuffers;\r
+  VOID            *TransmitBuffer;\r
+  UINTN           NumOffersReceived;\r
+  UINT16          TotalSeconds;\r
+\r
+  //\r
+  // arrays for different types of offers\r
+  //\r
+  UINT8           ServerCount[4];\r
+  UINT8           OfferCount[4][MAX_OFFERS];\r
+  UINT8           GotBootp;\r
+  UINT8           GotProxy[4];\r
+  UINT8           BinlProxies[MAX_OFFERS];\r
+\r
+  UINT8           *ArpBuffer;\r
+  UINT8           *TftpAckBuffer;\r
+  UINT8           *TftpErrorBuffer;\r
+  IGMPV2_MESSAGE  IgmpMessage;\r
+  BOOLEAN         BigBlkNumFlag;\r
+  UINT8           Timeout;\r
+  UINT16          RandomSeed;\r
+} PXE_BASECODE_DEVICE;\r
+\r
+//\r
+// type index\r
+//\r
+#define DHCP_ONLY_IX      0\r
+#define PXE10_IX          1\r
+#define WfM11a_IX         2\r
+#define BINL_IX           3\r
+\r
+#define PXE_RND_PORT_LOW  2070\r
+\r
+//\r
+//\r
+//\r
+#define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'l')\r
+\r
+typedef struct {\r
+  UINTN                   Signature;\r
+  EFI_LOCK                Lock;\r
+  EFI_LOAD_FILE_PROTOCOL  LoadFile;\r
+  PXE_BASECODE_DEVICE     *Private;\r
+} LOADFILE_DEVICE;\r
+\r
+#define EFI_BASE_CODE_DEV_FROM_THIS(a)  CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE);\r
+\r
+#define EFI_BASE_CODE_DEV_FROM_TCP(a)   CR (a, PXE_BASECODE_DEVICE, Tcp, PXE_BASECODE_DEVICE_SIGNATURE);\r
+\r
+#define EFI_LOAD_FILE_DEV_FROM_THIS(a)  CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE)\r
+\r
+EFI_BIS_PROTOCOL                    *\r
+PxebcBisStart (\r
+  PXE_BASECODE_DEVICE     *Private,\r
+  BIS_APPLICATION_HANDLE  *BisAppHandle,\r
+  EFI_BIS_DATA            **BisDataSigInfo\r
+  )\r
+;\r
+\r
+VOID\r
+PxebcBisStop (\r
+  EFI_BIS_PROTOCOL        *Bis,\r
+  BIS_APPLICATION_HANDLE  BisAppHandle,\r
+  EFI_BIS_DATA            *BisDataSigInfo\r
+  )\r
+;\r
+\r
+BOOLEAN\r
+PxebcBisVerify (\r
+  PXE_BASECODE_DEVICE     *Private,\r
+  VOID                    *FileBuffer,\r
+  UINTN                   FileBufferLength,\r
+  VOID                    *CredentialBuffer,\r
+  UINTN                   CredentialBufferLength\r
+  )\r
+;\r
+\r
+BOOLEAN\r
+PxebcBisDetect (\r
+  PXE_BASECODE_DEVICE *Private\r
+  )\r
+;\r
+\r
+//\r
+// Global Variables\r
+//\r
+extern EFI_COMPONENT_NAME_PROTOCOL   gPxeBcComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL  gPxeBcComponentName2;\r
+\r
+//\r
+// //////////////////////////////////////////////////////////\r
+//\r
+// prototypes\r
+//\r
+\r
+/**\r
+  Initialize the base code drivers and install the driver binding\r
+\r
+  Standard EFI Image Entry\r
+\r
+  @retval EFI_SUCCESS  This driver was successfully bound\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+InitializeBCDriver (\r
+  IN EFI_HANDLE                       ImageHandle,\r
+  IN EFI_SYSTEM_TABLE                 *SystemTable\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcStart (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
+  IN BOOLEAN                          UseIpv6\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcStop (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       *This\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcDhcp (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
+  IN BOOLEAN                          SortOffers\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcDiscover (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
+  IN UINT16                           Type,\r
+  IN UINT16                           *Layer,\r
+  IN BOOLEAN                          UseBis,\r
+  IN EFI_PXE_BASE_CODE_DISCOVER_INFO  * Info OPTIONAL\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcMtftp (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
+  IN EFI_PXE_BASE_CODE_TFTP_OPCODE    Operation,\r
+  IN OUT VOID                         *BufferPtr,\r
+  IN BOOLEAN                          Overwrite,\r
+  IN OUT UINT64                       *BufferSize,\r
+  IN UINTN                            *BlockSize OPTIONAL,\r
+  IN EFI_IP_ADDRESS                   * ServerIp,\r
+  IN UINT8                            *Filename,\r
+  IN EFI_PXE_BASE_CODE_MTFTP_INFO     * Info OPTIONAL,\r
+  IN BOOLEAN                          DontUseBuffer\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcUdpWrite (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
+  IN UINT16                           OpFlags,\r
+  IN EFI_IP_ADDRESS                   *DestIp,\r
+  IN EFI_PXE_BASE_CODE_UDP_PORT       *DestPort,\r
+  IN EFI_IP_ADDRESS                   *GatewayIp, OPTIONAL\r
+  IN EFI_IP_ADDRESS                   *SrcIp, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort, OPTIONAL\r
+  IN UINTN                            *HeaderSize, OPTIONAL\r
+  IN VOID                             *HeaderPtr, OPTIONAL\r
+  IN UINTN                            *BufferSize,\r
+  IN VOID                             *BufferPtr\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcUdpRead (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
+  IN UINT16                           OpFlags,\r
+  IN OUT EFI_IP_ADDRESS               *DestIp, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *DestPort, OPTIONAL\r
+  IN OUT EFI_IP_ADDRESS               *SrcIp, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort, OPTIONAL\r
+  IN UINTN                            *HeaderSize, OPTIONAL\r
+  IN VOID                             *HeaderPtr, OPTIONAL\r
+  IN OUT UINTN                        *BufferSize,\r
+  IN VOID                             *BufferPtr\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcTcpWrite (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
+  IN UINT16                           OpFlags,\r
+  IN UINT16                           *UrgentPointer,\r
+  IN UINT32                           *SequenceNumber,\r
+  IN UINT32                           *AckNumber,\r
+  IN UINT16                           *HlenResCode,\r
+  IN UINT16                           *Window,\r
+  IN EFI_IP_ADDRESS                   *DestIp,\r
+  IN EFI_PXE_BASE_CODE_TCP_PORT       *DestPort,\r
+  IN EFI_IP_ADDRESS                   *GatewayIp, OPTIONAL\r
+  IN EFI_IP_ADDRESS                   *SrcIp, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_TCP_PORT   *SrcPort, OPTIONAL\r
+  IN UINTN                            *HeaderSize, OPTIONAL\r
+  IN VOID                             *HeaderPtr, OPTIONAL\r
+  IN UINTN                            *BufferSize,\r
+  IN VOID                             *BufferPtr\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcTcpRead (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
+  IN UINT16                           OpFlags,\r
+  IN OUT EFI_IP_ADDRESS               *DestIp, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_TCP_PORT   *DestPort, OPTIONAL\r
+  IN OUT EFI_IP_ADDRESS               *SrcIp, OPTIONAL\r
+  IN OUT EFI_PXE_BASE_CODE_TCP_PORT   *SrcPort, OPTIONAL\r
+  IN UINTN                            *HeaderSize, OPTIONAL\r
+  IN VOID                             *HeaderPtr, OPTIONAL\r
+  IN OUT UINTN                        *BufferSize,\r
+  IN VOID                             *BufferPtr\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcArp (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
+  IN EFI_IP_ADDRESS                   * IpAddr,\r
+  IN EFI_MAC_ADDRESS                  * MacAddr OPTIONAL\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcIpFilter (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
+  IN EFI_PXE_BASE_CODE_IP_FILTER      *NewFilter\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcSetParameters (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
+  IN BOOLEAN                          *NewAutoArp, OPTIONAL\r
+  IN BOOLEAN                          *NewSendGUID, OPTIONAL\r
+  IN UINT8                            *NewTTL, OPTIONAL\r
+  IN UINT8                            *NewToS, OPTIONAL\r
+  IN BOOLEAN                          *NewMakeCallback OPTIONAL\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcSetStationIP (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
+  IN EFI_IP_ADDRESS                   * NewStationIp, OPTIONAL\r
+  IN EFI_IP_ADDRESS                   * NewSubnetMask OPTIONAL\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+BcSetPackets (\r
+  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
+  BOOLEAN                             *NewDhcpDiscoverValid, OPTIONAL\r
+  BOOLEAN                             *NewDhcpAckReceived, OPTIONAL\r
+  BOOLEAN                             *NewProxyOfferReceived, OPTIONAL\r
+  BOOLEAN                             *NewPxeDiscoverValid, OPTIONAL\r
+  BOOLEAN                             *NewPxeReplyReceived, OPTIONAL\r
+  BOOLEAN                             *NewPxeBisReplyReceived, OPTIONAL\r
+  IN EFI_PXE_BASE_CODE_PACKET         * NewDhcpDiscover, OPTIONAL\r
+  IN EFI_PXE_BASE_CODE_PACKET         * NewDhcpAck, OPTIONAL\r
+  IN EFI_PXE_BASE_CODE_PACKET         * NewProxyOffer, OPTIONAL\r
+  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeDiscover, OPTIONAL\r
+  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeReply, OPTIONAL\r
+  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeBisReply OPTIONAL\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LoadFile (\r
+  IN EFI_LOAD_FILE_PROTOCOL           *This,\r
+  IN EFI_DEVICE_PATH_PROTOCOL         *FilePath,\r
+  IN BOOLEAN                          BootPolicy,\r
+  IN OUT UINTN                        *BufferSize,\r
+  IN VOID                             *Buffer\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+PxeBcLibGetSmbiosSystemGuidAndSerialNumber (\r
+  IN  EFI_GUID    *SystemGuid,\r
+  OUT CHAR8       **SystemSerialNumber\r
+  )\r
+;\r
+\r
+#include "ip.h"\r
+#include "dhcp.h"\r
+#include "tftp.h"\r
+\r
+#endif /* _BC_H */\r
+\r
+/* EOF - bc.h */\r