From bb89ec1a7ec2f8d35033df9e47b3604925da3bd3 Mon Sep 17 00:00:00 2001 From: jljusten Date: Tue, 28 Jun 2011 16:47:23 +0000 Subject: InOsEmuPkg: Rename package to EmulatorPkg & Sec to Host * Rename InOsEmuPkg to EmulatorPkg * Rename Unix/Sec to Unix/Host Signed-off-by: jljusten Reviewed-by: andrewfish Reviewed-by: geekboy15a git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11918 6f19259b-4bc3-4df7-8a09-765794883524 --- EmulatorPkg/EmuSnpDxe/ComponentName.c | 318 +++++++++++ EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c | 958 ++++++++++++++++++++++++++++++++++ EmulatorPkg/EmuSnpDxe/EmuSnpDxe.h | 488 +++++++++++++++++ EmulatorPkg/EmuSnpDxe/EmuSnpDxe.inf | 57 ++ 4 files changed, 1821 insertions(+) create mode 100644 EmulatorPkg/EmuSnpDxe/ComponentName.c create mode 100644 EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c create mode 100644 EmulatorPkg/EmuSnpDxe/EmuSnpDxe.h create mode 100644 EmulatorPkg/EmuSnpDxe/EmuSnpDxe.inf (limited to 'EmulatorPkg/EmuSnpDxe') diff --git a/EmulatorPkg/EmuSnpDxe/ComponentName.c b/EmulatorPkg/EmuSnpDxe/ComponentName.c new file mode 100644 index 0000000000..a7c5124cff --- /dev/null +++ b/EmulatorPkg/EmuSnpDxe/ComponentName.c @@ -0,0 +1,318 @@ +/** @file + + Copyright (c) 2010, Apple, Inc. 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: + + ComponentName.c + +Abstract: + +-**/ + +#include "EmuSnpDxe.h" + +// +// EFI Component Name Functions +// +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 4646 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverComponentNameGetDriverName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN CHAR8 *Language, + OUT CHAR16 **DriverName + ); + + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 4646 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverComponentNameGetControllerName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName + ); + + +// +// EFI Component Name Protocol +// +GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmuSnpDriverComponentName = { + EmuSnpDriverComponentNameGetDriverName, + EmuSnpDriverComponentNameGetControllerName, + "eng" +}; + +// +// EFI Component Name 2 Protocol +// +GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuSnpDriverComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EmuSnpDriverComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EmuSnpDriverComponentNameGetControllerName, + "en" +}; + + +GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmuSnpDriverNameTable[] = { + { + "eng;en", + L"Emu SNP Driver" + }, + { + NULL, + NULL + } +}; + +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 4646 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverComponentNameGetDriverName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN CHAR8 *Language, + OUT CHAR16 **DriverName + ) +{ + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mEmuSnpDriverNameTable, + DriverName, + (BOOLEAN)(This == &gEmuSnpDriverComponentName) + ); +} + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 4646 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverComponentNameGetControllerName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c new file mode 100644 index 0000000000..4432218b51 --- /dev/null +++ b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c @@ -0,0 +1,958 @@ +/** @file + + Copyright (c) 2010, Apple, Inc. All rights reserved.
+ Copyright (c) 2011, 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: + + EmuSnp.c + +Abstract: + +-**/ + +#include "EmuSnpDxe.h" + + + +EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = { + EFI_SIMPLE_NETWORK_PROTOCOL_REVISION, + EmuSnpStart, + EmuSnpStop, + EmuSnpInitialize, + EmuSnpReset, + EmuSnpShutdown, + EmuSnpReceiveFilters, + EmuSnpStationAddress, + EmuSnpStatistics, + EmuSnpMcastIptoMac, + EmuSnpNvdata, + EmuSnpGetStatus, + EmuSnpTransmit, + EmuSnpReceive, + NULL, // WaitForPacket + NULL // Mode + }; + + + + +/** + Changes the state of a network interface from "stopped" to "started". + + @param This Protocol instance pointer. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpStart( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->Start (Private->Io); + return Status; +} + + +/** + Changes the state of a network interface from "started" to "stopped". + + @param This Protocol instance pointer. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpStop ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->Stop (Private->Io); + return Status; +} + + +/** + Resets a network adapter and allocates the transmit and receive buffers + required by the network interface; optionally, also requests allocation + of additional transmit and receive buffers. + + @param This Protocol instance pointer. + @param ExtraRxBufferSize The size, in bytes, of the extra receive buffer space + that the driver should allocate for the network interface. + Some network interfaces will not be able to use the extra + buffer, and the caller will not know if it is actually + being used. + @param ExtraTxBufferSize The size, in bytes, of the extra transmit buffer space + that the driver should allocate for the network interface. + Some network interfaces will not be able to use the extra + buffer, and the caller will not know if it is actually + being used. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpInitialize ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + IN UINTN ExtraRxBufferSize OPTIONAL, + IN UINTN ExtraTxBufferSize OPTIONAL + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->Initialize (Private->Io, ExtraRxBufferSize, ExtraTxBufferSize); + return Status; +} + +/** + Resets a network adapter and re-initializes it with the parameters that were + provided in the previous call to Initialize(). + + @param This Protocol instance pointer. + @param ExtendedVerification Indicates that the driver may perform a more + exhaustive verification operation of the device + during reset. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpReset ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + IN BOOLEAN ExtendedVerification + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->Reset (Private->Io, ExtendedVerification); + return Status; +} + +/** + Resets a network adapter and leaves it in a state that is safe for + another driver to initialize. + + @param This Protocol instance pointer. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpShutdown ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->Shutdown (Private->Io); + return Status; +} + +/** + Manages the multicast receive filters of a network interface. + + @param This Protocol instance pointer. + @param EnableBits A bit mask of receive filters to enable on the network interface. + @param DisableBits A bit mask of receive filters to disable on the network interface. + @param ResetMcastFilter Set to TRUE to reset the contents of the multicast receive + filters on the network interface to their default values. + @param McastFilterCount Number of multicast HW MAC addresses in the new + MCastFilter list. This value must be less than or equal to + the MCastFilterCnt field of EFI_SIMPLE_NETWORK_MODE. This + field is optional if ResetMCastFilter is TRUE. + @param McastFilter A pointer to a list of new multicast receive filter HW MAC + addresses. This list will replace any existing multicast + HW MAC address list. This field is optional if + ResetMCastFilter is TRUE. + + @retval EFI_SUCCESS The multicast receive filter list was updated. + @retval EFI_DEVICE_ERROR The command could not be sent to the network interface. + +**/ +EFI_STATUS +EFIAPI +EmuSnpReceiveFilters ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + IN UINT32 EnableBits, + IN UINT32 DisableBits, + IN BOOLEAN ResetMcastFilter, + IN UINTN McastFilterCount OPTIONAL, + IN EFI_MAC_ADDRESS *McastFilter OPTIONAL + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->ReceiveFilters ( + Private->Io, + EnableBits, + DisableBits, + ResetMcastFilter, + McastFilterCount, + McastFilter + ); + return Status; +} + +/** + Modifies or resets the current station address, if supported. + + @param This Protocol instance pointer. + @param Reset Flag used to reset the station address to the network interfaces + permanent address. + @param NewMacAddr New station address to be used for the network interface. + + @retval EFI_UNSUPPORTED Not supported yet. + +**/ +EFI_STATUS +EFIAPI +EmuSnpStationAddress ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + IN BOOLEAN Reset, + IN EFI_MAC_ADDRESS *NewMacAddr OPTIONAL + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->StationAddress (Private->Io, Reset, NewMacAddr); + return Status; +} + +/** + Resets or collects the statistics on a network interface. + + @param This Protocol instance pointer. + @param Reset Set to TRUE to reset the statistics for the network interface. + @param StatisticsSize On input the size, in bytes, of StatisticsTable. On + output the size, in bytes, of the resulting table of + statistics. + @param StatisticsTable A pointer to the EFI_NETWORK_STATISTICS structure that + contains the statistics. + + @retval EFI_SUCCESS The statistics were collected from the network interface. + @retval EFI_NOT_STARTED The network interface has not been started. + @retval EFI_BUFFER_TOO_SMALL The Statistics buffer was too small. The current buffer + size needed to hold the statistics is returned in + StatisticsSize. + @retval EFI_UNSUPPORTED Not supported yet. + +**/ +EFI_STATUS +EFIAPI +EmuSnpStatistics ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + IN BOOLEAN Reset, + IN OUT UINTN *StatisticsSize OPTIONAL, + OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->Statistics (Private->Io, Reset, StatisticsSize, StatisticsTable); + return Status; +} + +/** + Converts a multicast IP address to a multicast HW MAC address. + + @param This Protocol instance pointer. + @param Ipv6 Set to TRUE if the multicast IP address is IPv6 [RFC 2460]. Set + to FALSE if the multicast IP address is IPv4 [RFC 791]. + @param Ip The multicast IP address that is to be converted to a multicast + HW MAC address. + @param Mac The multicast HW MAC address that is to be generated from IP. + + @retval EFI_SUCCESS The multicast IP address was mapped to the multicast + HW MAC address. + @retval EFI_NOT_STARTED The network interface has not been started. + @retval EFI_BUFFER_TOO_SMALL The Statistics buffer was too small. The current buffer + size needed to hold the statistics is returned in + StatisticsSize. + @retval EFI_UNSUPPORTED Not supported yet. + +**/ +EFI_STATUS +EFIAPI +EmuSnpMcastIptoMac ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + IN BOOLEAN Ipv6, + IN EFI_IP_ADDRESS *Ip, + OUT EFI_MAC_ADDRESS *Mac + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->MCastIpToMac (Private->Io, Ipv6, Ip, Mac); + return Status; +} + + +/** + Performs read and write operations on the NVRAM device attached to a + network interface. + + @param This Protocol instance pointer. + @param ReadOrWrite TRUE for read operations, FALSE for write operations. + @param Offset Byte offset in the NVRAM device at which to start the read or + write operation. This must be a multiple of NvRamAccessSize and + less than NvRamSize. + @param BufferSize The number of bytes to read or write from the NVRAM device. + This must also be a multiple of NvramAccessSize. + @param Buffer A pointer to the data buffer. + + @retval EFI_UNSUPPORTED Not supported yet. + +**/ +EFI_STATUS +EFIAPI +EmuSnpNvdata ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + IN BOOLEAN ReadOrWrite, + IN UINTN Offset, + IN UINTN BufferSize, + IN OUT VOID *Buffer + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->NvData (Private->Io, ReadOrWrite, Offset, BufferSize, Buffer); + return Status; +} + + +/** + Reads the current interrupt status and recycled transmit buffer status from + a network interface. + + @param This Protocol instance pointer. + @param InterruptStatus A pointer to the bit mask of the currently active interrupts + If this is NULL, the interrupt status will not be read from + the device. If this is not NULL, the interrupt status will + be read from the device. When the interrupt status is read, + it will also be cleared. Clearing the transmit interrupt + does not empty the recycled transmit buffer array. + @param TxBuffer Recycled transmit buffer address. The network interface will + not transmit if its internal recycled transmit buffer array + is full. Reading the transmit buffer does not clear the + transmit interrupt. If this is NULL, then the transmit buffer + status will not be read. If there are no transmit buffers to + recycle and TxBuf is not NULL, * TxBuf will be set to NULL. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpGetStatus ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + OUT UINT32 *InterruptStatus, + OUT VOID **TxBuffer + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->GetStatus (Private->Io, InterruptStatus, TxBuffer); + return Status; +} + + +/** + Places a packet in the transmit queue of a network interface. + + @param This Protocol instance pointer. + @param HeaderSize The size, in bytes, of the media header to be filled in by + the Transmit() function. If HeaderSize is non-zero, then it + must be equal to This->Mode->MediaHeaderSize and the DestAddr + and Protocol parameters must not be NULL. + @param BufferSize The size, in bytes, of the entire packet (media header and + data) to be transmitted through the network interface. + @param Buffer A pointer to the packet (media header followed by data) to be + transmitted. This parameter cannot be NULL. If HeaderSize is zero, + then the media header in Buffer must already be filled in by the + caller. If HeaderSize is non-zero, then the media header will be + filled in by the Transmit() function. + @param SrcAddr The source HW MAC address. If HeaderSize is zero, then this parameter + is ignored. If HeaderSize is non-zero and SrcAddr is NULL, then + This->Mode->CurrentAddress is used for the source HW MAC address. + @param DestAddr The destination HW MAC address. If HeaderSize is zero, then this + parameter is ignored. + @param Protocol The type of header to build. If HeaderSize is zero, then this + parameter is ignored. See RFC 1700, section "Ether Types", for + examples. + + @retval EFI_SUCCESS The packet was placed on the transmit queue. + @retval EFI_DEVICE_ERROR The command could not be sent to the network interface. + @retval EFI_INVALID_PARAMETER One or more of the parameters has an unsupported value. + @retval EFI_NOT_STARTED The network interface has not been started. + +**/ +EFI_STATUS +EFIAPI +EmuSnpTransmit ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + IN UINTN HeaderSize, + IN UINTN BufferSize, + IN VOID* Buffer, + IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL, + IN EFI_MAC_ADDRESS *DestAddr OPTIONAL, + IN UINT16 *Protocol OPTIONAL + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->Transmit ( + Private->Io, + HeaderSize, + BufferSize, + Buffer, + SrcAddr, + DestAddr, + Protocol + ); + return Status; +} + +/** + Receives a packet from a network interface. + + @param This Protocol instance pointer. + @param HeaderSize The size, in bytes, of the media header received on the network + interface. If this parameter is NULL, then the media header size + will not be returned. + @param BuffSize On entry, the size, in bytes, of Buffer. On exit, the size, in + bytes, of the packet that was received on the network interface. + @param Buffer A pointer to the data buffer to receive both the media header and + the data. + @param SourceAddr The source HW MAC address. If this parameter is NULL, the + HW MAC source address will not be extracted from the media + header. + @param DestinationAddr The destination HW MAC address. If this parameter is NULL, + the HW MAC destination address will not be extracted from the + media header. + @param Protocol The media header type. If this parameter is NULL, then the + protocol will not be extracted from the media header. See + RFC 1700 section "Ether Types" for examples. + + @retval EFI_SUCCESS The received data was stored in Buffer, and BufferSize has + been updated to the number of bytes received. + @retval EFI_NOT_READY The network interface is too busy to accept this transmit + request. + @retval EFI_NOT_STARTED The network interface has not been started. + @retval EFI_BUFFER_TOO_SMALL The BufferSize parameter is too small. + @retval EFI_DEVICE_ERROR The command could not be sent to the network interface. + +**/ +EFI_STATUS +EFIAPI +EmuSnpReceive ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *This, + OUT UINTN *HeaderSize OPTIONAL, + IN OUT UINTN *BuffSize, + OUT VOID *Buffer, + OUT EFI_MAC_ADDRESS *SourceAddr OPTIONAL, + OUT EFI_MAC_ADDRESS *DestinationAddr OPTIONAL, + OUT UINT16 *Protocol OPTIONAL + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private; + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This); + + Status = Private->Io->Receive ( + Private->Io, + HeaderSize, + BuffSize, + Buffer, + SourceAddr, + DestinationAddr, + Protocol + ); + return Status; +} + + + +/** + Test to see if this driver supports ControllerHandle. This service + is called by the EFI boot service ConnectController(). In + order to make drivers as small as possible, there are a few calling + restrictions for this service. ConnectController() must + follow these calling restrictions. If any other agent wishes to call + Supported() it must also follow these calling restrictions. + + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to test + @param RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCESS This driver supports this device + @retval EFI_UNSUPPORTED This driver does not support this device + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ) +{ + EFI_STATUS Status; + EMU_IO_THUNK_PROTOCOL *EmuIoThunk; + MAC_ADDR_DEVICE_PATH *Node; + EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; + + if (RemainingDevicePath != NULL) { + if (!IsDevicePathEnd (RemainingDevicePath)) { + Node = (MAC_ADDR_DEVICE_PATH *)RemainingDevicePath; + if (Node->Header.Type != MESSAGING_DEVICE_PATH || + Node->Header.SubType != MSG_MAC_ADDR_DP) { + // If the remaining device path does not match we don't support the request + return EFI_UNSUPPORTED; + } + } + } + + + // + // Open the IO Abstraction(s) needed to perform the supported test + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEmuIoThunkProtocolGuid, + (VOID **)&EmuIoThunk, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Make sure GUID is for a File System handle. + // + Status = EFI_UNSUPPORTED; + if (CompareGuid (EmuIoThunk->Protocol, &gEmuSnpProtocolGuid)) { + Status = EFI_SUCCESS; + } + + // + // Close the I/O Abstraction(s) used to perform the supported test + // + gBS->CloseProtocol ( + ControllerHandle, + &gEmuIoThunkProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + + // + // Open the EFI Device Path protocol needed to perform the supported test + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + (VOID **) &ParentDevicePath, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (Status == EFI_ALREADY_STARTED) { + return EFI_SUCCESS; + } + + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Close protocol, don't use device path protocol in the Support() function + // + gBS->CloseProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + return Status; +} + + +/** + Start this driver on ControllerHandle. This service is called by the + EFI boot service ConnectController(). In order to make + drivers as small as possible, there are a few calling restrictions for + this service. ConnectController() must follow these + calling restrictions. If any other agent wishes to call Start() it + must also follow these calling restrictions. + + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to bind driver to + @param RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ) +{ + EFI_STATUS Status; + EMU_IO_THUNK_PROTOCOL *EmuIoThunk; + EMU_SNP_PRIVATE_DATA *Private; + MAC_ADDR_DEVICE_PATH Node; + EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; + + Private = NULL; + + // + // Grab the protocols we need + // + Status = gBS->OpenProtocol( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + ( VOID ** ) &ParentDevicePath, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status) && Status) { + return Status; + } + + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEmuIoThunkProtocolGuid, + (VOID **)&EmuIoThunk, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + return Status; + } + + if (!CompareGuid (EmuIoThunk->Protocol, &gEmuSnpProtocolGuid)) { + return EFI_UNSUPPORTED; + } + + Status = EmuIoThunk->Open (EmuIoThunk); + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Allocate the private data. + // + Private = AllocateZeroPool (sizeof (EMU_SNP_PRIVATE_DATA)); + if (Private == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + CopyMem (&Private->Snp, &gEmuSnpTemplate, sizeof (EFI_SIMPLE_NETWORK_PROTOCOL)); + + Private->Signature = EMU_SNP_PRIVATE_DATA_SIGNATURE; + Private->IoThunk = EmuIoThunk; + Private->Io = EmuIoThunk->Interface; + Private->EfiHandle = ControllerHandle; + Private->DeviceHandle = NULL; + Private->Snp.Mode = &Private->Mode; + Private->ControllerNameTable = NULL; + + + Status = Private->Io->CreateMapping (Private->Io, &Private->Mode); + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Build the device path by appending the MAC node to the ParentDevicePath + // from the EmuIo handle. + // + ZeroMem (&Node, sizeof (MAC_ADDR_DEVICE_PATH)); + + Node.Header.Type = MESSAGING_DEVICE_PATH; + Node.Header.SubType = MSG_MAC_ADDR_DP; + Node.IfType = Private->Mode.IfType; + + SetDevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL * )&Node, sizeof (MAC_ADDR_DEVICE_PATH)); + + CopyMem (&Node.MacAddress, &Private->Mode.CurrentAddress, sizeof (EFI_MAC_ADDRESS)); + + // + // Build the device path by appending the MAC node to the ParentDevicePath from the EmuIo handle. + // + Private->DevicePath = AppendDevicePathNode (ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&Node); + if ( Private->DevicePath == NULL ) { + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + AddUnicodeString2 ( + "eng", + gEmuSnpDriverComponentName.SupportedLanguages, + &Private->ControllerNameTable, + EmuIoThunk->ConfigString, + TRUE + ); + + AddUnicodeString2 ( + "en", + gEmuSnpDriverComponentName2.SupportedLanguages, + &Private->ControllerNameTable, + EmuIoThunk->ConfigString, + FALSE + ); + + // + // Create Child Handle + // + Status = gBS->InstallMultipleProtocolInterfaces( + &Private->DeviceHandle, + &gEfiSimpleNetworkProtocolGuid, &Private->Snp, + &gEfiDevicePathProtocolGuid, Private->DevicePath, + NULL + ); + if (EFI_ERROR (Status)) { + goto Done; + } + + // + // Open For Child Device + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEmuIoThunkProtocolGuid, + (VOID **)&EmuIoThunk, + This->DriverBindingHandle, + Private->DeviceHandle, + EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER + ); + +Done: + if (EFI_ERROR (Status)) { + if (Private != NULL) { + FreePool (Private); + } + if (ParentDevicePath != NULL) { + gBS->CloseProtocol( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + } + } + + return Status; +} + +/** + Stop this driver on ControllerHandle. This service is called by the + EFI boot service DisconnectController(). In order to + make drivers as small as possible, there are a few calling + restrictions for this service. DisconnectController() + must follow these calling restrictions. If any other agent wishes + to call Stop() it must also follow these calling restrictions. + + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to stop driver on + @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of + children is zero stop the entire bus driver. + @param ChildHandleBuffer List of Child Handles to Stop. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ) +{ + EFI_STATUS Status; + EMU_SNP_PRIVATE_DATA *Private = NULL; + EFI_SIMPLE_NETWORK_PROTOCOL *Snp; + + // + // Complete all outstanding transactions to Controller. + // Don't allow any new transaction to Controller to be started. + // + if (NumberOfChildren == 0) { + // + // Close the bus driver + // + Status = gBS->CloseProtocol ( + ControllerHandle, + &gEmuIoThunkProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + Status = gBS->CloseProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + return Status; + } + + ASSERT (NumberOfChildren == 1); + + + // + // Get our context back. + // + Status = gBS->OpenProtocol( + ChildHandleBuffer[0], + &gEfiSimpleNetworkProtocolGuid, + ( VOID ** ) &Snp, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + + Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (Snp); + Status = Private->IoThunk->Close (Private->IoThunk); + + Status = gBS->CloseProtocol( + ChildHandleBuffer[0], + &gEmuIoThunkProtocolGuid, + This->DriverBindingHandle, + Private->DeviceHandle + ); + + Status = gBS->UninstallMultipleProtocolInterfaces( + ChildHandleBuffer[0], + &gEfiSimpleNetworkProtocolGuid, &Private->Snp, + &gEfiDevicePathProtocolGuid, Private->DevicePath, + NULL + ); + + FreePool (Private->DevicePath); + FreeUnicodeStringTable (Private->ControllerNameTable); + FreePool (Private); + + return EFI_SUCCESS; +} + + +EFI_DRIVER_BINDING_PROTOCOL gEmuSnpDriverBinding = { + EmuSnpDriverBindingSupported, + EmuSnpDriverBindingStart, + EmuSnpDriverBindingStop, + 0xA, + NULL, + NULL +}; + + + +/** + This is the declaration of an EFI image entry point. This entry point is + the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including + both device drivers and bus drivers. + + @param ImageHandle The firmware allocated handle for the UEFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The operation completed successfully. + @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. + +**/ +EFI_STATUS +EFIAPI +InitializeEmuSnpDriver ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + // + // Install the Driver Protocols + // + + Status = EfiLibInstallDriverBindingComponentName2( + ImageHandle, + SystemTable, + &gEmuSnpDriverBinding, + ImageHandle, + &gEmuSnpDriverComponentName, + &gEmuSnpDriverComponentName2 + ); + + return Status; +} diff --git a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.h b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.h new file mode 100644 index 0000000000..21bfc42c14 --- /dev/null +++ b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.h @@ -0,0 +1,488 @@ +/** @file + + Copyright (c) 2010, Apple, Inc. 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: + + EmuSnp.h + +Abstract: + +-**/ + +#ifndef _EMU_SNP_H_ +#define _EMU_SNP_H_ + +#include + +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include + +#define NET_ETHER_HEADER_SIZE 14 + +// +// Private data for driver. +// +#define EMU_SNP_PRIVATE_DATA_SIGNATURE SIGNATURE_32( 'U', 'S', 'N', 'P' ) + +typedef struct { + UINTN Signature; + EMU_IO_THUNK_PROTOCOL *IoThunk; + EMU_SNP_PROTOCOL *Io; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + EFI_HANDLE EfiHandle; + EFI_HANDLE DeviceHandle; + + EFI_SIMPLE_NETWORK_PROTOCOL Snp; + EFI_SIMPLE_NETWORK_MODE Mode; + + EFI_UNICODE_STRING_TABLE *ControllerNameTable; + +} EMU_SNP_PRIVATE_DATA; + +#define EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS(a) \ + CR( a, EMU_SNP_PRIVATE_DATA, Snp, EMU_SNP_PRIVATE_DATA_SIGNATURE ) + +extern EFI_DRIVER_BINDING_PROTOCOL gEmuSnpDriverBinding; +extern EFI_COMPONENT_NAME_PROTOCOL gEmuSnpDriverComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gEmuSnpDriverComponentName2; + +/** + Test to see if this driver supports ControllerHandle. This service + is called by the EFI boot service ConnectController(). In + order to make drivers as small as possible, there are a few calling + restrictions for this service. ConnectController() must + follow these calling restrictions. If any other agent wishes to call + Supported() it must also follow these calling restrictions. + + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to test + @param RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCESS This driver supports this device + @retval EFI_UNSUPPORTED This driver does not support this device + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL * This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL + ); + +/** + Start this driver on ControllerHandle. This service is called by the + EFI boot service ConnectController(). In order to make + drivers as small as possible, there are a few calling restrictions for + this service. ConnectController() must follow these + calling restrictions. If any other agent wishes to call Start() it + must also follow these calling restrictions. + + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to bind driver to + @param RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL * This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL + ); + +/** + Stop this driver on ControllerHandle. This service is called by the + EFI boot service DisconnectController(). In order to + make drivers as small as possible, there are a few calling + restrictions for this service. DisconnectController() + must follow these calling restrictions. If any other agent wishes + to call Stop() it must also follow these calling restrictions. + + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to stop driver on + @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of + children is zero stop the entire bus driver. + @param ChildHandleBuffer List of Child Handles to Stop. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +/** + Changes the state of a network interface from "stopped" to "started". + + @param This Protocol instance pointer. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpStart( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This + ); + +/** + Changes the state of a network interface from "started" to "stopped". + + @param This Protocol instance pointer. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpStop( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This + ); + +/** + Resets a network adapter and allocates the transmit and receive buffers + required by the network interface; optionally, also requests allocation + of additional transmit and receive buffers. + + @param This Protocol instance pointer. + @param ExtraRxBufferSize The size, in bytes, of the extra receive buffer space + that the driver should allocate for the network interface. + Some network interfaces will not be able to use the extra + buffer, and the caller will not know if it is actually + being used. + @param ExtraTxBufferSize The size, in bytes, of the extra transmit buffer space + that the driver should allocate for the network interface. + Some network interfaces will not be able to use the extra + buffer, and the caller will not know if it is actually + being used. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpInitialize( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN UINTN ExtraRxBufferSize OPTIONAL, + IN UINTN ExtraTxBufferSize OPTIONAL + ); + +/** + Resets a network adapter and re-initializes it with the parameters that were + provided in the previous call to Initialize(). + + @param This Protocol instance pointer. + @param ExtendedVerification Indicates that the driver may perform a more + exhaustive verification operation of the device + during reset. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpReset( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN BOOLEAN ExtendedVerification + ); + +/** + Resets a network adapter and leaves it in a state that is safe for + another driver to initialize. + + @param This Protocol instance pointer. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpShutdown( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This + ); + +/** + Manages the multicast receive filters of a network interface. + + @param This Protocol instance pointer. + @param EnableBits A bit mask of receive filters to enable on the network interface. + @param DisableBits A bit mask of receive filters to disable on the network interface. + @param ResetMcastFilter Set to TRUE to reset the contents of the multicast receive + filters on the network interface to their default values. + @param McastFilterCount Number of multicast HW MAC addresses in the new + MCastFilter list. This value must be less than or equal to + the MCastFilterCnt field of EFI_SIMPLE_NETWORK_MODE. This + field is optional if ResetMCastFilter is TRUE. + @param McastFilter A pointer to a list of new multicast receive filter HW MAC + addresses. This list will replace any existing multicast + HW MAC address list. This field is optional if + ResetMCastFilter is TRUE. + + @retval EFI_SUCCESS The multicast receive filter list was updated. + @retval EFI_DEVICE_ERROR The command could not be sent to the network interface. + +**/ +EFI_STATUS +EFIAPI +EmuSnpReceiveFilters( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN UINT32 EnableBits, + IN UINT32 DisableBits, + IN BOOLEAN ResetMcastFilter, + IN UINTN McastFilterCount OPTIONAL, + IN EFI_MAC_ADDRESS* McastFilter OPTIONAL + ); + +/** + Modifies or resets the current station address, if supported. + + @param This Protocol instance pointer. + @param Reset Flag used to reset the station address to the network interfaces + permanent address. + @param NewMacAddr New station address to be used for the network interface. + + @retval EFI_UNSUPPORTED Not supported yet. + +**/ +EFI_STATUS +EFIAPI +EmuSnpStationAddress( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN BOOLEAN Reset, + IN EFI_MAC_ADDRESS* NewMacAddr OPTIONAL + ); + +/** + Resets or collects the statistics on a network interface. + + @param This Protocol instance pointer. + @param Reset Set to TRUE to reset the statistics for the network interface. + @param StatisticsSize On input the size, in bytes, of StatisticsTable. On + output the size, in bytes, of the resulting table of + statistics. + @param StatisticsTable A pointer to the EFI_NETWORK_STATISTICS structure that + contains the statistics. + + @retval EFI_SUCCESS The statistics were collected from the network interface. + @retval EFI_NOT_STARTED The network interface has not been started. + @retval EFI_BUFFER_TOO_SMALL The Statistics buffer was too small. The current buffer + size needed to hold the statistics is returned in + StatisticsSize. + @retval EFI_UNSUPPORTED Not supported yet. + +**/ +EFI_STATUS +EFIAPI +EmuSnpStatistics( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN BOOLEAN Reset, + IN OUT UINTN* StatisticsSize OPTIONAL, + OUT EFI_NETWORK_STATISTICS* StatisticsTable OPTIONAL + ); + +/** + Converts a multicast IP address to a multicast HW MAC address. + + @param This Protocol instance pointer. + @param Ipv6 Set to TRUE if the multicast IP address is IPv6 [RFC 2460]. Set + to FALSE if the multicast IP address is IPv4 [RFC 791]. + @param Ip The multicast IP address that is to be converted to a multicast + HW MAC address. + @param Mac The multicast HW MAC address that is to be generated from IP. + + @retval EFI_SUCCESS The multicast IP address was mapped to the multicast + HW MAC address. + @retval EFI_NOT_STARTED The network interface has not been started. + @retval EFI_BUFFER_TOO_SMALL The Statistics buffer was too small. The current buffer + size needed to hold the statistics is returned in + StatisticsSize. + @retval EFI_UNSUPPORTED Not supported yet. + +**/ +EFI_STATUS +EFIAPI +EmuSnpMcastIptoMac( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN BOOLEAN Ipv6, + IN EFI_IP_ADDRESS* Ip, + OUT EFI_MAC_ADDRESS* Mac + ); + +/** + Performs read and write operations on the NVRAM device attached to a + network interface. + + @param This Protocol instance pointer. + @param ReadOrWrite TRUE for read operations, FALSE for write operations. + @param Offset Byte offset in the NVRAM device at which to start the read or + write operation. This must be a multiple of NvRamAccessSize and + less than NvRamSize. + @param BufferSize The number of bytes to read or write from the NVRAM device. + This must also be a multiple of NvramAccessSize. + @param Buffer A pointer to the data buffer. + + @retval EFI_UNSUPPORTED Not supported yet. + +**/ +EFI_STATUS +EFIAPI +EmuSnpNvdata( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN BOOLEAN ReadOrWrite, + IN UINTN Offset, + IN UINTN BufferSize, + IN OUT VOID* Buffer + ); + +/** + Reads the current interrupt status and recycled transmit buffer status from + a network interface. + + @param This Protocol instance pointer. + @param InterruptStatus A pointer to the bit mask of the currently active interrupts + If this is NULL, the interrupt status will not be read from + the device. If this is not NULL, the interrupt status will + be read from the device. When the interrupt status is read, + it will also be cleared. Clearing the transmit interrupt + does not empty the recycled transmit buffer array. + @param TxBuffer Recycled transmit buffer address. The network interface will + not transmit if its internal recycled transmit buffer array + is full. Reading the transmit buffer does not clear the + transmit interrupt. If this is NULL, then the transmit buffer + status will not be read. If there are no transmit buffers to + recycle and TxBuf is not NULL, * TxBuf will be set to NULL. + + @retval EFI_SUCCESS Always succeeds. + +**/ +EFI_STATUS +EFIAPI +EmuSnpGetStatus( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + OUT UINT32* InterruptStatus, + OUT VOID** TxBuffer + ); + +/** + Places a packet in the transmit queue of a network interface. + + @param This Protocol instance pointer. + @param HeaderSize The size, in bytes, of the media header to be filled in by + the Transmit() function. If HeaderSize is non-zero, then it + must be equal to This->Mode->MediaHeaderSize and the DestAddr + and Protocol parameters must not be NULL. + @param BufferSize The size, in bytes, of the entire packet (media header and + data) to be transmitted through the network interface. + @param Buffer A pointer to the packet (media header followed by data) to be + transmitted. This parameter cannot be NULL. If HeaderSize is zero, + then the media header in Buffer must already be filled in by the + caller. If HeaderSize is non-zero, then the media header will be + filled in by the Transmit() function. + @param SrcAddr The source HW MAC address. If HeaderSize is zero, then this parameter + is ignored. If HeaderSize is non-zero and SrcAddr is NULL, then + This->Mode->CurrentAddress is used for the source HW MAC address. + @param DestAddr The destination HW MAC address. If HeaderSize is zero, then this + parameter is ignored. + @param Protocol The type of header to build. If HeaderSize is zero, then this + parameter is ignored. See RFC 1700, section "Ether Types", for + examples. + + @retval EFI_SUCCESS The packet was placed on the transmit queue. + @retval EFI_DEVICE_ERROR The command could not be sent to the network interface. + @retval EFI_ACCESS_DENIED Error acquire global lock for operation. + +**/ +EFI_STATUS +EFIAPI +EmuSnpTransmit( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN UINTN HeaderSize, + IN UINTN BufferSize, + IN VOID* Buffer, + IN EFI_MAC_ADDRESS* SrcAddr OPTIONAL, + IN EFI_MAC_ADDRESS* DestAddr OPTIONAL, + IN UINT16* Protocol OPTIONAL + ); + +/** + Receives a packet from a network interface. + + @param This Protocol instance pointer. + @param HeaderSize The size, in bytes, of the media header received on the network + interface. If this parameter is NULL, then the media header size + will not be returned. + @param BuffSize On entry, the size, in bytes, of Buffer. On exit, the size, in + bytes, of the packet that was received on the network interface. + @param Buffer A pointer to the data buffer to receive both the media header and + the data. + @param SourceAddr The source HW MAC address. If this parameter is NULL, the + HW MAC source address will not be extracted from the media + header. + @param DestinationAddr The destination HW MAC address. If this parameter is NULL, + the HW MAC destination address will not be extracted from the + media header. + @param Protocol The media header type. If this parameter is NULL, then the + protocol will not be extracted from the media header. See + RFC 1700 section "Ether Types" for examples. + + @retval EFI_SUCCESS The received data was stored in Buffer, and BufferSize has + been updated to the number of bytes received. + @retval EFI_NOT_READY The network interface is too busy to accept this transmit + request. + @retval EFI_BUFFER_TOO_SMALL The BufferSize parameter is too small. + @retval EFI_DEVICE_ERROR The command could not be sent to the network interface. + @retval EFI_ACCESS_DENIED Error acquire global lock for operation. + +**/ +EFI_STATUS +EFIAPI +EmuSnpReceive( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + OUT UINTN* HeaderSize OPTIONAL, + IN OUT UINTN* BuffSize, + OUT VOID* Buffer, + OUT EFI_MAC_ADDRESS* SourceAddr OPTIONAL, + OUT EFI_MAC_ADDRESS* DestinationAddr OPTIONAL, + OUT UINT16* Protocol OPTIONAL + ); + +VOID +EFIAPI +EmuSnpWaitForPacketNotify( + IN EFI_EVENT Event, + IN VOID* Private + ); + +#endif // _EMU_SNP_H_ diff --git a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.inf b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.inf new file mode 100644 index 0000000000..5360e2463c --- /dev/null +++ b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.inf @@ -0,0 +1,57 @@ +#/** @file +# Component name for module EmuSnpDxe +# +# Copyright (c) 2010, Apple, Inc. 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. +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = EmuSnpDxe + FILE_GUID = 22597239-6107-DF44-AD3F-5F053E92222E + MODULE_TYPE = UEFI_DRIVER + VERSION_STRING = 1.0 + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + + ENTRY_POINT = InitializeEmuSnpDriver +# UNLOAD_IMAGE = EmuSnpUnload +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources.common] + ComponentName.c + EmuSnpDxe.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + EmulatorPkg/EmulatorPkg.dec + +[LibraryClasses] + DevicePathLib + UefiLib + UefiBootServicesTableLib + BaseMemoryLib + DebugLib + UefiDriverEntryPoint + NetLib + +[Protocols] + gEfiSimpleNetworkProtocolGuid # PROTOCOL ALWAYS_CONSUMED + gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED + gEmuSnpProtocolGuid + gEmuIoThunkProtocolGuid + + -- cgit v1.2.3