/** @file

 Copyright (c) 2010, Apple, Inc. All rights reserved.<BR>
 Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>

    SPDX-License-Identifier: BSD-2-Clause-Patent

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
 };

EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
  EfiSimpleNetworkStopped,      //  State
  NET_ETHER_ADDR_LEN,           //  HwAddressSize
  NET_ETHER_HEADER_SIZE,        //  MediaHeaderSize
  1500,                         //  MaxPacketSize
  0,                            //  NvRamSize
  0,                            //  NvRamAccessSize
  0,                            //  ReceiveFilterMask
  0,                            //  ReceiveFilterSetting
  MAX_MCAST_FILTER_CNT,         //  MaxMCastFilterCount
  0,                            //  MCastFilterCount
  {
    { { 0 } }
  },                            //  MCastFilter
  {
    { 0 }
  },                            //  CurrentAddress
  {
    { 0 }
  },                            //  BroadcastAddress
  {
    { 0 }
  },                            //  PermanentAddress
  NET_IFTYPE_ETHERNET,          //  IfType
  FALSE,                        //  MacAddressChangeable
  FALSE,                        //  MultipleTxSupported
  FALSE,                        //  MediaPresentSupported
  TRUE                          //  MediaPresent
};


/**
  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;
  }

  //
  // 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;
  }

  //
  // Make sure GUID is for a SNP handle.
  //
  Status = EFI_UNSUPPORTED;
  if (CompareGuid (EmuIoThunk->Protocol, &gEmuSnpProtocolGuid)) {
    Status = EFI_SUCCESS;
  }

  //
  // 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));
  CopyMem (&Private->Mode, &gEmuSnpModeTemplate, sizeof (EFI_SIMPLE_NETWORK_MODE));

  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;
  VOID                        *EmuIoThunk;

  //
  // 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);
  ASSERT (Private->DeviceHandle == ChildHandleBuffer[0]);
  ASSERT (Private->EfiHandle    == ControllerHandle);

  Status = gBS->CloseProtocol(
                  ControllerHandle,
                  &gEmuIoThunkProtocolGuid,
                  This->DriverBindingHandle,
                  Private->DeviceHandle
                  );
  ASSERT_EFI_ERROR (Status);

  Status = gBS->UninstallMultipleProtocolInterfaces(
                  Private->DeviceHandle,
                  &gEfiSimpleNetworkProtocolGuid,   &Private->Snp,
                  &gEfiDevicePathProtocolGuid,      Private->DevicePath,
                  NULL
                  );
  if (EFI_ERROR (Status)) {
    gBS->OpenProtocol (
           ControllerHandle,
           &gEmuIoThunkProtocolGuid,
           &EmuIoThunk,
           This->DriverBindingHandle,
           Private->DeviceHandle,
           EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
           );
  } else {
    Status = Private->IoThunk->Close (Private->IoThunk);
    ASSERT_EFI_ERROR (Status);

    FreePool (Private->DevicePath);
    FreeUnicodeStringTable (Private->ControllerNameTable);
    FreePool (Private);
  }

  return Status;
}


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;
}
