public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ni, Ruiyu" <ruiyu.ni@intel.com>
To: "Fu, Siyuan" <siyuan.fu@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Wang, Jian J" <jian.j.wang@intel.com>,
	"Wu, Hao A" <hao.a.wu@intel.com>,
	 "Zeng, Star" <star.zeng@intel.com>,
	"Wu, Jiaxin" <jiaxin.wu@intel.com>
Subject: Re: [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg.
Date: Thu, 20 Dec 2018 02:07:21 +0000	[thread overview]
Message-ID: <734D49CCEBEEF84792F5B80ED585239D5BF6740D@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20181220014110.20324-4-siyuan.fu@intel.com>

Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>

Thanks/Ray

> -----Original Message-----
> From: Fu, Siyuan <siyuan.fu@intel.com>
> Sent: Thursday, December 20, 2018 9:41 AM
> To: edk2-devel@lists.01.org
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Ni, Ruiyu <ruiyu.ni@intel.com>; Zeng, Star <star.zeng@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> Subject: [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg.
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
> 
> This patch is to delete the IScsiDxe driver in MdeModulePkg. The driver
> will not be maintained and can't co-work with the dual-stack IScsiDxe in
> NetworkPkg.
> 
> People should use below NetworkPkg drivers instead:
>   NetworkPkg/IScsiDxe/IScsiDxe.inf
> Which is actively maintained with more bug fixes and new feature support.
> 
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Hao Wu <hao.a.wu@intel.com>
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Jiaxin Wu <jiaxin.wu@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Siyuan Fu <siyuan.fu@intel.com>
> ---
> 
> Notes:
>     v2:
>     Break original patch to separate commits per module.
> 
>  MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c           |
> 283 --
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c               |  430 ---
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c             | 1264 -----
> ----
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c               |  472 ----
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c             |  676 -----
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c    |  412
> ---
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c               |  539 ----
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c      |  116 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c               |  948 -------
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c              | 2799 ------
> --------------
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c             |  487 ----
>  MdeModulePkg/Universal/Network/IScsiDxe/Md5.c                     |  350 ---
>  MdeModulePkg/MdeModulePkg.dsc                                     |    1 -
>  MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h           |
> 165 --
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni             |   25 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni        |   20 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h               |  106 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h             |   22 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h             |  166 --
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr        |  219 --
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni |
> 62 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h  |
> 109 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h               |   55 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h             |  140 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf              |  134 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h    |   22
> -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h               |   38 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h               |  168 --
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h      |   74 -
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h               |  317 ---
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h              | 1005 -----
> --
>  MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h             |  142 -
>  MdeModulePkg/Universal/Network/IScsiDxe/Md5.h                     |   80 -
>  33 files changed, 11846 deletions(-)
> 
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> deleted file mode 100644
> index 3f561e93439d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> +++ /dev/null
> @@ -1,283 +0,0 @@
> -/** @file
> -  UEFI Component Name(2) protocol implementation for iSCSI.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -//
> -// EFI Component Name Protocol
> -//
> -GLOBAL_REMOVE_IF_UNREFERENCED
> EFI_COMPONENT_NAME_PROTOCOL     gIScsiComponentName = {
> -  IScsiComponentNameGetDriverName,
> -  IScsiComponentNameGetControllerName,
> -  "eng"
> -};
> -
> -//
> -// EFI Component Name 2 Protocol
> -//
> -GLOBAL_REMOVE_IF_UNREFERENCED
> EFI_COMPONENT_NAME2_PROTOCOL    gIScsiComponentName2 = {
> -  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)
> IScsiComponentNameGetDriverName,
> -  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)
> IScsiComponentNameGetControllerName,
> -  "en"
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
> mIScsiDriverNameTable[] = {
> -  {"eng;en", L"iSCSI Driver"},
> -  {NULL, NULL}
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
> *mIScsiControllerNameTable = NULL;
> -
> -/**
> -  Retrieves a Unicode string that is the user readable name of the EFI 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[in]  This        A pointer to the EFI_COMPONENT_NAME_PROTOCOL
> instance.
> -  @param[in]  Language    A pointer to a three character ISO 639-2 language
> identifier.
> -                          This is the language of the driver name that 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.
> -  @param[out]  DriverName 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
> -IScsiComponentNameGetDriverName (
> -  IN  EFI_COMPONENT_NAME_PROTOCOL   *This,
> -  IN  CHAR8                         *Language,
> -  OUT CHAR16                        **DriverName
> -  )
> -{
> -  return LookupUnicodeString2 (
> -          Language,
> -          This->SupportedLanguages,
> -          mIScsiDriverNameTable,
> -          DriverName,
> -          (BOOLEAN)(This == &gIScsiComponentName)
> -          );
> -}
> -
> -/**
> -  Update the component name for the iSCSI instance.
> -
> -  @param[in]  IScsiExtScsiPassThru  A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> -
> -  @retval EFI_SUCCESS               Update the ControllerNameTable of this
> instance successfully.
> -  @retval EFI_INVALID_PARAMETER     The input parameter is invalid.
> -  @retval EFI_UNSUPPORTED           Can't get the corresponding NIC info from
> the Controller handle.
> -
> -**/
> -EFI_STATUS
> -UpdateName (
> -  IN   EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru
> -  )
> -{
> -  EFI_STATUS                       Status;
> -  CHAR16                           HandleName[150];
> -  ISCSI_DRIVER_DATA                *Private;
> -  EFI_MAC_ADDRESS                  MacAddress;
> -  UINTN                            HwAddressSize;
> -  UINT16                           VlanId;
> -  CHAR16                           MacString[70];
> -
> -  if (IScsiExtScsiPassThru == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Private  = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU
> (IScsiExtScsiPassThru);
> -
> -  //
> -  // Get the mac string, it's the name of various variable
> -  //
> -  Status = NetLibGetMacAddress (Private->Controller, &MacAddress,
> &HwAddressSize);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -  VlanId = NetLibGetVlanId (Private->Controller);
> -  IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> -  UnicodeSPrint (
> -    HandleName,
> -    sizeof (HandleName),
> -    L"iSCSI IPv4 (MacString=%s)",
> -    MacString
> -  );
> -
> -  if (mIScsiControllerNameTable != NULL) {
> -    FreeUnicodeStringTable (mIScsiControllerNameTable);
> -    mIScsiControllerNameTable = NULL;
> -  }
> -
> -  Status = AddUnicodeString2 (
> -             "eng",
> -             gIScsiComponentName.SupportedLanguages,
> -             &mIScsiControllerNameTable,
> -             HandleName,
> -             TRUE
> -             );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  return AddUnicodeString2 (
> -           "en",
> -           gIScsiComponentName2.SupportedLanguages,
> -           &mIScsiControllerNameTable,
> -           HandleName,
> -           FALSE
> -           );
> -}
> -
> -/**
> -  Retrieves a Unicode string that is the user readable name of the controller
> -  that is being managed by an EFI Driver.Currently not implemented.
> -
> -  @param[in]  This             A pointer to the
> EFI_COMPONENT_NAME_PROTOCOL instance.
> -  @param[in]  ControllerHandle 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[in]  ChildHandle      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[in]  Language         A pointer to a three character ISO 639-2
> language
> -                               identifier.  This is the language of the controller name
> -                               that 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.
> -  @param[out]  ControllerName  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 NULL.
> -  @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
> -IScsiComponentNameGetControllerName (
> -  IN  EFI_COMPONENT_NAME_PROTOCOL   *This,
> -  IN  EFI_HANDLE                    ControllerHandle,
> -  IN  EFI_HANDLE                    ChildHandle        OPTIONAL,
> -  IN  CHAR8                         *Language,
> -  OUT CHAR16                        **ControllerName
> -  )
> -{
> -  EFI_STATUS                      Status;
> -
> -  EFI_HANDLE                      IScsiController;
> -  ISCSI_PRIVATE_PROTOCOL          *IScsiIdentifier;
> -
> -  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru;
> -
> -  if (ControllerHandle == NULL) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  //
> -  // Get the handle of the controller we are controling.
> -  //
> -  IScsiController = NetLibGetNicHandle (ControllerHandle,
> &gEfiTcp4ProtocolGuid);
> -  if (IScsiController == NULL) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  Status = gBS->OpenProtocol (
> -                  IScsiController,
> -                  &gEfiCallerIdGuid,
> -                  (VOID **)&IScsiIdentifier,
> -                  NULL,
> -                  NULL,
> -                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  if (ChildHandle != NULL) {
> -    //
> -    // Make sure this driver produced ChildHandle
> -    //
> -    Status = EfiTestChildHandle (
> -               ControllerHandle,
> -               ChildHandle,
> -               &gEfiTcp4ProtocolGuid
> -               );
> -    if (!EFI_ERROR (Status)) {
> -      //
> -      // Retrieve an instance of a produced protocol from ChildHandle
> -      //
> -      Status = gBS->OpenProtocol (
> -                      ChildHandle,
> -                      &gEfiExtScsiPassThruProtocolGuid,
> -                     (VOID **)&IScsiExtScsiPassThru,
> -                      NULL,
> -                      NULL,
> -                      EFI_OPEN_PROTOCOL_GET_PROTOCOL
> -                      );
> -      if (EFI_ERROR (Status)) {
> -        return Status;
> -      }
> -
> -      //
> -      // Update the component name for this child handle.
> -      //
> -      Status = UpdateName (IScsiExtScsiPassThru);
> -      if (EFI_ERROR (Status)) {
> -        return Status;
> -      }
> -    } else {
> -      return Status;
> -    }
> -  }
> -
> -  return LookupUnicodeString2 (
> -           Language,
> -           This->SupportedLanguages,
> -           mIScsiControllerNameTable,
> -           ControllerName,
> -           (BOOLEAN)(This == &gIScsiComponentName)
> -           );
> -}
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> deleted file mode 100644
> index 6307684ff05b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> +++ /dev/null
> @@ -1,430 +0,0 @@
> -/** @file
> -  This file is for Challenge-Handshake Authentication Protocol (CHAP)
> Configuration.
> -
> -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -#include "Md5.h"
> -
> -/**
> -  Initator calculates its own expected hash value.
> -
> -  @param[in]   ChapIdentifier     iSCSI CHAP identifier sent by authenticator.
> -  @param[in]   ChapSecret         iSCSI CHAP secret of the authenticator.
> -  @param[in]   SecretLength       The length of iSCSI CHAP secret.
> -  @param[in]   ChapChallenge      The challenge message sent by
> authenticator.
> -  @param[in]   ChallengeLength    The length of iSCSI CHAP challenge
> message.
> -  @param[out]  ChapResponse       The calculation of the expected hash
> value.
> -
> -  @retval EFI_SUCCESS             The expected hash value was calculatedly
> successfully.
> -  @retval EFI_PROTOCOL_ERROR      The length of the secret should be at
> least the
> -                                  length of the hash value for the hashing algorithm chosen.
> -  @retval Others                  Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPCalculateResponse (
> -  IN  UINT32  ChapIdentifier,
> -  IN  CHAR8   *ChapSecret,
> -  IN  UINT32  SecretLength,
> -  IN  UINT8   *ChapChallenge,
> -  IN  UINT32  ChallengeLength,
> -  OUT UINT8   *ChapResponse
> -  )
> -{
> -  MD5_CTX     Md5Ctx;
> -  CHAR8       IdByte[1];
> -  EFI_STATUS  Status;
> -
> -  Status = MD5Init (&Md5Ctx);
> -
> -  //
> -  // Hash Identifier - Only calculate 1 byte data (RFC1994)
> -  //
> -  IdByte[0] = (CHAR8) ChapIdentifier;
> -  MD5Update (&Md5Ctx, IdByte, 1);
> -
> -  //
> -  // Hash Secret
> -  //
> -  if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  MD5Update (&Md5Ctx, ChapSecret, SecretLength);
> -
> -  //
> -  // Hash Challenge received from Target
> -  //
> -  MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength);
> -
> -  Status = MD5Final (&Md5Ctx, ChapResponse);
> -
> -  return Status;
> -}
> -
> -/**
> -  The initator checks the CHAP response replied by target against its own
> -  calculation of the expected hash value.
> -
> -  @param[in]   AuthData             iSCSI CHAP authentication data.
> -  @param[in]   TargetResponse       The response from target.
> -
> -  @retval EFI_SUCCESS               The response from target passed
> authentication.
> -  @retval EFI_SECURITY_VIOLATION    The response from target was not
> expected value.
> -  @retval Others                    Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPAuthTarget (
> -  IN  ISCSI_CHAP_AUTH_DATA  *AuthData,
> -  IN  UINT8                 *TargetResponse
> -  )
> -{
> -  EFI_STATUS  Status;
> -  UINT32      SecretSize;
> -  UINT8       VerifyRsp[ISCSI_CHAP_RSP_LEN];
> -
> -  Status      = EFI_SUCCESS;
> -
> -  SecretSize  = (UINT32) AsciiStrLen (AuthData-
> >AuthConfig.ReverseCHAPSecret);
> -  Status = IScsiCHAPCalculateResponse (
> -            AuthData->OutIdentifier,
> -            AuthData->AuthConfig.ReverseCHAPSecret,
> -            SecretSize,
> -            AuthData->OutChallenge,
> -            AuthData->OutChallengeLength,
> -            VerifyRsp
> -            );
> -
> -  if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0)
> {
> -    Status = EFI_SECURITY_VIOLATION;
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  This function checks the received iSCSI Login Response during the security
> -  negotiation stage.
> -
> -  @param[in] Conn             The iSCSI connection.
> -
> -  @retval EFI_SUCCESS          The Login Response passed the CHAP validation.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of protocol error happend.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPOnRspReceived (
> -  IN ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  EFI_STATUS                Status;
> -  ISCSI_SESSION             *Session;
> -  ISCSI_CHAP_AUTH_DATA      *AuthData;
> -  CHAR8                     *Value;
> -  UINT8                     *Data;
> -  UINT32                    Len;
> -  LIST_ENTRY                *KeyValueList;
> -  UINTN                     Algorithm;
> -  CHAR8                     *Identifier;
> -  CHAR8                     *Challenge;
> -  CHAR8                     *Name;
> -  CHAR8                     *Response;
> -  UINT8                     TargetRsp[ISCSI_CHAP_RSP_LEN];
> -  UINT32                    RspLen;
> -
> -  ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
> -  ASSERT (Conn->RspQue.BufNum != 0);
> -
> -  Session     = Conn->Session;
> -  AuthData    = &Session->AuthData;
> -
> -  Len         = Conn->RspQue.BufSize;
> -  Data        = AllocatePool (Len);
> -  if (Data == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -  //
> -  // Copy the data in case the data spans over multiple PDUs.
> -  //
> -  NetbufQueCopy (&Conn->RspQue, 0, Len, Data);
> -
> -  //
> -  // Build the key-value list from the data segment of the Login Response.
> -  //
> -  KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len);
> -  if (KeyValueList == NULL) {
> -    FreePool (Data);
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Status = EFI_PROTOCOL_ERROR;
> -
> -  switch (Conn->CHAPStep) {
> -  case ISCSI_CHAP_INITIAL:
> -    //
> -    // The first Login Response.
> -    //
> -    Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
> -    if (Value == NULL) {
> -      goto ON_EXIT;
> -    }
> -
> -    Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn
> (Value);
> -
> -    Value                         = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_AUTH_METHOD);
> -    if (Value == NULL) {
> -      goto ON_EXIT;
> -    }
> -    //
> -    // Initiator mandates CHAP authentication but target replies without
> "CHAP" or
> -    // initiator suggets "None" but target replies with some kind of auth
> method.
> -    //
> -    if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) {
> -      if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
> -        goto ON_EXIT;
> -      }
> -    } else {
> -      if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) {
> -        goto ON_EXIT;
> -      }
> -    }
> -    //
> -    // Transit to CHAP step one.
> -    //
> -    Conn->CHAPStep  = ISCSI_CHAP_STEP_ONE;
> -    Status          = EFI_SUCCESS;
> -    break;
> -
> -  case ISCSI_CHAP_STEP_TWO:
> -    //
> -    // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C>
> -    //
> -    Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_ALGORITHM);
> -    if (Value == NULL) {
> -      goto ON_EXIT;
> -    }
> -
> -    Algorithm = AsciiStrDecimalToUintn (Value);
> -    if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) {
> -      //
> -      // Unsupported algorithm is chosen by target.
> -      //
> -      goto ON_EXIT;
> -    }
> -
> -    Identifier = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_IDENTIFIER);
> -    if (Identifier == NULL) {
> -      goto ON_EXIT;
> -    }
> -
> -    Challenge = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_CHALLENGE);
> -    if (Challenge == NULL) {
> -      goto ON_EXIT;
> -    }
> -    //
> -    // Process the CHAP identifier and CHAP Challenge from Target
> -    // Calculate Response value
> -    //
> -    AuthData->InIdentifier      = (UINT32) AsciiStrDecimalToUintn (Identifier);
> -    AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN;
> -    IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData-
> >InChallengeLength, Challenge);
> -    Status = IScsiCHAPCalculateResponse (
> -              AuthData->InIdentifier,
> -              AuthData->AuthConfig.CHAPSecret,
> -              (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret),
> -              AuthData->InChallenge,
> -              AuthData->InChallengeLength,
> -              AuthData->CHAPResponse
> -              );
> -
> -    //
> -    // Transit to next step.
> -    //
> -    Conn->CHAPStep = ISCSI_CHAP_STEP_THREE;
> -    break;
> -
> -  case ISCSI_CHAP_STEP_THREE:
> -    //
> -    // one way CHAP authentication and the target would like to
> -    // authenticate us.
> -    //
> -    Status = EFI_SUCCESS;
> -    break;
> -
> -  case ISCSI_CHAP_STEP_FOUR:
> -    ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL);
> -    //
> -    // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.
> -    //
> -    Name = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_NAME);
> -    if (Name == NULL) {
> -      goto ON_EXIT;
> -    }
> -
> -    Response = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_RESPONSE);
> -    if (Response == NULL) {
> -      goto ON_EXIT;
> -    }
> -
> -    RspLen = ISCSI_CHAP_RSP_LEN;
> -    IScsiHexToBin (TargetRsp, &RspLen, Response);
> -
> -    //
> -    // Check the CHAP Response replied by Target.
> -    //
> -    Status = IScsiCHAPAuthTarget (AuthData, TargetRsp);
> -    break;
> -
> -  default:
> -    break;
> -  }
> -
> -ON_EXIT:
> -
> -  IScsiFreeKeyValueList (KeyValueList);
> -
> -  FreePool (Data);
> -
> -  return Status;
> -}
> -
> -/**
> -  This function fills the CHAP authentication information into the login PDU
> -  during the security negotiation stage in the iSCSI connection login.
> -
> -  @param[in]       Conn        The iSCSI connection.
> -  @param[in, out]  Pdu         The PDU to send out.
> -
> -  @retval EFI_SUCCESS          All check passed and the phase-related CHAP
> -                               authentication info is filled into the iSCSI PDU.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of protocol error happend.
> -**/
> -EFI_STATUS
> -IScsiCHAPToSendReq (
> -  IN      ISCSI_CONNECTION  *Conn,
> -  IN OUT  NET_BUF           *Pdu
> -  )
> -{
> -  EFI_STATUS                Status;
> -  ISCSI_SESSION             *Session;
> -  ISCSI_LOGIN_REQUEST       *LoginReq;
> -  ISCSI_CHAP_AUTH_DATA      *AuthData;
> -  CHAR8                     *Value;
> -  CHAR8                     ValueStr[256];
> -  CHAR8                     *Response;
> -  UINT32                    RspLen;
> -  CHAR8                     *Challenge;
> -  UINT32                    ChallengeLen;
> -
> -  ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
> -
> -  Session     = Conn->Session;
> -  AuthData    = &Session->AuthData;
> -  LoginReq    = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0);
> -  if (LoginReq == NULL) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -  Status      = EFI_SUCCESS;
> -
> -  RspLen      = 2 * ISCSI_CHAP_RSP_LEN + 3;
> -  Response    = AllocatePool (RspLen);
> -  if (Response == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  ChallengeLen  = 2 * ISCSI_CHAP_RSP_LEN + 3;
> -  Challenge     = AllocatePool (ChallengeLen);
> -  if (Challenge == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  switch (Conn->CHAPStep) {
> -  case ISCSI_CHAP_INITIAL:
> -    //
> -    // It's the initial Login Request. Fill in the key=value pairs mandatory
> -    // for the initial Login Request.
> -    //
> -    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session-
> >InitiatorName);
> -    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal");
> -    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session-
> >ConfigData.NvData.TargetName);
> -
> -    if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
> -      Value = ISCSI_KEY_VALUE_NONE;
> -      ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> -    } else {
> -      Value = ISCSI_AUTH_METHOD_CHAP;
> -    }
> -
> -    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value);
> -
> -    break;
> -
> -  case ISCSI_CHAP_STEP_ONE:
> -    //
> -    // First step, send the Login Request with CHAP_A=<A1,A2...> key-value
> pair.
> -    //
> -    AsciiSPrint (ValueStr, sizeof (ValueStr), "%d",
> ISCSI_CHAP_ALGORITHM_MD5);
> -    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr);
> -
> -    Conn->CHAPStep = ISCSI_CHAP_STEP_TWO;
> -    break;
> -
> -  case ISCSI_CHAP_STEP_THREE:
> -    //
> -    // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or
> -    // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target
> ahtentication is
> -    // required too.
> -    //
> -    // CHAP_N=<N>
> -    //
> -    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *)
> &AuthData->AuthConfig.CHAPName);
> -    //
> -    // CHAP_R=<R>
> -    //
> -    IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse,
> ISCSI_CHAP_RSP_LEN, Response, &RspLen);
> -    IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response);
> -
> -    if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) {
> -      //
> -      // CHAP_I=<I>
> -      //
> -      IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1);
> -      AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier);
> -      IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr);
> -      //
> -      // CHAP_C=<C>
> -      //
> -      IScsiGenRandom ((UINT8 *) AuthData->OutChallenge,
> ISCSI_CHAP_RSP_LEN);
> -      AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN;
> -      IScsiBinToHex ((UINT8 *) AuthData->OutChallenge,
> ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen);
> -      IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge);
> -
> -      Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR;
> -    }
> -    //
> -    // set the stage transition flag.
> -    //
> -    ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> -    break;
> -
> -  default:
> -    Status = EFI_PROTOCOL_ERROR;
> -    break;
> -  }
> -
> -  FreePool (Response);
> -  FreePool (Challenge);
> -
> -  return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> deleted file mode 100644
> index cb1eff1b690c..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> +++ /dev/null
> @@ -1,1264 +0,0 @@
> -/** @file
> -  Helper functions for configuring or getting the parameters relating to iSCSI.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -CHAR16          mVendorStorageName[]     = L"ISCSI_CONFIG_IFR_NVDATA";
> -BOOLEAN         mIScsiDeviceListUpdated  = FALSE;
> -UINTN           mNumberOfIScsiDevices    = 0;
> -ISCSI_FORM_CALLBACK_INFO  *mCallbackInfo = NULL;
> -
> -LIST_ENTRY      mIScsiConfigFormList = {
> -  &mIScsiConfigFormList,
> -  &mIScsiConfigFormList
> -};
> -
> -HII_VENDOR_DEVICE_PATH  mIScsiHiiVendorDevicePath = {
> -  {
> -    {
> -      HARDWARE_DEVICE_PATH,
> -      HW_VENDOR_DP,
> -      {
> -        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
> -        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
> -      }
> -    },
> -    IP4_ISCSI_CONFIG_GUID
> -  },
> -  {
> -    END_DEVICE_PATH_TYPE,
> -    END_ENTIRE_DEVICE_PATH_SUBTYPE,
> -    {
> -      (UINT8) (END_DEVICE_PATH_LENGTH),
> -      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
> -    }
> -  }
> -};
> -
> -/**
> -  Convert the IPv4 address into a dotted string.
> -
> -  @param[in]   Ip   The IPv4 address.
> -  @param[out]  Str  The dotted IP string.
> -**/
> -VOID
> -IScsiIpToStr (
> -  IN  EFI_IPv4_ADDRESS  *Ip,
> -  OUT CHAR16            *Str
> -  )
> -{
> -  UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0],
> Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);
> -}
> -
> -
> -/**
> -  Parse IsId in string format and convert it to binary.
> -
> -  @param[in]        String  The buffer of the string to be parsed.
> -  @param[in, out]   IsId    The buffer to store IsId.
> -
> -  @retval EFI_SUCCESS              The operation finished successfully.
> -  @retval EFI_INVALID_PARAMETER    Any input parameter is invalid.
> -
> -**/
> -EFI_STATUS
> -IScsiParseIsIdFromString (
> -  IN CONST CHAR16                    *String,
> -  IN OUT   UINT8                     *IsId
> -  )
> -{
> -  UINT8                          Index;
> -  CHAR16                         *IsIdStr;
> -  CHAR16                         TempStr[3];
> -  UINTN                          NodeVal;
> -  CHAR16                         PortString[ISCSI_NAME_IFR_MAX_SIZE];
> -  EFI_INPUT_KEY                  Key;
> -
> -  if ((String == NULL) || (IsId == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  IsIdStr = (CHAR16 *) String;
> -
> -  if (StrLen (IsIdStr) != 6) {
> -    UnicodeSPrint (
> -      PortString,
> -      (UINTN) sizeof (PortString),
> -      L"Error! Input is incorrect, please input 6 hex numbers!\n"
> -      );
> -
> -    CreatePopUp (
> -      EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> -      &Key,
> -      PortString,
> -      NULL
> -      );
> -
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  for (Index = 3; Index < 6; Index++) {
> -    CopyMem (TempStr, IsIdStr, sizeof (TempStr));
> -    TempStr[2] = L'\0';
> -
> -    //
> -    // Convert the string to IsId. StrHexToUintn stops at the first character
> -    // that is not a valid hex character, '\0' here.
> -    //
> -    NodeVal = StrHexToUintn (TempStr);
> -
> -    IsId[Index] = (UINT8) NodeVal;
> -
> -    IsIdStr = IsIdStr + 2;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Convert IsId from binary to string format.
> -
> -  @param[out]      String  The buffer to store the converted string.
> -  @param[in]       IsId    The buffer to store IsId.
> -
> -  @retval EFI_SUCCESS              The string converted successfully.
> -  @retval EFI_INVALID_PARAMETER    Any input parameter is invalid.
> -
> -**/
> -EFI_STATUS
> -IScsiConvertIsIdToString (
> -  OUT CHAR16                         *String,
> -  IN  UINT8                          *IsId
> -  )
> -{
> -  UINT8                          Index;
> -  UINTN                          Number;
> -
> -  if ((String == NULL) || (IsId == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  for (Index = 0; Index < 6; Index++) {
> -    if (IsId[Index] <= 0xF) {
> -      Number = UnicodeSPrint (
> -                 String,
> -                 2 * ISID_CONFIGURABLE_STORAGE,
> -                 L"0%X",
> -                 (UINTN) IsId[Index]
> -                 );
> -    } else {
> -      Number = UnicodeSPrint (
> -                 String,
> -                 2 * ISID_CONFIGURABLE_STORAGE,
> -                 L"%X",
> -                 (UINTN) IsId[Index]
> -                 );
> -
> -    }
> -
> -    String = String + Number;
> -  }
> -
> -  *String = L'\0';
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -/**
> -  Update the list of iSCSI devices the iSCSI driver is controlling.
> -
> -  @retval EFI_SUCCESS            The callback successfully handled the action.
> -  @retval Others                 Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateDeviceList (
> -  VOID
> -  )
> -{
> -  EFI_STATUS                  Status;
> -  ISCSI_DEVICE_LIST           *DeviceList;
> -  UINTN                       DataSize;
> -  UINTN                       NumHandles;
> -  EFI_HANDLE                  *Handles;
> -  UINTN                       HandleIndex;
> -  UINTN                       Index;
> -  UINTN                       LastDeviceIndex;
> -  EFI_MAC_ADDRESS             MacAddress;
> -  UINTN                       HwAddressSize;
> -  UINT16                      VlanId;
> -  ISCSI_MAC_INFO              *CurMacInfo;
> -  ISCSI_MAC_INFO              TempMacInfo;
> -  CHAR16                      MacString[70];
> -  UINTN                       DeviceListSize;
> -
> -  //
> -  // Dump all the handles the Managed Network Service Binding Protocol is
> installed on.
> -  //
> -  Status = gBS->LocateHandleBuffer (
> -                  ByProtocol,
> -                  &gEfiManagedNetworkServiceBindingProtocolGuid,
> -                  NULL,
> -                  &NumHandles,
> -                  &Handles
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  DataSize = 0;
> -  Status = gRT->GetVariable (
> -                  L"iSCSIDeviceList",
> -                  &gIp4IScsiConfigGuid,
> -                  NULL,
> -                  &DataSize,
> -                  NULL
> -                  );
> -  if (Status == EFI_BUFFER_TOO_SMALL) {
> -    DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize);
> -    ASSERT (DeviceList != NULL);
> -
> -    gRT->GetVariable (
> -          L"iSCSIDeviceList",
> -          &gIp4IScsiConfigGuid,
> -          NULL,
> -          &DataSize,
> -          DeviceList
> -          );
> -
> -    LastDeviceIndex = 0;
> -
> -    for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) {
> -      Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress,
> &HwAddressSize);
> -      ASSERT (Status == EFI_SUCCESS);
> -      VlanId = NetLibGetVlanId (Handles[HandleIndex]);
> -
> -      for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
> -        CurMacInfo = &DeviceList->MacInfo[Index];
> -        if ((CurMacInfo->Len == HwAddressSize) &&
> -            (CurMacInfo->VlanId == VlanId) &&
> -            (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr,
> HwAddressSize))
> -            ) {
> -          //
> -          // The previous configured NIC is still here.
> -          //
> -          if (Index != LastDeviceIndex) {
> -            //
> -            // Swap the current MAC address entry with the one indexed by
> -            // LastDeviceIndex.
> -            //
> -            CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO));
> -            CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex],
> sizeof (ISCSI_MAC_INFO));
> -            CopyMem (&DeviceList->MacInfo[LastDeviceIndex], &TempMacInfo,
> sizeof (ISCSI_MAC_INFO));
> -          }
> -
> -          LastDeviceIndex++;
> -        }
> -      }
> -
> -      if (LastDeviceIndex == DeviceList->NumDevice) {
> -        break;
> -      }
> -    }
> -
> -    for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
> -      //
> -      // delete the variables
> -      //
> -      CurMacInfo = &DeviceList->MacInfo[Index];
> -      IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo-
> >VlanId, MacString);
> -      gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0,
> NULL);
> -      gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL);
> -    }
> -
> -    FreePool (DeviceList);
> -  } else if (Status != EFI_NOT_FOUND) {
> -    FreePool (Handles);
> -    return Status;
> -  }
> -  //
> -  // Construct the new iSCSI device list.
> -  //
> -  DeviceListSize        = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof
> (ISCSI_MAC_INFO);
> -  DeviceList            = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize);
> -  ASSERT (DeviceList != NULL);
> -  DeviceList->NumDevice = (UINT8) NumHandles;
> -
> -  for (Index = 0; Index < NumHandles; Index++) {
> -    NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize);
> -
> -    CurMacInfo  = &DeviceList->MacInfo[Index];
> -    CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize);
> -    CurMacInfo->Len = (UINT8) HwAddressSize;
> -    CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]);
> -  }
> -
> -  gRT->SetVariable (
> -        L"iSCSIDeviceList",
> -        &gIp4IScsiConfigGuid,
> -        ISCSI_CONFIG_VAR_ATTR,
> -        DeviceListSize,
> -        DeviceList
> -        );
> -
> -  FreePool (DeviceList);
> -  FreePool (Handles);
> -
> -  return Status;
> -}
> -
> -/**
> -  Get the iSCSI configuration form entry by the index of the goto opcode
> actived.
> -
> -  @param[in]  Index The 0-based index of the goto opcode actived.
> -
> -  @return The iSCSI configuration form entry found.
> -**/
> -ISCSI_CONFIG_FORM_ENTRY *
> -IScsiGetConfigFormEntryByIndex (
> -  IN UINT32 Index
> -  )
> -{
> -  UINT32                  CurrentIndex;
> -  LIST_ENTRY              *Entry;
> -  ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> -
> -  CurrentIndex    = 0;
> -  ConfigFormEntry = NULL;
> -
> -  NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> -    if (CurrentIndex == Index) {
> -      ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> -      break;
> -    }
> -
> -    CurrentIndex++;
> -  }
> -
> -  return ConfigFormEntry;
> -}
> -
> -/**
> -  Convert the iSCSI configuration data into the IFR data.
> -
> -  @param[in]   ConfigFormEntry The iSCSI configuration form entry.
> -  @param[out]  IfrNvData       The IFR nv data.
> -
> -**/
> -VOID
> -IScsiConvertDeviceConfigDataToIfrNvData (
> -  IN ISCSI_CONFIG_FORM_ENTRY      *ConfigFormEntry,
> -  OUT ISCSI_CONFIG_IFR_NVDATA     *IfrNvData
> -  )
> -{
> -  ISCSI_SESSION_CONFIG_NVDATA   *SessionConfigData;
> -  ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData;
> -
> -  //
> -  // Normal session configuration parameters.
> -  //
> -  SessionConfigData                 = &ConfigFormEntry->SessionConfigData;
> -  IfrNvData->Enabled                = SessionConfigData->Enabled;
> -
> -  IfrNvData->InitiatorInfoFromDhcp  = SessionConfigData-
> >InitiatorInfoFromDhcp;
> -  IfrNvData->TargetInfoFromDhcp     = SessionConfigData-
> >TargetInfoFromDhcp;
> -  IfrNvData->TargetPort             = SessionConfigData->TargetPort;
> -
> -  IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp);
> -  IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask);
> -  IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway);
> -  IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp);
> -
> -  IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData-
> >TargetName);
> -
> -  IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun);
> -
> -  IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId);
> -
> -  //
> -  // CHAP authentication parameters.
> -  //
> -  AuthConfigData      = &ConfigFormEntry->AuthConfigData;
> -
> -  IfrNvData->CHAPType = AuthConfigData->CHAPType;
> -
> -  IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData-
> >CHAPName);
> -  IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData-
> >CHAPSecret);
> -  IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName,
> IfrNvData->ReverseCHAPName);
> -  IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret,
> IfrNvData->ReverseCHAPSecret);
> -}
> -
> -/**
> -  This function allows the caller to request the current
> -  configuration for one or more named elements. The resulting
> -  string is in <ConfigAltResp> format. Any and all alternative
> -  configuration strings shall also be appended to the end of the
> -  current configuration string. If they are, they must appear
> -  after the current configuration. They must contain the same
> -  routing (GUID, NAME, PATH) as the current configuration string.
> -  They must have an additional description indicating the type of
> -  alternative configuration the string represents,
> -  "ALTCFG=<StringToken>". That <StringToken> (when
> -  converted from Hex UNICODE to binary) is a reference to a
> -  string in the associated string pack.
> -
> -  @param[in] This       Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> -  @param[in] Request    A null-terminated Unicode string in
> -                        <ConfigRequest> format. Note that this
> -                        includes the routing information as well as
> -                        the configurable name / value pairs. It is
> -                        invalid for this string to be in
> -                        <MultiConfigRequest> format.
> -  @param[out] Progress  On return, points to a character in the
> -                        Request string. Points to the string's null
> -                        terminator if request was successful. Points
> -                        to the most recent "&" before the first
> -                        failing name / value pair (or the beginning
> -                        of the string if the failure is in the first
> -                        name / value pair) if the request was not
> -                        successful.
> -  @param[out] Results   A null-terminated Unicode string in
> -                        <ConfigAltResp> format which has all values
> -                        filled in for the names in the Request string.
> -                        String to be allocated by the called function.
> -
> -  @retval EFI_SUCCESS             The Results string is filled with the
> -                                  values corresponding to all requested
> -                                  names.
> -  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the
> -                                  parts of the results that must be
> -                                  stored awaiting possible future
> -                                  protocols.
> -  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL
> -                                  for the Request parameter
> -                                  would result in this type of
> -                                  error. In this case, the
> -                                  Progress parameter would be
> -                                  set to NULL.
> -  @retval EFI_NOT_FOUND           Routing data doesn't match any
> -                                  known driver. Progress set to the
> -                                  first character in the routing header.
> -                                  Note: There is no requirement that the
> -                                  driver validate the routing data. It
> -                                  must skip the <ConfigHdr> in order to
> -                                  process the names.
> -  @retval EFI_INVALID_PARAMETER   Illegal syntax. Progress set
> -                                  to most recent & before the
> -                                  error or the beginning of the
> -                                  string.
> -  @retval EFI_INVALID_PARAMETER   Unknown name. Progress points
> -                                  to the & before the name in
> -                                  question.Currently not implemented.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormExtractConfig (
> -  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> -  IN  CONST EFI_STRING                       Request,
> -  OUT EFI_STRING                             *Progress,
> -  OUT EFI_STRING                             *Results
> -  )
> -{
> -  EFI_STATUS                       Status;
> -  CHAR8                            InitiatorName[ISCSI_NAME_MAX_SIZE];
> -  UINTN                            BufferSize;
> -  ISCSI_CONFIG_IFR_NVDATA          *IfrNvData;
> -  ISCSI_FORM_CALLBACK_INFO         *Private;
> -  EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;
> -  EFI_STRING                       ConfigRequestHdr;
> -  EFI_STRING                       ConfigRequest;
> -  BOOLEAN                          AllocatedRequest;
> -  UINTN                            Size;
> -
> -  if (Progress == NULL || Results == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  *Progress = Request;
> -  if ((Request != NULL) && !HiiIsConfigHdrMatch (Request,
> &gIp4IScsiConfigGuid, mVendorStorageName)) {
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  ConfigRequestHdr = NULL;
> -  ConfigRequest    = NULL;
> -  AllocatedRequest = FALSE;
> -  Size             = 0;
> -
> -  if (!mIScsiDeviceListUpdated) {
> -    //
> -    // Update the device list.
> -    //
> -    IScsiUpdateDeviceList ();
> -    mIScsiDeviceListUpdated = TRUE;
> -  }
> -
> -  Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
> -  IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
> -  ASSERT (IfrNvData != NULL);
> -  if (Private->Current != NULL) {
> -    IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData);
> -  }
> -
> -  BufferSize  = ISCSI_NAME_MAX_SIZE;
> -  Status      = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize,
> InitiatorName);
> -  if (EFI_ERROR (Status)) {
> -    IfrNvData->InitiatorName[0] = L'\0';
> -  } else {
> -    IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName);
> -  }
> -
> -  //
> -  // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
> -  //
> -  HiiConfigRouting = Private->ConfigRouting;
> -  BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);
> -  ConfigRequest = Request;
> -  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
> -    //
> -    // Request has no request element, construct full request string.
> -    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
> -    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW"
> followed by a Null-terminator
> -    //
> -    ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid,
> mVendorStorageName, Private->DriverHandle);
> -    Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
> -    ConfigRequest = AllocateZeroPool (Size);
> -    ASSERT (ConfigRequest != NULL);
> -    AllocatedRequest = TRUE;
> -    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX",
> ConfigRequestHdr, (UINT64)BufferSize);
> -    FreePool (ConfigRequestHdr);
> -  }
> -  Status = HiiConfigRouting->BlockToConfig (
> -                               HiiConfigRouting,
> -                               ConfigRequest,
> -                               (UINT8 *) IfrNvData,
> -                               BufferSize,
> -                               Results,
> -                               Progress
> -                               );
> -  FreePool (IfrNvData);
> -  //
> -  // Free the allocated config request string.
> -  //
> -  if (AllocatedRequest) {
> -    FreePool (ConfigRequest);
> -    ConfigRequest = NULL;
> -  }
> -
> -  //
> -  // Set Progress string to the original request string.
> -  //
> -  if (Request == NULL) {
> -    *Progress = NULL;
> -  } else if (StrStr (Request, L"OFFSET") == NULL) {
> -    *Progress = Request + StrLen (Request);
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  This function applies changes in a driver's configuration.
> -  Input is a Configuration, which has the routing data for this
> -  driver followed by name / value configuration pairs. The driver
> -  must apply those pairs to its configurable storage. If the
> -  driver's configuration is stored in a linear block of data
> -  and the driver's name / value pairs are in <BlockConfig>
> -  format, it may use the ConfigToBlock helper function (above) to
> -  simplify the job. Currently not implemented.
> -
> -  @param[in]  This           Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> -  @param[in]  Configuration  A null-terminated Unicode string in
> -                             <ConfigString> format.
> -  @param[out] Progress       A pointer to a string filled in with the
> -                             offset of the most recent '&' before the
> -                             first failing name / value pair (or the
> -                             beginn ing of the string if the failure
> -                             is in the first name / value pair) or
> -                             the terminating NULL if all was
> -                             successful.
> -
> -  @retval EFI_SUCCESS             The results have been distributed or are
> -                                  awaiting distribution.
> -  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the
> -                                  parts of the results that must be
> -                                  stored awaiting possible future
> -                                  protocols.
> -  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the
> -                                  Results parameter would result
> -                                  in this type of error.
> -  @retval EFI_NOT_FOUND           Target for the specified routing data
> -                                  was not found.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormRouteConfig (
> -  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> -  IN  CONST EFI_STRING                       Configuration,
> -  OUT EFI_STRING                             *Progress
> -  )
> -{
> -  if (Configuration == NULL || Progress == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  //
> -  // Check routing data in <ConfigHdr>.
> -  // Note: if only one Storage is used, then this checking could be skipped.
> -  //
> -  if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid,
> mVendorStorageName)) {
> -    *Progress = Configuration;
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  *Progress = Configuration + StrLen (Configuration);
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  This function is called to provide results data to the driver.
> -  This data consists of a unique key that is used to identify
> -  which data is either being passed back or being asked for.
> -
> -  @param[in]  This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> -  @param[in]  Action             Specifies the type of action taken by the browser.
> -  @param[in]  QuestionId         A unique value which is sent to the original
> -                                 exporting driver so that it can identify the type
> -                                 of data to expect. The format of the data tends to
> -                                 vary based on the opcode that enerated the callback.
> -  @param[in]  Type               The type of value for the question.
> -  @param[in]  Value              A pointer to the data being sent to the original
> -                                 exporting driver.
> -  @param[out]  ActionRequest     On return, points to the action requested
> by the
> -                                 callback function.
> -
> -  @retval EFI_SUCCESS            The callback successfully handled the action.
> -  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold
> the
> -                                 variable and its data.
> -  @retval EFI_DEVICE_ERROR       The variable could not be saved.
> -  @retval EFI_UNSUPPORTED        The specified Action is not supported by
> the
> -                                 callback.Currently not implemented.
> -  @retval EFI_INVALID_PARAMETERS Passing in wrong parameter.
> -  @retval Others                 Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormCallback (
> -  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> -  IN  EFI_BROWSER_ACTION                     Action,
> -  IN  EFI_QUESTION_ID                        QuestionId,
> -  IN  UINT8                                  Type,
> -  IN  EFI_IFR_TYPE_VALUE                     *Value,
> -  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
> -  )
> -{
> -  ISCSI_FORM_CALLBACK_INFO  *Private;
> -  UINTN                     BufferSize;
> -  CHAR8                     IScsiName[ISCSI_NAME_MAX_SIZE];
> -  CHAR16                    PortString[128];
> -  CHAR8                     Ip4String[IP4_STR_MAX_SIZE];
> -  CHAR8                     LunString[ISCSI_LUN_STR_MAX_LEN];
> -  UINT64                    Lun;
> -  EFI_STRING_ID             DeviceFormTitleToken;
> -  ISCSI_CONFIG_IFR_NVDATA   *IfrNvData;
> -  ISCSI_CONFIG_FORM_ENTRY   *ConfigFormEntry;
> -  EFI_IP_ADDRESS            HostIp;
> -  EFI_IP_ADDRESS            SubnetMask;
> -  EFI_IP_ADDRESS            Gateway;
> -  EFI_STATUS                Status;
> -  EFI_INPUT_KEY             Key;
> -
> -  if (Action != EFI_BROWSER_ACTION_CHANGING && Action !=
> EFI_BROWSER_ACTION_CHANGED) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  Private   = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
> -  //
> -  // Retrieve uncommitted data from Browser
> -  //
> -  IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
> -  ASSERT (IfrNvData != NULL);
> -  if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName,
> sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) {
> -    FreePool (IfrNvData);
> -    return EFI_NOT_FOUND;
> -  }
> -  Status = EFI_SUCCESS;
> -
> -  if (Action == EFI_BROWSER_ACTION_CHANGING) {
> -    if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId <
> (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) {
> -      //
> -      // In case goto the device configuration form, update the device form
> title.
> -      //
> -      ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32)
> (QuestionId - KEY_DEVICE_ENTRY_BASE));
> -      ASSERT (ConfigFormEntry != NULL);
> -
> -      UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s",
> ConfigFormEntry->MacString);
> -      DeviceFormTitleToken = (EFI_STRING_ID)
> STR_ISCSI_DEVICE_FORM_TITLE;
> -      HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken,
> PortString, NULL);
> -
> -      IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);
> -
> -      Private->Current = ConfigFormEntry;
> -    }
> -  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
> -    switch (QuestionId) {
> -    case KEY_INITIATOR_NAME:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName);
> -      BufferSize  = AsciiStrSize (IScsiName);
> -
> -      Status      = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize,
> IScsiName);
> -      if (EFI_ERROR (Status)) {
> -        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid iSCSI Name!", NULL);
> -      }
> -
> -      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
> -      break;
> -
> -    case KEY_LOCAL_IP:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);
> -      Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
> -      if (EFI_ERROR (Status) ||
> -          ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
> -           !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private-
> >Current->SessionConfigData.SubnetMask.Addr)))) {
> -        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid IP address!", NULL);
> -        Status = EFI_INVALID_PARAMETER;
> -      } else {
> -        CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4,
> sizeof (HostIp.v4));
> -      }
> -
> -      break;
> -
> -    case KEY_SUBNET_MASK:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);
> -      Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);
> -      if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) &&
> (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
> -        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid Subnet Mask!", NULL);
> -        Status = EFI_INVALID_PARAMETER;
> -      } else {
> -        CopyMem (&Private->Current->SessionConfigData.SubnetMask,
> &SubnetMask.v4, sizeof (SubnetMask.v4));
> -      }
> -
> -      break;
> -
> -    case KEY_GATE_WAY:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
> -      Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
> -      if (EFI_ERROR (Status) ||
> -          ((Gateway.Addr[0] != 0) &&
> -           (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
> -           !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]),
> NTOHL(*(UINT32*)Private->Current-
> >SessionConfigData.SubnetMask.Addr)))) {
> -        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid Gateway!", NULL);
> -        Status = EFI_INVALID_PARAMETER;
> -      } else {
> -        CopyMem (&Private->Current->SessionConfigData.Gateway,
> &Gateway.v4, sizeof (Gateway.v4));
> -      }
> -
> -      break;
> -
> -    case KEY_TARGET_IP:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
> -      Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
> -      if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST
> (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) {
> -        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid IP address!", NULL);
> -        Status = EFI_INVALID_PARAMETER;
> -      } else {
> -        CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4,
> sizeof (HostIp.v4));
> -      }
> -
> -      break;
> -
> -    case KEY_TARGET_NAME:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);
> -      Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));
> -      if (EFI_ERROR (Status)) {
> -        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid iSCSI Name!", NULL);
> -      } else {
> -        AsciiStrCpyS (Private->Current->SessionConfigData.TargetName,
> ISCSI_NAME_MAX_SIZE, IScsiName);
> -      }
> -
> -      break;
> -
> -    case KEY_DHCP_ENABLE:
> -      if (IfrNvData->InitiatorInfoFromDhcp == 0) {
> -        IfrNvData->TargetInfoFromDhcp = 0;
> -      }
> -
> -      break;
> -
> -    case KEY_BOOT_LUN:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);
> -      Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);
> -      if (EFI_ERROR (Status)) {
> -        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid LUN string!", NULL);
> -      } else {
> -        CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof
> (Lun));
> -      }
> -
> -      break;
> -
> -    case KEY_CHAP_NAME:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current-
> >AuthConfigData.CHAPName);
> -      break;
> -
> -    case KEY_CHAP_SECRET:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private->Current-
> >AuthConfigData.CHAPSecret);
> -      break;
> -
> -    case KEY_REVERSE_CHAP_NAME:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private-
> >Current->AuthConfigData.ReverseCHAPName);
> -      break;
> -
> -    case KEY_REVERSE_CHAP_SECRET:
> -      IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private-
> >Current->AuthConfigData.ReverseCHAPSecret);
> -      break;
> -
> -    case KEY_CONFIG_ISID:
> -      IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current-
> >SessionConfigData.IsId);
> -      IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current-
> >SessionConfigData.IsId);
> -
> -      break;
> -
> -    case KEY_SAVE_CHANGES:
> -      //
> -      // First, update those fields which don't have INTERACTIVE set.
> -      //
> -      Private->Current->SessionConfigData.Enabled               = IfrNvData-
> >Enabled;
> -      Private->Current->SessionConfigData.InitiatorInfoFromDhcp = IfrNvData-
> >InitiatorInfoFromDhcp;
> -      Private->Current->SessionConfigData.TargetPort            = IfrNvData-
> >TargetPort;
> -      if (Private->Current->SessionConfigData.TargetPort == 0) {
> -        Private->Current->SessionConfigData.TargetPort =
> ISCSI_WELL_KNOWN_PORT;
> -      }
> -
> -      Private->Current->SessionConfigData.TargetInfoFromDhcp  = IfrNvData-
> >TargetInfoFromDhcp;
> -      Private->Current->AuthConfigData.CHAPType               = IfrNvData-
> >CHAPType;
> -
> -      //
> -      // Only do full parameter validation if iSCSI is enabled on this device.
> -      //
> -      if (Private->Current->SessionConfigData.Enabled) {
> -        //
> -        // Validate the address configuration of the Initiator if DHCP isn't
> -        // deployed.
> -        //
> -        if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) {
> -          CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.LocalIp,
> sizeof (HostIp.v4));
> -          CopyMem (&SubnetMask.v4, &Private->Current-
> >SessionConfigData.SubnetMask, sizeof (SubnetMask.v4));
> -          CopyMem (&Gateway.v4, &Private->Current-
> >SessionConfigData.Gateway, sizeof (Gateway.v4));
> -
> -          if ((Gateway.Addr[0] != 0)) {
> -            if (SubnetMask.Addr[0] == 0) {
> -              CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Gateway address is set but subnet mask is zero.", NULL);
> -              Status = EFI_INVALID_PARAMETER;
> -              break;
> -            } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0],
> SubnetMask.Addr[0])) {
> -              CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Local IP and Gateway are not in the same subnet.", NULL);
> -              Status = EFI_INVALID_PARAMETER;
> -              break;
> -            }
> -          }
> -        }
> -        //
> -        // Validate target configuration if DHCP isn't deployed.
> -        //
> -        if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
> -          CopyMem (&HostIp.v4, &Private->Current-
> >SessionConfigData.TargetIp, sizeof (HostIp.v4));
> -          if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) ||
> IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) {
> -            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Target IP is invalid!", NULL);
> -            Status = EFI_INVALID_PARAMETER;
> -            break;
> -          }
> -
> -          //
> -          // Validate iSCSI target name configuration again:
> -          // The format of iSCSI target name is already verified when user input
> the name;
> -          // here we only check the case user does not input the name.
> -          //
> -          if (Private->Current->SessionConfigData.TargetName[0] == '\0') {
> -            CreatePopUp (
> -              EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> -              &Key,
> -              L"iSCSI target name is NULL!",
> -              NULL
> -              );
> -            Status = EFI_INVALID_PARAMETER;
> -            break;
> -          }
> -
> -        }
> -
> -        if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {
> -          if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] ==
> '\0')) {
> -            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"CHAP Name or CHAP Secret is invalid!", NULL);
> -            Status = EFI_INVALID_PARAMETER;
> -            break;
> -          }
> -
> -          if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&
> -              ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData-
> >ReverseCHAPSecret[0] == '\0'))
> -              ) {
> -            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);
> -            Status = EFI_INVALID_PARAMETER;
> -            break;
> -          }
> -        }
> -      }
> -
> -      BufferSize = sizeof (Private->Current->SessionConfigData);
> -      gRT->SetVariable (
> -            Private->Current->MacString,
> -            &gEfiIScsiInitiatorNameProtocolGuid,
> -            ISCSI_CONFIG_VAR_ATTR,
> -            BufferSize,
> -            &Private->Current->SessionConfigData
> -            );
> -
> -      BufferSize = sizeof (Private->Current->AuthConfigData);
> -      gRT->SetVariable (
> -            Private->Current->MacString,
> -            &gIScsiCHAPAuthInfoGuid,
> -            ISCSI_CONFIG_VAR_ATTR,
> -            BufferSize,
> -            &Private->Current->AuthConfigData
> -            );
> -      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
> -      break;
> -
> -    default:
> -      break;
> -    }
> -  }
> -
> -  if (!EFI_ERROR (Status)) {
> -    //
> -    // Pass changed uncommitted data back to Form Browser
> -    //
> -    HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof
> (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);
> -  }
> -
> -  FreePool (IfrNvData);
> -
> -  return Status;
> -}
> -
> -/**
> -  Updates the iSCSI configuration form to add/delete an entry for the iSCSI
> -  device specified by the Controller.
> -
> -  @param[in]  DriverBindingHandle The driverbinding handle.
> -  @param[in]  Controller          The controller handle of the iSCSI device.
> -  @param[in]  AddForm             Whether to add or delete a form entry.
> -
> -  @retval EFI_SUCCESS             The iSCSI configuration form is updated.
> -  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> -  @retval Others                  Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigUpdateForm (
> -  IN EFI_HANDLE  DriverBindingHandle,
> -  IN EFI_HANDLE  Controller,
> -  IN BOOLEAN     AddForm
> -  )
> -{
> -  LIST_ENTRY                  *Entry;
> -  ISCSI_CONFIG_FORM_ENTRY     *ConfigFormEntry;
> -  BOOLEAN                     EntryExisted;
> -  EFI_STATUS                  Status;
> -  EFI_MAC_ADDRESS             MacAddress;
> -  UINTN                       HwAddressSize;
> -  UINT16                      VlanId;
> -  CHAR16                      PortString[128];
> -  UINT16                      FormIndex;
> -  UINTN                       BufferSize;
> -  VOID                        *StartOpCodeHandle;
> -  VOID                        *EndOpCodeHandle;
> -  EFI_IFR_GUID_LABEL          *StartLabel;
> -  EFI_IFR_GUID_LABEL          *EndLabel;
> -
> -  ConfigFormEntry = NULL;
> -  EntryExisted    = FALSE;
> -
> -  NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> -    ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> -
> -    if (ConfigFormEntry->Controller == Controller) {
> -      EntryExisted = TRUE;
> -      break;
> -    }
> -  }
> -
> -  if (AddForm) {
> -    if (EntryExisted) {
> -      return EFI_SUCCESS;
> -    } else {
> -      //
> -      // Add a new form.
> -      //
> -      ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool
> (sizeof (ISCSI_CONFIG_FORM_ENTRY));
> -      if (ConfigFormEntry == NULL) {
> -        return EFI_OUT_OF_RESOURCES;
> -      }
> -
> -      InitializeListHead (&ConfigFormEntry->Link);
> -      ConfigFormEntry->Controller = Controller;
> -
> -      //
> -      // Get the MAC address and convert it into the formatted string.
> -      //
> -      Status = NetLibGetMacAddress (Controller, &MacAddress,
> &HwAddressSize);
> -      ASSERT (Status == EFI_SUCCESS);
> -      VlanId = NetLibGetVlanId (Controller);
> -
> -      IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> ConfigFormEntry->MacString);
> -
> -      //
> -      // Get the normal session configuration data.
> -      //
> -      BufferSize = sizeof (ConfigFormEntry->SessionConfigData);
> -      Status = gRT->GetVariable (
> -                      ConfigFormEntry->MacString,
> -                      &gEfiIScsiInitiatorNameProtocolGuid,
> -                      NULL,
> -                      &BufferSize,
> -                      &ConfigFormEntry->SessionConfigData
> -                      );
> -      if (EFI_ERROR (Status)) {
> -        ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof
> (ConfigFormEntry->SessionConfigData));
> -
> -        //
> -        // Generate OUI-format ISID based on MAC address.
> -        //
> -        CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, 6);
> -        ConfigFormEntry->SessionConfigData.IsId[0] =
> -          (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F);
> -      }
> -      //
> -      // Get the CHAP authentication configuration data.
> -      //
> -      BufferSize = sizeof (ConfigFormEntry->AuthConfigData);
> -      Status = gRT->GetVariable (
> -                      ConfigFormEntry->MacString,
> -                      &gIScsiCHAPAuthInfoGuid,
> -                      NULL,
> -                      &BufferSize,
> -                      &ConfigFormEntry->AuthConfigData
> -                      );
> -      if (EFI_ERROR (Status)) {
> -        ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof
> (ConfigFormEntry->AuthConfigData));
> -      }
> -      //
> -      // Compose the Port string and create a new EFI_STRING_ID.
> -      //
> -      UnicodeSPrint (PortString, sizeof (PortString), L"Port %s",
> ConfigFormEntry->MacString);
> -      ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo-
> >RegisteredHandle, 0, PortString, NULL);
> -
> -      //
> -      // Compose the help string of this port and create a new EFI_STRING_ID.
> -      //
> -      UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters
> on port %s", ConfigFormEntry->MacString);
> -      ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo-
> >RegisteredHandle, 0, PortString, NULL);
> -
> -      InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link);
> -      mNumberOfIScsiDevices++;
> -    }
> -  } else {
> -    ASSERT (EntryExisted);
> -
> -    mNumberOfIScsiDevices--;
> -    RemoveEntryList (&ConfigFormEntry->Link);
> -    FreePool (ConfigFormEntry);
> -    mCallbackInfo->Current = NULL;
> -  }
> -  //
> -  // Allocate space for creation of Buffer
> -  //
> -
> -  //
> -  // Init OpCode Handle
> -  //
> -  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
> -  ASSERT (StartOpCodeHandle != NULL);
> -
> -  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
> -  ASSERT (EndOpCodeHandle != NULL);
> -
> -  //
> -  // Create Hii Extend Label OpCode as the start opcode
> -  //
> -  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode
> (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof
> (EFI_IFR_GUID_LABEL));
> -  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
> -  StartLabel->Number       = DEVICE_ENTRY_LABEL;
> -
> -  //
> -  // Create Hii Extend Label OpCode as the end opcode
> -  //
> -  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode
> (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
> -  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
> -  EndLabel->Number       = LABEL_END;
> -
> -  FormIndex = 0;
> -  NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> -    ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> -
> -    HiiCreateGotoOpCode (
> -      StartOpCodeHandle,                            // Container for dynamic created
> opcodes
> -      FORMID_DEVICE_FORM,                           // Target Form ID
> -      ConfigFormEntry->PortTitleToken,              // Prompt text
> -      ConfigFormEntry->PortTitleHelpToken,          // Help text
> -      EFI_IFR_FLAG_CALLBACK,                        // Question flag
> -      (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex)   // Question ID
> -      );
> -
> -    FormIndex++;
> -  }
> -
> -  HiiUpdateForm (
> -    mCallbackInfo->RegisteredHandle,
> -    &gIp4IScsiConfigGuid,
> -    FORMID_MAIN_FORM,
> -    StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL
> -    EndOpCodeHandle    // LABEL_END
> -    );
> -
> -  HiiFreeOpCodeHandle (StartOpCodeHandle);
> -  HiiFreeOpCodeHandle (EndOpCodeHandle);
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Initialize the iSCSI configuration form.
> -
> -  @param[in]  DriverBindingHandle  The iSCSI driverbinding handle.
> -
> -  @retval EFI_SUCCESS              The iSCSI configuration form is initialized.
> -  @retval EFI_OUT_OF_RESOURCES     Failed to allocate memory.
> -  @retval Others                   Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigFormInit (
> -  VOID
> -  )
> -{
> -  EFI_STATUS                  Status;
> -  EFI_HII_DATABASE_PROTOCOL   *HiiDatabase;
> -  ISCSI_FORM_CALLBACK_INFO    *CallbackInfo;
> -
> -  Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID
> **)&HiiDatabase);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof
> (ISCSI_FORM_CALLBACK_INFO));
> -  if (CallbackInfo == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  CallbackInfo->Signature   = ISCSI_FORM_CALLBACK_INFO_SIGNATURE;
> -  CallbackInfo->HiiDatabase = HiiDatabase;
> -  CallbackInfo->Current     = NULL;
> -
> -  CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig;
> -  CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig;
> -  CallbackInfo->ConfigAccess.Callback = IScsiFormCallback;
> -
> -  Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL,
> (VOID **)&CallbackInfo->ConfigRouting);
> -  if (EFI_ERROR (Status)) {
> -    FreePool(CallbackInfo);
> -    return Status;
> -  }
> -
> -  //
> -  // Install Device Path Protocol and Config Access protocol to driver handle
> -  //
> -  Status = gBS->InstallMultipleProtocolInterfaces (
> -                  &CallbackInfo->DriverHandle,
> -                  &gEfiDevicePathProtocolGuid,
> -                  &mIScsiHiiVendorDevicePath,
> -                  &gEfiHiiConfigAccessProtocolGuid,
> -                  &CallbackInfo->ConfigAccess,
> -                  NULL
> -                  );
> -  ASSERT_EFI_ERROR (Status);
> -
> -  //
> -  // Publish our HII data
> -  //
> -  CallbackInfo->RegisteredHandle = HiiAddPackages (
> -                                     &gIp4IScsiConfigGuid,
> -                                     CallbackInfo->DriverHandle,
> -                                     IScsi4DxeStrings,
> -                                     IScsiConfigDxeBin,
> -                                     NULL
> -                                     );
> -  if (CallbackInfo->RegisteredHandle == NULL) {
> -    FreePool(CallbackInfo);
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  mCallbackInfo = CallbackInfo;
> -
> -  return Status;
> -}
> -
> -/**
> -  Unload the iSCSI configuration form, this includes: delete all the iSCSI
> -  device configuration entries, uninstall the form callback protocol and
> -  free the resources used.
> -
> -  @param[in]  DriverBindingHandle The iSCSI driverbinding handle.
> -
> -  @retval EFI_SUCCESS             The iSCSI configuration form is unloaded.
> -  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiConfigFormUnload (
> -  IN EFI_HANDLE  DriverBindingHandle
> -  )
> -{
> -  ISCSI_CONFIG_FORM_ENTRY     *ConfigFormEntry;
> -
> -  while (!IsListEmpty (&mIScsiConfigFormList)) {
> -    //
> -    // Uninstall the device forms as the iSCSI driver instance may fail to
> -    // control the controller but still install the device configuration form.
> -    // In such case, upon driver unloading, the driver instance's driverbinding.
> -    // stop () won't be called, so we have to take this chance here to uninstall
> -    // the device form.
> -    //
> -    ConfigFormEntry = NET_LIST_USER_STRUCT
> (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link);
> -    IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry-
> >Controller, FALSE);
> -  }
> -
> -  //
> -  // Remove HII package list
> -  //
> -  mCallbackInfo->HiiDatabase->RemovePackageList (
> -                                mCallbackInfo->HiiDatabase,
> -                                mCallbackInfo->RegisteredHandle
> -                                );
> -
> -  //
> -  // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL
> -  //
> -  gBS->UninstallMultipleProtocolInterfaces (
> -         mCallbackInfo->DriverHandle,
> -         &gEfiDevicePathProtocolGuid,
> -         &mIScsiHiiVendorDevicePath,
> -         &gEfiHiiConfigAccessProtocolGuid,
> -         &mCallbackInfo->ConfigAccess,
> -         NULL
> -         );
> -  FreePool (mCallbackInfo);
> -
> -  return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> deleted file mode 100644
> index 6a876c8b69dd..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> +++ /dev/null
> @@ -1,472 +0,0 @@
> -/** @file
> -  iSCSI DHCP related configuration routines.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> -  Extract the Root Path option and get the required target information.
> -
> -  @param[in]        RootPath         The RootPath.
> -  @param[in]        Length           Length of the RootPath option payload.
> -  @param[in, out]   ConfigNvData     The iSCSI session configuration data read
> from nonvolatile device.
> -
> -  @retval EFI_SUCCESS           All required information is extracted from the
> RootPath option.
> -  @retval EFI_NOT_FOUND         The RootPath is not an iSCSI RootPath.
> -  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
> -  @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted.
> -**/
> -EFI_STATUS
> -IScsiDhcpExtractRootPath (
> -  IN      CHAR8                        *RootPath,
> -  IN      UINT8                        Length,
> -  IN OUT  ISCSI_SESSION_CONFIG_NVDATA  *ConfigNvData
> -  )
> -{
> -  EFI_STATUS            Status;
> -  UINT8                 IScsiRootPathIdLen;
> -  CHAR8                 *TmpStr;
> -  ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
> -  ISCSI_ROOT_PATH_FIELD *Field;
> -  UINT32                FieldIndex;
> -  UINT8                 Index;
> -
> -  //
> -  // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
> -  //
> -  IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID);
> -
> -  if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath,
> ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
> -    return EFI_NOT_FOUND;
> -  }
> -  //
> -  // Skip the iSCSI RootPath ID "iscsi:".
> -  //
> -  RootPath += IScsiRootPathIdLen;
> -  Length  = (UINT8) (Length - IScsiRootPathIdLen);
> -
> -  TmpStr  = (CHAR8 *) AllocatePool (Length + 1);
> -  if (TmpStr == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  CopyMem (TmpStr, RootPath, Length);
> -  TmpStr[Length]  = '\0';
> -
> -  Index           = 0;
> -  FieldIndex      = RP_FIELD_IDX_SERVERNAME;
> -  ZeroMem (&Fields[0], sizeof (Fields));
> -
> -  //
> -  // Extract the fields in the Root Path option string.
> -  //
> -  for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex <
> RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) {
> -    if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) {
> -      Fields[FieldIndex].Str = &TmpStr[Index];
> -    }
> -
> -    while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index
> < Length)) {
> -      Index++;
> -    }
> -
> -    if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) {
> -      if (FieldIndex != RP_FIELD_IDX_TARGETNAME) {
> -        TmpStr[Index] = '\0';
> -        Index++;
> -      }
> -
> -      if (Fields[FieldIndex].Str != NULL) {
> -        Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str);
> -      }
> -    }
> -  }
> -
> -  if (FieldIndex != RP_FIELD_IDX_MAX) {
> -    Status = EFI_INVALID_PARAMETER;
> -    goto ON_EXIT;
> -  }
> -
> -    if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
> -      (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
> -      (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
> -      ) {
> -
> -    Status = EFI_INVALID_PARAMETER;
> -    goto ON_EXIT;
> -  }
> -  //
> -  // Get the IP address of the target.
> -  //
> -  Field   = &Fields[RP_FIELD_IDX_SERVERNAME];
> -  Status  = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -  //
> -  // Check the protocol type.
> -  //
> -  Field = &Fields[RP_FIELD_IDX_PROTOCOL];
> -  if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) {
> -    Status = EFI_INVALID_PARAMETER;
> -    goto ON_EXIT;
> -  }
> -  //
> -  // Get the port of the iSCSI target.
> -  //
> -  Field = &Fields[RP_FIELD_IDX_PORT];
> -  if (Field->Str != NULL) {
> -    ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str);
> -  } else {
> -    ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
> -  }
> -  //
> -  // Get the LUN.
> -  //
> -  Field = &Fields[RP_FIELD_IDX_LUN];
> -  if (Field->Str != NULL) {
> -    Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun);
> -    if (EFI_ERROR (Status)) {
> -      goto ON_EXIT;
> -    }
> -  } else {
> -    ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
> -  }
> -  //
> -  // Get the target iSCSI Name.
> -  //
> -  Field = &Fields[RP_FIELD_IDX_TARGETNAME];
> -
> -  if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) {
> -    Status = EFI_INVALID_PARAMETER;
> -    goto ON_EXIT;
> -  }
> -  //
> -  // Validate the iSCSI name.
> -  //
> -  Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str));
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field-
> >Str);
> -
> -ON_EXIT:
> -
> -  FreePool (TmpStr);
> -
> -  return Status;
> -}
> -
> -/**
> -  The callback function registerd to the DHCP4 instance which is used to
> select
> -  the qualified DHCP OFFER.
> -
> -  @param[in]  This         The DHCP4 protocol.
> -  @param[in]  Context      The context set when configuring the DHCP4
> protocol.
> -  @param[in]  CurrentState The current state of the DHCP4 protocol.
> -  @param[in]  Dhcp4Event   The event occurs in the current state.
> -  @param[in]  Packet       The DHCP packet that is to be sent or already
> received.
> -  @param[out] NewPacket    The packet used to replace the above Packet.
> -
> -  @retval EFI_SUCCESS      Either the DHCP OFFER is qualified or we're not
> intereseted
> -                           in the Dhcp4Event.
> -  @retval EFI_NOT_READY    The DHCP OFFER packet doesn't match our
> requirements.
> -  @retval Others           Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDhcpSelectOffer (
> -  IN  EFI_DHCP4_PROTOCOL  * This,
> -  IN  VOID                *Context,
> -  IN  EFI_DHCP4_STATE     CurrentState,
> -  IN  EFI_DHCP4_EVENT     Dhcp4Event,
> -  IN  EFI_DHCP4_PACKET    * Packet, OPTIONAL
> -  OUT EFI_DHCP4_PACKET    **NewPacket OPTIONAL
> -  )
> -{
> -  EFI_STATUS              Status;
> -  UINT32                  OptionCount;
> -  EFI_DHCP4_PACKET_OPTION **OptionList;
> -  UINT32                  Index;
> -
> -  if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer))
> {
> -    return EFI_SUCCESS;
> -  }
> -
> -  OptionCount = 0;
> -
> -  Status      = This->Parse (This, Packet, &OptionCount, NULL);
> -  if (Status != EFI_BUFFER_TOO_SMALL) {
> -    return EFI_NOT_READY;
> -  }
> -
> -  OptionList = AllocatePool (OptionCount * sizeof
> (EFI_DHCP4_PACKET_OPTION *));
> -  if (OptionList == NULL) {
> -    return EFI_NOT_READY;
> -  }
> -
> -  Status = This->Parse (This, Packet, &OptionCount, OptionList);
> -  if (EFI_ERROR (Status)) {
> -    FreePool (OptionList);
> -    return EFI_NOT_READY;
> -  }
> -
> -  for (Index = 0; Index < OptionCount; Index++) {
> -    if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) {
> -      continue;
> -    }
> -
> -    Status = IScsiDhcpExtractRootPath (
> -              (CHAR8 *) &OptionList[Index]->Data[0],
> -              OptionList[Index]->Length,
> -              (ISCSI_SESSION_CONFIG_NVDATA *) Context
> -              );
> -
> -    break;
> -  }
> -
> -  if (Index == OptionCount) {
> -    Status = EFI_NOT_READY;
> -  }
> -
> -  FreePool (OptionList);
> -
> -  return Status;
> -}
> -
> -/**
> -  Parse the DHCP ACK to get the address configuration and DNS information.
> -
> -  @param[in]       Dhcp4        The DHCP4 protocol.
> -  @param[in, out]  ConfigData   The session configuration data.
> -
> -  @retval EFI_SUCCESS           The DNS information is got from the DHCP ACK.
> -  @retval EFI_NO_MAPPING        DHCP failed to acquire address and other
> information.
> -  @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal-
> formatted.
> -  @retval EFI_DEVICE_ERROR      Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiParseDhcpAck (
> -  IN      EFI_DHCP4_PROTOCOL         *Dhcp4,
> -  IN OUT  ISCSI_SESSION_CONFIG_DATA  *ConfigData
> -  )
> -{
> -  EFI_STATUS              Status;
> -  EFI_DHCP4_MODE_DATA     Dhcp4ModeData;
> -  UINT32                  OptionCount;
> -  EFI_DHCP4_PACKET_OPTION **OptionList;
> -  UINT32                  Index;
> -
> -  Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  if (Dhcp4ModeData.State != Dhcp4Bound) {
> -    return EFI_NO_MAPPING;
> -  }
> -
> -  CopyMem (&ConfigData->NvData.LocalIp,
> &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS));
> -  CopyMem (&ConfigData->NvData.SubnetMask,
> &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
> -  CopyMem (&ConfigData->NvData.Gateway,
> &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS));
> -
> -  OptionCount = 0;
> -  OptionList  = NULL;
> -
> -  Status      = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket,
> &OptionCount, OptionList);
> -  if (Status != EFI_BUFFER_TOO_SMALL) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  OptionList = AllocatePool (OptionCount * sizeof
> (EFI_DHCP4_PACKET_OPTION *));
> -  if (OptionList == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket,
> &OptionCount, OptionList);
> -  if (EFI_ERROR (Status)) {
> -    FreePool (OptionList);
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  for (Index = 0; Index < OptionCount; Index++) {
> -    //
> -    // Get DNS server addresses and DHCP server address from this offer.
> -    //
> -    if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
> -
> -      if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]-
> >Length == 0)) {
> -        Status = EFI_INVALID_PARAMETER;
> -        break;
> -      }
> -      //
> -      // Primary DNS server address.
> -      //
> -      CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0],
> sizeof (EFI_IPv4_ADDRESS));
> -
> -      if (OptionList[Index]->Length > 4) {
> -        //
> -        // Secondary DNS server address
> -        //
> -        CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4],
> sizeof (EFI_IPv4_ADDRESS));
> -      }
> -    } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) {
> -      if (OptionList[Index]->Length != 4) {
> -        Status = EFI_INVALID_PARAMETER;
> -        break;
> -      }
> -
> -      CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0],
> sizeof (EFI_IPv4_ADDRESS));
> -    }
> -  }
> -
> -  FreePool (OptionList);
> -
> -  return Status;
> -}
> -
> -/**
> -  Parse the DHCP ACK to get the address configuration and DNS information.
> -
> -  @param[in]       Image            The handle of the driver image.
> -  @param[in]       Controller       The handle of the controller;
> -  @param[in, out]  ConfigData       The session configuration data.
> -
> -  @retval EFI_SUCCESS           The DNS information is got from the DHCP ACK.
> -  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
> -  @retval EFI_NO_MEDIA          There was a media error.
> -  @retval Others                Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiDoDhcp (
> -  IN     EFI_HANDLE                 Image,
> -  IN     EFI_HANDLE                 Controller,
> -  IN OUT ISCSI_SESSION_CONFIG_DATA  *ConfigData
> -  )
> -{
> -  EFI_HANDLE              Dhcp4Handle;
> -  EFI_DHCP4_PROTOCOL      *Dhcp4;
> -  EFI_STATUS              Status;
> -  EFI_DHCP4_PACKET_OPTION *ParaList;
> -  EFI_DHCP4_CONFIG_DATA   Dhcp4ConfigData;
> -  EFI_STATUS              MediaStatus;
> -  UINT8                   *Data;
> -
> -  Dhcp4Handle = NULL;
> -  Dhcp4       = NULL;
> -  ParaList    = NULL;
> -
> -  //
> -  // Check media status before do DHCP
> -  //
> -  MediaStatus = EFI_SUCCESS;
> -  NetLibDetectMediaWaitTimeout (Controller,
> ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);
> -  if (MediaStatus != EFI_SUCCESS) {
> -    return EFI_NO_MEDIA;
> -  }
> -
> -  //
> -  // Create a DHCP4 child instance and get the protocol.
> -  //
> -  Status = NetLibCreateServiceChild (
> -            Controller,
> -            Image,
> -            &gEfiDhcp4ServiceBindingProtocolGuid,
> -            &Dhcp4Handle
> -            );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  Status = gBS->OpenProtocol (
> -                  Dhcp4Handle,
> -                  &gEfiDhcp4ProtocolGuid,
> -                  (VOID **)&Dhcp4,
> -                  Image,
> -                  Controller,
> -                  EFI_OPEN_PROTOCOL_BY_DRIVER
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3);
> -  if (ParaList == NULL) {
> -    Status = EFI_OUT_OF_RESOURCES;
> -    goto ON_EXIT;
> -  }
> -  //
> -  // Ask the server to reply with Netmask, Router, DNS and RootPath options.
> -  //
> -  ParaList->OpCode  = DHCP4_TAG_PARA_LIST;
> -  ParaList->Length  = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 :
> 3);
> -  Data = &ParaList->Data[0];
> -  Data[0] = DHCP4_TAG_NETMASK;
> -  Data[1] = DHCP4_TAG_ROUTER;
> -  Data[2] = DHCP4_TAG_DNS_SERVER;
> -  Data[3] = DHCP4_TAG_ROOTPATH;
> -
> -  ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA));
> -  Dhcp4ConfigData.OptionCount = 1;
> -  Dhcp4ConfigData.OptionList  = &ParaList;
> -
> -  if (ConfigData->NvData.TargetInfoFromDhcp) {
> -    //
> -    // Use callback to select an offer which contains target information.
> -    //
> -    Dhcp4ConfigData.Dhcp4Callback   = IScsiDhcpSelectOffer;
> -    Dhcp4ConfigData.CallbackContext = &ConfigData->NvData;
> -  }
> -
> -  Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  Status = Dhcp4->Start (Dhcp4, NULL);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -  //
> -  // Parse the ACK to get required information.
> -  //
> -  Status = IScsiParseDhcpAck (Dhcp4, ConfigData);
> -
> -ON_EXIT:
> -
> -  if (ParaList != NULL) {
> -    FreePool (ParaList);
> -  }
> -
> -  if (Dhcp4 != NULL) {
> -    Dhcp4->Stop (Dhcp4);
> -    Dhcp4->Configure (Dhcp4, NULL);
> -
> -    gBS->CloseProtocol (
> -          Dhcp4Handle,
> -          &gEfiDhcp4ProtocolGuid,
> -          Image,
> -          Controller
> -          );
> -  }
> -
> -  NetLibDestroyServiceChild (
> -    Controller,
> -    Image,
> -    &gEfiDhcp4ServiceBindingProtocolGuid,
> -    Dhcp4Handle
> -    );
> -
> -  return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> deleted file mode 100644
> index 730f3e506bbc..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> +++ /dev/null
> @@ -1,676 +0,0 @@
> -/** @file
> -  The entry point of IScsi driver.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = {
> -  IScsiDriverBindingSupported,
> -  IScsiDriverBindingStart,
> -  IScsiDriverBindingStop,
> -  0xa,
> -  NULL,
> -  NULL
> -};
> -
> -/**
> -  Tests to see if this driver supports the RemainingDevicePath.
> -
> -  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
> device path.  This
> -                                   parameter is ignored by device drivers, and is optional for
> bus
> -                                   drivers. For bus drivers, if this parameter is not NULL, then
> -                                   the bus driver must determine if the bus controller
> specified
> -                                   by ControllerHandle and the child controller specified
> -                                   by RemainingDevicePath are both supported by this
> -                                   bus driver.
> -
> -  @retval EFI_SUCCESS              The RemainingDevicePath is supported or
> NULL.
> -  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle
> and
> -                                   RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -IScsiIsDevicePathSupported (
> -  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> -  )
> -{
> -  EFI_DEVICE_PATH_PROTOCOL  *CurrentDevicePath;
> -
> -  CurrentDevicePath = RemainingDevicePath;
> -  if (CurrentDevicePath != NULL) {
> -    while (!IsDevicePathEnd (CurrentDevicePath)) {
> -      if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) &&
> (CurrentDevicePath->SubType == MSG_ISCSI_DP)) {
> -        return EFI_SUCCESS;
> -      }
> -
> -      CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);
> -    }
> -
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Tests to see if this driver supports a given controller. If a child device is
> provided,
> -  it further tests to see if this driver supports creating a handle for the
> specified child device.
> -
> -  @param[in]  This                 A pointer to the
> EFI_DRIVER_BINDING_PROTOCOL instance.
> -  @param[in]  ControllerHandle     The handle of the controller to test. This
> handle
> -                                   must support a protocol interface that supplies
> -                                   an I/O abstraction to the driver.
> -  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
> device path.
> -                                   This parameter is ignored by device drivers, and is optional
> for bus drivers.
> -
> -
> -  @retval EFI_SUCCESS              The device specified by ControllerHandle and
> -                                   RemainingDevicePath is supported by the driver specified
> by This.
> -  @retval EFI_ALREADY_STARTED      The device specified by
> ControllerHandle and
> -                                   RemainingDevicePath is already being managed by the
> driver
> -                                   specified by This.
> -  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle
> and
> -                                   RemainingDevicePath is already being managed by a
> different
> -                                   driver or an application that requires exclusive acces.
> -                                   Currently not implemented.
> -  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle
> and
> -                                   RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingSupported (
> -  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> -  IN EFI_HANDLE                   ControllerHandle,
> -  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> -  )
> -{
> -  EFI_STATUS                Status;
> -
> -  Status = gBS->OpenProtocol (
> -                  ControllerHandle,
> -                  &gEfiCallerIdGuid,
> -                  NULL,
> -                  This->DriverBindingHandle,
> -                  ControllerHandle,
> -                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> -                  );
> -  if (!EFI_ERROR (Status)) {
> -    return EFI_ALREADY_STARTED;
> -  }
> -
> -  Status = gBS->OpenProtocol (
> -                  ControllerHandle,
> -                  &gEfiTcp4ServiceBindingProtocolGuid,
> -                  NULL,
> -                  This->DriverBindingHandle,
> -                  ControllerHandle,
> -                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  Status = IScsiIsDevicePathSupported (RemainingDevicePath);
> -  if (EFI_ERROR (Status)) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  if (IScsiDhcpIsConfigured (ControllerHandle)) {
> -    Status = gBS->OpenProtocol (
> -                    ControllerHandle,
> -                    &gEfiDhcp4ServiceBindingProtocolGuid,
> -                    NULL,
> -                    This->DriverBindingHandle,
> -                    ControllerHandle,
> -                    EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> -                    );
> -    if (EFI_ERROR (Status)) {
> -      return EFI_UNSUPPORTED;
> -    }
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Start this driver on ControllerHandle.
> -
> -  The Start() function is designed to be invoked from the EFI boot service
> ConnectController().
> -  As a result, much of the error checking on the parameters to Start() has
> been moved into this
> -  common boot service. It is legal to call Start() from other locations, but the
> following calling
> -  restrictions must be followed or the system behavior will not be
> deterministic.
> -  1. ControllerHandle must be a valid EFI_HANDLE.
> -  2. If RemainingDevicePath is not NULL, then it must be a pointer to a
> naturally aligned
> -     EFI_DEVICE_PATH_PROTOCOL.
> -  3. Prior to calling Start(), the Supported() function for the driver specified
> by This must
> -     have been called with the same calling parameters, and Supported() must
> have returned EFI_SUCCESS.
> -
> -  @param[in]  This                 A pointer to the
> EFI_DRIVER_BINDING_PROTOCOL instance.
> -  @param[in]  ControllerHandle     The handle of the controller to start. This
> handle
> -                                   must support a protocol interface that supplies
> -                                   an I/O abstraction to the driver.
> -  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
> device path.
> -                                   This parameter is ignored by device drivers, and is optional
> for bus drivers.
> -
> -  @retval EFI_SUCCESS              The device was started.
> -  @retval EFI_DEVICE_ERROR         The device could not be started due to a
> device error.
> -                                   Currently not implemented.
> -  @retval EFI_OUT_OF_RESOURCES     The request could not be completed
> due to a lack of resources.
> -  @retval Others                   The driver failded to start the device.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStart (
> -  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> -  IN EFI_HANDLE                   ControllerHandle,
> -  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> -  )
> -{
> -  EFI_STATUS        Status;
> -  ISCSI_DRIVER_DATA *Private;
> -  VOID              *Interface;
> -
> -  Private = IScsiCreateDriverData (This->DriverBindingHandle,
> ControllerHandle);
> -  if (Private == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  //
> -  // Create a underlayer child instance, but not need to configure it. Just
> open ChildHandle
> -  // via BY_DRIVER. That is, establishing the relationship between
> ControllerHandle and ChildHandle.
> -  // Therefore, when DisconnectController(), especially VLAN virtual
> controller handle,
> -  // IScsiDriverBindingStop() will be called.
> -  //
> -  Status = NetLibCreateServiceChild (
> -             ControllerHandle,
> -             This->DriverBindingHandle,
> -             &gEfiTcp4ServiceBindingProtocolGuid,
> -             &Private->ChildHandle
> -             );
> -
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  Status = gBS->OpenProtocol (
> -                  Private->ChildHandle,
> -                  &gEfiTcp4ProtocolGuid,
> -                  &Interface,
> -                  This->DriverBindingHandle,
> -                  ControllerHandle,
> -                  EFI_OPEN_PROTOCOL_BY_DRIVER
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  //
> -  // Always install private protocol no matter what happens later. We need
> to
> -  // keep the relationship between ControllerHandle and ChildHandle.
> -  //
> -  Status = gBS->InstallProtocolInterface (
> -                  &ControllerHandle,
> -                  &gEfiCallerIdGuid,
> -                  EFI_NATIVE_INTERFACE,
> -                  &Private->IScsiIdentifier
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  //
> -  // Try to add a port configuration page for this controller.
> -  //
> -  IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle,
> TRUE);
> -
> -  //
> -  // Get the iSCSI configuration data of this controller.
> -  //
> -  Status = IScsiGetConfigData (Private);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -  //
> -  // Try to login and create an iSCSI session according to the configuration.
> -  //
> -  Status = IScsiSessionLogin (Private);
> -  if (Status == EFI_MEDIA_CHANGED) {
> -    //
> -    // The specified target is not available and the redirection information is
> -    // got, login the session again with the updated target address.
> -    //
> -    Status = IScsiSessionLogin (Private);
> -  }
> -
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -  //
> -  // Duplicate the Session's tcp connection device path. The source port field
> -  // will be set to zero as one iSCSI session is comprised of several iSCSI
> -  // connections.
> -  //
> -  Private->DevicePath = IScsiGetTcpConnDevicePath (Private);
> -  if (Private->DevicePath == NULL) {
> -    goto ON_ERROR;
> -  }
> -  //
> -  // Install the updated device path onto the ExtScsiPassThruHandle.
> -  //
> -  Status = gBS->InstallProtocolInterface (
> -                  &Private->ExtScsiPassThruHandle,
> -                  &gEfiDevicePathProtocolGuid,
> -                  EFI_NATIVE_INTERFACE,
> -                  Private->DevicePath
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  //
> -  // ISCSI children should share the default Tcp child, just open the default
> Tcp child via BY_CHILD_CONTROLLER.
> -  //
> -  Status = gBS->OpenProtocol (
> -                  Private->ChildHandle, /// Default Tcp child
> -                  &gEfiTcp4ProtocolGuid,
> -                  &Interface,
> -                  This->DriverBindingHandle,
> -                  Private->ExtScsiPassThruHandle,
> -                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    gBS->UninstallMultipleProtocolInterfaces (
> -           Private->ExtScsiPassThruHandle,
> -           &gEfiExtScsiPassThruProtocolGuid,
> -           &Private->IScsiExtScsiPassThru,
> -           &gEfiDevicePathProtocolGuid,
> -           Private->DevicePath,
> -           NULL
> -           );
> -
> -    goto ON_ERROR;
> -  }
> -
> -  //
> -  // Update/Publish the iSCSI Boot Firmware Table.
> -  //
> -  IScsiPublishIbft ();
> -
> -  return EFI_SUCCESS;
> -
> -ON_ERROR:
> -
> -  IScsiSessionAbort (&Private->Session);
> -
> -  return Status;
> -}
> -
> -/**
> -  Stop this driver on ControllerHandle.
> -
> -  Release the control of this controller and remove the IScsi functions. The
> Stop()
> -  function is designed to be invoked from the EFI boot service
> DisconnectController().
> -  As a result, much of the error checking on the parameters to Stop() has
> been moved
> -  into this common boot service. It is legal to call Stop() from other locations,
> -  but the following calling restrictions must be followed or the system
> behavior will not be deterministic.
> -  1. ControllerHandle must be a valid EFI_HANDLE that was used on a
> previous call to this
> -     same driver's Start() function.
> -  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a
> valid
> -     EFI_HANDLE. In addition, all of these handles must have been created in
> this driver's
> -     Start() function, and the Start() function must have called OpenProtocol()
> on
> -     ControllerHandle with an Attribute of
> EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
> -
> -  @param[in]  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> -  @param[in]  ControllerHandle  A handle to the device being stopped. The
> handle must
> -                                support a bus specific I/O protocol for the driver
> -                                to use to stop the device.
> -  @param[in]  NumberOfChildren  The number of child device handles in
> ChildHandleBuffer.Not used.
> -  @param[in]  ChildHandleBuffer An array of child handles to be freed. May
> be NULL
> -                                if NumberOfChildren is 0.Not used.
> -
> -  @retval EFI_SUCCESS           The device was stopped.
> -  @retval EFI_DEVICE_ERROR      The device could not be stopped due to a
> device error.
> -  @retval EFI_INVALID_PARAMETER Child handle is NULL.
> -  @retval EFI_ACCESS_DENIED     The protocol could not be removed from
> the Handle
> -                                because its interfaces are being used.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStop (
> -  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> -  IN EFI_HANDLE                   ControllerHandle,
> -  IN UINTN                        NumberOfChildren,
> -  IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL
> -  )
> -{
> -  EFI_HANDLE                      IScsiController;
> -  EFI_STATUS                      Status;
> -  ISCSI_PRIVATE_PROTOCOL          *IScsiIdentifier;
> -  ISCSI_DRIVER_DATA               *Private;
> -  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
> -  ISCSI_CONNECTION                *Conn;
> -
> -  if (NumberOfChildren != 0) {
> -    //
> -    // We should have only one child.
> -    //
> -    Status = gBS->OpenProtocol (
> -                    ChildHandleBuffer[0],
> -                    &gEfiExtScsiPassThruProtocolGuid,
> -                    (VOID **) &PassThru,
> -                    This->DriverBindingHandle,
> -                    ControllerHandle,
> -                    EFI_OPEN_PROTOCOL_GET_PROTOCOL
> -                    );
> -    if (EFI_ERROR (Status)) {
> -      return EFI_DEVICE_ERROR;
> -    }
> -
> -    Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
> -    Conn    = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION,
> Link);
> -
> -    //
> -    // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just
> close
> -    // the protocol here but not uninstall the device path protocol and
> -    // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle.
> -    //
> -    gBS->CloseProtocol (
> -           Private->ChildHandle,
> -           &gEfiTcp4ProtocolGuid,
> -           Private->Image,
> -           Private->ExtScsiPassThruHandle
> -           );
> -
> -    gBS->CloseProtocol (
> -          Conn->Tcp4Io.Handle,
> -          &gEfiTcp4ProtocolGuid,
> -          Private->Image,
> -          Private->ExtScsiPassThruHandle
> -          );
> -
> -    return EFI_SUCCESS;
> -  }
> -  //
> -  // Get the handle of the controller we are controling.
> -  //
> -  IScsiController = NetLibGetNicHandle (ControllerHandle,
> &gEfiTcp4ProtocolGuid);
> -
> -  Status = gBS->OpenProtocol (
> -                  IScsiController,
> -                  &gEfiCallerIdGuid,
> -                  (VOID **)&IScsiIdentifier,
> -                  This->DriverBindingHandle,
> -                  ControllerHandle,
> -                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> -
> -  if (Private->ChildHandle != NULL) {
> -    Status = gBS->CloseProtocol (
> -                    Private->ChildHandle,
> -                    &gEfiTcp4ProtocolGuid,
> -                    This->DriverBindingHandle,
> -                    IScsiController
> -                    );
> -
> -    ASSERT (!EFI_ERROR (Status));
> -
> -    Status = NetLibDestroyServiceChild (
> -               IScsiController,
> -               This->DriverBindingHandle,
> -               &gEfiTcp4ServiceBindingProtocolGuid,
> -               Private->ChildHandle
> -               );
> -    ASSERT (!EFI_ERROR (Status));
> -  }
> -
> -  IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE);
> -
> -  //
> -  // Uninstall the private protocol.
> -  //
> -  gBS->UninstallProtocolInterface (
> -        IScsiController,
> -        &gEfiCallerIdGuid,
> -        &Private->IScsiIdentifier
> -        );
> -
> -  //
> -  // Update the iSCSI Boot Firware Table.
> -  //
> -  IScsiPublishIbft ();
> -
> -  IScsiSessionAbort (&Private->Session);
> -  Status = IScsiCleanDriverData (Private);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Unloads an image(the iSCSI driver).
> -
> -  @param[in]  ImageHandle       Handle that identifies the image to be
> unloaded.
> -
> -  @retval EFI_SUCCESS           The image has been unloaded.
> -  @retval Others                Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiIScsiUnload (
> -  IN EFI_HANDLE  ImageHandle
> -  )
> -{
> -  EFI_STATUS                        Status;
> -  UINTN                             DeviceHandleCount;
> -  EFI_HANDLE                        *DeviceHandleBuffer;
> -  UINTN                             Index;
> -  EFI_COMPONENT_NAME_PROTOCOL       *ComponentName;
> -  EFI_COMPONENT_NAME2_PROTOCOL      *ComponentName2;
> -
> -  //
> -  // Try to disonnect the driver from the devices it's controlling.
> -  //
> -  Status = gBS->LocateHandleBuffer (
> -                  AllHandles,
> -                  NULL,
> -                  NULL,
> -                  &DeviceHandleCount,
> -                  &DeviceHandleBuffer
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  for (Index = 0; Index < DeviceHandleCount; Index++) {
> -    Status = IScsiTestManagedDevice (
> -               DeviceHandleBuffer[Index],
> -               gIScsiDriverBinding.DriverBindingHandle,
> -               &gEfiTcp4ProtocolGuid
> -               );
> -    if (EFI_ERROR (Status)) {
> -      continue;
> -    }
> -    Status = gBS->DisconnectController (
> -                    DeviceHandleBuffer[Index],
> -                    gIScsiDriverBinding.DriverBindingHandle,
> -                    NULL
> -                    );
> -    if (EFI_ERROR (Status)) {
> -      goto ON_EXIT;
> -    }
> -  }
> -
> -  //
> -  // Unload the iSCSI configuration form.
> -  //
> -  Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // Uninstall the ComponentName and ComponentName2 protocol from
> iSCSI4 driver binding handle
> -  // if it has been installed.
> -  //
> -  Status = gBS->HandleProtocol (
> -                  gIScsiDriverBinding.DriverBindingHandle,
> -                  &gEfiComponentNameProtocolGuid,
> -                  (VOID **) &ComponentName
> -                  );
> -  if (!EFI_ERROR (Status)) {
> -    Status = gBS->UninstallMultipleProtocolInterfaces (
> -           gIScsiDriverBinding.DriverBindingHandle,
> -           &gEfiComponentNameProtocolGuid,
> -           ComponentName,
> -           NULL
> -           );
> -    if (EFI_ERROR (Status)) {
> -      goto ON_EXIT;
> -    }
> -  }
> -
> -  Status = gBS->HandleProtocol (
> -                  gIScsiDriverBinding.DriverBindingHandle,
> -                  &gEfiComponentName2ProtocolGuid,
> -                  (VOID **) &ComponentName2
> -                  );
> -  if (!EFI_ERROR (Status)) {
> -    gBS->UninstallMultipleProtocolInterfaces (
> -           gIScsiDriverBinding.DriverBindingHandle,
> -           &gEfiComponentName2ProtocolGuid,
> -           ComponentName2,
> -           NULL
> -           );
> -    if (EFI_ERROR (Status)) {
> -      goto ON_EXIT;
> -    }
> -  }
> -
> -  Status = gBS->UninstallMultipleProtocolInterfaces (
> -                  ImageHandle,
> -                  &gEfiDriverBindingProtocolGuid,
> -                  &gIScsiDriverBinding,
> -                  &gEfiIScsiInitiatorNameProtocolGuid,
> -                  &gIScsiInitiatorName,
> -                  NULL
> -                  );
> -ON_EXIT:
> -
> -  if (DeviceHandleBuffer != NULL) {
> -    FreePool (DeviceHandleBuffer);
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  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. It initialize the global variables and
> -  publish the driver binding protocol.
> -
> -  @param[in]   ImageHandle      The firmware allocated handle for the UEFI
> image.
> -  @param[in]   SystemTable      A pointer to the EFI System Table.
> -
> -  @retval EFI_SUCCESS           The operation completed successfully.
> -  @retval EFI_ACCESS_DENIED     EFI_ISCSI_INITIATOR_NAME_PROTOCOL
> was installed unexpectedly.
> -  @retval Others                Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverEntryPoint (
> -  IN EFI_HANDLE         ImageHandle,
> -  IN EFI_SYSTEM_TABLE   *SystemTable
> -  )
> -{
> -  EFI_STATUS                         Status;
> -  EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *IScsiInitiatorName;
> -
> -  //
> -  // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL.
> -  //
> -  Status = gBS->LocateProtocol (
> -                   &gEfiIScsiInitiatorNameProtocolGuid,
> -                   NULL,
> -                   (VOID**) &IScsiInitiatorName
> -                   );
> -
> -  if (!EFI_ERROR (Status)) {
> -    return EFI_ACCESS_DENIED;
> -  }
> -
> -  //
> -  // Initialize the EFI Driver Library
> -  //
> -  Status = EfiLibInstallDriverBindingComponentName2 (
> -             ImageHandle,
> -             SystemTable,
> -             &gIScsiDriverBinding,
> -             ImageHandle,
> -             &gIScsiComponentName,
> -             &gIScsiComponentName2
> -           );
> -
> -  if (!EFI_ERROR (Status)) {
> -    //
> -    // Install the iSCSI Initiator Name Protocol.
> -    //
> -    Status = gBS->InstallProtocolInterface (
> -                    &ImageHandle,
> -                    &gEfiIScsiInitiatorNameProtocolGuid,
> -                    EFI_NATIVE_INTERFACE,
> -                    &gIScsiInitiatorName
> -                    );
> -    if (EFI_ERROR (Status)) {
> -      gBS->UninstallMultipleProtocolInterfaces (
> -            ImageHandle,
> -            &gEfiDriverBindingProtocolGuid,
> -            &gIScsiDriverBinding,
> -            &gEfiComponentName2ProtocolGuid,
> -            &gIScsiComponentName2,
> -            &gEfiComponentNameProtocolGuid,
> -            &gIScsiComponentName,
> -            NULL
> -            );
> -      return Status;
> -    }
> -
> -    //
> -    // Initialize the configuration form of iSCSI.
> -    //
> -    Status = IScsiConfigFormInit ();
> -    if (EFI_ERROR (Status)) {
> -      gBS->UninstallMultipleProtocolInterfaces (
> -            ImageHandle,
> -            &gEfiDriverBindingProtocolGuid,
> -            &gIScsiDriverBinding,
> -            &gEfiComponentName2ProtocolGuid,
> -            &gIScsiComponentName2,
> -            &gEfiComponentNameProtocolGuid,
> -            &gIScsiComponentName,
> -            &gEfiIScsiInitiatorNameProtocolGuid,
> -            &gIScsiInitiatorName,
> -            NULL
> -            );
> -    }
> -  }
> -  return Status;
> -}
> -
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> deleted file mode 100644
> index db2d6d19366e..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> +++ /dev/null
> @@ -1,412 +0,0 @@
> -/** @file
> -  The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> -  Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI
> channel. This function
> -  supports both blocking I/O and nonblocking I/O. The blocking I/O
> functionality is required, and the
> -  nonblocking I/O functionality is optional.
> -
> -  @param[in]      This    A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> -  @param[in]      Target  The Target is an array of size TARGET_MAX_BYTES
> and it represents
> -                          the id of the SCSI device to send the SCSI Request Packet. Each
> -                          transport driver may chose to utilize a subset of this size to suit
> the needs
> -                          of transport target representation. For example, a Fibre
> Channel driver
> -                          may use only 8 bytes (WWN) to represent an FC target.
> -  @param[in]       Lun    The LUN of the SCSI device to send the SCSI Request
> Packet.
> -  @param[in, out]  Packet A pointer to the SCSI Request Packet to send to
> the SCSI device
> -                          specified by Target and Lun.
> -  @param[in]       Event  If nonblocking I/O is not supported then Event is
> ignored, and blocking
> -                          I/O is performed. If Event is NULL, then blocking I/O is
> performed. If
> -                          Event is not NULL and non blocking I/O is supported, then
> -                          nonblocking I/O is performed, and Event will be signaled when
> the
> -                          SCSI Request Packet completes.
> -
> -  @retval EFI_SUCCESS           The SCSI Request Packet was sent by the host.
> For bi-directional
> -                                commands, InTransferLength bytes were transferred from
> -                                InDataBuffer. For write and bi-directional commands,
> -                                OutTransferLength bytes were transferred by
> -                                OutDataBuffer.
> -  @retval EFI_BAD_BUFFER_SIZE   The SCSI Request Packet was not
> executed. The number of bytes that
> -                                could be transferred is returned in InTransferLength. For
> write
> -                                and bi-directional commands, OutTransferLength bytes
> were
> -                                transferred by OutDataBuffer. Currently not implemeted.
> -  @retval EFI_NOT_READY         The SCSI Request Packet could not be sent
> because there are too many
> -                                SCSI Request Packets already queued. The caller may retry
> again later.
> -  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to
> send the SCSI Request
> -                                Packet.
> -  @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of
> ScsiRequestPacket are invalid.
> -  @retval EFI_UNSUPPORTED       The command described by the SCSI
> Request Packet is not supported
> -                                by the host adapter. This includes the case of Bi-directional
> SCSI
> -                                commands not supported by the implementation. The SCSI
> Request
> -                                Packet was not sent, so no additional status information is
> available.
> -                                Currently not implemeted.
> -  @retval EFI_TIMEOUT           A timeout occurred while waiting for the SCSI
> Request Packet to execute.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruFunction (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                          *This,
> -  IN UINT8                                                    *Target,
> -  IN UINT64                                                   Lun,
> -  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET           *Packet,
> -  IN EFI_EVENT                                                Event     OPTIONAL
> -  )
> -{
> -  ISCSI_DRIVER_DATA           *Private;
> -  ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> -  EFI_STATUS                  Status;
> -
> -  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> -  ConfigNvData  = &Private->Session.ConfigData.NvData;
> -
> -  if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof
> (UINT64)) != 0)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if ((Packet == NULL) || (Packet->Cdb == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
> -  if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) {
> -    //
> -    // Try to reinstate the session and re-execute the Scsi command.
> -    //
> -    if (EFI_ERROR (IScsiSessionReinstatement (Private))) {
> -      return EFI_DEVICE_ERROR;
> -    }
> -
> -    Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a
> SCSI channel. These
> -  can either be the list SCSI devices that are actually present on the SCSI
> channel, or the list of legal
> -  Target Ids and LUNs for the SCSI channel. Regardless, the caller of this
> function must probe the
> -  Target ID and LUN returned to see if a SCSI device is actually present at that
> location on the SCSI
> -  channel.
> -
> -  @param[in]       This    A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> -  @param[in, out]  Target  On input, a pointer to the Target ID (an array of
> size
> -                           TARGET_MAX_BYTES) of a SCSI device present on the SCSI
> channel.
> -                           On output, a pointer to the Target ID (an array of
> -                           TARGET_MAX_BYTES) of the next SCSI device present on a
> SCSI
> -                           channel. An input value of 0xF(all bytes in the array are 0xF) in
> the
> -                           Target array retrieves the Target ID of the first SCSI device
> present on a
> -                           SCSI channel.
> -  @param[in, out]  Lun     On input, a pointer to the LUN of a SCSI device
> present on the SCSI
> -                           channel. On output, a pointer to the LUN of the next SCSI
> device present
> -                           on a SCSI channel.
> -
> -  @retval EFI_SUCCESS           The Target ID and LUN of the next SCSI device
> on the SCSI
> -                                channel was returned in Target and Lun.
> -  @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target
> and Lun were
> -                                not returned on a previous call to GetNextTargetLun().
> -  @retval EFI_NOT_FOUND         There are no more SCSI devices on this SCSI
> channel.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetNextTargetLun (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
> -  IN OUT UINT8                        **Target,
> -  IN OUT UINT64                       *Lun
> -  )
> -{
> -  ISCSI_DRIVER_DATA           *Private;
> -  ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> -  UINT8                       TargetId[TARGET_MAX_BYTES];
> -
> -  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> -  ConfigNvData  = &Private->Session.ConfigData.NvData;
> -
> -  if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun,
> sizeof (UINT64)) == 0)) {
> -    //
> -    // Only one <Target, Lun> pair per iSCSI Driver instance.
> -    //
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
> -  if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
> -    (*Target)[0] = 0;
> -    CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
> -
> -    return EFI_SUCCESS;
> -  }
> -
> -  return EFI_INVALID_PARAMETER;
> -}
> -
> -/**
> -  Used to allocate and build a device path node for a SCSI device on a SCSI
> channel.
> -
> -  @param[in]      This        A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> -  @param[in]      Target      The Target is an array of size TARGET_MAX_BYTES
> and it specifies the
> -                              Target ID of the SCSI device for which a device path node is to
> be
> -                              allocated and built. Transport drivers may chose to utilize a
> subset of
> -                              this size to suit the representation of targets. For example, a
> Fibre
> -                              Channel driver may use only 8 bytes (WWN) in the array to
> represent a
> -                              FC target.
> -  @param[in]       Lun        The LUN of the SCSI device for which a device path
> node is to be
> -                              allocated and built.
> -  @param[in, out]  DevicePath A pointer to a single device path node that
> describes the SCSI device
> -                              specified by Target and Lun. This function is responsible for
> -                              allocating the buffer DevicePath with the boot service
> -                              AllocatePool(). It is the caller's responsibility to free
> -                              DevicePath when the caller is finished with DevicePath.
> -
> -  @retval EFI_SUCCESS           The device path node that describes the SCSI
> device specified by
> -                                Target and Lun was allocated and returned in
> -                                DevicePath.
> -  @retval EFI_INVALID_PARAMETER DevicePath is NULL.
> -  @retval EFI_NOT_FOUND         The SCSI devices specified by Target and Lun
> does not exist
> -                                on the SCSI channel.
> -  @retval EFI_OUT_OF_RESOURCES  There are not enough resources to
> allocate DevicePath.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruBuildDevicePath (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
> -  IN UINT8                            *Target,
> -  IN UINT64                           Lun,
> -  IN OUT EFI_DEVICE_PATH_PROTOCOL     **DevicePath
> -  )
> -{
> -  ISCSI_DRIVER_DATA             *Private;
> -  ISCSI_SESSION                 *Session;
> -  ISCSI_SESSION_CONFIG_NVDATA   *ConfigNvData;
> -  ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
> -  EFI_DEV_PATH                  *Node;
> -  UINTN                         DevPathNodeLen;
> -
> -  if (DevicePath == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if (Target[0] != 0) {
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> -  Session       = &Private->Session;
> -  ConfigNvData  = &Session->ConfigData.NvData;
> -  AuthConfig    = &Session->AuthData.AuthConfig;
> -
> -  if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  DevPathNodeLen  = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen
> (ConfigNvData->TargetName) + 1;
> -  Node            = AllocatePool (DevPathNodeLen);
> -  if (Node == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Node->DevPath.Type    = MESSAGING_DEVICE_PATH;
> -  Node->DevPath.SubType = MSG_ISCSI_DP;
> -  SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen);
> -
> -  //
> -  // 0 for TCP, others are reserved.
> -  //
> -  Node->Iscsi.NetworkProtocol = 0;
> -
> -  Node->Iscsi.LoginOption     = 0;
> -  switch (AuthConfig->CHAPType) {
> -  case ISCSI_CHAP_NONE:
> -    Node->Iscsi.LoginOption |= 0x0800;
> -    break;
> -
> -  case ISCSI_CHAP_UNI:
> -    Node->Iscsi.LoginOption |= 0x1000;
> -    break;
> -
> -  default:
> -    break;
> -  }
> -
> -  CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
> -  Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
> -  AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen
> (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName);
> -
> -  *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Used to translate a device path node to a Target ID and LUN.
> -
> -  @param[in]  This       A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> -  @param[in]  DevicePath A pointer to a single device path node that
> describes the SCSI device
> -                         on the SCSI channel.
> -  @param[out] Target     A pointer to the Target Array which represents the
> ID of a SCSI device
> -                         on the SCSI channel.
> -  @param[out]  Lun       A pointer to the LUN of a SCSI device on the SCSI
> channel.
> -
> -  @retval EFI_SUCCESS           DevicePath was successfully translated to a
> Target ID and
> -                                LUN, and they were returned in Target and Lun.
> -  @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL.
> -  @retval EFI_NOT_FOUND         A valid translation from DevicePath to a
> Target ID and LUN
> -                                does not exist.Currently not implemented.
> -  @retval EFI_UNSUPPORTED       This driver does not support the device
> path node type in
> -                                DevicePath.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetTargetLun (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
> -  IN EFI_DEVICE_PATH_PROTOCOL         *DevicePath,
> -  OUT UINT8                           **Target,
> -  OUT UINT64                          *Lun
> -  )
> -{
> -  ISCSI_DRIVER_DATA           *Private;
> -  ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> -
> -  if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
> -      (DevicePath->SubType != MSG_ISCSI_DP) ||
> -      (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
> -      ) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> -  ConfigNvData  = &Private->Session.ConfigData.NvData;
> -
> -  SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
> -  (*Target)[0] = 0;
> -
> -  if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath +
> sizeof (ISCSI_DEVICE_PATH)) != 0) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Resets a SCSI channel. This operation resets all the SCSI devices connected
> to the SCSI channel.
> -  Currently not implemented.
> -
> -  @param[in]  This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> -
> -  @retval EFI_SUCCESS      The SCSI channel was reset.
> -  @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> reset the SCSI channel.
> -  @retval EFI_TIMEOUT      A timeout occurred while attempting to reset the
> SCSI channel.
> -  @retval EFI_UNSUPPORTED  The SCSI channel does not support a channel
> reset operation.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruResetChannel (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This
> -  )
> -{
> -  return EFI_UNSUPPORTED;
> -}
> -
> -/**
> -  Resets a SCSI logical unit that is connected to a SCSI channel. Currently not
> implemented.
> -
> -  @param[in]  This   A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> -  @param[in]  Target The Target is an array of size TARGET_MAX_BYTE and it
> represents the
> -                     target port ID of the SCSI device containing the SCSI logical unit to
> -                     reset. Transport drivers may chose to utilize a subset of this array
> to suit
> -                     the representation of their targets.
> -  @param[in]  Lun    The LUN of the SCSI device to reset.
> -
> -  @retval EFI_SUCCESS           The SCSI device specified by Target and Lun was
> reset.
> -  @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
> -  @retval EFI_TIMEOUT           A timeout occurred while attempting to reset
> the SCSI device
> -                                specified by Target and Lun.
> -  @retval EFI_UNSUPPORTED       The SCSI channel does not support a target
> reset operation.
> -  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to
> reset the SCSI device
> -                                specified by Target and Lun.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruResetTargetLun (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
> -  IN UINT8                            *Target,
> -  IN UINT64                           Lun
> -  )
> -{
> -  return EFI_UNSUPPORTED;
> -}
> -
> -/**
> -  Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI
> channel. These can either
> -  be the list SCSI devices that are actually present on the SCSI channel, or the
> list of legal Target IDs
> -  for the SCSI channel. Regardless, the caller of this function must probe the
> Target ID returned to
> -  see if a SCSI device is actually present at that location on the SCSI channel.
> -
> -  @param[in]       This    A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> -  @param[in, out]  Target  (TARGET_MAX_BYTES) of a SCSI device present
> on the SCSI channel.
> -                           On output, a pointer to the Target ID (an array of
> -                           TARGET_MAX_BYTES) of the next SCSI device present on a
> SCSI
> -                           channel. An input value of 0xF(all bytes in the array are 0xF) in
> the
> -                           Target array retrieves the Target ID of the first SCSI device
> present on a
> -                           SCSI channel.
> -
> -  @retval EFI_SUCCESS           The Target ID of the next SCSI device on the
> SCSI
> -                                channel was returned in Target.
> -  @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
> -  @retval EFI_TIMEOUT           Target array is not all 0xF, and Target were not
> -                                returned on a previous call to GetNextTarget().
> -                                Currently not implemented.
> -  @retval EFI_NOT_FOUND         There are no more SCSI devices on this SCSI
> channel.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetNextTarget (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL  *This,
> -  IN OUT UINT8                        **Target
> -  )
> -{
> -  UINT8 TargetId[TARGET_MAX_BYTES];
> -
> -  SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
> -
> -  if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
> -    (*Target)[0] = 0;
> -    return EFI_SUCCESS;
> -  } else if ((*Target)[0] == 0) {
> -    return EFI_NOT_FOUND;
> -  } else {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -}
> -
> -EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> gIScsiExtScsiPassThruProtocolTemplate = {
> -  NULL,
> -  IScsiExtScsiPassThruFunction,
> -  IScsiExtScsiPassThruGetNextTargetLun,
> -  IScsiExtScsiPassThruBuildDevicePath,
> -  IScsiExtScsiPassThruGetTargetLun,
> -  IScsiExtScsiPassThruResetChannel,
> -  IScsiExtScsiPassThruResetTargetLun,
> -  IScsiExtScsiPassThruGetNextTarget
> -};
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> deleted file mode 100644
> index 58c5447dcbd1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> +++ /dev/null
> @@ -1,539 +0,0 @@
> -/** @file
> -  Implementation for iSCSI Boot Firmware Table publication.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -BOOLEAN mIbftInstalled = FALSE;
> -UINTN   mTableKey;
> -
> -/**
> -  Initialize the header of the iSCSI Boot Firmware Table.
> -
> -  @param[out]  Header     The header of the iSCSI Boot Firmware Table.
> -  @param[in]   OemId      The OEM ID.
> -  @param[in]   OemTableId The OEM table ID for the iBFT.
> -**/
> -VOID
> -IScsiInitIbfTableHeader (
> -  OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER   *Header,
> -  IN  UINT8                                       *OemId,
> -  IN  UINT64                                      *OemTableId
> -  )
> -{
> -  ZeroMem (Header, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER));
> -
> -  Header->Signature =
> EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE;
> -  Header->Length    = IBFT_HEAP_OFFSET;
> -  Header->Revision  = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION;
> -  Header->Checksum  = 0;
> -
> -  CopyMem (Header->OemId, OemId, sizeof (Header->OemId));
> -  CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64));
> -}
> -
> -/**
> -  Initialize the control section of the iSCSI Boot Firmware Table.
> -
> -  @param[in]  Table       The ACPI table.
> -  @param[in]  HandleCount The number of the handles associated with iSCSI
> sessions, it's
> -                          equal to the number of iSCSI sessions.
> -**/
> -VOID
> -IScsiInitControlSection (
> -  IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER  *Table,
> -  IN UINTN                                      HandleCount
> -  )
> -{
> -  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *Control;
> -  UINTN                                                 NumOffset;
> -
> -  Control =
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table
> + 1);
> -
> -  ZeroMem (Control, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE));
> -
> -  Control->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID;
> -  Control->Header.Version     =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION;
> -  Control->Header.Length      = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE);
> -
> -  //
> -  // Each session occupies two offsets, one for the NIC section,
> -  // the other for the Target section.
> -  //
> -  NumOffset = 2 * HandleCount;
> -  if (NumOffset > 4) {
> -    //
> -    // Need expand the control section if more than 2 NIC/Target sections
> -    // exist.
> -    //
> -    Control->Header.Length = (UINT16) (Control->Header.Length +
> (NumOffset - 4) * sizeof (UINT16));
> -  }
> -}
> -
> -/**
> -  Add one item into the heap.
> -
> -  @param[in, out]  Heap  On input, the current address of the heap; On
> output, the address of
> -                         the heap after the item is added.
> -  @param[in]       Data  The data to add into the heap.
> -  @param[in]       Len   Length of the Data in byte.
> -**/
> -VOID
> -IScsiAddHeapItem (
> -  IN OUT UINT8  **Heap,
> -  IN     VOID   *Data,
> -  IN     UINTN  Len
> -  )
> -{
> -  //
> -  // Add one byte for the NULL delimiter.
> -  //
> -  *Heap -= Len + 1;
> -
> -  CopyMem (*Heap, Data, Len);
> -  *(*Heap + Len) = 0;
> -}
> -
> -/**
> -  Fill the Initiator section of the iSCSI Boot Firmware Table.
> -
> -  @param[in]       Table    The ACPI table.
> -  @param[in, out]  Heap     The heap.
> -  @param[in]       Handle   The handle associated with the iSCSI session.
> -**/
> -VOID
> -IScsiFillInitiatorSection (
> -  IN     EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER  *Table,
> -  IN OUT UINT8                                      **Heap,
> -  IN     EFI_HANDLE                                 Handle
> -  )
> -{
> -  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *Control;
> -  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE
> *Initiator;
> -  ISCSI_DRIVER_DATA                                       *DriverData;
> -  ISCSI_SESSION                                           *Session;
> -  ISCSI_PRIVATE_PROTOCOL                                  *IScsiIdentifier;
> -  EFI_STATUS                                              Status;
> -
> -  Control =
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table
> + 1);
> -
> -  //
> -  // Initiator section immediately follows the control section.
> -  //
> -  Initiator =
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *)
> ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length));
> -
> -  Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table);
> -
> -  ZeroMem (Initiator, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE));
> -
> -  Initiator->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID;
> -  Initiator->Header.Version     =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSIO
> N;
> -  Initiator->Header.Length      = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE);
> -  Initiator->Header.Flags       =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_B
> LOCK_VALID |
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_B
> OOT_SELECTED;
> -
> -  //
> -  // Get the identifier from the handle.
> -  //
> -  Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **)
> &IScsiIdentifier);
> -  if (EFI_ERROR (Status)) {
> -    ASSERT (FALSE);
> -    return ;
> -  }
> -
> -  DriverData  = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> -  Session     = &DriverData->Session;
> -
> -  //
> -  // Fill the iSCSI Initiator Name into the heap.
> -  //
> -  IScsiAddHeapItem (Heap, Session->InitiatorName, Session-
> >InitiatorNameLength - 1);
> -
> -  Initiator->IScsiNameLength  = (UINT16) (Session->InitiatorNameLength - 1);
> -  Initiator->IScsiNameOffset  = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -}
> -
> -/**
> -  Map the v4 IP address into v6 IP address.
> -
> -  @param[in]   V4 The v4 IP address.
> -  @param[out]  V6 The v6 IP address.
> -**/
> -VOID
> -IScsiMapV4ToV6Addr (
> -  IN  EFI_IPv4_ADDRESS *V4,
> -  OUT EFI_IPv6_ADDRESS *V6
> -  )
> -{
> -  UINTN Index;
> -
> -  ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS));
> -
> -  V6->Addr[10]  = 0xff;
> -  V6->Addr[11]  = 0xff;
> -
> -  for (Index = 0; Index < 4; Index++) {
> -    V6->Addr[12 + Index] = V4->Addr[Index];
> -  }
> -}
> -
> -/**
> -  Get the NIC's PCI location and return it according to the composited
> -  format defined in iSCSI Boot Firmware Table.
> -
> -  @param[in]  Controller  The handle of the controller.
> -
> -  @return UINT16          The composited representation of the NIC PCI
> location.
> -  @retval 0               Other errors as indicated.
> -**/
> -UINT16
> -IScsiGetNICPciLocation (
> -  IN EFI_HANDLE  Controller
> -  )
> -{
> -  EFI_STATUS                Status;
> -  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
> -  EFI_HANDLE                PciIoHandle;
> -  EFI_PCI_IO_PROTOCOL       *PciIo;
> -  UINTN                     Segment;
> -  UINTN                     Bus;
> -  UINTN                     Device;
> -  UINTN                     Function;
> -
> -  Status = gBS->HandleProtocol (
> -                  Controller,
> -                  &gEfiDevicePathProtocolGuid,
> -                  (VOID **)&DevicePath
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return 0;
> -  }
> -
> -  Status = gBS->LocateDevicePath (
> -                  &gEfiPciIoProtocolGuid,
> -                  &DevicePath,
> -                  &PciIoHandle
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return 0;
> -  }
> -
> -  Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID
> **)&PciIo);
> -  if (EFI_ERROR (Status)) {
> -    return 0;
> -  }
> -
> -  Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
> -  if (EFI_ERROR (Status)) {
> -    return 0;
> -  }
> -
> -  return (UINT16) ((Bus << 8) | (Device << 3) | Function);
> -}
> -
> -/**
> -  Fill the NIC and target sections in iSCSI Boot Firmware Table.
> -
> -  @param[in]       Table       The buffer of the ACPI table.
> -  @param[in, out]  Heap        The heap buffer used to store the variable
> length parameters such as iSCSI name.
> -  @param[in]       HandleCount Count The number of handles having iSCSI
> private protocol installed.
> -  @param[in]       Handles     The handle buffer.
> -**/
> -VOID
> -IScsiFillNICAndTargetSections (
> -  IN     EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER  *Table,
> -  IN OUT UINT8                                      **Heap,
> -  IN     UINTN                                      HandleCount,
> -  IN     EFI_HANDLE                                 *Handles
> -  )
> -{
> -  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *Control;
> -  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE      *Nic;
> -  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE   *Target;
> -  ISCSI_DRIVER_DATA                                     *DriverData;
> -  ISCSI_SESSION_CONFIG_DATA                             *SessionConfigData;
> -  ISCSI_CHAP_AUTH_CONFIG_NVDATA                         *AuthConfig;
> -  UINT16                                                *SectionOffset;
> -  UINTN                                                 Index;
> -  UINT16                                                Length;
> -  EFI_MAC_ADDRESS                                       MacAddress;
> -  UINTN                                                 HwAddressSize;
> -  ISCSI_PRIVATE_PROTOCOL                                *IScsiIdentifier;
> -  EFI_STATUS                                            Status;
> -
> -  //
> -  // Get the offset of the first Nic and Target section.
> -  //
> -  Control =
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table
> + 1);
> -  Nic     = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)
> ((UINTN) Table +
> -          Control->InitiatorOffset + IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));
> -  Target  = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE
> *) ((UINTN) Nic +
> -          IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
> -
> -  SectionOffset = &Control->NIC0Offset;
> -
> -  for (Index = 0; Index < HandleCount; Index++) {
> -    Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID
> **)&IScsiIdentifier);
> -    if (EFI_ERROR (Status)) {
> -      ASSERT (FALSE);
> -      return ;
> -    }
> -
> -    DriverData        = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> -    SessionConfigData = &DriverData->Session.ConfigData;
> -    AuthConfig        = &DriverData->Session.AuthData.AuthConfig;
> -
> -    //
> -    // Fill the Nic section.
> -    //
> -    ZeroMem (Nic, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE));
> -
> -    Nic->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID;
> -    Nic->Header.Version     =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION;
> -    Nic->Header.Length      = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE);
> -    Nic->Header.Index       = (UINT8) Index;
> -    Nic->Header.Flags       =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_
> VALID |
> -
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_S
> ELECTED |
> -
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;
> -
> -    //
> -    // Get the subnet mask prefix length.
> -    //
> -    Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength
> (&SessionConfigData->NvData.SubnetMask);
> -
> -    if (SessionConfigData->NvData.InitiatorInfoFromDhcp) {
> -      Nic->Origin = IpPrefixOriginDhcp;
> -    } else {
> -      Nic->Origin = IpPrefixOriginManual;
> -    }
> -    //
> -    // Map the various v4 addresses into v6 addresses.
> -    //
> -    IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip);
> -    IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic-
> >Gateway);
> -    IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic-
> >PrimaryDns);
> -    IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic-
> >SecondaryDns);
> -    IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic-
> >DhcpServer);
> -
> -    Nic->VLanTag = NetLibGetVlanId (DriverData->Controller);
> -
> -    Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress,
> &HwAddressSize);
> -    ASSERT (Status == EFI_SUCCESS);
> -    CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac));
> -
> -    //
> -    // Get the PCI location of the Nic.
> -    //
> -    Nic->PciLocation  = IScsiGetNICPciLocation (DriverData->Controller);
> -
> -    *SectionOffset    = (UINT16) ((UINTN) Nic - (UINTN) Table);
> -    SectionOffset++;
> -
> -    //
> -    // Fill the Target section.
> -    //
> -    ZeroMem (Target, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE));
> -
> -    Target->Header.StructureId  =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID;
> -    Target->Header.Version      =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION;
> -    Target->Header.Length       = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);
> -    Target->Header.Index        = (UINT8) Index;
> -    Target->Header.Flags        =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLO
> CK_VALID |
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOO
> T_SELECTED;
> -    Target->Port                = SessionConfigData->NvData.TargetPort;
> -    Target->NicIndex            = (UINT8) Index;
> -
> -    if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) {
> -      Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_NO_CHAP;
> -    } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
> -      Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_CHAP;
> -    } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
> -      Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_MUTUAL_CHAP;
> -    }
> -
> -    IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target-
> >Ip);
> -    CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof
> (Target->BootLun));
> -
> -    //
> -    // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret.
> -    //
> -    Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName);
> -    IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName,
> Length);
> -
> -    Target->IScsiNameLength = Length;
> -    Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> -    if (Target->CHAPType !=
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_NO_CHAP) {
> -      //
> -      // CHAP Name
> -      //
> -      Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName);
> -      IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length);
> -      Target->CHAPNameLength  = Length;
> -      Target->CHAPNameOffset  = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> -      //
> -      // CHAP Secret
> -      //
> -      Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret);
> -      IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length);
> -      Target->CHAPSecretLength  = Length;
> -      Target->CHAPSecretOffset  = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> -      if (Target->CHAPType ==
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_MUTUAL_CHAP) {
> -        //
> -        // Reverse CHAP Name
> -        //
> -        Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName);
> -        IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length);
> -        Target->ReverseCHAPNameLength = Length;
> -        Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN)
> Table);
> -
> -        //
> -        // Reverse CHAP Secret
> -        //
> -        Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret);
> -        IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length);
> -        Target->ReverseCHAPSecretLength = Length;
> -        Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap -
> (UINTN) Table);
> -      }
> -    }
> -
> -    *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table);
> -    SectionOffset++;
> -
> -    //
> -    // Advance to the next NIC/Target pair
> -    //
> -    Nic    = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)
> ((UINTN) Target +
> -           IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));
> -    Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE
> *) ((UINTN) Nic +
> -           IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
> -  }
> -}
> -
> -/**
> -  Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
> -  session status.
> -**/
> -VOID
> -IScsiPublishIbft (
> -  VOID
> -  )
> -{
> -  EFI_STATUS                                Status;
> -  EFI_ACPI_TABLE_PROTOCOL                   *AcpiTableProtocol;
> -  EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table;
> -  UINTN                                     HandleCount;
> -  EFI_HANDLE                                *HandleBuffer;
> -  UINT8                                     *Heap;
> -  UINT8                                     Checksum;
> -  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;
> -  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;
> -  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;
> -
> -  Rsdt = NULL;
> -  Xsdt = NULL;
> -
> -  Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID
> **)&AcpiTableProtocol);
> -  if (EFI_ERROR (Status)) {
> -    return ;
> -  }
> -
> -
> -  //
> -  // Find ACPI table RSD_PTR from system table
> -  //
> -  Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **)
> &Rsdp);
> -  if (EFI_ERROR (Status)) {
> -    Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID
> **) &Rsdp);
> -  }
> -
> -  if (EFI_ERROR (Status) || (Rsdp == NULL)) {
> -    return ;
> -  } else if (Rsdp->Revision >=
> EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp-
> >XsdtAddress != 0) {
> -    Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;
> -  } else if (Rsdp->RsdtAddress != 0) {
> -    Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;
> -  }
> -
> -  if ((Xsdt == NULL) && (Rsdt == NULL)) {
> -    return ;
> -  }
> -
> -  if (mIbftInstalled) {
> -    Status = AcpiTableProtocol->UninstallAcpiTable (
> -                                  AcpiTableProtocol,
> -                                  mTableKey
> -                                  );
> -    if (EFI_ERROR (Status)) {
> -      return ;
> -    }
> -    mIbftInstalled = FALSE;
> -  }
> -
> -  //
> -  // Get all iSCSI private protocols.
> -  //
> -  Status = gBS->LocateHandleBuffer (
> -                  ByProtocol,
> -                  &gEfiCallerIdGuid,
> -                  NULL,
> -                  &HandleCount,
> -                  &HandleBuffer
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return ;
> -  }
> -  //
> -  // Allocate 4k bytes to hold the ACPI table.
> -  //
> -  Table = AllocateZeroPool (IBFT_MAX_SIZE);
> -  if (Table == NULL) {
> -    return ;
> -  }
> -
> -  Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET;
> -
> -  //
> -  // Fill in the various section of the iSCSI Boot Firmware Table.
> -  //
> -  if (Rsdp->Revision >=
> EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {
> -    IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId);
> -  } else {
> -    IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId);
> -  }
> -
> -  IScsiInitControlSection (Table, HandleCount);
> -  IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]);
> -  IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer);
> -
> -  Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);
> -  Table->Checksum = Checksum;
> -
> -  FreePool (HandleBuffer);
> -
> -  //
> -  // Install or update the iBFT table.
> -  //
> -  Status = AcpiTableProtocol->InstallAcpiTable (
> -                                AcpiTableProtocol,
> -                                Table,
> -                                Table->Length,
> -                                &mTableKey
> -                                );
> -  if (EFI_ERROR(Status)) {
> -    return;
> -  }
> -
> -  mIbftInstalled = TRUE;
> -  FreePool (Table);
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> deleted file mode 100644
> index e753d9eebdbe..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> +++ /dev/null
> @@ -1,116 +0,0 @@
> -/** @file
> -  Implementation for EFI iSCSI Initiator Name Protocol.
> -
> -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
> -  IScsiGetInitiatorName,
> -  IScsiSetInitiatorName
> -};
> -
> -/**
> -  Retrieves the current set value of iSCSI Initiator Name.
> -
> -  @param[in]       This       Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> -  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer
> / Actual size of the
> -                              variable data buffer.
> -  @param[out]      Buffer     Pointer to the buffer for data to be read. The data
> is a null-terminated UTF-8 encoded string.
> -                              The maximum length is 223 characters, including the null-
> terminator.
> -
> -  @retval EFI_SUCCESS           Data was successfully retrieved into the
> provided buffer and the
> -                                BufferSize was sufficient to handle the iSCSI initiator name.
> -  @retval EFI_BUFFER_TOO_SMALL  BufferSize is too small for the result.
> -  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> -  @retval EFI_DEVICE_ERROR      The iSCSI initiator name could not be
> retrieved due to a hardware error.
> -  @retval Others                Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> -  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
> -  IN OUT UINTN                              *BufferSize,
> -  OUT    VOID                               *Buffer
> -  )
> -{
> -  EFI_STATUS  Status;
> -
> -  if ((BufferSize == NULL) || (Buffer == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Status = gRT->GetVariable (
> -                  ISCSI_INITIATOR_NAME_VAR_NAME,
> -                  &gEfiIScsiInitiatorNameProtocolGuid,
> -                  NULL,
> -                  BufferSize,
> -                  Buffer
> -                  );
> -
> -  return Status;
> -}
> -
> -/**
> -  Sets the iSCSI Initiator Name.
> -
> -  @param[in]       This       Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> -  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer.
> -  @param[in]       Buffer     Pointer to the buffer for data to be written. The
> data is a null-terminated UTF-8 encoded string.
> -                              The maximum length is 223 characters, including the null-
> terminator.
> -
> -  @retval EFI_SUCCESS           Data was successfully stored by the protocol.
> -  @retval EFI_UNSUPPORTED       Platform policies do not allow for data to be
> written.
> -                                Currently not implemented.
> -  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or
> BufferSize exceeds the maximum allowed limit.
> -  @retval EFI_DEVICE_ERROR      The data could not be stored due to a
> hardware error.
> -  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold
> the data.
> -  @retval EFI_PROTOCOL_ERROR    Input iSCSI initiator name does not
> adhere to RFC 3720
> -                                (and other related protocols).
> -  @retval Others                Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> -  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
> -  IN OUT UINTN                              *BufferSize,
> -  IN     VOID                               *Buffer
> -  )
> -{
> -  EFI_STATUS  Status;
> -
> -  if ((BufferSize == NULL) || (Buffer == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if (*BufferSize > ISCSI_NAME_MAX_SIZE) {
> -    *BufferSize = ISCSI_NAME_MAX_SIZE;
> -    return EFI_INVALID_PARAMETER;
> -  }
> -  //
> -  // only support iqn iSCSI names.
> -  //
> -  Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  Status = gRT->SetVariable (
> -                  ISCSI_INITIATOR_NAME_VAR_NAME,
> -                  &gEfiIScsiInitiatorNameProtocolGuid,
> -                  EFI_VARIABLE_NON_VOLATILE |
> EFI_VARIABLE_BOOTSERVICE_ACCESS,
> -                  *BufferSize,
> -                  Buffer
> -                  );
> -
> -  return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> deleted file mode 100644
> index d924a8b82427..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> +++ /dev/null
> @@ -1,948 +0,0 @@
> -/** @file
> -  Miscellaneous routines for iSCSI driver.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8  IScsiHexString[] =
> "0123456789ABCDEFabcdef";
> -
> -/**
> -  Removes (trims) specified leading and trailing characters from a string.
> -
> -  @param[in, out]  Str  Pointer to the null-terminated string to be trimmed.
> On return,
> -                        Str will hold the trimmed string.
> -
> -  @param[in]      CharC Character will be trimmed from str.
> -**/
> -VOID
> -StrTrim (
> -  IN OUT CHAR16   *Str,
> -  IN     CHAR16   CharC
> -  )
> -{
> -  CHAR16  *Pointer1;
> -  CHAR16  *Pointer2;
> -
> -  if (*Str == 0) {
> -    return;
> -  }
> -
> -  //
> -  // Trim off the leading and trailing characters c
> -  //
> -  for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) {
> -    ;
> -  }
> -
> -  Pointer2 = Str;
> -  if (Pointer2 == Pointer1) {
> -    while (*Pointer1 != 0) {
> -      Pointer2++;
> -      Pointer1++;
> -    }
> -  } else {
> -    while (*Pointer1 != 0) {
> -    *Pointer2 = *Pointer1;
> -    Pointer1++;
> -    Pointer2++;
> -    }
> -    *Pointer2 = 0;
> -  }
> -
> -
> -  for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC;
> Pointer1--) {
> -    ;
> -  }
> -  if  (Pointer1 !=  Str + StrLen(Str) - 1) {
> -    *(Pointer1 + 1) = 0;
> -  }
> -}
> -
> -/**
> -  Calculate the prefix length of the IPv4 subnet mask.
> -
> -  @param[in]  SubnetMask The IPv4 subnet mask.
> -
> -  @return The prefix length of the subnet mask.
> -  @retval 0 Other errors as indicated.
> -**/
> -UINT8
> -IScsiGetSubnetMaskPrefixLength (
> -  IN EFI_IPv4_ADDRESS  *SubnetMask
> -  )
> -{
> -  UINT8   Len;
> -  UINT32  ReverseMask;
> -
> -  //
> -  // The SubnetMask is in network byte order.
> -  //
> -  ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] <<
> 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);
> -
> -  //
> -  // Reverse it.
> -  //
> -  ReverseMask = ~ReverseMask;
> -
> -  if ((ReverseMask & (ReverseMask + 1)) != 0) {
> -    return 0;
> -  }
> -
> -  Len = 0;
> -
> -  while (ReverseMask != 0) {
> -    ReverseMask = ReverseMask >> 1;
> -    Len++;
> -  }
> -
> -  return (UINT8) (32 - Len);
> -}
> -
> -/**
> -  Convert the hexadecimal encoded LUN string into the 64-bit LUN.
> -
> -  @param[in]   Str             The hexadecimal encoded LUN string.
> -  @param[out]  Lun             Storage to return the 64-bit LUN.
> -
> -  @retval EFI_SUCCESS           The 64-bit LUN is stored in Lun.
> -  @retval EFI_INVALID_PARAMETER The string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToLun (
> -  IN  CHAR8  *Str,
> -  OUT UINT8  *Lun
> -  )
> -{
> -  UINTN   Index, IndexValue, IndexNum, SizeStr;
> -  CHAR8   TemStr[2];
> -  UINT8   TemValue;
> -  UINT16  Value[4];
> -
> -  ZeroMem (Lun, 8);
> -  ZeroMem (TemStr, 2);
> -  ZeroMem ((UINT8 *) Value, sizeof (Value));
> -  SizeStr    = AsciiStrLen (Str);
> -  IndexValue = 0;
> -  IndexNum   = 0;
> -
> -  for (Index = 0; Index < SizeStr; Index ++) {
> -    TemStr[0] = Str[Index];
> -    TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);
> -    if (TemValue == 0 && TemStr[0] != '0') {
> -      if ((TemStr[0] != '-') || (IndexNum == 0)) {
> -        //
> -        // Invalid Lun Char
> -        //
> -        return EFI_INVALID_PARAMETER;
> -      }
> -    }
> -
> -    if ((TemValue == 0) && (TemStr[0] == '-')) {
> -      //
> -      // Next Lun value
> -      //
> -      if (++IndexValue >= 4) {
> -        //
> -        // Max 4 Lun value
> -        //
> -        return EFI_INVALID_PARAMETER;
> -      }
> -      //
> -      // Restart str index for the next lun value
> -      //
> -      IndexNum = 0;
> -      continue;
> -    }
> -
> -    if (++IndexNum > 4) {
> -      //
> -      // Each Lun Str can't exceed size 4, because it will be as UINT16 value
> -      //
> -      return EFI_INVALID_PARAMETER;
> -    }
> -
> -    //
> -    // Combine UINT16 value
> -    //
> -    Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);
> -  }
> -
> -  for (Index = 0; Index <= IndexValue; Index ++) {
> -    *((UINT16 *) &Lun[Index * 2]) =  HTONS (Value[Index]);
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Convert the 64-bit LUN into the hexadecimal encoded LUN string.
> -
> -  @param[in]   Lun The 64-bit LUN.
> -  @param[out]  Str The storage to return the hexadecimal encoded LUN
> string.
> -**/
> -VOID
> -IScsiLunToUnicodeStr (
> -  IN UINT8    *Lun,
> -  OUT CHAR16  *Str
> -  )
> -{
> -  UINTN   Index;
> -  CHAR16  *TempStr;
> -
> -  TempStr = Str;
> -
> -  for (Index = 0; Index < 4; Index++) {
> -
> -    if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) {
> -      CopyMem(TempStr, L"0-", sizeof (L"0-"));
> -    } else {
> -      TempStr[0]  = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4];
> -      TempStr[1]  = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F];
> -      TempStr[2]  = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4];
> -      TempStr[3]  = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F];
> -      TempStr[4]  = L'-';
> -      TempStr[5]  = 0;
> -
> -      StrTrim (TempStr, L'0');
> -    }
> -
> -    TempStr += StrLen (TempStr);
> -  }
> -
> -  ASSERT (StrLen(Str) >= 1);
> -  Str[StrLen (Str) - 1] = 0;
> -
> -  for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) {
> -    if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) {
> -      Str[Index - 1] = 0;
> -    } else {
> -      break;
> -    }
> -  }
> -}
> -
> -/**
> -  Convert the ASCII string into a UNICODE string.
> -
> -  @param[in]   Source      The ASCII string.
> -  @param[out]  Destination The storage to return the UNICODE string.
> -
> -  @return CHAR16 *         Pointer to the UNICODE string.
> -**/
> -CHAR16 *
> -IScsiAsciiStrToUnicodeStr (
> -  IN  CHAR8   *Source,
> -  OUT CHAR16  *Destination
> -  )
> -{
> -  ASSERT (Destination != NULL);
> -  ASSERT (Source != NULL);
> -
> -  while (*Source != '\0') {
> -    *(Destination++) = (CHAR16) *(Source++);
> -  }
> -
> -  *Destination = '\0';
> -
> -  return Destination;
> -}
> -
> -/**
> -  Convert the UNICODE string into an ASCII string.
> -
> -  @param[in]  Source       The UNICODE string.
> -  @param[out] Destination  The storage to return the ASCII string.
> -
> -  @return CHAR8 *          Pointer to the ASCII string.
> -**/
> -CHAR8 *
> -IScsiUnicodeStrToAsciiStr (
> -  IN  CHAR16  *Source,
> -  OUT CHAR8   *Destination
> -  )
> -{
> -  ASSERT (Destination != NULL);
> -  ASSERT (Source != NULL);
> -
> -  while (*Source != '\0') {
> -    //
> -    // If any Unicode characters in Source contain
> -    // non-zero value in the upper 8 bits, then ASSERT().
> -    //
> -    ASSERT (*Source < 0x100);
> -    *(Destination++) = (CHAR8) *(Source++);
> -  }
> -
> -  *Destination = '\0';
> -
> -  return Destination;
> -}
> -
> -/**
> -  Convert the decimal dotted IPv4 address into the binary IPv4 address.
> -
> -  @param[in]   Str             The UNICODE string.
> -  @param[out]  Ip              The storage to return the ASCII string.
> -
> -  @retval EFI_SUCCESS           The binary IP address is returned in Ip.
> -  @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToIp (
> -  IN  CHAR8             *Str,
> -  OUT EFI_IPv4_ADDRESS  *Ip
> -  )
> -{
> -  UINTN Index;
> -  UINTN Number;
> -
> -  Index = 0;
> -
> -  while (*Str != 0) {
> -
> -    if (Index > 3) {
> -      return EFI_INVALID_PARAMETER;
> -    }
> -
> -    Number = 0;
> -    while (NET_IS_DIGIT (*Str)) {
> -      Number = Number * 10 + (*Str - '0');
> -      Str++;
> -    }
> -
> -    if (Number > 0xFF) {
> -      return EFI_INVALID_PARAMETER;
> -    }
> -
> -    Ip->Addr[Index] = (UINT8) Number;
> -
> -    if ((*Str != '\0') && (*Str != '.')) {
> -      //
> -      // The current character should be either the NULL terminator or
> -      // the dot delimiter.
> -      //
> -      return EFI_INVALID_PARAMETER;
> -    }
> -
> -    if (*Str == '.') {
> -      //
> -      // Skip the delimiter.
> -      //
> -      Str++;
> -    }
> -
> -    Index++;
> -  }
> -
> -  if (Index != 4) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Convert the mac address into a hexadecimal encoded "-" seperated string.
> -
> -  @param[in]  Mac     The mac address.
> -  @param[in]  Len     Length in bytes of the mac address.
> -  @param[in]  VlanId  VLAN ID of the network device.
> -  @param[out] Str     The storage to return the mac string.
> -**/
> -VOID
> -IScsiMacAddrToStr (
> -  IN  EFI_MAC_ADDRESS  *Mac,
> -  IN  UINT32           Len,
> -  IN  UINT16           VlanId,
> -  OUT CHAR16           *Str
> -  )
> -{
> -  UINT32  Index;
> -  CHAR16  *String;
> -
> -  for (Index = 0; Index < Len; Index++) {
> -    Str[3 * Index]      = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) &
> 0x0F];
> -    Str[3 * Index + 1]  = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F];
> -    Str[3 * Index + 2]  = L'-';
> -  }
> -
> -  String = &Str[3 * Index - 1] ;
> -  if (VlanId != 0) {
> -    String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN)
> VlanId);
> -  }
> -
> -  *String = L'\0';
> -}
> -
> -/**
> -  Convert the binary encoded buffer into a hexadecimal encoded string.
> -
> -  @param[in]       BinBuffer   The buffer containing the binary data.
> -  @param[in]       BinLength   Length of the binary buffer.
> -  @param[in, out]  HexStr      Pointer to the string.
> -  @param[in, out]  HexLength   The length of the string.
> -
> -  @retval EFI_SUCCESS          The binary data is converted to the hexadecimal
> string
> -                               and the length of the string is updated.
> -  @retval EFI_BUFFER_TOO_SMALL The string is too small.
> -  @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiBinToHex (
> -  IN     UINT8  *BinBuffer,
> -  IN     UINT32 BinLength,
> -  IN OUT CHAR8  *HexStr,
> -  IN OUT UINT32 *HexLength
> -  )
> -{
> -  UINTN Index;
> -
> -  if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if (((*HexLength) - 3) < BinLength * 2) {
> -    *HexLength = BinLength * 2 + 3;
> -    return EFI_BUFFER_TOO_SMALL;
> -  }
> -
> -  *HexLength = BinLength * 2 + 3;
> -  //
> -  // Prefix for Hex String
> -  //
> -  HexStr[0] = '0';
> -  HexStr[1] = 'x';
> -
> -  for (Index = 0; Index < BinLength; Index++) {
> -    HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4];
> -    HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F];
> -  }
> -
> -  HexStr[Index * 2 + 2] = '\0';
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Convert the hexadecimal string into a binary encoded buffer.
> -
> -  @param[in, out]  BinBuffer   The binary buffer.
> -  @param[in, out]  BinLength   Length of the binary buffer.
> -  @param[in]       HexStr      The hexadecimal string.
> -
> -  @retval EFI_SUCCESS          The hexadecimal string is converted into a binary
> -                               encoded buffer.
> -  @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the
> converted data.
> -**/
> -EFI_STATUS
> -IScsiHexToBin (
> -  IN OUT UINT8  *BinBuffer,
> -  IN OUT UINT32 *BinLength,
> -  IN     CHAR8  *HexStr
> -  )
> -{
> -  UINTN   Index;
> -  UINTN   Length;
> -  UINT8   Digit;
> -  CHAR8   TemStr[2];
> -
> -  ZeroMem (TemStr, sizeof (TemStr));
> -
> -  //
> -  // Find out how many hex characters the string has.
> -  //
> -  if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {
> -    HexStr += 2;
> -  }
> -
> -  Length = AsciiStrLen (HexStr);
> -
> -  for (Index = 0; Index < Length; Index ++) {
> -    TemStr[0] = HexStr[Index];
> -    Digit = (UINT8) AsciiStrHexToUint64 (TemStr);
> -    if (Digit == 0 && TemStr[0] != '0') {
> -      //
> -      // Invalid Lun Char
> -      //
> -      break;
> -    }
> -    if ((Index & 1) == 0) {
> -      BinBuffer [Index/2] = Digit;
> -    } else {
> -      BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);
> -    }
> -  }
> -
> -  *BinLength = (UINT32) ((Index + 1)/2);
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Generate random numbers.
> -
> -  @param[in, out]  Rand       The buffer to contain random numbers.
> -  @param[in]       RandLength The length of the Rand buffer.
> -**/
> -VOID
> -IScsiGenRandom (
> -  IN OUT UINT8  *Rand,
> -  IN     UINTN  RandLength
> -  )
> -{
> -  UINT32  Random;
> -
> -  while (RandLength > 0) {
> -    Random  = NET_RANDOM (NetRandomInitSeed ());
> -    *Rand++ = (UINT8) (Random);
> -    RandLength--;
> -  }
> -}
> -
> -/**
> -  Create the iSCSI driver data..
> -
> -  @param[in] Image      The handle of the driver image.
> -  @param[in] Controller The handle of the controller.
> -
> -  @return The iSCSI driver data created.
> -  @retval NULL Other errors as indicated.
> -**/
> -ISCSI_DRIVER_DATA *
> -IScsiCreateDriverData (
> -  IN EFI_HANDLE  Image,
> -  IN EFI_HANDLE  Controller
> -  )
> -{
> -  ISCSI_DRIVER_DATA *Private;
> -  EFI_STATUS        Status;
> -
> -  Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA));
> -  if (Private == NULL) {
> -    return NULL;
> -  }
> -
> -  Private->Signature  = ISCSI_DRIVER_DATA_SIGNATURE;
> -  Private->Image      = Image;
> -  Private->Controller = Controller;
> -
> -  //
> -  // Create an event to be signal when the BS to RT transition is triggerd so
> -  // as to abort the iSCSI session.
> -  //
> -  Status = gBS->CreateEventEx (
> -                  EVT_NOTIFY_SIGNAL,
> -                  TPL_CALLBACK,
> -                  IScsiOnExitBootService,
> -                  Private,
> -                  &gEfiEventExitBootServicesGuid,
> -                  &Private->ExitBootServiceEvent
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    FreePool (Private);
> -    return NULL;
> -  }
> -
> -  CopyMem(&Private->IScsiExtScsiPassThru,
> &gIScsiExtScsiPassThruProtocolTemplate,
> sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL));
> -
> -  //
> -  // 0 is designated to the TargetId, so use another value for the AdapterId.
> -  //
> -  Private->ExtScsiPassThruMode.AdapterId = 2;
> -  Private->ExtScsiPassThruMode.Attributes =
> EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL |
> EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;
> -  Private->ExtScsiPassThruMode.IoAlign  = 4;
> -  Private->IScsiExtScsiPassThru.Mode    = &Private->ExtScsiPassThruMode;
> -
> -  //
> -  // Install the Ext SCSI PASS THRU protocol.
> -  //
> -  Status = gBS->InstallProtocolInterface (
> -                  &Private->ExtScsiPassThruHandle,
> -                  &gEfiExtScsiPassThruProtocolGuid,
> -                  EFI_NATIVE_INTERFACE,
> -                  &Private->IScsiExtScsiPassThru
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    gBS->CloseEvent (Private->ExitBootServiceEvent);
> -    FreePool (Private);
> -
> -    return NULL;
> -  }
> -
> -  IScsiSessionInit (&Private->Session, FALSE);
> -
> -  return Private;
> -}
> -
> -/**
> -  Clean the iSCSI driver data.
> -
> -  @param[in]              Private The iSCSI driver data.
> -
> -  @retval EFI_SUCCESS     The clean operation is successful.
> -  @retval Others          Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiCleanDriverData (
> -  IN ISCSI_DRIVER_DATA  *Private
> -  )
> -{
> -  EFI_STATUS             Status;
> -
> -  Status = EFI_SUCCESS;
> -
> -  if (Private->DevicePath != NULL) {
> -    Status = gBS->UninstallProtocolInterface (
> -                    Private->ExtScsiPassThruHandle,
> -                    &gEfiDevicePathProtocolGuid,
> -                    Private->DevicePath
> -                    );
> -    if (EFI_ERROR (Status)) {
> -      goto EXIT;
> -    }
> -
> -    FreePool (Private->DevicePath);
> -  }
> -
> -  if (Private->ExtScsiPassThruHandle != NULL) {
> -    Status = gBS->UninstallProtocolInterface (
> -                    Private->ExtScsiPassThruHandle,
> -                    &gEfiExtScsiPassThruProtocolGuid,
> -                    &Private->IScsiExtScsiPassThru
> -                    );
> -  }
> -
> -EXIT:
> -  if (Private->ExitBootServiceEvent != NULL) {
> -    gBS->CloseEvent (Private->ExitBootServiceEvent);
> -  }
> -
> -  FreePool (Private);
> -  return Status;
> -}
> -
> -/**
> -  Check wheather the Controller is configured to use DHCP protocol.
> -
> -  @param[in]  Controller           The handle of the controller.
> -
> -  @retval TRUE                     The handle of the controller need the Dhcp
> protocol.
> -  @retval FALSE                    The handle of the controller does not need the
> Dhcp protocol.
> -
> -**/
> -BOOLEAN
> -IScsiDhcpIsConfigured (
> -  IN EFI_HANDLE  Controller
> -  )
> -{
> -  EFI_STATUS                  Status;
> -  EFI_MAC_ADDRESS             MacAddress;
> -  UINTN                       HwAddressSize;
> -  UINT16                      VlanId;
> -  CHAR16                      MacString[70];
> -  ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp;
> -
> -  //
> -  // Get the mac string, it's the name of various variable
> -  //
> -  Status = NetLibGetMacAddress (Controller, &MacAddress,
> &HwAddressSize);
> -  if (EFI_ERROR (Status)) {
> -    return FALSE;
> -  }
> -  VlanId = NetLibGetVlanId (Controller);
> -  IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> -  //
> -  // Get the normal configuration.
> -  //
> -  Status = GetVariable2 (
> -             MacString,
> -             &gEfiIScsiInitiatorNameProtocolGuid,
> -             (VOID**)&ConfigDataTmp,
> -             NULL
> -             );
> -  if (ConfigDataTmp == NULL || EFI_ERROR (Status)) {
> -    return FALSE;
> -  }
> -
> -  if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) {
> -    FreePool (ConfigDataTmp);
> -    return TRUE;
> -  }
> -
> -  FreePool (ConfigDataTmp);
> -  return FALSE;
> -}
> -
> -/**
> -  Get the various configuration data of this iSCSI instance.
> -
> -  @param[in]  Private   The iSCSI driver data.
> -
> -  @retval EFI_SUCCESS   The configuration of this instance is got.
> -  @retval EFI_ABORTED   The operation was aborted.
> -  @retval Others        Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiGetConfigData (
> -  IN ISCSI_DRIVER_DATA  *Private
> -  )
> -{
> -  EFI_STATUS                  Status;
> -  ISCSI_SESSION               *Session;
> -  UINTN                       BufferSize;
> -  EFI_MAC_ADDRESS             MacAddress;
> -  UINTN                       HwAddressSize;
> -  UINT16                      VlanId;
> -  CHAR16                      MacString[70];
> -
> -  //
> -  // get the iSCSI Initiator Name
> -  //
> -  Session                       = &Private->Session;
> -  Session->InitiatorNameLength  = ISCSI_NAME_MAX_SIZE;
> -  Status = gIScsiInitiatorName.Get (
> -                                &gIScsiInitiatorName,
> -                                &Session->InitiatorNameLength,
> -                                Session->InitiatorName
> -                                );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  //
> -  // Get the mac string, it's the name of various variable
> -  //
> -  Status = NetLibGetMacAddress (Private->Controller, &MacAddress,
> &HwAddressSize);
> -  ASSERT (Status == EFI_SUCCESS);
> -  VlanId = NetLibGetVlanId (Private->Controller);
> -  IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> -  //
> -  // Get the normal configuration.
> -  //
> -  BufferSize = sizeof (Session->ConfigData.NvData);
> -  Status = gRT->GetVariable (
> -                  MacString,
> -                  &gEfiIScsiInitiatorNameProtocolGuid,
> -                  NULL,
> -                  &BufferSize,
> -                  &Session->ConfigData.NvData
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  if (!Session->ConfigData.NvData.Enabled) {
> -    return EFI_ABORTED;
> -  }
> -  //
> -  // Get the CHAP Auth information.
> -  //
> -  BufferSize = sizeof (Session->AuthData.AuthConfig);
> -  Status = gRT->GetVariable (
> -                  MacString,
> -                  &gIScsiCHAPAuthInfoGuid,
> -                  NULL,
> -                  &BufferSize,
> -                  &Session->AuthData.AuthConfig
> -                  );
> -
> -  if (!EFI_ERROR (Status) && Session-
> >ConfigData.NvData.InitiatorInfoFromDhcp) {
> -    //
> -    // Start dhcp.
> -    //
> -    Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session-
> >ConfigData);
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Get the device path of the iSCSI tcp connection and update it.
> -
> -  @param[in]  Private The iSCSI driver data.
> -
> -  @return The updated device path.
> -  @retval NULL Other errors as indicated.
> -**/
> -EFI_DEVICE_PATH_PROTOCOL *
> -IScsiGetTcpConnDevicePath (
> -  IN ISCSI_DRIVER_DATA  *Private
> -  )
> -{
> -  ISCSI_SESSION             *Session;
> -  ISCSI_CONNECTION          *Conn;
> -  TCP4_IO                   *Tcp4Io;
> -  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
> -  EFI_STATUS                Status;
> -  EFI_DEV_PATH              *DPathNode;
> -
> -  Session = &Private->Session;
> -  if (Session->State != SESSION_STATE_LOGGED_IN) {
> -    return NULL;
> -  }
> -
> -  Conn = NET_LIST_USER_STRUCT_S (
> -          Session->Conns.ForwardLink,
> -          ISCSI_CONNECTION,
> -          Link,
> -          ISCSI_CONNECTION_SIGNATURE
> -          );
> -  Tcp4Io = &Conn->Tcp4Io;
> -
> -  Status = gBS->HandleProtocol (
> -                  Tcp4Io->Handle,
> -                  &gEfiDevicePathProtocolGuid,
> -                  (VOID **)&DevicePath
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    return NULL;
> -  }
> -  //
> -  // Duplicate it.
> -  //
> -  DevicePath  = DuplicateDevicePath (DevicePath);
> -  if (DevicePath == NULL) {
> -    return NULL;
> -  }
> -
> -  DPathNode   = (EFI_DEV_PATH *) DevicePath;
> -
> -  while (!IsDevicePathEnd (&DPathNode->DevPath)) {
> -    if ((DevicePathType (&DPathNode->DevPath) ==
> MESSAGING_DEVICE_PATH) &&
> -        (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP)
> -        ) {
> -
> -      DPathNode->Ipv4.LocalPort       = 0;
> -      DPathNode->Ipv4.StaticIpAddress =
> -        (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp);
> -
> -      //
> -      //  Add a judgement here to support previous versions of
> IPv4_DEVICE_PATH.
> -      //  In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and
> SubnetMask
> -      //  do not exist.
> -      //  In new version of IPv4_DEVICE_PATH, structcure length is 27.
> -      //
> -      if (DevicePathNodeLength (&DPathNode->Ipv4) ==
> IP4_NODE_LEN_NEW_VERSIONS) {
> -
> -        IP4_COPY_ADDRESS (
> -          &DPathNode->Ipv4.GatewayIpAddress,
> -          &Session->ConfigData.NvData.Gateway
> -          );
> -
> -        IP4_COPY_ADDRESS (
> -          &DPathNode->Ipv4.SubnetMask,
> -          &Session->ConfigData.NvData.SubnetMask
> -          );
> -      }
> -
> -      break;
> -    }
> -
> -    DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode-
> >DevPath);
> -  }
> -
> -  return DevicePath;
> -}
> -
> -/**
> -  Abort the session when the transition from BS to RT is initiated.
> -
> -  @param[in]   Event  The event signaled.
> -  @param[in]  Context The iSCSI driver data.
> -**/
> -VOID
> -EFIAPI
> -IScsiOnExitBootService (
> -  IN EFI_EVENT  Event,
> -  IN VOID       *Context
> -  )
> -{
> -  ISCSI_DRIVER_DATA *Private;
> -
> -  Private = (ISCSI_DRIVER_DATA *) Context;
> -
> -  gBS->CloseEvent (Private->ExitBootServiceEvent);
> -  Private->ExitBootServiceEvent = NULL;
> -
> -  IScsiSessionAbort (&Private->Session);
> -}
> -
> -/**
> -  Tests whether a controller handle is being managed by IScsi driver.
> -
> -  This function tests whether the driver specified by DriverBindingHandle is
> -  currently managing the controller specified by ControllerHandle.  This test
> -  is performed by evaluating if the the protocol specified by ProtocolGuid is
> -  present on ControllerHandle and is was opened by DriverBindingHandle
> and Nic
> -  Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
> -  If ProtocolGuid is NULL, then ASSERT().
> -
> -  @param  ControllerHandle     A handle for a controller to test.
> -  @param  DriverBindingHandle  Specifies the driver binding handle for the
> -                               driver.
> -  @param  ProtocolGuid         Specifies the protocol that the driver specified
> -                               by DriverBindingHandle opens in its Start()
> -                               function.
> -
> -  @retval EFI_SUCCESS          ControllerHandle is managed by the driver
> -                               specified by DriverBindingHandle.
> -  @retval EFI_UNSUPPORTED      ControllerHandle is not managed by the
> driver
> -                               specified by DriverBindingHandle.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiTestManagedDevice (
> -  IN  EFI_HANDLE       ControllerHandle,
> -  IN  EFI_HANDLE       DriverBindingHandle,
> -  IN  EFI_GUID         *ProtocolGuid
> -  )
> -{
> -  EFI_STATUS     Status;
> -  VOID           *ManagedInterface;
> -  EFI_HANDLE     NicControllerHandle;
> -
> -  ASSERT (ProtocolGuid != NULL);
> -
> -  NicControllerHandle = NetLibGetNicHandle (ControllerHandle,
> ProtocolGuid);
> -  if (NicControllerHandle == NULL) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  Status = gBS->OpenProtocol (
> -                  ControllerHandle,
> -                  (EFI_GUID *) ProtocolGuid,
> -                  &ManagedInterface,
> -                  DriverBindingHandle,
> -                  NicControllerHandle,
> -                  EFI_OPEN_PROTOCOL_BY_DRIVER
> -                  );
> -  if (!EFI_ERROR (Status)) {
> -    gBS->CloseProtocol (
> -           ControllerHandle,
> -           (EFI_GUID *) ProtocolGuid,
> -           DriverBindingHandle,
> -           NicControllerHandle
> -           );
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  if (Status != EFI_ALREADY_STARTED) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> deleted file mode 100644
> index b4a5c2d02413..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> +++ /dev/null
> @@ -1,2799 +0,0 @@
> -/** @file
> -  The implementation of iSCSI protocol based on RFC3720.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -UINT32 mDataSegPad = 0;
> -
> -/**
> -  Attach the iSCSI connection to the iSCSI session.
> -
> -  @param[in, out]  Session The iSCSI session.
> -  @param[in, out]  Conn    The iSCSI connection.
> -**/
> -VOID
> -IScsiAttatchConnection (
> -  IN OUT ISCSI_SESSION     *Session,
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  InsertTailList (&Session->Conns, &Conn->Link);
> -  Conn->Session = Session;
> -  Session->NumConns++;
> -}
> -
> -/**
> -  Detach the iSCSI connection from the session it belongs to.
> -
> -  @param[in, out]  Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiDetatchConnection (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  RemoveEntryList (&Conn->Link);
> -  Conn->Session->NumConns--;
> -  Conn->Session = NULL;
> -}
> -
> -/**
> -  Check the sequence number according to RFC3720.
> -
> -  @param[in, out]  ExpSN   The currently expected sequence number.
> -  @param[in]       NewSN   The sequence number to check.
> -
> -  @retval EFI_SUCCESS         The check passed and the ExpSN is increased.
> -  @retval EFI_NOT_READY       Response was sent due to a retransmission
> request.
> -  @retval EFI_PROTOCOL_ERROR  Some kind of iSCSI protocol error
> happened.
> -**/
> -EFI_STATUS
> -IScsiCheckSN (
> -  IN OUT UINT32  *ExpSN,
> -  IN UINT32      NewSN
> -  )
> -{
> -  if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) {
> -    if (ISCSI_SEQ_LT (NewSN, *ExpSN)) {
> -      //
> -      // Duplicate
> -      //
> -      return EFI_NOT_READY;
> -    } else {
> -      return EFI_PROTOCOL_ERROR;
> -    }
> -  } else {
> -    //
> -    // Advance the ExpSN
> -    //
> -    (*ExpSN)++;
> -    return EFI_SUCCESS;
> -  }
> -}
> -
> -/**
> -  Update the sequence numbers for the iSCSI command.
> -
> -  @param[in, out]  Session  The iSCSI session.
> -  @param[in]       MaxCmdSN Maximum CmdSN from the target.
> -  @param[in]       ExpCmdSN Next expected CmdSN from the target.
> -**/
> -VOID
> -IScsiUpdateCmdSN (
> -  IN OUT ISCSI_SESSION  *Session,
> -  IN UINT32             MaxCmdSN,
> -  IN UINT32             ExpCmdSN
> -  )
> -{
> -  if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) {
> -    return ;
> -  }
> -
> -  if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) {
> -    Session->MaxCmdSN = MaxCmdSN;
> -  }
> -
> -  if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) {
> -    Session->ExpCmdSN = ExpCmdSN;
> -  }
> -}
> -
> -/**
> -  This function does the iSCSI connection login.
> -
> -  @param[in, out]  Conn      The iSCSI connection to login.
> -
> -  @retval EFI_SUCCESS        The iSCSI connection is logged into the iSCSI
> target.
> -  @retval EFI_TIMEOUT        Timeout happened during the login procedure.
> -  @retval Others             Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConnLogin (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  EFI_STATUS  Status;
> -
> -  //
> -  // Start the timer, wait 16 seconds to establish the TCP connection.
> -  //
> -  Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 *
> TICKS_PER_SECOND);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -  //
> -  // try to establish the tcp connection
> -  //
> -  Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0);
> -  Conn->State = CONN_STATE_IN_LOGIN;
> -
> -  //
> -  // connection is established, start the iSCSI Login
> -  //
> -  do {
> -    Status = IScsiSendLoginReq (Conn);
> -    if (EFI_ERROR (Status)) {
> -      break;
> -    }
> -
> -    Status = IScsiReceiveLoginRsp (Conn);
> -    if (EFI_ERROR (Status)) {
> -      break;
> -    }
> -  } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE);
> -
> -  return Status;
> -}
> -
> -/**
> -  Reset the iSCSI connection.
> -
> -  @param[in, out]  Conn The iSCSI connection to reset.
> -**/
> -VOID
> -IScsiConnReset (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  Tcp4IoReset (&Conn->Tcp4Io);
> -}
> -
> -/**
> -  Create a TCP connection for the iSCSI session.
> -
> -  @param[in]  Private The iSCSI driver data.
> -  @param[in]  Session Maximum CmdSN from the target.
> -
> -  @return The newly created iSCSI connection.
> -**/
> -ISCSI_CONNECTION *
> -IScsiCreateConnection (
> -  IN ISCSI_DRIVER_DATA  *Private,
> -  IN ISCSI_SESSION      *Session
> -  )
> -{
> -  ISCSI_CONNECTION    *Conn;
> -  TCP4_IO_CONFIG_DATA Tcp4IoConfig;
> -  EFI_STATUS          Status;
> -
> -  Conn = AllocatePool (sizeof (ISCSI_CONNECTION));
> -  if (Conn == NULL) {
> -    return NULL;
> -  }
> -
> -  Conn->Signature       = ISCSI_CONNECTION_SIGNATURE;
> -  Conn->State           = CONN_STATE_FREE;
> -  Conn->CurrentStage    = ISCSI_SECURITY_NEGOTIATION;
> -  Conn->NextStage       = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION;
> -  Conn->CHAPStep        = ISCSI_CHAP_INITIAL;
> -  Conn->ExpStatSN       = 0;
> -  Conn->PartialReqSent  = FALSE;
> -  Conn->PartialRspRcvd  = FALSE;
> -  Conn->Cid             = Session->NextCid++;
> -
> -  Status = gBS->CreateEvent (
> -                  EVT_TIMER,
> -                  TPL_CALLBACK,
> -                  NULL,
> -                  NULL,
> -                  &Conn->TimeoutEvent
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    FreePool (Conn);
> -    return NULL;
> -  }
> -
> -  NetbufQueInit (&Conn->RspQue);
> -
> -  //
> -  // set the default connection-only parameters
> -  //
> -  Conn->MaxRecvDataSegmentLength  =
> DEFAULT_MAX_RECV_DATA_SEG_LEN;
> -  Conn->HeaderDigest              = IScsiDigestNone;
> -  Conn->DataDigest                = IScsiDigestNone;
> -
> -  CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp,
> sizeof (EFI_IPv4_ADDRESS));
> -  CopyMem (&Tcp4IoConfig.SubnetMask, &Session-
> >ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
> -  CopyMem (&Tcp4IoConfig.Gateway, &Session-
> >ConfigData.NvData.Gateway, sizeof (EFI_IPv4_ADDRESS));
> -  CopyMem (&Tcp4IoConfig.RemoteIp, &Session-
> >ConfigData.NvData.TargetIp, sizeof (EFI_IPv4_ADDRESS));
> -
> -  Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort;
> -
> -  //
> -  // Create the tcp4 IO for this connection
> -  //
> -  Status = Tcp4IoCreateSocket (
> -            Private->Image,
> -            Private->Controller,
> -            &Tcp4IoConfig,
> -            &Conn->Tcp4Io
> -            );
> -  if (EFI_ERROR (Status)) {
> -    gBS->CloseEvent (Conn->TimeoutEvent);
> -    FreePool (Conn);
> -    Conn = NULL;
> -  }
> -
> -  return Conn;
> -}
> -
> -/**
> -  Destroy an iSCSI connection.
> -
> -  @param[in]  Conn The connection to destroy.
> -**/
> -VOID
> -IScsiDestroyConnection (
> -  IN ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  Tcp4IoDestroySocket (&Conn->Tcp4Io);
> -  NetbufQueFlush (&Conn->RspQue);
> -  gBS->CloseEvent (Conn->TimeoutEvent);
> -  FreePool (Conn);
> -}
> -
> -/**
> -  Login the iSCSI session.
> -
> -  @param[in]  Private          The iSCSI driver data.
> -
> -  @retval EFI_SUCCESS          The iSCSI session login procedure finished.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_NO_MEDIA         There was a media error.
> -  @retval Others               Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiSessionLogin (
> -  IN ISCSI_DRIVER_DATA  *Private
> -  )
> -{
> -  EFI_STATUS        Status;
> -  ISCSI_SESSION     *Session;
> -  ISCSI_CONNECTION  *Conn;
> -  EFI_TCP4_PROTOCOL *Tcp4;
> -  EFI_STATUS        MediaStatus;
> -
> -  Session = &Private->Session;
> -
> -  //
> -  // Check media status before session login
> -  //
> -  MediaStatus = EFI_SUCCESS;
> -  NetLibDetectMediaWaitTimeout (Private->Controller,
> ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus);
> -  if (MediaStatus != EFI_SUCCESS) {
> -    return EFI_NO_MEDIA;
> -  }
> -
> -  //
> -  // Set session identifier
> -  //
> -  CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6);
> -
> -  //
> -  // Create a connection for the session.
> -  //
> -  Conn = IScsiCreateConnection (Private, Session);
> -  if (Conn == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  IScsiAttatchConnection (Session, Conn);
> -
> -  //
> -  // Login througth the newly created connection.
> -  //
> -  Status = IScsiConnLogin (Conn);
> -  if (EFI_ERROR (Status)) {
> -    IScsiConnReset (Conn);
> -    IScsiDetatchConnection (Conn);
> -    IScsiDestroyConnection (Conn);
> -  } else {
> -    Session->State = SESSION_STATE_LOGGED_IN;
> -
> -    gBS->OpenProtocol (
> -          Conn->Tcp4Io.Handle,
> -          &gEfiTcp4ProtocolGuid,
> -          (VOID **)&Tcp4,
> -          Private->Image,
> -          Private->ExtScsiPassThruHandle,
> -          EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
> -          );
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Build and send the iSCSI login request to the iSCSI target according to
> -  the current login stage.
> -
> -  @param[in]  Conn             The connection in the iSCSI login phase.
> -
> -  @retval EFI_SUCCESS          The iSCSI login request PDU is built and sent on
> this
> -                               connection.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_DEVICE_ERROR     Some kind of device error happened.
> -**/
> -EFI_STATUS
> -IScsiSendLoginReq (
> -  IN ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  NET_BUF     *Pdu;
> -  EFI_STATUS  Status;
> -
> -  //
> -  // build the Login Request PDU
> -  //
> -  Pdu = IScsiPrepareLoginReq (Conn);
> -  if (Pdu == NULL) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -  //
> -  // Send it to the iSCSI target.
> -  //
> -  Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
> -
> -  NetbufFree (Pdu);
> -
> -  return Status;
> -}
> -
> -/**
> -  Receive and process the iSCSI login response.
> -
> -  @param[in]  Conn             The connection in the iSCSI login phase.
> -
> -  @retval EFI_SUCCESS          The iSCSI login response PDU is received and
> processed.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceiveLoginRsp (
> -  IN ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  EFI_STATUS  Status;
> -  NET_BUF     *Pdu;
> -
> -  Pdu = NULL;
> -
> -  //
> -  // Receive the iSCSI login response.
> -  //
> -  Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -  //
> -  // A Login Response is received, process it.
> -  //
> -  ASSERT (Pdu != NULL);
> -  Status = IScsiProcessLoginRsp (Conn, Pdu);
> -
> -  NetbufFree (Pdu);
> -
> -  return Status;
> -}
> -
> -/**
> -  Add an iSCSI key-value pair as a string into the data segment of the Login
> Request PDU.
> -  The DataSegmentLength and the actual size of the net buffer containing
> this PDU will be
> -  updated.
> -
> -  @param[in, out]  Pdu         The iSCSI PDU whose data segment the key-
> value pair will
> -                               be added to.
> -  @param[in]       Key         The key name string.
> -  @param[in]       Value       The value string.
> -
> -  @retval EFI_SUCCESS          The key-valu pair is added to the PDU's
> datasegment and
> -                               the correspondence length fields are updated.
> -  @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to
> add the key-value
> -                               pair.
> -**/
> -EFI_STATUS
> -IScsiAddKeyValuePair (
> -  IN OUT NET_BUF      *Pdu,
> -  IN CHAR8            *Key,
> -  IN CHAR8            *Value
> -  )
> -{
> -  UINT32              DataSegLen;
> -  UINT32              KeyLen;
> -  UINT32              ValueLen;
> -  UINT32              TotalLen;
> -  ISCSI_LOGIN_REQUEST *LoginReq;
> -  CHAR8               *Data;
> -
> -  LoginReq    = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL);
> -  if (LoginReq == NULL) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -  DataSegLen  = NTOH24 (LoginReq->DataSegmentLength);
> -
> -  KeyLen      = (UINT32) AsciiStrLen (Key);
> -  ValueLen    = (UINT32) AsciiStrLen (Value);
> -
> -  //
> -  // 1 byte for the key value separator '=' and 1 byte for the null
> -  // delimiter after the value.
> -  //
> -  TotalLen = KeyLen + 1 + ValueLen + 1;
> -
> -  //
> -  // Allocate the space for the key-value pair.
> -  //
> -  Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL);
> -  if (Data == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -  //
> -  // Add the key.
> -  //
> -  CopyMem (Data, Key, KeyLen);
> -  Data += KeyLen;
> -
> -  *Data = '=';
> -  Data++;
> -
> -  //
> -  // Add the value.
> -  //
> -  CopyMem (Data, Value, ValueLen);
> -  Data += ValueLen;
> -
> -  *Data = '\0';
> -
> -  //
> -  // update the DataSegmentLength
> -  //
> -  ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen);
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Prepare the iSCSI login request to be sent according to the current login
> status.
> -
> -  @param[in, out]  Conn The connection in the iSCSI login phase.
> -
> -  @return The pointer to the net buffer containing the iSCSI login request
> built.
> -  @retval Others    Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiPrepareLoginReq (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  ISCSI_SESSION       *Session;
> -  NET_BUF             *Nbuf;
> -  ISCSI_LOGIN_REQUEST *LoginReq;
> -  EFI_STATUS          Status;
> -
> -  Session = Conn->Session;
> -
> -  Nbuf    = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) +
> DEFAULT_MAX_RECV_DATA_SEG_LEN);
> -  if (Nbuf == NULL) {
> -    return NULL;
> -  }
> -
> -  LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof
> (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL);
> -  ASSERT (LoginReq != NULL);
> -  ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST));
> -
> -  //
> -  // Init the login request pdu
> -  //
> -  ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ,
> ISCSI_REQ_IMMEDIATE);
> -  ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage);
> -  LoginReq->VersionMax        = ISCSI_VERSION_MAX;
> -  LoginReq->VersionMin        = ISCSI_VERSION_MIN;
> -  LoginReq->Tsih              = HTONS (Session->Tsih);
> -  LoginReq->InitiatorTaskTag  = HTONL (Session->InitiatorTaskTag);
> -  LoginReq->Cid               = HTONS (Conn->Cid);
> -  LoginReq->CmdSN             = HTONL (Session->CmdSN);
> -
> -  //
> -  // For the first Login Request on a coonection this is ExpStatSN for the
> -  // old connection and this field is only valid if the Login Request restarts
> -  // a connection.
> -  // For subsequent Login Requests it is used to acknowledge the Login
> Responses
> -  // with their increasing StatSN values.
> -  //
> -  LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN);
> -  CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid));
> -
> -  if (Conn->PartialRspRcvd) {
> -    //
> -    // A partial response, initiator must send an empty Login Request.
> -    //
> -    return Nbuf;
> -  }
> -
> -  switch (Conn->CurrentStage) {
> -  case ISCSI_SECURITY_NEGOTIATION:
> -    Status = IScsiCHAPToSendReq (Conn, Nbuf);
> -    break;
> -
> -  case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
> -    Status = IScsiFillOpParams (Conn, Nbuf);
> -    ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> -    break;
> -
> -  default:
> -    //
> -    // something error happens...
> -    //
> -    Status = EFI_DEVICE_ERROR;
> -    break;
> -  }
> -
> -  if (EFI_ERROR (Status)) {
> -    NetbufFree (Nbuf);
> -    Nbuf = NULL;
> -  } else {
> -    //
> -    // Pad the data segment if needed.
> -    //
> -    IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq));
> -    //
> -    // Check whether we will issue the stage transition signal?
> -    //
> -    Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq,
> ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> -  }
> -
> -  return Nbuf;
> -}
> -
> -/**
> -  Process the iSCSI Login Response.
> -
> -  @param[in, out]  Conn The connection on which the iSCSI login response is
> received.
> -  @param[in, out]  Pdu  The iSCSI login response PDU.
> -
> -  @retval EFI_SUCCESS        The iSCSI login response PDU is processed and all
> check are passed.
> -  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> -  @retval EFI_MEDIA_CHANGED  Target is redirected.
> -  @retval Others             Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiProcessLoginRsp (
> -  IN OUT ISCSI_CONNECTION  *Conn,
> -  IN OUT NET_BUF           *Pdu
> -  )
> -{
> -  EFI_STATUS            Status;
> -  ISCSI_SESSION         *Session;
> -  ISCSI_LOGIN_RESPONSE  *LoginRsp;
> -  BOOLEAN               Transit;
> -  BOOLEAN               Continue;
> -  UINT8                 CurrentStage;
> -  UINT8                 NextStage;
> -  UINT8                 *DataSeg;
> -  UINT32                DataSegLen;
> -
> -  Session   = Conn->Session;
> -
> -  LoginRsp  = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
> -  if (LoginRsp == NULL) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -  if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) {
> -    //
> -    // It's not a Login Response
> -    //
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -  //
> -  // Get the data segment if any.
> -  //
> -  DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp);
> -  if (DataSegLen != 0) {
> -    DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL);
> -  } else {
> -    DataSeg = NULL;
> -  }
> -  //
> -  // Check the status class in the login response PDU.
> -  //
> -  switch (LoginRsp->StatusClass) {
> -  case ISCSI_LOGIN_STATUS_SUCCESS:
> -    //
> -    // Just break here, the response and the data segment will be processed
> later.
> -    //
> -    break;
> -
> -  case ISCSI_LOGIN_STATUS_REDIRECTION:
> -    //
> -    // The target may be moved to a different address
> -    //
> -    if (DataSeg == NULL) {
> -      return EFI_PROTOCOL_ERROR;
> -    }
> -    //
> -    // Process the TargetAddress key-value strings in the data segment to
> update the
> -    // target address info.
> -    //
> -    Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg,
> DataSegLen);
> -    if (EFI_ERROR (Status)) {
> -      return Status;
> -    }
> -    //
> -    // Session will be restarted on this error status because the Target is
> -    // redirected by this Login Response.
> -    //
> -    return EFI_MEDIA_CHANGED;
> -
> -  default:
> -    //
> -    // Initiator Error, Target Error, or any other undefined error code.
> -    //
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -  //
> -  // The status is sucess, extract the wanted fields from the header segment.
> -  //
> -  Transit                     = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp,
> ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT);
> -  Continue                    = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp,
> ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE);
> -
> -  CurrentStage                = (UINT8) ISCSI_GET_CURRENT_STAGE (LoginRsp);
> -  NextStage                   = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp);
> -
> -  LoginRsp->InitiatorTaskTag  = NTOHL (LoginRsp->InitiatorTaskTag);
> -
> -  if ((Transit && Continue) ||
> -      (CurrentStage != Conn->CurrentStage) ||
> -      (!Conn->TransitInitiated && Transit) ||
> -      (Transit && (NextStage != Conn->NextStage)) ||
> -      (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp->Isid)) !=
> 0) ||
> -      (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag)
> -      ) {
> -    //
> -    // A Login Response with the C bit set to 1 MUST have the T bit set to 0;
> -    // The CSG in the Login Response MUST be the same with the I-end of this
> connection;
> -    // The T bit can't be 1 if the last Login Response sent by the initiator
> doesn't
> -    // initiate the transistion;
> -    // The NSG MUST be the same with the I-end of this connection if Transit
> is required.
> -    // The ISID in the Login Response MUST be the same with this session.
> -    //
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  LoginRsp->StatSN    = NTOHL (LoginRsp->StatSN);
> -  LoginRsp->ExpCmdSN  = NTOHL (LoginRsp->ExpCmdSN);
> -  LoginRsp->MaxCmdSN  = NTOHL (LoginRsp->MaxCmdSN);
> -
> -  if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn-
> >CHAPStep == ISCSI_CHAP_INITIAL)) {
> -    //
> -    // If the Login Request is a leading Login Request, the target MUST use
> -    // the value presented in CmdSN as the target value for ExpCmdSN.
> -    //
> -    if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN !=
> LoginRsp->ExpCmdSN)) {
> -      return EFI_PROTOCOL_ERROR;
> -    }
> -
> -    //
> -    // It's the initial Login Response, initialize the local ExpStatSN, MaxCmdSN
> -    // and ExpCmdSN.
> -    //
> -    Conn->ExpStatSN   = LoginRsp->StatSN + 1;
> -    Session->MaxCmdSN = LoginRsp->MaxCmdSN;
> -    Session->ExpCmdSN = LoginRsp->ExpCmdSN;
> -  } else {
> -    //
> -    // Check the StatSN of this PDU
> -    //
> -    Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN);
> -    if (!EFI_ERROR (Status)) {
> -      //
> -      // Update the MaxCmdSN and ExpCmdSN
> -      //
> -      IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp-
> >ExpCmdSN);
> -    } else {
> -      return Status;
> -    }
> -  }
> -  //
> -  // Trim off the header segment.
> -  //
> -  NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD);
> -
> -  //
> -  // Queue this login response first in case it's a partial response so that
> -  // later when the full response list is received we can combine these
> scattered
> -  // responses' data segment and then process it.
> -  //
> -  NET_GET_REF (Pdu);
> -  NetbufQueAppend (&Conn->RspQue, Pdu);
> -
> -  Conn->PartialRspRcvd = Continue;
> -  if (Continue) {
> -    //
> -    // It's a partial response, have to wait for another or more
> Request/Response
> -    // conversations to get the full response.
> -    //
> -    return EFI_SUCCESS;
> -  }
> -
> -  switch (CurrentStage) {
> -  case ISCSI_SECURITY_NEGOTIATION:
> -    //
> -    // In security negotiation stage, let CHAP module handle it.
> -    //
> -    Status = IScsiCHAPOnRspReceived (Conn);
> -    break;
> -
> -  case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
> -    //
> -    // Response received with negotiation resonse on iSCSI parameters, check
> them.
> -    //
> -    Status = IScsiCheckOpParams (Conn);
> -    break;
> -
> -  default:
> -    //
> -    // Should never get here.
> -    //
> -    Status = EFI_PROTOCOL_ERROR;
> -    break;
> -  }
> -
> -  if (Transit && (Status == EFI_SUCCESS)) {
> -    //
> -    // Do the state transition.
> -    //
> -    Conn->CurrentStage = Conn->NextStage;
> -
> -    if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) {
> -      Conn->NextStage = ISCSI_FULL_FEATURE_PHASE;
> -    } else {
> -      //
> -      // CurrentStage is iSCSI Full Feature, it's the Login-Final Response,
> -      // get the TSIH from the Login Response.
> -      //
> -      Session->Tsih = NTOHS (LoginRsp->Tsih);
> -    }
> -  }
> -  //
> -  // Flush the response(s) received.
> -  //
> -  NetbufQueFlush (&Conn->RspQue);
> -
> -  return Status;
> -}
> -
> -/**
> -  Updated the target information according the data received in the iSCSI
> -  login response with an target redirection status.
> -
> -  @param[in, out] Session      The iSCSI session.
> -  @param[in]      Data         The data segment which should contain the
> -                               TargetAddress key-value list.
> -  @param[in]      Len          Length of the data.
> -
> -  @retval EFI_SUCCESS          The target address is updated.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_NOT_FOUND        The TargetAddress key is not found.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateTargetAddress (
> -  IN OUT ISCSI_SESSION  *Session,
> -  IN CHAR8              *Data,
> -  IN UINT32             Len
> -  )
> -{
> -  LIST_ENTRY      *KeyValueList;
> -  CHAR8           *TargetAddress;
> -  CHAR8           *IpStr;
> -  EFI_STATUS      Status;
> -  UINTN           Number;
> -
> -  KeyValueList = IScsiBuildKeyValueList (Data, Len);
> -  if (KeyValueList == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Status = EFI_NOT_FOUND;
> -
> -  while (TRUE) {
> -    TargetAddress = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_ADDRESS);
> -    if (TargetAddress == NULL) {
> -      break;
> -    }
> -
> -    if (!NET_IS_DIGIT (TargetAddress[0])) {
> -      //
> -      // The domainname of the target may be presented in three formats: a
> DNS host name,
> -      // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only
> accept dotted
> -      // IPv4 address.
> -      //
> -      continue;
> -    }
> -
> -    IpStr = TargetAddress;
> -
> -    while ((*TargetAddress != 0) && (*TargetAddress != ':') &&
> (*TargetAddress != ',')) {
> -      //
> -      // NULL, ':' or ',' ends the IPv4 string.
> -      //
> -      TargetAddress++;
> -    }
> -
> -    if (*TargetAddress == ',') {
> -      //
> -      // Comma and the portal group tag MUST be ommitted if the
> TargetAddress is sent
> -      // as the result of a redirection.
> -      //
> -      continue;
> -    } else if (*TargetAddress == ':') {
> -      *TargetAddress = '\0';
> -
> -      TargetAddress++;
> -
> -      Number = AsciiStrDecimalToUintn (TargetAddress);
> -      if (Number > 0xFFFF) {
> -        continue;
> -      } else {
> -        Session->ConfigData.NvData.TargetPort = (UINT16) Number;
> -      }
> -    } else {
> -      //
> -      // The string only contains the IPv4 address. Use the well known port.
> -      //
> -      Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT;
> -    }
> -    //
> -    // Update the target IP address.
> -    //
> -    Status = IScsiAsciiStrToIp (IpStr, &Session->ConfigData.NvData.TargetIp);
> -    if (EFI_ERROR (Status)) {
> -      continue;
> -    } else {
> -      break;
> -    }
> -  }
> -
> -  IScsiFreeKeyValueList (KeyValueList);
> -
> -  return Status;
> -}
> -
> -/**
> -  The callback function to free the net buffer list.
> -
> -  @param[in]  Arg The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiFreeNbufList (
> -  VOID *Arg
> -  )
> -{
> -  ASSERT (Arg != NULL);
> -
> -  NetbufFreeList ((LIST_ENTRY     *) Arg);
> -  FreePool (Arg);
> -}
> -
> -/**
> -  The callback function called in NetBufFree, it does nothing.
> -
> -  @param[in]   Arg  The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiNbufExtFree (
> -  VOID *Arg
> -  )
> -{
> -}
> -
> -/**
> -  Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI
> PDU header and
> -  an optional data segment. The two parts will be put into two blocks of
> buffers in the
> -  net buffer. The digest check will be conducted in this function if needed
> and the digests
> -  will be trimmed from the PDU buffer.
> -
> -  @param[in]   Conn        The iSCSI connection to receive data from.
> -  @param[out]  Pdu         The received iSCSI pdu.
> -  @param[in]   Context     The context used to describe information on the
> caller provided
> -                           buffer to receive data segment of the iSCSI pdu, it's optional.
> -  @param[in]  HeaderDigest Whether there will be header digest received.
> -  @param[in]  DataDigest   Whether there will be data digest.
> -  @param[in]  TimeoutEvent The timeout event, it's optional.
> -
> -  @retval EFI_SUCCESS          An iSCSI pdu is received.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error
> happened.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceivePdu (
> -  IN ISCSI_CONNECTION                      *Conn,
> -  OUT NET_BUF                              **Pdu,
> -  IN ISCSI_IN_BUFFER_CONTEXT               *Context, OPTIONAL
> -  IN BOOLEAN                               HeaderDigest,
> -  IN BOOLEAN                               DataDigest,
> -  IN EFI_EVENT                             TimeoutEvent OPTIONAL
> -  )
> -{
> -  LIST_ENTRY      *NbufList;
> -  UINT32          Len;
> -  NET_BUF         *PduHdr;
> -  UINT8           *Header;
> -  EFI_STATUS      Status;
> -  UINT32          PadLen;
> -  UINT32          InDataOffset;
> -  NET_FRAGMENT    Fragment[2];
> -  UINT32          FragmentCount;
> -  NET_BUF         *DataSeg;
> -  UINT32          PadAndCRC32[2];
> -
> -  NbufList = AllocatePool (sizeof (LIST_ENTRY));
> -  if (NbufList == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  InitializeListHead (NbufList);
> -
> -  //
> -  // The header digest will be received together with the PDU header if
> exists.
> -  //
> -  Len     = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof (UINT32) : 0);
> -  PduHdr  = NetbufAlloc (Len);
> -  if (PduHdr == NULL) {
> -    FreePool (NbufList);
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL);
> -  ASSERT (Header != NULL);
> -  InsertTailList (NbufList, &PduHdr->List);
> -
> -  //
> -  // First step, receive the BHS of the PDU.
> -  //
> -  Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  if (HeaderDigest) {
> -    //
> -    // TODO: check the header-digest.
> -    //
> -    //
> -    // Trim off the digest.
> -    //
> -    NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL);
> -  }
> -
> -  Len = ISCSI_GET_DATASEG_LEN (Header);
> -  if (Len == 0) {
> -    //
> -    // No data segment.Form the pdu from a list of pdu segments.
> -    //
> -    *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> -    if (*Pdu == NULL) {
> -      Status = EFI_OUT_OF_RESOURCES;
> -      goto ON_EXIT;
> -    }
> -    return Status;
> -  }
> -  //
> -  // Get the length of the padding bytes of the data segment.
> -  //
> -  PadLen = ISCSI_GET_PAD_LEN (Len);
> -
> -  switch (ISCSI_GET_OPCODE (Header)) {
> -  case ISCSI_OPCODE_SCSI_DATA_IN:
> -    //
> -    // Try to use the buffer described by Context if the PDU is an
> -    // iSCSI SCSI data in pdu so as to reduce memory copy overhead.
> -    //
> -    InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header);
> -    if ((Context == NULL) || ((InDataOffset + Len) > Context->InDataLen)) {
> -      Status = EFI_PROTOCOL_ERROR;
> -      goto ON_EXIT;
> -    }
> -
> -    Fragment[0].Len   = Len;
> -    Fragment[0].Bulk  = Context->InData + InDataOffset;
> -
> -    if (DataDigest || (PadLen != 0)) {
> -      //
> -      // The data segment is padded, use two fragments to receive it.
> -      // The first to receive the useful data. The second to receive the padding.
> -      //
> -      Fragment[1].Len   = PadLen + (DataDigest ? sizeof (UINT32) : 0);
> -      Fragment[1].Bulk  = (UINT8 *)PadAndCRC32 + (4 - PadLen);
> -      FragmentCount     = 2;
> -    } else {
> -      FragmentCount = 1;
> -    }
> -
> -    DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0,
> IScsiNbufExtFree, NULL);
> -    if (DataSeg == NULL) {
> -      Status = EFI_OUT_OF_RESOURCES;
> -      goto ON_EXIT;
> -    }
> -
> -    break;
> -
> -  case ISCSI_OPCODE_SCSI_RSP:
> -  case ISCSI_OPCODE_NOP_IN:
> -  case ISCSI_OPCODE_LOGIN_RSP:
> -  case ISCSI_OPCODE_TEXT_RSP:
> -  case ISCSI_OPCODE_ASYNC_MSG:
> -  case ISCSI_OPCODE_REJECT:
> -  case ISCSI_OPCODE_VENDOR_T0:
> -  case ISCSI_OPCODE_VENDOR_T1:
> -  case ISCSI_OPCODE_VENDOR_T2:
> -    //
> -    // Allocate buffer to receive the data segment.
> -    //
> -    Len += PadLen + (DataDigest ? sizeof (UINT32) : 0);
> -    DataSeg = NetbufAlloc (Len);
> -    if (DataSeg == NULL) {
> -      Status = EFI_OUT_OF_RESOURCES;
> -      goto ON_EXIT;
> -    }
> -
> -    NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL);
> -    break;
> -
> -  default:
> -    Status = EFI_PROTOCOL_ERROR;
> -    goto ON_EXIT;
> -  }
> -
> -  InsertTailList (NbufList, &DataSeg->List);
> -
> -  //
> -  // Receive the data segment with the data digest if any.
> -  //
> -  Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  if (DataDigest) {
> -    //
> -    // TODO: Check the data digest.
> -    //
> -    NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL);
> -  }
> -
> -  if (PadLen != 0) {
> -    //
> -    // Trim off the padding bytes in the data segment.
> -    //
> -    NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL);
> -  }
> -
> -  //
> -  // Form the pdu from a list of pdu segments.
> -  //
> -  *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> -  if (*Pdu == NULL) {
> -    Status = EFI_OUT_OF_RESOURCES;
> -  }
> -
> -ON_EXIT:
> -
> -  if (EFI_ERROR (Status)) {
> -    //
> -    // Free the Nbufs in this NbufList and the NbufList itself.
> -    //
> -    IScsiFreeNbufList (NbufList);
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Check and get the result of the prameter negotiation.
> -
> -  @param[in, out]  Conn          The connection in iSCSI login.
> -
> -  @retval EFI_SUCCESS          The parmeter check is passed and negotiation is
> finished.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error
> happened.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiCheckOpParams (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  )
> -{
> -  EFI_STATUS      Status;
> -  LIST_ENTRY      *KeyValueList;
> -  CHAR8           *Data;
> -  UINT32          Len;
> -  ISCSI_SESSION   *Session;
> -  CHAR8           *Value;
> -  UINTN           NumericValue;
> -
> -  ASSERT (Conn->RspQue.BufNum != 0);
> -
> -  Session = Conn->Session;
> -
> -  Len     = Conn->RspQue.BufSize;
> -  Data    = AllocatePool (Len);
> -  if (Data == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data);
> -
> -  Status = EFI_PROTOCOL_ERROR;
> -
> -  //
> -  // Extract the Key-Value pairs into a list.
> -  //
> -  KeyValueList = IScsiBuildKeyValueList (Data, Len);
> -  if (KeyValueList == NULL) {
> -    FreePool (Data);
> -    return Status;
> -  }
> -  //
> -  // HeaderDigest
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_HEADER_DIGEST);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  if (AsciiStrCmp (Value, "CRC32") == 0) {
> -    if (Conn->HeaderDigest != IScsiDigestCRC32) {
> -      goto ON_ERROR;
> -    }
> -  } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
> -    Conn->HeaderDigest = IScsiDigestNone;
> -  } else {
> -    goto ON_ERROR;
> -  }
> -  //
> -  // DataDigest
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_DIGEST);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  if (AsciiStrCmp (Value, "CRC32") == 0) {
> -    if (Conn->DataDigest != IScsiDigestCRC32) {
> -      goto ON_ERROR;
> -    }
> -  } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
> -    Conn->DataDigest = IScsiDigestNone;
> -  } else {
> -    goto ON_ERROR;
> -  }
> -  //
> -  // ErrorRecoveryLevel, result fuction is Minimum.
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_ERROR_RECOVERY_LEVEL);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  NumericValue = AsciiStrDecimalToUintn (Value);
> -  if (NumericValue > 2) {
> -    goto ON_ERROR;
> -  }
> -
> -  Session->ErrorRecoveryLevel = (UINT8) MIN (Session->ErrorRecoveryLevel,
> NumericValue);
> -
> -  //
> -  // InitialR2T, result function is OR.
> -  //
> -  if (!Session->InitialR2T) {
> -    Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_INITIAL_R2T);
> -    if (Value == NULL) {
> -      goto ON_ERROR;
> -    }
> -
> -    Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
> -  }
> -
> -  //
> -  // ImmediateData, result function is AND.
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_IMMEDIATE_DATA);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  Session->ImmediateData = (BOOLEAN) (Session->ImmediateData &&
> (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0));
> -
> -  //
> -  // MaxRecvDataSegmentLength is declarative.
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH);
> -  if (Value != NULL) {
> -    Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn
> (Value);
> -  }
> -  //
> -  // MaxBurstLength, result funtion is Mininum.
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_BURST_LENGTH);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  NumericValue            = AsciiStrDecimalToUintn (Value);
> -  Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength,
> NumericValue);
> -
> -  //
> -  // FirstBurstLength, result function is Minimum. Irrelevant when
> InitialR2T=Yes and
> -  // ImmediateData=No.
> -  // This Key/Value is negotiation type.
> -  //
> -  if (!(Session->InitialR2T && !Session->ImmediateData)) {
> -    Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_FIRST_BURST_LENGTH);
> -    if (Value == NULL) {
> -      goto ON_ERROR;
> -    }
> -
> -    NumericValue              = AsciiStrDecimalToUintn (Value);
> -    Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength,
> NumericValue);
> -  }
> -
> -  //
> -  // MaxConnections, result function is Minimum.
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_CONNECTIONS);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  NumericValue = AsciiStrDecimalToUintn (Value);
> -  if ((NumericValue == 0) || (NumericValue > 65535)) {
> -    goto ON_ERROR;
> -  }
> -
> -  Session->MaxConnections = (UINT32) MIN (Session->MaxConnections,
> NumericValue);
> -
> -  //
> -  // DataPDUInOrder, result function is OR.
> -  //
> -  if (!Session->DataPDUInOrder) {
> -    Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_PDU_IN_ORDER);
> -    if (Value == NULL) {
> -      goto ON_ERROR;
> -    }
> -
> -    Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
> -  }
> -
> -  //
> -  // DataSequenceInorder, result function is OR.
> -  //
> -  if (!Session->DataSequenceInOrder) {
> -    Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
> -    if (Value == NULL) {
> -      goto ON_ERROR;
> -    }
> -
> -    Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes")
> == 0);
> -  }
> -
> -  //
> -  // DefaultTime2Wait, result function is Maximum.
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DEFAULT_TIME2WAIT);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  NumericValue = AsciiStrDecimalToUintn (Value);
> -  if (NumericValue == 0) {
> -    Session->DefaultTime2Wait = 0;
> -  } else if (NumericValue > 3600) {
> -    goto ON_ERROR;
> -  } else {
> -    Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait,
> NumericValue);
> -  }
> -  //
> -  // DefaultTime2Retain, result function is Minimum.
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DEFAULT_TIME2RETAIN);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  NumericValue = AsciiStrDecimalToUintn (Value);
> -  if (NumericValue == 0) {
> -    Session->DefaultTime2Retain = 0;
> -  } else if (NumericValue > 3600) {
> -    goto ON_ERROR;
> -  } else {
> -    Session->DefaultTime2Retain = (UINT32) MIN (Session-
> >DefaultTime2Retain, NumericValue);
> -  }
> -  //
> -  // MaxOutstandingR2T, result function is Minimum.
> -  //
> -  Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_OUTSTANDING_R2T);
> -  if (Value == NULL) {
> -    goto ON_ERROR;
> -  }
> -
> -  NumericValue = AsciiStrDecimalToUintn (Value);
> -  if ((NumericValue == 0) || (NumericValue > 65535)) {
> -    goto ON_ERROR;
> -  }
> -
> -  Session->MaxOutstandingR2T = (UINT16) MIN (Session-
> >MaxOutstandingR2T, NumericValue);
> -
> -  //
> -  // Remove declarative key-value pairs, if any.
> -  //
> -  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE);
> -  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS);
> -  IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
> -  //
> -  // Remove the key-value that may not needed for result function is OR.
> -  //
> -  IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
> -  IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_PDU_IN_ORDER);
> -  IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
> -
> -  //
> -  // Remove irrelevant parameter, if any.
> -  //
> -  if (Session->InitialR2T && !Session->ImmediateData) {
> -    IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_FIRST_BURST_LENGTH);
> -  }
> -
> -  if (IsListEmpty (KeyValueList)) {
> -    //
> -    // Succeed if no more keys in the list.
> -    //
> -    Status = EFI_SUCCESS;
> -  }
> -
> -ON_ERROR:
> -
> -  IScsiFreeKeyValueList (KeyValueList);
> -
> -  FreePool (Data);
> -
> -  return Status;
> -}
> -
> -/**
> -  Fill the oprational prameters.
> -
> -  @param[in]       Conn        The connection in iSCSI login.
> -  @param[in, out]  Pdu         The iSCSI login request PDU to fill the parameters.
> -
> -  @retval EFI_SUCCESS          The parmeters are filled into the iSCSI login
> request PDU.
> -**/
> -EFI_STATUS
> -IScsiFillOpParams (
> -  IN ISCSI_CONNECTION  *Conn,
> -  IN OUT NET_BUF       *Pdu
> -  )
> -{
> -  ISCSI_SESSION *Session;
> -  CHAR8         Value[256];
> -
> -  Session = Conn->Session;
> -
> -  AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest ==
> IScsiDigestCRC32) ? "None,CRC32" : "None");
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest ==
> IScsiDigestCRC32) ? "None,CRC32" : "None");
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%d", Session->ErrorRecoveryLevel);
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? "Yes" : "No");
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? "Yes" :
> "No");
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%d",
> MAX_RECV_DATA_SEG_LEN_IN_FFP);
> -  IScsiAddKeyValuePair (Pdu,
> ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength);
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength);
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections);
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? "Yes" :
> "No");
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%a", Session->DataSequenceInOrder ?
> "Yes" : "No");
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER,
> Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait);
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Retain);
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value);
> -
> -  AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T);
> -  IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value);
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
> -
> -  @param[in, out]  Pdu         The iSCSI pdu which contains segments to pad.
> -  @param[in]       Len         The length of the last semgnet in the PDU.
> -
> -  @retval EFI_SUCCESS          The segment is padded or no need to pad it.
> -  @retval EFI_OUT_OF_RESOURCES There is not enough remaining free
> space to add the
> -                               padding bytes.
> -**/
> -EFI_STATUS
> -IScsiPadSegment (
> -  IN OUT NET_BUF  *Pdu,
> -  IN UINT32       Len
> -  )
> -{
> -  UINT32  PadLen;
> -  UINT8   *Data;
> -
> -  PadLen = ISCSI_GET_PAD_LEN (Len);
> -
> -  if (PadLen != 0) {
> -    Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL);
> -    if (Data == NULL) {
> -      return EFI_OUT_OF_RESOURCES;
> -    }
> -
> -    ZeroMem (Data, PadLen);
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Build a key-value list from the data segment.
> -
> -  @param[in]  Data The data segment containing the key-value pairs.
> -  @param[in]  Len  Length of the data segment.
> -
> -  @return The key-value list.
> -  @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiBuildKeyValueList (
> -  IN CHAR8  *Data,
> -  IN UINT32 Len
> -  )
> -{
> -  LIST_ENTRY            *ListHead;
> -  ISCSI_KEY_VALUE_PAIR  *KeyValuePair;
> -
> -  ListHead = AllocatePool (sizeof (LIST_ENTRY));
> -  if (ListHead == NULL) {
> -    return NULL;
> -  }
> -
> -  InitializeListHead (ListHead);
> -
> -  while (Len > 0) {
> -    KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR));
> -    if (KeyValuePair == NULL) {
> -      goto ON_ERROR;
> -    }
> -
> -    InitializeListHead (&KeyValuePair->List);
> -
> -    KeyValuePair->Key = Data;
> -
> -    while ((Len > 0) && (*Data != '=')) {
> -      Len--;
> -      Data++;
> -    }
> -
> -    if (*Data == '=') {
> -      *Data = '\0';
> -
> -      Data++;
> -      Len--;
> -    } else {
> -      FreePool (KeyValuePair);
> -      goto ON_ERROR;
> -    }
> -
> -    KeyValuePair->Value = Data;
> -
> -    InsertTailList (ListHead, &KeyValuePair->List);;
> -
> -    Data += AsciiStrLen (KeyValuePair->Value) + 1;
> -    Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1;
> -  }
> -
> -  return ListHead;
> -
> -ON_ERROR:
> -
> -  IScsiFreeKeyValueList (ListHead);
> -
> -  return NULL;
> -}
> -
> -/**
> -  Get the value string by the key name from the key-value list. If found,
> -  the key-value entry will be removed from the list.
> -
> -  @param[in, out]  KeyValueList  The key-value list.
> -  @param[in]       Key           The key name to find.
> -
> -  @return The value string.
> -**/
> -CHAR8 *
> -IScsiGetValueByKeyFromList (
> -  IN OUT LIST_ENTRY  *KeyValueList,
> -  IN CHAR8           *Key
> -  )
> -{
> -  LIST_ENTRY            *Entry;
> -  ISCSI_KEY_VALUE_PAIR  *KeyValuePair;
> -  CHAR8                 *Value;
> -
> -  Value = NULL;
> -
> -  NET_LIST_FOR_EACH (Entry, KeyValueList) {
> -    KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR,
> List);
> -
> -    if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) {
> -      Value = KeyValuePair->Value;
> -
> -      RemoveEntryList (&KeyValuePair->List);
> -      FreePool (KeyValuePair);
> -      break;
> -    }
> -  }
> -
> -  return Value;
> -}
> -
> -/**
> -  Free the key-value list.
> -
> -  @param[in]  KeyValueList The key-value list.
> -**/
> -VOID
> -IScsiFreeKeyValueList (
> -  IN LIST_ENTRY      *KeyValueList
> -  )
> -{
> -  LIST_ENTRY            *Entry;
> -  ISCSI_KEY_VALUE_PAIR  *KeyValuePair;
> -
> -  while (!IsListEmpty (KeyValueList)) {
> -    Entry         = NetListRemoveHead (KeyValueList);
> -    KeyValuePair  = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR,
> List);
> -
> -    FreePool (KeyValuePair);
> -  }
> -
> -  FreePool (KeyValueList);
> -}
> -
> -/**
> -  Normalize the iSCSI name according to RFC.
> -
> -  @param[in, out]  Name       The iSCSI name.
> -  @param[in]       Len        length of the iSCSI name.
> -
> -  @retval EFI_SUCCESS        The iSCSI name is valid and normalized.
> -  @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in
> the IQN format.
> -**/
> -EFI_STATUS
> -IScsiNormalizeName (
> -  IN OUT CHAR8  *Name,
> -  IN UINTN      Len
> -  )
> -{
> -  UINTN Index;
> -
> -  for (Index = 0; Index < Len; Index++) {
> -    if (NET_IS_UPPER_CASE_CHAR (Name[Index])) {
> -      //
> -      // Convert the upper-case characters to lower-case ones
> -      //
> -      Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a');
> -    }
> -
> -    if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) &&
> -        !NET_IS_DIGIT (Name[Index]) &&
> -        (Name[Index] != '-') &&
> -        (Name[Index] != '.') &&
> -        (Name[Index] != ':')
> -        ) {
> -      //
> -      // ASCII dash, dot, colon lower-case characters and digit characters
> -      // are allowed.
> -      //
> -      return EFI_PROTOCOL_ERROR;
> -    }
> -  }
> -
> -  if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) {
> -    //
> -    // Only IQN format is accepted now.
> -    //
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Create an iSCSI task control block.
> -
> -  @param[in]   Conn           The connection on which the task control block will
> be created.
> -  @param[out]  Tcb            The newly created task control block.
> -
> -  @retval EFI_SUCCESS          The task control block is created.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_NOT_READY        The target can not accept new commands.
> -**/
> -EFI_STATUS
> -IScsiNewTcb (
> -  IN  ISCSI_CONNECTION  *Conn,
> -  OUT ISCSI_TCB         **Tcb
> -  )
> -{
> -  ISCSI_SESSION *Session;
> -  ISCSI_TCB     *NewTcb;
> -
> -  ASSERT (Tcb != NULL);
> -
> -  Session = Conn->Session;
> -
> -  if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) {
> -    return EFI_NOT_READY;
> -  }
> -
> -  NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB));
> -  if (NewTcb == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  InitializeListHead (&NewTcb->Link);
> -
> -  NewTcb->SoFarInOrder      = TRUE;
> -  NewTcb->InitiatorTaskTag  = Session->InitiatorTaskTag;
> -  NewTcb->CmdSN             = Session->CmdSN;
> -  NewTcb->Conn              = Conn;
> -
> -  InsertTailList (&Session->TcbList, &NewTcb->Link);
> -
> -  //
> -  // Advance the initiator task tag.
> -  //
> -  Session->InitiatorTaskTag++;
> -  Session->CmdSN++;
> -
> -  *Tcb = NewTcb;
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Delete the tcb from the connection and destroy it.
> -
> -  @param[in]  Tcb The tcb to delete.
> -**/
> -VOID
> -IScsiDelTcb (
> -  IN ISCSI_TCB  *Tcb
> -  )
> -{
> -  RemoveEntryList (&Tcb->Link);
> -
> -  FreePool (Tcb);
> -}
> -
> -
> -/**
> -  Create a data segment, pad it and calculate the CRC if needed.
> -
> -  @param[in]  Data       The data to fill into the data segment.
> -  @param[in]  Len        Length of the data.
> -  @param[in]  DataDigest Whether to calculate CRC for this data segment.
> -
> -  @return The net buffer wrapping the data segment.
> -**/
> -NET_BUF *
> -IScsiNewDataSegment (
> -  IN UINT8    *Data,
> -  IN UINT32   Len,
> -  IN BOOLEAN  DataDigest
> -  )
> -{
> -  NET_FRAGMENT  Fragment[2];
> -  UINT32        FragmentCount;
> -  UINT32        PadLen;
> -  NET_BUF       *DataSeg;
> -
> -  Fragment[0].Len   = Len;
> -  Fragment[0].Bulk  = Data;
> -
> -  PadLen            = ISCSI_GET_PAD_LEN (Len);
> -  if (PadLen != 0) {
> -    Fragment[1].Len   = PadLen;
> -    Fragment[1].Bulk  = (UINT8 *) &mDataSegPad;
> -
> -    FragmentCount     = 2;
> -  } else {
> -    FragmentCount = 1;
> -  }
> -
> -  DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0,
> IScsiNbufExtFree, NULL);
> -
> -  return DataSeg;
> -}
> -
> -/**
> -  Create a iSCSI SCSI command PDU to encapsulate the command issued
> -  by SCSI through the EXT SCSI PASS THRU Protocol.
> -
> -  @param[in]  Packet The EXT SCSI PASS THRU request packet containing the
> SCSI command.
> -  @param[in]  Lun    The LUN.
> -  @param[in]  Tcb    The tcb associated with this SCSI command.
> -
> -  @return The  created iSCSI SCSI command PDU.
> -  @retval NULL Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiNewScsiCmdPdu (
> -  IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
> -  IN UINT64                                     Lun,
> -  IN ISCSI_TCB                                  *Tcb
> -  )
> -{
> -  LIST_ENTRY                      *NbufList;
> -  NET_BUF                         *Pdu;
> -  NET_BUF                         *PduHeader;
> -  NET_BUF                         *DataSeg;
> -  SCSI_COMMAND                    *ScsiCmd;
> -  UINT8                           AHSLength;
> -  UINT32                          Length;
> -  ISCSI_ADDITIONAL_HEADER         *Header;
> -  ISCSI_BI_EXP_READ_DATA_LEN_AHS  *BiExpReadDataLenAHS;
> -  ISCSI_SESSION                   *Session;
> -  UINT32                          ImmediateDataLen;
> -
> -  AHSLength = 0;
> -
> -  if (Packet->DataDirection == DataBi) {
> -    //
> -    // Bi directional Read/Write command, the bidirectional expected
> -    // read data length AHS is required.
> -    //
> -    AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS);
> -  }
> -
> -  if (Packet->CdbLength > 16) {
> -    //
> -    // The CDB exceeds 16 bytes, an extended CDB AHS is required.
> -    //
> -    AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet-
> >CdbLength - 16) + sizeof (ISCSI_ADDITIONAL_HEADER)));
> -  }
> -
> -  Length    = sizeof (SCSI_COMMAND) + AHSLength;
> -  PduHeader = NetbufAlloc (Length);
> -  if (PduHeader == NULL) {
> -    return NULL;
> -  }
> -
> -  ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length,
> NET_BUF_TAIL);
> -  if (ScsiCmd == NULL) {
> -    NetbufFree (PduHeader);
> -    return NULL;
> -  }
> -  Header  = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1);
> -
> -  ZeroMem (ScsiCmd, Length);
> -
> -  ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0);
> -  ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE);
> -
> -  //
> -  // Set the READ/WRITE flags according to the IO type of this request.
> -  //
> -  switch (Packet->DataDirection) {
> -  case DataIn:
> -    ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ);
> -    ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength);
> -    break;
> -
> -  case DataOut:
> -    ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE);
> -    ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
> -    break;
> -
> -  case DataBi:
> -    ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ |
> SCSI_CMD_PDU_FLAG_WRITE);
> -    ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
> -
> -    //
> -    // Fill the bidirectional expected read data length AHS.
> -    //
> -    BiExpReadDataLenAHS                     = (ISCSI_BI_EXP_READ_DATA_LEN_AHS
> *) Header;
> -    Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1);
> -
> -    BiExpReadDataLenAHS->Length = NTOHS (5);
> -    BiExpReadDataLenAHS->Type =
> ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN;
> -    BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet-
> >InTransferLength);
> -
> -    break;
> -  }
> -
> -  ScsiCmd->TotalAHSLength = AHSLength;
> -  CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun));
> -  ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag);
> -  ScsiCmd->CmdSN            = NTOHL (Tcb->CmdSN);
> -  ScsiCmd->ExpStatSN        = NTOHL (Tcb->Conn->ExpStatSN);
> -
> -  CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb));
> -
> -  if (Packet->CdbLength > 16) {
> -    Header->Length  = NTOHS ((UINT16) (Packet->CdbLength - 15));
> -    Header->Type    = ISCSI_AHS_TYPE_EXT_CDB;
> -
> -    CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength -
> 16);
> -  }
> -
> -  Pdu               = PduHeader;
> -  Session           = Tcb->Conn->Session;
> -  ImmediateDataLen  = 0;
> -
> -  if (Session->ImmediateData && (Packet->OutTransferLength != 0)) {
> -    //
> -    // Send immediate data in this SCSI Command PDU. The length of the
> immeidate
> -    // data is the minimum of FirstBurstLength, the data length to be xfered
> and
> -    // the MaxRecvdataSegmentLength on this connection.
> -    //
> -    ImmediateDataLen  = MIN (Session->FirstBurstLength, Packet-
> >OutTransferLength);
> -    ImmediateDataLen  = MIN (ImmediateDataLen, Tcb->Conn-
> >MaxRecvDataSegmentLength);
> -
> -    //
> -    // Update the data segment length in the PDU header.
> -    //
> -    ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen);
> -
> -    //
> -    // Create the data segment.
> -    //
> -    DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer,
> ImmediateDataLen, FALSE);
> -    if (DataSeg == NULL) {
> -      NetbufFree (PduHeader);
> -      Pdu = NULL;
> -      goto ON_EXIT;
> -    }
> -
> -    NbufList = AllocatePool (sizeof (LIST_ENTRY));
> -    if (NbufList == NULL) {
> -      NetbufFree (PduHeader);
> -      NetbufFree (DataSeg);
> -
> -      Pdu = NULL;
> -      goto ON_EXIT;
> -    }
> -
> -    InitializeListHead (NbufList);
> -    InsertTailList (NbufList, &PduHeader->List);
> -    InsertTailList (NbufList, &DataSeg->List);
> -
> -    Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> -    if (Pdu == NULL) {
> -      IScsiFreeNbufList (NbufList);
> -    }
> -  }
> -
> -  if (Session->InitialR2T ||
> -      (ImmediateDataLen == Session->FirstBurstLength) ||
> -      (ImmediateDataLen == Packet->OutTransferLength)
> -      ) {
> -    //
> -    // Unsolicited data out sequence is not allowed,
> -    // or FirstBurstLength data is already sent out by immediate data
> -    // or all the OUT data accompany this SCSI packet is sent as
> -    // immediate data, the final flag should be set on this SCSI Command
> -    // PDU.
> -    //
> -    ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL);
> -  }
> -
> -ON_EXIT:
> -
> -  return Pdu;
> -}
> -
> -/**
> -  Create a new iSCSI SCSI Data Out PDU.
> -
> -  @param[in]  Data   The data to put into the Data Out PDU.
> -  @param[in]  Len    Length of the data.
> -  @param[in]  DataSN The DataSN of the Data Out PDU.
> -  @param[in]  Tcb    The task control block of this Data Out PDU.
> -  @param[in]  Lun    The LUN.
> -
> -  @return The net buffer wrapping the Data Out PDU.
> -  @retval NULL Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiNewDataOutPdu (
> -  IN UINT8      *Data,
> -  IN UINT32     Len,
> -  IN UINT32     DataSN,
> -  IN ISCSI_TCB  *Tcb,
> -  IN UINT64     Lun
> -  )
> -{
> -  LIST_ENTRY          *NbufList;
> -  NET_BUF             *PduHdr;
> -  NET_BUF             *DataSeg;
> -  NET_BUF             *Pdu;
> -  ISCSI_SCSI_DATA_OUT *DataOutHdr;
> -  ISCSI_XFER_CONTEXT  *XferContext;
> -
> -  NbufList = AllocatePool (sizeof (LIST_ENTRY));
> -  if (NbufList == NULL) {
> -    return NULL;
> -  }
> -
> -  InitializeListHead (NbufList);
> -
> -  //
> -  // Allocate memory for the BHS.
> -  //
> -  PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT));
> -  if (PduHdr == NULL) {
> -    FreePool (NbufList);
> -    return NULL;
> -  }
> -  //
> -  // Insert the BHS into the buffer list.
> -  //
> -  InsertTailList (NbufList, &PduHdr->List);
> -
> -  DataOutHdr  = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr,
> sizeof (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL);
> -  ASSERT (DataOutHdr != NULL);
> -  XferContext = &Tcb->XferContext;
> -
> -  ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT));
> -
> -  //
> -  // Set the flags and fields of the Data Out PDU BHS.
> -  //
> -  ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0);
> -  ISCSI_SET_DATASEG_LEN (DataOutHdr, Len);
> -
> -  DataOutHdr->InitiatorTaskTag  = HTONL (Tcb->InitiatorTaskTag);
> -  DataOutHdr->TargetTransferTag = HTONL (XferContext-
> >TargetTransferTag);
> -  DataOutHdr->ExpStatSN         = HTONL (Tcb->Conn->ExpStatSN);
> -  DataOutHdr->DataSN            = HTONL (DataSN);
> -  DataOutHdr->BufferOffset      = HTONL (XferContext->Offset);
> -
> -  if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) {
> -    CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun));
> -  }
> -  //
> -  // Build the data segment for this Data Out PDU.
> -  //
> -  DataSeg = IScsiNewDataSegment (Data, Len, FALSE);
> -  if (DataSeg == NULL) {
> -    IScsiFreeNbufList (NbufList);
> -    return NULL;
> -  }
> -  //
> -  // Put the data segment into the buffer list and combine it with the BHS
> -  // into a full Data Out PDU.
> -  //
> -  InsertTailList (NbufList, &DataSeg->List);
> -  Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> -  if (Pdu == NULL) {
> -    IScsiFreeNbufList (NbufList);
> -  }
> -
> -  return Pdu;
> -}
> -
> -/**
> -  Generate a consecutive sequence of iSCSI SCSI Data Out PDUs.
> -
> -  @param[in]  Data The data  which will be carried by the sequence of iSCSI
> SCSI Data Out PDUs.
> -  @param[in]  Tcb  The task control block of the data to send out.
> -  @param[in]  Lun  The LUN the data will be sent to.
> -
> -  @return A list of net buffers with each of them wraps an iSCSI SCSI Data
> Out PDU.
> -  @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiGenerateDataOutPduSequence (
> -  IN UINT8      *Data,
> -  IN ISCSI_TCB  *Tcb,
> -  IN UINT64     Lun
> -  )
> -{
> -  LIST_ENTRY          *PduList;
> -  UINT32              DataSN;
> -  UINT32              DataLen;
> -  NET_BUF             *DataOutPdu;
> -  ISCSI_CONNECTION    *Conn;
> -  ISCSI_XFER_CONTEXT  *XferContext;
> -  UINT8               *DataOutPacket;
> -
> -  PduList = AllocatePool (sizeof (LIST_ENTRY));
> -  if (PduList == NULL) {
> -    return NULL;
> -  }
> -
> -  InitializeListHead (PduList);
> -
> -  DataSN      = 0;
> -  Conn        = Tcb->Conn;
> -  DataOutPdu  = NULL;
> -  XferContext = &Tcb->XferContext;
> -
> -  while (XferContext->DesiredLength > 0) {
> -    //
> -    // Determine the length of data this Data Out PDU can carry.
> -    //
> -    DataLen = MIN (XferContext->DesiredLength, Conn-
> >MaxRecvDataSegmentLength);
> -
> -    //
> -    // Create a Data Out PDU.
> -    //
> -    DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun);
> -    if (DataOutPdu == NULL) {
> -      IScsiFreeNbufList (PduList);
> -      PduList = NULL;
> -
> -      goto ON_EXIT;
> -    }
> -
> -    InsertTailList (PduList, &DataOutPdu->List);
> -
> -    //
> -    // Update the context and DataSN.
> -    //
> -    XferContext->Offset += DataLen;
> -    XferContext->DesiredLength -= DataLen;
> -    DataSN++;
> -    Data += DataLen;
> -  }
> -  //
> -  // Set the F bit for the last data out PDU in this sequence.
> -  //
> -  DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL);
> -  if (DataOutPacket == NULL) {
> -    IScsiFreeNbufList (PduList);
> -    PduList = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL);
> -
> -ON_EXIT:
> -
> -  return PduList;
> -}
> -
> -/**
> -  Send the Data in a sequence of Data Out PDUs one by one.
> -
> -  @param[in]  Data            The data to carry by Data Out PDUs.
> -  @param[in]  Lun             The LUN the data will be sent to.
> -  @param[in]  Tcb             The task control block.
> -
> -  @retval EFI_SUCCES           The data is sent out to the LUN.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiSendDataOutPduSequence (
> -  IN UINT8      *Data,
> -  IN UINT64     Lun,
> -  IN ISCSI_TCB  *Tcb
> -  )
> -{
> -  LIST_ENTRY      *DataOutPduList;
> -  LIST_ENTRY      *Entry;
> -  NET_BUF         *Pdu;
> -  EFI_STATUS      Status;
> -
> -  //
> -  // Generate the Data Out PDU sequence.
> -  //
> -  DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun);
> -  if (DataOutPduList == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Status = EFI_SUCCESS;
> -
> -  //
> -  // Send the Data Out PDU's one by one.
> -  //
> -  NET_LIST_FOR_EACH (Entry, DataOutPduList) {
> -    Pdu     = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
> -
> -    Status  = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu);
> -    if (EFI_ERROR (Status)) {
> -      break;
> -    }
> -  }
> -
> -  IScsiFreeNbufList (DataOutPduList);
> -
> -  return Status;
> -}
> -
> -/**
> -  Process the received iSCSI SCSI Data In PDU.
> -
> -  @param[in]        Pdu      The Data In PDU received.
> -  @param[in]        Tcb      The task control block.
> -  @param[in, out]   Packet   The EXT SCSI PASS THRU request packet.
> -
> -  @retval EFI_SUCCES           The check on the Data IN PDU is passed and
> some update
> -                               actions are taken.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol errror
> happened.
> -  @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the
> request.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnDataInRcvd (
> -  IN NET_BUF                                         *Pdu,
> -  IN ISCSI_TCB                                       *Tcb,
> -  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
> -  )
> -{
> -  ISCSI_SCSI_DATA_IN  *DataInHdr;
> -  EFI_STATUS          Status;
> -
> -  DataInHdr                   = (ISCSI_SCSI_DATA_IN *) NetbufGetByte (Pdu, 0,
> NULL);
> -  if (DataInHdr == NULL) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag);
> -  DataInHdr->ExpCmdSN         = NTOHL (DataInHdr->ExpCmdSN);
> -  DataInHdr->MaxCmdSN         = NTOHL (DataInHdr->MaxCmdSN);
> -  DataInHdr->DataSN           = NTOHL (DataInHdr->DataSN);
> -
> -  //
> -  // Check the DataSN.
> -  //
> -  Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -  //
> -  // Update the command related sequence numbers.
> -  //
> -  IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN,
> DataInHdr->ExpCmdSN);
> -
> -  if (ISCSI_FLAG_ON (DataInHdr,
> SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) {
> -    if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) {
> -      //
> -      // The S bit is on but the F bit is off.
> -      //
> -      return EFI_PROTOCOL_ERROR;
> -    }
> -
> -    Tcb->StatusXferd = TRUE;
> -
> -    if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW |
> SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) {
> -      //
> -      // Underflow and Overflow are mutual flags.
> -      //
> -      return EFI_PROTOCOL_ERROR;
> -    }
> -    //
> -    // S bit is on, the StatSN is valid.
> -    //
> -    Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr-
> >StatSN));
> -    if (EFI_ERROR (Status)) {
> -      return Status;
> -    }
> -
> -    Packet->HostAdapterStatus = 0;
> -    Packet->TargetStatus      = DataInHdr->Status;
> -
> -    if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
> -      Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount);
> -      Status = EFI_BAD_BUFFER_SIZE;
> -    }
> -
> -    if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
> -      Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount);
> -    }
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Process the received iSCSI R2T PDU.
> -
> -  @param[in]       Pdu       The R2T PDU received.
> -  @param[in]       Tcb       The task control block.
> -  @param[in]       Lun       The Lun.
> -  @param[in, out]  Packet    The EXT SCSI PASS THRU request packet.
> -
> -  @retval EFI_SUCCES         The R2T PDU is valid and the solicited data is sent
> out.
> -  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror
> happened.
> -  @retval Others             Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnR2TRcvd (
> -  IN NET_BUF                                         *Pdu,
> -  IN ISCSI_TCB                                       *Tcb,
> -  IN UINT64                                          Lun,
> -  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
> -  )
> -{
> -  ISCSI_READY_TO_TRANSFER *R2THdr;
> -  EFI_STATUS              Status;
> -  ISCSI_XFER_CONTEXT      *XferContext;
> -  UINT8                   *Data;
> -
> -  R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL);
> -  if (R2THdr == NULL) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag);
> -  R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag);
> -  R2THdr->StatSN = NTOHL (R2THdr->StatSN);
> -  R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum);
> -  R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset);
> -  R2THdr->DesiredDataTransferLength = NTOHL (R2THdr-
> >DesiredDataTransferLength);
> -
> -  if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) || !ISCSI_SEQ_EQ
> (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) {
> -    return EFI_PROTOCOL_ERROR;;
> -  }
> -  //
> -  // Check the sequence number.
> -  //
> -  Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  XferContext                     = &Tcb->XferContext;
> -  XferContext->TargetTransferTag  = R2THdr->TargetTransferTag;
> -  XferContext->Offset             = R2THdr->BufferOffset;
> -  XferContext->DesiredLength      = R2THdr->DesiredDataTransferLength;
> -
> -  if (((XferContext->Offset + XferContext->DesiredLength) > Packet-
> >OutTransferLength) ||
> -      (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength)
> -      ) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -  //
> -  // Send the data solicited by this R2T.
> -  //
> -  Data    = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
> -  Status  = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
> -
> -  return Status;
> -}
> -
> -/**
> -  Process the received iSCSI SCSI Response PDU.
> -
> -  @param[in]       Pdu      The Response PDU received.
> -  @param[in]       Tcb      The task control block.
> -  @param[in, out]  Packet   The EXT SCSI PASS THRU request packet.
> -
> -  @retval EFI_SUCCES         The Response PDU is processed.
> -  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror
> happened.
> -  @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the
> request.
> -  @retval Others             Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnScsiRspRcvd (
> -  IN NET_BUF                                         *Pdu,
> -  IN ISCSI_TCB                                       *Tcb,
> -  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
> -  )
> -{
> -  SCSI_RESPONSE     *ScsiRspHdr;
> -  ISCSI_SENSE_DATA  *SenseData;
> -  EFI_STATUS        Status;
> -  UINT32            DataSegLen;
> -
> -  ScsiRspHdr                    = (SCSI_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
> -  if (ScsiRspHdr == NULL) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  ScsiRspHdr->InitiatorTaskTag  = NTOHL (ScsiRspHdr->InitiatorTaskTag);
> -  if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  ScsiRspHdr->StatSN  = NTOHL (ScsiRspHdr->StatSN);
> -
> -  Status              = IScsiCheckSN (&Tcb->Conn->ExpStatSN, ScsiRspHdr-
> >StatSN);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  ScsiRspHdr->MaxCmdSN  = NTOHL (ScsiRspHdr->MaxCmdSN);
> -  ScsiRspHdr->ExpCmdSN  = NTOHL (ScsiRspHdr->ExpCmdSN);
> -  IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN,
> ScsiRspHdr->ExpCmdSN);
> -
> -  Tcb->StatusXferd          = TRUE;
> -
> -  Packet->HostAdapterStatus = ScsiRspHdr->Response;
> -  if (Packet->HostAdapterStatus !=
> ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) {
> -    return EFI_SUCCESS;
> -  }
> -
> -  Packet->TargetStatus = ScsiRspHdr->Status;
> -
> -  if (ISCSI_FLAG_ON (ScsiRspHdr,
> SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW |
> SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) ||
> -      ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW |
> SCSI_RSP_PDU_FLAG_UNDERFLOW)
> -        ) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  if (ISCSI_FLAG_ON (ScsiRspHdr,
> SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) {
> -    Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount);
> -    Status = EFI_BAD_BUFFER_SIZE;
> -  }
> -
> -  if (ISCSI_FLAG_ON (ScsiRspHdr,
> SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW)) {
> -    Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount);
> -  }
> -
> -  if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
> -    if (Packet->DataDirection == DataIn) {
> -      Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
> -    } else {
> -      Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
> -    }
> -
> -    Status = EFI_BAD_BUFFER_SIZE;
> -  }
> -
> -  if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
> -    if (Packet->DataDirection == DataIn) {
> -      Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
> -    } else {
> -      Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
> -    }
> -  }
> -
> -  DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr);
> -  if (DataSegLen != 0) {
> -    SenseData               = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, sizeof
> (SCSI_RESPONSE), NULL);
> -    if (SenseData == NULL) {
> -      return EFI_PROTOCOL_ERROR;
> -    }
> -
> -    SenseData->Length       = NTOHS (SenseData->Length);
> -
> -    Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet-
> >SenseDataLength);
> -    if (Packet->SenseDataLength != 0) {
> -      CopyMem (Packet->SenseData, &SenseData->Data[0], Packet-
> >SenseDataLength);
> -    }
> -  } else {
> -    Packet->SenseDataLength = 0;
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Process the received NOP In PDU.
> -
> -  @param[in]  Pdu            The NOP In PDU received.
> -  @param[in]  Tcb            The task control block.
> -
> -  @retval EFI_SUCCES         The NOP In PDU is processed and the related
> sequence
> -                             numbers are updated.
> -  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror
> happened.
> -**/
> -EFI_STATUS
> -IScsiOnNopInRcvd (
> -  IN NET_BUF    *Pdu,
> -  IN ISCSI_TCB  *Tcb
> -  )
> -{
> -  ISCSI_NOP_IN  *NopInHdr;
> -  EFI_STATUS    Status;
> -
> -  NopInHdr            = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL);
> -  if (NopInHdr == NULL) {
> -    return EFI_PROTOCOL_ERROR;
> -  }
> -
> -  NopInHdr->StatSN    = NTOHL (NopInHdr->StatSN);
> -  NopInHdr->ExpCmdSN  = NTOHL (NopInHdr->ExpCmdSN);
> -  NopInHdr->MaxCmdSN  = NTOHL (NopInHdr->MaxCmdSN);
> -
> -  if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) {
> -    if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) {
> -      return EFI_PROTOCOL_ERROR;
> -    }
> -  } else {
> -    Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN);
> -    if (EFI_ERROR (Status)) {
> -      return Status;
> -    }
> -  }
> -
> -  IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN,
> NopInHdr->ExpCmdSN);
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Execute the SCSI command issued through the EXT SCSI PASS THRU
> protocol.
> -
> -  @param[in]       PassThru  The EXT SCSI PASS THRU protocol.
> -  @param[in]       Target    The target ID.
> -  @param[in]       Lun       The LUN.
> -  @param[in, out]  Packet    The request packet containing IO request, SCSI
> command
> -                             buffer and buffers to read/write.
> -
> -  @retval EFI_SUCCES           The SCSI command is executed and the result is
> updated to
> -                               the Packet.
> -  @retval EFI_DEVICE_ERROR     Session state was not as required.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_NOT_READY        The target can not accept new commands.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiExecuteScsiCommand (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                 *PassThru,
> -  IN UINT8                                           *Target,
> -  IN UINT64                                          Lun,
> -  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
> -  )
> -{
> -  EFI_STATUS              Status;
> -  ISCSI_DRIVER_DATA       *Private;
> -  ISCSI_SESSION           *Session;
> -  EFI_EVENT               TimeoutEvent;
> -  ISCSI_CONNECTION        *Conn;
> -  ISCSI_TCB               *Tcb;
> -  NET_BUF                 *Pdu;
> -  ISCSI_XFER_CONTEXT      *XferContext;
> -  UINT8                   *Data;
> -  ISCSI_IN_BUFFER_CONTEXT InBufferContext;
> -  UINT64                  Timeout;
> -  UINT8                   *PduHdr;
> -
> -  Private       = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
> -  Session       = &Private->Session;
> -  Status        = EFI_SUCCESS;
> -  Tcb           = NULL;
> -  TimeoutEvent  = NULL;
> -  Timeout       = 0;
> -
> -  if (Session->State != SESSION_STATE_LOGGED_IN) {
> -    Status = EFI_DEVICE_ERROR;
> -    goto ON_EXIT;
> -  }
> -
> -  Conn = NET_LIST_USER_STRUCT_S (
> -          Session->Conns.ForwardLink,
> -          ISCSI_CONNECTION,
> -          Link,
> -          ISCSI_CONNECTION_SIGNATURE
> -          );
> -
> -  if (Packet->Timeout != 0) {
> -    Timeout = MultU64x32 (Packet->Timeout, 2);
> -  }
> -
> -  Status = IScsiNewTcb (Conn, &Tcb);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -  //
> -  // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU.
> -  //
> -  Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb);
> -  if (Pdu == NULL) {
> -    Status = EFI_OUT_OF_RESOURCES;
> -    goto ON_EXIT;
> -  }
> -
> -  XferContext         = &Tcb->XferContext;
> -  PduHdr              = NetbufGetByte (Pdu, 0, NULL);
> -  if (PduHdr == NULL) {
> -    Status = EFI_PROTOCOL_ERROR;
> -    NetbufFree (Pdu);
> -    goto ON_EXIT;
> -  }
> -  XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr);
> -
> -  //
> -  // Transmit the SCSI Command PDU.
> -  //
> -  Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
> -
> -  NetbufFree (Pdu);
> -
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  if (!Session->InitialR2T &&
> -      (XferContext->Offset < Session->FirstBurstLength) &&
> -      (XferContext->Offset < Packet->OutTransferLength)
> -      ) {
> -    //
> -    // Unsolicited Data-Out sequence is allowed, there is remaining SCSI
> -    // OUT data and the limit of FirstBurstLength is not reached.
> -    //
> -    XferContext->TargetTransferTag = ISCSI_RESERVED_TAG;
> -    XferContext->DesiredLength = MIN (
> -                                  Session->FirstBurstLength,
> -                                  Packet->OutTransferLength - XferContext->Offset
> -                                  );
> -
> -    Data    = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
> -    Status  = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
> -    if (EFI_ERROR (Status)) {
> -      goto ON_EXIT;
> -    }
> -  }
> -
> -  InBufferContext.InData    = (UINT8 *) Packet->InDataBuffer;
> -  InBufferContext.InDataLen = Packet->InTransferLength;
> -
> -  while (!Tcb->StatusXferd) {
> -    //
> -    // Start the timeout timer.
> -    //
> -    if (Timeout != 0) {
> -      Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout);
> -      if (EFI_ERROR (Status)) {
> -        goto ON_EXIT;
> -      }
> -      TimeoutEvent = Conn->TimeoutEvent;
> -    }
> -    //
> -    // try to receive PDU from target.
> -    //
> -    Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, FALSE,
> TimeoutEvent);
> -    if (EFI_ERROR (Status)) {
> -      goto ON_EXIT;
> -    }
> -
> -    PduHdr = NetbufGetByte (Pdu, 0, NULL);
> -    if (PduHdr == NULL) {
> -      Status = EFI_PROTOCOL_ERROR;
> -      NetbufFree (Pdu);
> -      goto ON_EXIT;
> -    }
> -    switch (ISCSI_GET_OPCODE (PduHdr)) {
> -    case ISCSI_OPCODE_SCSI_DATA_IN:
> -      Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet);
> -      break;
> -
> -    case ISCSI_OPCODE_R2T:
> -      Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet);
> -      break;
> -
> -    case ISCSI_OPCODE_SCSI_RSP:
> -      Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet);
> -      break;
> -
> -    case ISCSI_OPCODE_NOP_IN:
> -      Status = IScsiOnNopInRcvd (Pdu, Tcb);
> -      break;
> -
> -    case ISCSI_OPCODE_VENDOR_T0:
> -    case ISCSI_OPCODE_VENDOR_T1:
> -    case ISCSI_OPCODE_VENDOR_T2:
> -      //
> -      // These messages are vendor specific, skip them.
> -      //
> -      break;
> -
> -    default:
> -      Status = EFI_PROTOCOL_ERROR;
> -      break;
> -    }
> -
> -    NetbufFree (Pdu);
> -
> -    if (EFI_ERROR (Status)) {
> -      break;
> -    }
> -  }
> -
> -ON_EXIT:
> -
> -  if (TimeoutEvent != NULL) {
> -    gBS->SetTimer (TimeoutEvent, TimerCancel, 0);
> -  }
> -
> -  if (Tcb != NULL) {
> -    IScsiDelTcb (Tcb);
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Reinstate the session on some error.
> -
> -  @param[in, out]  Private The iSCSI driver data.
> -
> -  @retval EFI_SUCCES  The session is reinstated from some error.
> -  @retval Other       Reinstatement failed.
> -**/
> -EFI_STATUS
> -IScsiSessionReinstatement (
> -  IN OUT ISCSI_DRIVER_DATA  *Private
> -  )
> -{
> -  ISCSI_SESSION *Session;
> -  EFI_STATUS    Status;
> -
> -  Session = &Private->Session;
> -  ASSERT (Session->State != SESSION_STATE_FREE);
> -
> -  //
> -  // Abort the session and re-init it.
> -  //
> -  IScsiSessionAbort (Session);
> -  IScsiSessionInit (Session, TRUE);
> -
> -  //
> -  // Login again.
> -  //
> -  Status = IScsiSessionLogin (Private);
> -
> -  return Status;
> -}
> -
> -/**
> -  Initialize some session parameters before login.
> -
> -  @param[in, out]  Session  The iSCSI session.
> -  @param[in]       Recovery Whether the request is from a fresh new start or
> recovery.
> -**/
> -VOID
> -IScsiSessionInit (
> -  IN OUT ISCSI_SESSION  *Session,
> -  IN BOOLEAN            Recovery
> -  )
> -{
> -  if (!Recovery) {
> -    Session->Signature  = ISCSI_SESSION_SIGNATURE;
> -    Session->State      = SESSION_STATE_FREE;
> -
> -    InitializeListHead (&Session->Conns);
> -    InitializeListHead (&Session->TcbList);
> -  }
> -
> -  Session->Tsih                 = 0;
> -
> -  Session->CmdSN                = 1;
> -  Session->InitiatorTaskTag     = 1;
> -  Session->NextCid              = 1;
> -
> -  Session->TargetPortalGroupTag = 0;
> -  Session->MaxConnections       = ISCSI_MAX_CONNS_PER_SESSION;
> -  Session->InitialR2T           = FALSE;
> -  Session->ImmediateData        = TRUE;
> -  Session->MaxBurstLength       = 262144;
> -  Session->FirstBurstLength     = MAX_RECV_DATA_SEG_LEN_IN_FFP;
> -  Session->DefaultTime2Wait     = 2;
> -  Session->DefaultTime2Retain   = 20;
> -  Session->MaxOutstandingR2T    = DEFAULT_MAX_OUTSTANDING_R2T;
> -  Session->DataPDUInOrder       = TRUE;
> -  Session->DataSequenceInOrder  = TRUE;
> -  Session->ErrorRecoveryLevel   = 0;
> -}
> -
> -/**
> -  Abort the iSCSI session, that is, reset all the connection and free the
> -  resources.
> -
> -  @param[in, out]  Session The iSCSI session.
> -
> -  @retval EFI_SUCCES  The session is aborted.
> -**/
> -EFI_STATUS
> -IScsiSessionAbort (
> -  IN OUT ISCSI_SESSION  *Session
> -  )
> -{
> -  ISCSI_DRIVER_DATA *Private;
> -  ISCSI_CONNECTION  *Conn;
> -
> -  if (Session->State != SESSION_STATE_LOGGED_IN) {
> -    return EFI_SUCCESS;
> -  }
> -
> -  ASSERT (!IsListEmpty (&Session->Conns));
> -
> -  Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session);
> -
> -  while (!IsListEmpty (&Session->Conns)) {
> -    Conn = NET_LIST_USER_STRUCT_S (
> -            Session->Conns.ForwardLink,
> -            ISCSI_CONNECTION,
> -            Link,
> -            ISCSI_CONNECTION_SIGNATURE
> -            );
> -
> -    gBS->CloseProtocol (
> -          Conn->Tcp4Io.Handle,
> -          &gEfiTcp4ProtocolGuid,
> -          Private->Image,
> -          Private->ExtScsiPassThruHandle
> -          );
> -
> -    IScsiConnReset (Conn);
> -
> -    IScsiDetatchConnection (Conn);
> -    IScsiDestroyConnection (Conn);
> -  }
> -
> -  Session->State = SESSION_STATE_FAILED;
> -
> -  return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> deleted file mode 100644
> index 901b38e92fc0..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> +++ /dev/null
> @@ -1,487 +0,0 @@
> -/** @file
> -  The wrap of TCP/IP Socket interface.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> -  The common notify function associated with various Tcp4Io events.
> -
> -  @param[in]  Event   The event signaled.
> -  @param[in]  Context The context.
> -**/
> -VOID
> -EFIAPI
> -Tcp4IoCommonNotify (
> -  IN EFI_EVENT  Event,
> -  IN VOID       *Context
> -  )
> -{
> -  *((BOOLEAN *) Context) = TRUE;
> -}
> -
> -/**
> -  Create a TCP socket with the specified configuration data.
> -
> -  @param[in]  Image      The handle of the driver image.
> -  @param[in]  Controller The handle of the controller.
> -  @param[in]  ConfigData The Tcp4 configuration data.
> -  @param[in]  Tcp4Io     The Tcp4Io.
> -
> -  @retval EFI_SUCCESS    The TCP socket is created and configured.
> -  @retval Others         Failed to create the TCP socket or configure it.
> -**/
> -EFI_STATUS
> -Tcp4IoCreateSocket (
> -  IN EFI_HANDLE           Image,
> -  IN EFI_HANDLE           Controller,
> -  IN TCP4_IO_CONFIG_DATA  *ConfigData,
> -  IN TCP4_IO              *Tcp4Io
> -  )
> -{
> -  EFI_STATUS            Status;
> -  EFI_TCP4_PROTOCOL     *Tcp4;
> -  EFI_TCP4_CONFIG_DATA  Tcp4ConfigData;
> -  EFI_TCP4_OPTION       ControlOption;
> -  EFI_TCP4_ACCESS_POINT *AccessPoint;
> -
> -  Tcp4Io->Handle = NULL;
> -  Tcp4Io->ConnToken.CompletionToken.Event = NULL;
> -  Tcp4Io->TxToken.CompletionToken.Event = NULL;
> -  Tcp4Io->RxToken.CompletionToken.Event = NULL;
> -  Tcp4Io->CloseToken.CompletionToken.Event = NULL;
> -  Tcp4 = NULL;
> -
> -  //
> -  // Create the TCP4 child instance and get the TCP4 protocol.
> -  //
> -  Status = NetLibCreateServiceChild (
> -            Controller,
> -            Image,
> -            &gEfiTcp4ServiceBindingProtocolGuid,
> -            &Tcp4Io->Handle
> -            );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  Status = gBS->OpenProtocol (
> -                  Tcp4Io->Handle,
> -                  &gEfiTcp4ProtocolGuid,
> -                  (VOID **)&Tcp4Io->Tcp4,
> -                  Image,
> -                  Controller,
> -                  EFI_OPEN_PROTOCOL_BY_DRIVER
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  Tcp4Io->Image       = Image;
> -  Tcp4Io->Controller  = Controller;
> -  Tcp4                = Tcp4Io->Tcp4;
> -
> -  //
> -  // Set the configuration parameters.
> -  //
> -  ControlOption.ReceiveBufferSize       = 0x200000;
> -  ControlOption.SendBufferSize          = 0x200000;
> -  ControlOption.MaxSynBackLog           = 0;
> -  ControlOption.ConnectionTimeout       = 0;
> -  ControlOption.DataRetries             = 6;
> -  ControlOption.FinTimeout              = 0;
> -  ControlOption.TimeWaitTimeout         = 0;
> -  ControlOption.KeepAliveProbes         = 4;
> -  ControlOption.KeepAliveTime           = 0;
> -  ControlOption.KeepAliveInterval       = 0;
> -  ControlOption.EnableNagle             = FALSE;
> -  ControlOption.EnableTimeStamp         = FALSE;
> -  ControlOption.EnableWindowScaling     = TRUE;
> -  ControlOption.EnableSelectiveAck      = FALSE;
> -  ControlOption.EnablePathMtuDiscovery  = FALSE;
> -
> -  Tcp4ConfigData.TypeOfService          = 8;
> -  Tcp4ConfigData.TimeToLive             = 255;
> -  Tcp4ConfigData.ControlOption          = &ControlOption;
> -
> -  AccessPoint = &Tcp4ConfigData.AccessPoint;
> -
> -  AccessPoint->UseDefaultAddress = FALSE;
> -  AccessPoint->StationPort = 0;
> -  AccessPoint->RemotePort = ConfigData->RemotePort;
> -  AccessPoint->ActiveFlag = TRUE;
> -
> -  CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof
> (EFI_IPv4_ADDRESS));
> -  CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask,
> sizeof (EFI_IPv4_ADDRESS));
> -  CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp,
> sizeof (EFI_IPv4_ADDRESS));
> -
> -  //
> -  // Configure the TCP4 protocol.
> -  //
> -  Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) {
> -    //
> -    // the gateway is not zero, add the default route by hand
> -    //
> -    Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr,
> &ConfigData->Gateway);
> -    if (EFI_ERROR (Status)) {
> -      goto ON_ERROR;
> -    }
> -  }
> -  //
> -  // Create events for variuos asynchronous operations.
> -  //
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_SIGNAL,
> -                  TPL_NOTIFY,
> -                  Tcp4IoCommonNotify,
> -                  &Tcp4Io->IsConnDone,
> -                  &Tcp4Io->ConnToken.CompletionToken.Event
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_SIGNAL,
> -                  TPL_NOTIFY,
> -                  Tcp4IoCommonNotify,
> -                  &Tcp4Io->IsTxDone,
> -                  &Tcp4Io->TxToken.CompletionToken.Event
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_SIGNAL,
> -                  TPL_NOTIFY,
> -                  Tcp4IoCommonNotify,
> -                  &Tcp4Io->IsRxDone,
> -                  &Tcp4Io->RxToken.CompletionToken.Event
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_SIGNAL,
> -                  TPL_NOTIFY,
> -                  Tcp4IoCommonNotify,
> -                  &Tcp4Io->IsCloseDone,
> -                  &Tcp4Io->CloseToken.CompletionToken.Event
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_ERROR;
> -  }
> -
> -  Tcp4Io->IsTxDone  = FALSE;
> -  Tcp4Io->IsRxDone  = FALSE;
> -
> -  return EFI_SUCCESS;
> -
> -ON_ERROR:
> -
> -  if (Tcp4Io->RxToken.CompletionToken.Event != NULL) {
> -    gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
> -  }
> -
> -  if (Tcp4Io->TxToken.CompletionToken.Event != NULL) {
> -    gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
> -  }
> -
> -  if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) {
> -    gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
> -  }
> -
> -  if (Tcp4 != NULL) {
> -    Tcp4->Configure (Tcp4, NULL);
> -
> -    gBS->CloseProtocol (
> -          Tcp4Io->Handle,
> -          &gEfiTcp4ProtocolGuid,
> -          Image,
> -          Controller
> -          );
> -  }
> -
> -  NetLibDestroyServiceChild (
> -    Controller,
> -    Image,
> -    &gEfiTcp4ServiceBindingProtocolGuid,
> -    Tcp4Io->Handle
> -    );
> -
> -  return Status;
> -}
> -
> -/**
> -  Destroy the socket.
> -
> -  @param[in]  Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
> -**/
> -VOID
> -Tcp4IoDestroySocket (
> -  IN TCP4_IO  *Tcp4Io
> -  )
> -{
> -  EFI_TCP4_PROTOCOL *Tcp4;
> -
> -  Tcp4 = Tcp4Io->Tcp4;
> -
> -  Tcp4->Configure (Tcp4, NULL);
> -
> -  gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
> -  gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
> -  gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
> -
> -  gBS->CloseProtocol (
> -        Tcp4Io->Handle,
> -        &gEfiTcp4ProtocolGuid,
> -        Tcp4Io->Image,
> -        Tcp4Io->Controller
> -        );
> -
> -  NetLibDestroyServiceChild (
> -    Tcp4Io->Controller,
> -    Tcp4Io->Image,
> -    &gEfiTcp4ServiceBindingProtocolGuid,
> -    Tcp4Io->Handle
> -    );
> -}
> -
> -/**
> -  Connect to the other endpoint of the TCP socket.
> -
> -  @param[in, out]  Tcp4Io    The Tcp4Io wrapping the TCP socket.
> -  @param[in]       Timeout   The time to wait for connection done.
> -
> -  @retval EFI_SUCCESS          Connect to the other endpoint of the TCP socket
> successfully.
> -  @retval EFI_TIMEOUT          Failed to connect to the other endpoint of the
> TCP socket in the                               specified time period.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoConnect (
> -  IN OUT TCP4_IO    *Tcp4Io,
> -  IN EFI_EVENT      Timeout
> -  )
> -{
> -  EFI_TCP4_PROTOCOL *Tcp4;
> -  EFI_STATUS        Status;
> -
> -  Tcp4Io->IsConnDone  = FALSE;
> -  Tcp4                = Tcp4Io->Tcp4;
> -  Status              = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout)))
> {
> -    Tcp4->Poll (Tcp4);
> -  }
> -
> -  if (!Tcp4Io->IsConnDone) {
> -    Status = EFI_TIMEOUT;
> -  } else {
> -    Status = Tcp4Io->ConnToken.CompletionToken.Status;
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Reset the socket.
> -
> -  @param[in, out]  Tcp4Io The Tcp4Io wrapping the TCP socket.
> -**/
> -VOID
> -Tcp4IoReset (
> -  IN OUT TCP4_IO  *Tcp4Io
> -  )
> -{
> -  EFI_STATUS        Status;
> -  EFI_TCP4_PROTOCOL *Tcp4;
> -
> -  Tcp4Io->CloseToken.AbortOnClose = TRUE;
> -  Tcp4Io->IsCloseDone             = FALSE;
> -
> -  Tcp4 = Tcp4Io->Tcp4;
> -  Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken);
> -  if (EFI_ERROR (Status)) {
> -    return ;
> -  }
> -
> -  while (!Tcp4Io->IsCloseDone) {
> -    Tcp4->Poll (Tcp4);
> -  }
> -}
> -
> -/**
> -  Transmit the Packet to the other endpoint of the socket.
> -
> -  @param[in]   Tcp4Io          The Tcp4Io wrapping the TCP socket.
> -  @param[in]   Packet          The packet to transmit.
> -
> -  @retval EFI_SUCCESS          The packet is trasmitted.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoTransmit (
> -  IN TCP4_IO  *Tcp4Io,
> -  IN NET_BUF  *Packet
> -  )
> -{
> -  EFI_TCP4_TRANSMIT_DATA  *TxData;
> -  EFI_TCP4_PROTOCOL       *Tcp4;
> -  EFI_STATUS              Status;
> -
> -  TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet-
> >BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA));
> -  if (TxData == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  TxData->Push        = TRUE;
> -  TxData->Urgent      = FALSE;
> -  TxData->DataLength  = Packet->TotalSize;
> -
> -  //
> -  // Build the fragment table.
> -  //
> -  TxData->FragmentCount = Packet->BlockOpNum;
> -  NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0],
> &TxData->FragmentCount);
> -
> -  Tcp4Io->TxToken.Packet.TxData = TxData;
> -
> -  //
> -  // Trasnmit the packet.
> -  //
> -  Tcp4    = Tcp4Io->Tcp4;
> -  Status  = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  while (!Tcp4Io->IsTxDone) {
> -    Tcp4->Poll (Tcp4);
> -  }
> -
> -  Tcp4Io->IsTxDone  = FALSE;
> -
> -  Status            = Tcp4Io->TxToken.CompletionToken.Status;
> -
> -ON_EXIT:
> -
> -  FreePool (TxData);
> -
> -  return Status;
> -}
> -
> -/**
> -  Receive data from the socket.
> -
> -  @param[in]  Tcp4Io           The Tcp4Io which wraps the socket to be
> destroyed.
> -  @param[in]  Packet           The buffer to hold the data copy from the soket rx
> buffer.
> -  @param[in]  AsyncMode        Is this receive asyncronous or not.
> -  @param[in]  Timeout          The time to wait for receiving the amount of data
> the Packet
> -                               can hold.
> -
> -  @retval EFI_SUCCESS          The required amount of data is received from
> the socket.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
> -  @retval EFI_TIMEOUT          Failed to receive the required amount of data in
> the
> -                               specified time period.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoReceive (
> -  IN TCP4_IO    *Tcp4Io,
> -  IN NET_BUF    *Packet,
> -  IN BOOLEAN    AsyncMode,
> -  IN EFI_EVENT  Timeout
> -  )
> -{
> -  EFI_TCP4_PROTOCOL     *Tcp4;
> -  EFI_TCP4_RECEIVE_DATA RxData;
> -  EFI_STATUS            Status;
> -  NET_FRAGMENT          *Fragment;
> -  UINT32                FragmentCount;
> -  UINT32                CurrentFragment;
> -
> -  FragmentCount = Packet->BlockOpNum;
> -  Fragment      = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT));
> -  if (Fragment == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -  //
> -  // Build the fragment table.
> -  //
> -  NetbufBuildExt (Packet, Fragment, &FragmentCount);
> -
> -  RxData.FragmentCount          = 1;
> -  Tcp4Io->RxToken.Packet.RxData = &RxData;
> -  CurrentFragment               = 0;
> -  Tcp4                          = Tcp4Io->Tcp4;
> -  Status                        = EFI_SUCCESS;
> -
> -  while (CurrentFragment < FragmentCount) {
> -    RxData.DataLength                       = Fragment[CurrentFragment].Len;
> -    RxData.FragmentTable[0].FragmentLength  =
> Fragment[CurrentFragment].Len;
> -    RxData.FragmentTable[0].FragmentBuffer  =
> Fragment[CurrentFragment].Bulk;
> -
> -    Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken);
> -    if (EFI_ERROR (Status)) {
> -      goto ON_EXIT;
> -    }
> -
> -    while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS-
> >CheckEvent (Timeout)))) {
> -      //
> -      // Poll until some data is received or something error happens.
> -      //
> -      Tcp4->Poll (Tcp4);
> -    }
> -
> -    if (!Tcp4Io->IsRxDone) {
> -      //
> -      // Timeout occurs, cancel the receive request.
> -      //
> -      Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken);
> -
> -      Status = EFI_TIMEOUT;
> -      goto ON_EXIT;
> -    } else {
> -      Tcp4Io->IsRxDone = FALSE;
> -    }
> -
> -    if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) {
> -      Status = Tcp4Io->RxToken.CompletionToken.Status;
> -      goto ON_EXIT;
> -    }
> -
> -    Fragment[CurrentFragment].Len -=
> RxData.FragmentTable[0].FragmentLength;
> -    if (Fragment[CurrentFragment].Len == 0) {
> -      CurrentFragment++;
> -    } else {
> -      Fragment[CurrentFragment].Bulk +=
> RxData.FragmentTable[0].FragmentLength;
> -    }
> -  }
> -
> -ON_EXIT:
> -  Tcp4Io->RxToken.Packet.RxData = NULL;
> -  FreePool (Fragment);
> -
> -  return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> deleted file mode 100644
> index 3555f1a2ebe3..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> +++ /dev/null
> @@ -1,350 +0,0 @@
> -/** @file
> -  Implementation of MD5 algorithm.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "Md5.h"
> -
> -CONST UINT32  Md5_Data[][2] = {
> -  { 0, 1 },
> -  { 1, 5 },
> -  { 5, 3 },
> -  { 0, 7 }
> -};
> -
> -CONST UINT32  Md5_S[][4] = {
> -  { 7, 22, 17, 12 },
> -  { 5, 20, 14, 9 },
> -  { 4, 23, 16 ,11 },
> -  { 6, 21, 15, 10 },
> -};
> -
> -CONST UINT32  Md5_T[] = {
> -  0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE,
> -  0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501,
> -  0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE,
> -  0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821,
> -  0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA,
> -  0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8,
> -  0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED,
> -  0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A,
> -  0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C,
> -  0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70,
> -  0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05,
> -  0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665,
> -  0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039,
> -  0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1,
> -  0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1,
> -  0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391
> -};
> -
> -CONST UINT8 Md5HashPadding[] =
> -{
> -  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> -  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> -};
> -
> -//
> -// ROTATE_LEFT rotates x left n bits.
> -//
> -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
> -
> -#define SA            MedStates[Index2 & 3]
> -#define SB            MedStates[(Index2 + 1) & 3]
> -#define SC            MedStates[(Index2 + 2) & 3]
> -#define SD            MedStates[(Index2 + 3) & 3]
> -
> -/**
> -  Tf1 is one basic MD5 transform function.
> -
> -  @param[in]  A      A  32-bit quantity.
> -  @param[in]  B      A  32-bit quantity.
> -  @param[in]  C      A  32-bit quantity.
> -
> -  @return             Output was produced as a 32-bit quantity based on the
> -                      three 32-bit input quantity.
> -**/
> -UINT32
> -Tf1 (
> -  IN UINT32 A,
> -  IN UINT32 B,
> -  IN UINT32 C
> -  )
> -{
> -  return (A & B) | (~A & C);
> -}
> -
> -/**
> -  Tf2 is one basic MD5 transform function.
> -
> -  @param[in]  A      A  32-bit quantity.
> -  @param[in]  B      A  32-bit quantity.
> -  @param[in]  C      A  32-bit quantity.
> -
> -  @return             Output was produced as a 32-bit quantity based on the
> -                      three 32-bit input quantity.
> -**/
> -UINT32
> -Tf2 (
> -  IN UINT32 A,
> -  IN UINT32 B,
> -  IN UINT32 C
> -  )
> -{
> -  return (A & C) | (B & ~C);
> -}
> -
> -/**
> -  Tf3 is one basic MD5 transform function.
> -
> -  @param[in]  A      A  32-bit quantity.
> -  @param[in]  B      A  32-bit quantity.
> -  @param[in]  C      A  32-bit quantity.
> -
> -  @return             Output was produced as a 32-bit quantity based on the
> -                      three 32-bit input quantity.
> -**/
> -UINT32
> -Tf3 (
> -  IN UINT32 A,
> -  IN UINT32 B,
> -  IN UINT32 C
> -  )
> -{
> -  return A ^ B ^ C;
> -}
> -
> -/**
> -  Tf4 is one basic MD5 transform function.
> -
> -  @param[in]  A      A  32-bit quantity.
> -  @param[in]  B      A  32-bit quantity.
> -  @param[in]  C      A  32-bit quantity.
> -
> -  @return             Output was produced as a 32-bit quantity based on the
> -                      three 32-bit input quantity.
> -**/
> -UINT32
> -Tf4 (
> -  IN UINT32 A,
> -  IN UINT32 B,
> -  IN UINT32 C
> -  )
> -{
> -  return B ^ (A | ~C);
> -}
> -
> -typedef
> -UINT32
> -(*MD5_TRANSFORM_FUNC) (
> -  IN UINT32  A,
> -  IN UINT32  B,
> -  IN UINT32  C
> -  );
> -
> -CONST MD5_TRANSFORM_FUNC Md5_F[] = {
> -  Tf1,
> -  Tf2,
> -  Tf3,
> -  Tf4
> -};
> -
> -/**
> -  Perform the MD5 transform on 64 bytes data segment.
> -
> -  @param[in, out]  Md5Ctx  It includes the data segment for Md5 transform.
> -**/
> -VOID
> -MD5Transform (
> -  IN OUT MD5_CTX  *Md5Ctx
> -  )
> -{
> -  UINT32  Index1;
> -  UINT32  Index2;
> -  UINT32  MedStates[MD5_HASHSIZE >> 2];
> -  UINT32  *Data;
> -  UINT32  IndexD;
> -  UINT32  IndexT;
> -
> -  Data = (UINT32 *) Md5Ctx->M;
> -
> -  //
> -  // Copy MD5 states to MedStates
> -  //
> -  CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE);
> -
> -  IndexT = 0;
> -  for (Index1 = 0; Index1 < 4; Index1++) {
> -    IndexD = Md5_Data[Index1][0];
> -    for (Index2 = 16; Index2 > 0; Index2--) {
> -      SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT];
> -      SA  = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]);
> -      SA += SB;
> -
> -      IndexD += Md5_Data[Index1][1];
> -      IndexD &= 15;
> -
> -      IndexT++;
> -    }
> -  }
> -
> -  for (Index1 = 0; Index1 < 4; Index1++) {
> -    Md5Ctx->States[Index1] += MedStates[Index1];
> -  }
> -}
> -
> -/**
> -  Copy data segment into the M field of MD5_CTX structure for later
> transform.
> -  If the length of data segment is larger than 64 bytes, then does the
> transform
> -  immediately and the generated Md5 code is stored in the States field of
> MD5_CTX
> -  data struct for later accumulation.
> -  All of Md5 code generated for the sequential 64-bytes data segaments are
> be
> -  accumulated in MD5Final() function.
> -
> -  @param[in, out]  Md5Ctx  The data structure of storing the original data
> -                           segment and the final result.
> -  @param[in]       Data    The data wanted to be transformed.
> -  @param[in]       DataLen The length of data.
> -**/
> -VOID
> -MD5UpdateBlock (
> -  IN OUT MD5_CTX  *Md5Ctx,
> -  IN CONST UINT8  *Data,
> -  IN       UINTN  DataLen
> -  )
> -{
> -  UINTN Limit;
> -
> -  for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64)
> {
> -    CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit);
> -    MD5Transform (Md5Ctx);
> -
> -    Md5Ctx->Count = 0;
> -    Data         += Limit;
> -    DataLen      -= Limit;
> -  }
> -
> -  CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen);
> -  Md5Ctx->Count += DataLen;
> -}
> -
> -/**
> -  Initialize four 32-bits chaining variables and use them to do the Md5
> transform.
> -
> -  @param[out]  Md5Ctx The data structure of Md5.
> -
> -  @retval EFI_SUCCESS Initialization is ok.
> -**/
> -EFI_STATUS
> -MD5Init (
> -  OUT MD5_CTX  *Md5Ctx
> -  )
> -{
> -  ZeroMem (Md5Ctx, sizeof (*Md5Ctx));
> -
> -  //
> -  // Set magic initialization constants.
> -  //
> -  Md5Ctx->States[0] = 0x67452301;
> -  Md5Ctx->States[1] = 0xefcdab89;
> -  Md5Ctx->States[2] = 0x98badcfe;
> -  Md5Ctx->States[3] = 0x10325476;
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  the external interface of Md5 algorithm
> -
> -  @param[in, out]  Md5Ctx  The data structure of storing the original data
> -                           segment and the final result.
> -  @param[in]       Data    The data wanted to be transformed.
> -  @param[in]       DataLen The length of data.
> -
> -  @retval EFI_SUCCESS The transform is ok.
> -  @retval Others      Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Update (
> -  IN  OUT MD5_CTX  *Md5Ctx,
> -  IN  VOID         *Data,
> -  IN  UINTN        DataLen
> -  )
> -{
> -  if (EFI_ERROR (Md5Ctx->Status)) {
> -    return Md5Ctx->Status;
> -  }
> -
> -  MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen);
> -  Md5Ctx->Length += DataLen;
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Accumulate the MD5 value of every data segment and generate the finial
> -  result according to MD5 algorithm.
> -
> -  @param[in, out]   Md5Ctx  The data structure of storing the original data
> -                            segment and the final result.
> -  @param[out]      HashVal  The final 128-bits output.
> -
> -  @retval EFI_SUCCESS  The transform is ok.
> -  @retval Others       Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Final (
> -  IN  OUT MD5_CTX  *Md5Ctx,
> -  OUT UINT8        *HashVal
> -  )
> -{
> -  UINTN PadLength;
> -
> -  if (Md5Ctx->Status == EFI_ALREADY_STARTED) {
> -    //
> -    // Store Hashed value & Zeroize sensitive context information.
> -    //
> -    CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE);
> -    ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx));
> -
> -    return EFI_SUCCESS;
> -  }
> -
> -  if (EFI_ERROR (Md5Ctx->Status)) {
> -    return Md5Ctx->Status;
> -  }
> -
> -  PadLength  = Md5Ctx->Count >= 56 ? 120 : 56;
> -  PadLength -= Md5Ctx->Count;
> -  MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength);
> -  Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3);
> -  MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8);
> -
> -  ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M));
> -  Md5Ctx->Length  = 0;
> -  Md5Ctx->Status  = EFI_ALREADY_STARTED;
> -  return MD5Final (Md5Ctx, HashVal);
> -}
> -
> diff --git a/MdeModulePkg/MdeModulePkg.dsc
> b/MdeModulePkg/MdeModulePkg.dsc
> index 3529c8d30365..b787fb5692d3 100644
> --- a/MdeModulePkg/MdeModulePkg.dsc
> +++ b/MdeModulePkg/MdeModulePkg.dsc
> @@ -354,7 +354,6 @@ [Components]
>    MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
>    MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
>    MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
> -  MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
>    MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
>    MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
>    MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> deleted file mode 100644
> index ee371d26744c..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> +++ /dev/null
> @@ -1,165 +0,0 @@
> -/** @file
> -  The header file of UEFI Component Name(2) protocol.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _COMPONENT_NAME_H_
> -#define _COMPONENT_NAME_H_
> -
> -#include <Protocol/ComponentName.h>
> -#include <Protocol/ComponentName2.h>
> -
> -extern EFI_COMPONENT_NAME2_PROTOCOL       gIScsiComponentName2;
> -extern EFI_COMPONENT_NAME_PROTOCOL        gIScsiComponentName;
> -
> -//
> -// EFI Component Name Protocol for iSCSI driver.
> -//
> -
> -/**
> -  Retrieves a Unicode string that is the user readable name of the EFI 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[in]  This        A pointer to the EFI_COMPONENT_NAME_PROTOCOL
> instance.
> -  @param[in]  Language    A pointer to a three characters ISO 639-2 language
> identifier.
> -                          This is the language of the driver name that 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.
> -  @param[out]  DriverName 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
> -IScsiComponentNameGetDriverName (
> -  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 an EFI Driver. Currently not implemented.
> -
> -  @param[in]  This             A pointer to the
> EFI_COMPONENT_NAME_PROTOCOL instance.
> -  @param[in]  ControllerHandle 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[in]  ChildHandle      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[in]  Language         A pointer to a three characters ISO 639-2
> language
> -                               identifier.  This is the language of the controller name
> -                               that 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.
> -  @param[out]  ControllerName  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 NULL.
> -  @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
> -IScsiComponentNameGetControllerName (
> -  IN  EFI_COMPONENT_NAME_PROTOCOL   *This,
> -  IN  EFI_HANDLE                    ControllerHandle,
> -  IN  EFI_HANDLE                    ChildHandle        OPTIONAL,
> -  IN  CHAR8                         *Language,
> -  OUT CHAR16                        **ControllerName
> -  );
> -
> -//
> -// EFI iSCSI Initiator Name Protocol for IScsi driver.
> -//
> -
> -/**
> -  Retrieves the current set value of iSCSI Initiator Name.
> -
> -  @param[in]       This       Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> -  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer
> / Actual size of the
> -                              variable data buffer.
> -  @param[out]      Buffer     Pointer to the buffer for data to be read.
> -
> -  @retval EFI_SUCCESS           Data was successfully retrieved into the
> provided buffer and the
> -                                BufferSize was sufficient to handle the iSCSI initiator name
> -  @retval EFI_BUFFER_TOO_SMALL  BufferSize is too small for the result.
> -  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> -  @retval EFI_DEVICE_ERROR      The iSCSI initiator name could not be
> retrieved due to a hardware error.
> -  @retval Others                Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> -  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
> -  IN OUT UINTN                              *BufferSize,
> -  OUT    VOID                               *Buffer
> -  );
> -
> -/**
> -  Sets the iSCSI Initiator Name.
> -
> -  @param[in]       This       Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> -  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer.
> -  @param[in]       Buffer     Pointer to the buffer for data to be written.
> -
> -  @retval EFI_SUCCESS           Data was successfully stored by the protocol.
> -  @retval EFI_UNSUPPORTED       Platform policies do not allow for data to be
> written.
> -                                Currently not implemented.
> -  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or
> BufferSize exceeds the maximum allowed limit.
> -  @retval EFI_DEVICE_ERROR      The data could not be stored due to a
> hardware error.
> -  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold
> the data.
> -  @retval EFI_PROTOCOL_ERROR    Input iSCSI initiator name does not
> adhere to RFC 3720
> -                                (and other related protocols)
> -  @retval Others                Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> -  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
> -  IN OUT UINTN                              *BufferSize,
> -  IN     VOID                               *Buffer
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> deleted file mode 100644
> index d3c020e45d3b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -// /** @file
> -// This module produces EFI iSCSI Initiator Name Protocol.
> -//
> -// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4
> Protocol
> -// and EFI DHCPv4 Protocol, to provide the capability to do the transport for
> SCSI
> -// data over TCP/IP. It installs EFI HII Configuration Access Protocol to
> provide
> -// one way to configurate the iSCSI setting.
> -//
> -// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -//
> -// 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.
> -//
> -// **/
> -
> -
> -#string STR_MODULE_ABSTRACT             #language en-US "Produces EFI iSCSI
> Initiator Name Protocol"
> -
> -#string STR_MODULE_DESCRIPTION          #language en-US "This module
> produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI
> DHCPv4 Protocol, to provide the capability to do the transport for SCSI data
> over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way
> to configure the iSCSI setting."
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> deleted file mode 100644
> index 5ec75820a605..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -// /** @file
> -// IScsi4Dxe Localized Strings and Content
> -//
> -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
> -//
> -// 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.
> -//
> -// **/
> -
> -#string STR_PROPERTIES_MODULE_NAME
> -#language en-US
> -"iSCSI DXE Driver"
> -
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> deleted file mode 100644
> index 14a5658f754b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> +++ /dev/null
> @@ -1,106 +0,0 @@
> -/** @file
> -  The header file of CHAP configuration.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_CHAP_H_
> -#define _ISCSI_CHAP_H_
> -
> -#define ISCSI_AUTH_METHOD_CHAP    "CHAP"
> -
> -#define ISCSI_KEY_CHAP_ALGORITHM  "CHAP_A"
> -#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I"
> -#define ISCSI_KEY_CHAP_CHALLENGE  "CHAP_C"
> -#define ISCSI_KEY_CHAP_NAME       "CHAP_N"
> -#define ISCSI_KEY_CHAP_RESPONSE   "CHAP_R"
> -
> -#define ISCSI_CHAP_ALGORITHM_MD5  5
> -
> -#define ISCSI_CHAP_AUTH_MAX_LEN   1024
> -///
> -/// MD5_HASHSIZE
> -///
> -#define ISCSI_CHAP_RSP_LEN        16
> -
> -#define ISCSI_CHAP_INITIAL        0
> -#define ISCSI_CHAP_STEP_ONE       1
> -#define ISCSI_CHAP_STEP_TWO       2
> -#define ISCSI_CHAP_STEP_THREE     3
> -#define ISCSI_CHAP_STEP_FOUR      4
> -
> -#pragma pack(1)
> -
> -typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
> -  UINT8 CHAPType;
> -  CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE];
> -  CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> -  CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
> -  CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> -} ISCSI_CHAP_AUTH_CONFIG_NVDATA;
> -
> -#pragma pack()
> -
> -///
> -/// ISCSI CHAP Authentication Data
> -///
> -typedef struct _ISCSI_CHAP_AUTH_DATA {
> -  ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig;
> -  UINT32                        InIdentifier;
> -  UINT8                         InChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
> -  UINT32                        InChallengeLength;
> -  //
> -  // Calculated CHAP Response (CHAP_R) value
> -  //
> -  UINT8                         CHAPResponse[ISCSI_CHAP_RSP_LEN];
> -
> -  //
> -  // Auth-data to be sent out for mutual authentication
> -  //
> -  UINT32                        OutIdentifier;
> -  UINT8                         OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
> -  UINT32                        OutChallengeLength;
> -} ISCSI_CHAP_AUTH_DATA;
> -
> -/**
> -  This function checks the received iSCSI Login Response during the security
> -  negotiation stage.
> -
> -  @param[in] Conn             The iSCSI connection.
> -
> -  @retval EFI_SUCCESS          The Login Response passed the CHAP validation.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of protocol error happend.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPOnRspReceived (
> -  IN ISCSI_CONNECTION  *Conn
> -  );
> -/**
> -  This function fills the CHAP authentication information into the login PDU
> -  during the security negotiation stage in the iSCSI connection login.
> -
> -  @param[in]       Conn        The iSCSI connection.
> -  @param[in, out]  Pdu         The PDU to send out.
> -
> -  @retval EFI_SUCCESS          All check passed and the phase-related CHAP
> -                               authentication info is filled into the iSCSI PDU.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of protocol error happend.
> -**/
> -EFI_STATUS
> -IScsiCHAPToSendReq (
> -  IN      ISCSI_CONNECTION  *Conn,
> -  IN OUT  NET_BUF           *Pdu
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> deleted file mode 100644
> index 650c68d53bab..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/** @file
> -  The common header file of Iscsi.
> -
> -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_COMMON_H_
> -#define _ISCSI_COMMON_H_
> -
> -typedef struct _ISCSI_SESSION             ISCSI_SESSION;
> -typedef struct _ISCSI_CONNECTION          ISCSI_CONNECTION;
> -typedef struct _ISCSI_DRIVER_DATA         ISCSI_DRIVER_DATA;
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> deleted file mode 100644
> index c3d07f6f4859..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> +++ /dev/null
> @@ -1,166 +0,0 @@
> -/** @file
> -  The header file of IScsiConfig.c.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_CONFIG_H_
> -#define _ISCSI_CONFIG_H_
> -
> -#include <Guid/MdeModuleHii.h>
> -#include <Protocol/HiiConfigRouting.h>
> -#include <Library/HiiLib.h>
> -#include <Library/DevicePathLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/BaseLib.h>
> -#include <Library/NetLib.h>
> -
> -extern UINT8  IScsiConfigDxeBin[];
> -extern UINT8  IScsi4DxeStrings[];
> -
> -#define ISCSI_INITATOR_NAME_VAR_NAME        L"I_NAME"
> -
> -#define ISCSI_CONFIG_VAR_ATTR
> (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE)
> -
> -#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE  SIGNATURE_32 ('I', 'f',
> 'c', 'i')
> -
> -
> -
> -/**
> -  If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
> PcdDebugProperyMask is clear,
> -  then this macro return a pointer to a data structure
> ISCSI_FORM_CALLBACK_INFO.
> -
> -  If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
> PcdDebugProperyMask is set,
> -  The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO
> -  is compared to TestSignature.  If the signatures match, then a pointer
> -  to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned.
> -  If the signatures do not match, then DebugAssert() is called with a
> description
> -  of "CR has a bad signature" and Callback is returned.
> -
> -  If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not
> contain the field
> -  specified by Callback, then the module will not compile.
> -
> -  If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field
> called Signature,
> -  then the module will not compile.
> -
> -  @param   Callback      Pointer to the specified field within the data
> -                         structure ISCSI_FORM_CALLBACK_INFO.
> -  @return  A pointer to the pointer to a data structure
> ISCSI_FORM_CALLBACK_INFO.
> -  @retval  Others        Some unexpected error happened.
> -**/
> -
> -#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback)
> \
> -  CR ( \
> -  Callback, \
> -  ISCSI_FORM_CALLBACK_INFO, \
> -  ConfigAccess, \
> -  ISCSI_FORM_CALLBACK_INFO_SIGNATURE \
> -  )
> -
> -#pragma pack(1)
> -
> -typedef struct _ISCSI_MAC_INFO {
> -  EFI_MAC_ADDRESS Mac;
> -  UINT8           Len;
> -  UINT16          VlanId;
> -} ISCSI_MAC_INFO;
> -
> -typedef struct _ISCSI_DEVICE_LIST {
> -  UINT8           NumDevice;
> -  ISCSI_MAC_INFO  MacInfo[1];
> -} ISCSI_DEVICE_LIST;
> -
> -#pragma pack()
> -
> -typedef struct _ISCSI_CONFIG_FORM_ENTRY {
> -  LIST_ENTRY                    Link;
> -  EFI_HANDLE                    Controller;
> -  CHAR16                        MacString[95];
> -  EFI_STRING_ID                 PortTitleToken;
> -  EFI_STRING_ID                 PortTitleHelpToken;
> -
> -  ISCSI_SESSION_CONFIG_NVDATA   SessionConfigData;
> -  ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData;
> -} ISCSI_CONFIG_FORM_ENTRY;
> -
> -typedef struct _ISCSI_FORM_CALLBACK_INFO {
> -  UINTN                            Signature;
> -  EFI_HANDLE                       DriverHandle;
> -  EFI_HII_CONFIG_ACCESS_PROTOCOL   ConfigAccess;
> -  EFI_HII_DATABASE_PROTOCOL        *HiiDatabase;
> -  EFI_HII_CONFIG_ROUTING_PROTOCOL  *ConfigRouting;
> -  UINT16                           *KeyList;
> -  VOID                             *FormBuffer;
> -  EFI_HII_HANDLE                   RegisteredHandle;
> -  ISCSI_CONFIG_FORM_ENTRY          *Current;
> -} ISCSI_FORM_CALLBACK_INFO;
> -
> -#pragma pack(1)
> -
> -///
> -/// HII specific Vendor Device Path definition.
> -///
> -typedef struct {
> -  VENDOR_DEVICE_PATH             VendorDevicePath;
> -  EFI_DEVICE_PATH_PROTOCOL       End;
> -} HII_VENDOR_DEVICE_PATH;
> -
> -#pragma pack()
> -
> -/**
> -  Updates the iSCSI configuration form to add/delete an entry for the iSCSI
> -  device specified by the Controller.
> -
> -  @param[in]  DriverBindingHandle The driverbinding handle.
> -  @param[in]  Controller          The controller handle of the iSCSI device.
> -  @param[in]  AddForm             Whether to add or delete a form entry.
> -
> -  @retval EFI_SUCCESS             The iSCSI configuration form is updated.
> -  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> -  @retval Others                  Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigUpdateForm (
> -  IN EFI_HANDLE  DriverBindingHandle,
> -  IN EFI_HANDLE  Controller,
> -  IN BOOLEAN     AddForm
> -  );
> -
> -/**
> -  Initialize the iSCSI configuration form.
> -
> -  @param[in]  DriverBindingHandle  The iSCSI driverbinding handle.
> -
> -  @retval EFI_SUCCESS              The iSCSI configuration form is initialized.
> -  @retval EFI_OUT_OF_RESOURCES     Failed to allocate memory.
> -  @retval Others                   Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigFormInit (
> -  VOID
> -  );
> -
> -/**
> -  Unload the iSCSI configuration form, this includes: delete all the iSCSI
> -  device configuration entries, uninstall the form callback protocol and
> -  free the resources used.
> -
> -  @param[in]  DriverBindingHandle The iSCSI driverbinding handle.
> -
> -  @retval EFI_SUCCESS             The iSCSI configuration form is unloaded.
> -  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiConfigFormUnload (
> -  IN EFI_HANDLE  DriverBindingHandle
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> deleted file mode 100644
> index 9e28d81fb40d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> +++ /dev/null
> @@ -1,219 +0,0 @@
> -/** @file
> -  Vfr file for iSCSI config.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -
> -#include "IScsiConfigNVDataStruc.h"
> -#define EFI_NETWORK_DEVICE_CLASS  0x04
> -
> -formset
> -  guid     = IP4_ISCSI_CONFIG_GUID,
> -  title    = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE),
> -  help     = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP),
> -
> -  varstore ISCSI_CONFIG_IFR_NVDATA,
> -    name = ISCSI_CONFIG_IFR_NVDATA,
> -    guid = IP4_ISCSI_CONFIG_GUID;
> -  form formid = FORMID_MAIN_FORM,
> -    title  = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE);
> -
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.InitiatorName,
> -            prompt  = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME),
> -            help    = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP),
> -            flags   = INTERACTIVE,
> -            key     = KEY_INITIATOR_NAME,
> -            minsize = ISCSI_NAME_IFR_MIN_SIZE,
> -            maxsize = ISCSI_NAME_IFR_MAX_SIZE,
> -    endstring;
> -
> -    label DEVICE_ENTRY_LABEL;
> -    label LABEL_END;
> -
> -  endform;
> -
> -  form formid = FORMID_DEVICE_FORM,
> -    title  = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE);
> -
> -    checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled,
> -            prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE),
> -            help   = STRING_TOKEN(STR_NULL),
> -            flags  = 0,
> -    endcheckbox;
> -
> -    checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp,
> -            prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
> -            help   = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
> -            flags  = INTERACTIVE,
> -            key    = KEY_DHCP_ENABLE,
> -    endcheckbox;
> -
> -    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp ==
> 0x01;
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.LocalIp,
> -            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS),
> -            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> -            flags   = INTERACTIVE,
> -            key     = KEY_LOCAL_IP,
> -            minsize = IP_MIN_SIZE,
> -            maxsize = IP_MAX_SIZE,
> -    endstring;
> -
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.SubnetMask,
> -            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_MASK),
> -            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> -            flags   = INTERACTIVE,
> -            key     = KEY_SUBNET_MASK,
> -            minsize = IP_MIN_SIZE,
> -            maxsize = IP_MAX_SIZE,
> -    endstring;
> -
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.Gateway,
> -            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY),
> -            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> -            flags   = INTERACTIVE,
> -            key     = KEY_GATE_WAY,
> -            minsize = IP_MIN_SIZE,
> -            maxsize = IP_MAX_SIZE,
> -    endstring;
> -    endif;
> -
> -    subtitle text = STRING_TOKEN(STR_NULL);
> -
> -    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp ==
> 0x00;
> -    checkbox varid  = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp,
> -             prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
> -             help   = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
> -             flags  = 0,
> -    endcheckbox;
> -    endif;
> -
> -    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp ==
> 0x01;
> -
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.TargetName,
> -            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
> -            help    = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
> -            flags   = INTERACTIVE,
> -            key     = KEY_TARGET_NAME,
> -            minsize = ISCSI_NAME_IFR_MIN_SIZE,
> -            maxsize = ISCSI_NAME_IFR_MAX_SIZE,
> -    endstring;
> -
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.TargetIp,
> -            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
> -            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> -            flags   = INTERACTIVE,
> -            key     = KEY_TARGET_IP,
> -            minsize = IP_MIN_SIZE,
> -            maxsize = IP_MAX_SIZE,
> -    endstring;
> -
> -    numeric varid   = ISCSI_CONFIG_IFR_NVDATA.TargetPort,
> -            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
> -            help    = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
> -            flags   = 0,
> -            minimum = TARGET_PORT_MIN_NUM,
> -            maximum = TARGET_PORT_MAX_NUM,
> -            step    = 0,
> -    endnumeric;
> -
> -    string varid    = ISCSI_CONFIG_IFR_NVDATA.BootLun,
> -            prompt  = STRING_TOKEN(STR_ISCSI_BOOT_LUN),
> -            help    = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP),
> -            flags   = INTERACTIVE,
> -            key     = KEY_BOOT_LUN,
> -            minsize = LUN_MIN_SIZE,
> -            maxsize = LUN_MAX_SIZE,
> -    endstring;
> -    endif;
> -
> -    subtitle text = STRING_TOKEN(STR_NULL);
> -
> -    oneof varid  = ISCSI_CONFIG_IFR_NVDATA.CHAPType,
> -          prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT),
> -          help   = STRING_TOKEN(STR_CHAP_TYPE_HELP),
> -          option text = STRING_TOKEN(STR_CHAP_TYPE_NONE),   value =
> ISCSI_CHAP_NONE,   flags = DEFAULT;
> -          option text = STRING_TOKEN(STR_CHAP_TYPE_UNI),    value =
> ISCSI_CHAP_UNI,    flags = 0;
> -          option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value =
> ISCSI_CHAP_MUTUAL, flags = 0;
> -    endoneof;
> -
> -    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType ==
> ISCSI_CHAP_NONE;
> -
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.CHAPName,
> -            prompt  = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
> -            help    = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
> -            flags   = INTERACTIVE,
> -            key     = KEY_CHAP_NAME,
> -            minsize = 0,
> -            maxsize = ISCSI_CHAP_NAME_MAX_LEN,
> -    endstring;
> -
> -    string  varid    = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret,
> -            prompt   = STRING_TOKEN(STR_ISCSI_CHAP_SECRET),
> -            help     = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
> -            flags    = INTERACTIVE,
> -            key      = KEY_CHAP_SECRET,
> -            minsize  = ISCSI_CHAP_SECRET_MIN_LEN,
> -            maxsize  = ISCSI_CHAP_SECRET_MAX_LEN,
> -    endstring;
> -
> -    endif;
> -
> -    suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType ==
> ISCSI_CHAP_MUTUAL;
> -
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName,
> -            prompt  = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
> -            help    = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
> -            flags   = INTERACTIVE,
> -            key     = KEY_REVERSE_CHAP_NAME,
> -            minsize = 0,
> -            maxsize = ISCSI_CHAP_NAME_MAX_LEN,
> -    endstring;
> -
> -    string  varid    = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret,
> -            prompt   = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET),
> -            help     = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
> -            flags    = INTERACTIVE,
> -            key      = KEY_REVERSE_CHAP_SECRET,
> -            minsize  = ISCSI_CHAP_SECRET_MIN_LEN,
> -            maxsize  = ISCSI_CHAP_SECRET_MAX_LEN,
> -    endstring;
> -
> -    endif;
> -
> -    subtitle text = STRING_TOKEN(STR_NULL);
> -
> -    string  varid   = ISCSI_CONFIG_IFR_NVDATA.IsId,
> -            prompt  = STRING_TOKEN(STR_ISCSI_CONFIG_ISID),
> -            help    = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP),
> -            flags   = INTERACTIVE,
> -            key     = KEY_CONFIG_ISID,
> -            minsize = ISID_CONFIGURABLE_MIN_LEN,
> -            maxsize = ISID_CONFIGURABLE_MAX_LEN,
> -    endstring;
> -
> -    subtitle text = STRING_TOKEN(STR_NULL);
> -
> -    text
> -      help   = STRING_TOKEN (STR_SAVE_CHANGES),
> -      text   = STRING_TOKEN (STR_SAVE_CHANGES),
> -      flags  = INTERACTIVE,
> -      key    = KEY_SAVE_CHANGES;
> -
> -    goto FORMID_MAIN_FORM,
> -    prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM),
> -    help   = STRING_TOKEN (STR_RETURN_MAIN_FORM),
> -    flags  = 0;
> -
> -  endform;
> -
> -endformset;
> -
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> deleted file mode 100644
> index 729c74ebfc1b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> +++ /dev/null
> @@ -1,62 +0,0 @@
> -// *++
> -//
> -// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -// 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:
> -//
> -//   IScsiConfigStrings.uni
> -//
> -// Abstract:
> -//
> -//   String definitions for iSCSI configuration.
> -//
> -// Revision History:
> -//
> -// --*/
> -
> -
> -/=#
> -
> -#langdef en-US "English"
> -
> -#string STR_ISCSI_CONFIG_FORM_TITLE     #language en-US "iSCSI
> Configuration"
> -#string STR_ISCSI_CONFIG_FORM_HELP      #language en-US "Configure the
> iSCSI parameters."
> -#string STR_ISCSI_MAIN_FORM_TITLE       #language en-US "iSCSI
> Configuration"
> -#string STR_ISCSI_CONFIG_INIT_NAME      #language en-US "iSCSI Initiator
> Name"
> -#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The
> worldwide unique name of the initiator. Only iqn. format is accepted."
> -#string STR_ISCSI_DEVICE_FORM_TITLE     #language en-US ""
> -#string STR_ISCSI_DEVICE_ENABLE         #language en-US "Enable iSCSI"
> -#string STR_ISCSI_LOCAL_IP_ADDRESS      #language en-US "  Initiator IP
> Address"
> -#string STR_ISCSI_LOCAL_MASK            #language en-US "  Initiator Subnet
> Mask"
> -#string STR_ISCSI_LOCAL_GATEWAY         #language en-US "  Gateway"
> -#string STR_ISCSI_IP_ADDRESS_HELP       #language en-US "Enter IP address
> in dotted-decimal notation."
> -#string STR_ISCSI_TARGET_NAME           #language en-US "  Target Name"
> -#string STR_ISCSI_TARGET_IP_ADDRESS     #language en-US "  Target IP
> Address"
> -#string STR_ISCSI_TARGET_PORT           #language en-US "  Target Port"
> -#string STR_ISCSI_BOOT_LUN              #language en-US "  Boot LUN"
> -#string STR_ISCSI_BOOT_LUN_HELP         #language en-US "Hexadecimal
> representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-
> 9-156f-127, 4186-9"
> -#string STR_ISCSI_ENABLE_DHCP           #language en-US "Enable DHCP"
> -#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target
> info via DHCP"
> -#string STR_CHAP_TYPE_PROMPT            #language en-US "CHAP Type"
> -#string STR_CHAP_TYPE_HELP              #language en-US "None, One way
> CHAP or mutual CHAP"
> -#string STR_CHAP_TYPE_NONE              #language en-US "None"
> -#string STR_CHAP_TYPE_UNI               #language en-US "One way"
> -#string STR_CHAP_TYPE_MUTUAL            #language en-US "Mutual"
> -#string STR_ISCSI_CHAP_NAME             #language en-US "  CHAP Name"
> -#string STR_ISCSI_CHAP_SECRET           #language en-US "  CHAP Secret"
> -#string STR_ISCSI_CHAP_SECRET_HELP      #language en-US "The minimum
> length is 12 bytes and the maximum length is 16 bytes."
> -#string STR_ISCSI_REVERSE_CHAP_NAME     #language en-US "  Reverse
> CHAP Name"
> -#string STR_ISCSI_REVERSE_CHAP_SECRET   #language en-US "  Reverse
> CHAP Secret"
> -#string STR_ISCSI_CONFIG_ISID           #language en-US "ISID"
> -#string STR_ISCSI_CONFIG_ISID_HELP      #language en-US "OUI-format ISID
> in 6 bytes, default value are derived from MAC address. Only last 3 bytes are
> configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input
> F07901."
> -#string STR_RETURN_MAIN_FORM            #language en-US "Back to Previous
> Page"
> -#string STR_SAVE_CHANGES                #language en-US "Save Changes"
> -#string STR_NULL                        #language en-US ""
> -
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> deleted file mode 100644
> index 7c2e4e65fa8e..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> +++ /dev/null
> @@ -1,109 +0,0 @@
> -/** @file
> -  Define NVData structures used by the iSCSI configuration component
> -
> -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_NVDATASTRUC_H_
> -#define _ISCSI_NVDATASTRUC_H_
> -
> -#include <Guid/Ip4IScsiConfigHii.h>
> -
> -#define VAR_EQ_TEST_NAME    0x100
> -
> -#define FORMID_MAIN_FORM    1
> -#define FORMID_DEVICE_FORM  2
> -
> -#define ISCSI_NAME_MAX_SIZE 224
> -
> -//
> -// Vfr has a limit on the size, it's 255 bytes.
> -//
> -#define ISCSI_NAME_IFR_MIN_SIZE   4
> -#define ISCSI_NAME_IFR_MAX_SIZE   223
> -
> -#define IP_MIN_SIZE               7
> -#define IP_MAX_SIZE               15
> -#define IP4_STR_MAX_SIZE          16
> -
> -#define LUN_MIN_SIZE              1
> -#define LUN_MAX_SIZE              20
> -
> -#define ISCSI_CHAP_NONE           0
> -#define ISCSI_CHAP_UNI            1
> -#define ISCSI_CHAP_MUTUAL         2
> -
> -#define TARGET_PORT_MIN_NUM       0
> -#define TARGET_PORT_MAX_NUM       65535
> -
> -#define DEVICE_ENTRY_LABEL        0x1234
> -#define LABEL_END                 0xffff
> -
> -#define KEY_INITIATOR_NAME        0x101
> -#define KEY_DHCP_ENABLE           0x102
> -#define KEY_LOCAL_IP              0x103
> -#define KEY_SUBNET_MASK           0x104
> -#define KEY_GATE_WAY              0x105
> -#define KEY_TARGET_IP             0x106
> -#define KEY_CHAP_NAME             0x107
> -#define KEY_CHAP_SECRET           0x108
> -#define KEY_REVERSE_CHAP_NAME     0x109
> -#define KEY_REVERSE_CHAP_SECRET   0x10a
> -#define KEY_SAVE_CHANGES          0x10b
> -#define KEY_TARGET_NAME           0x10c
> -#define KEY_BOOT_LUN              0x10d
> -#define KEY_CONFIG_ISID           0x10e
> -
> -#define KEY_DEVICE_ENTRY_BASE     0x1000
> -
> -#define ISCSI_LUN_STR_MAX_LEN     21
> -#define ISCSI_CHAP_SECRET_MIN_LEN 12
> -#define ISCSI_CHAP_SECRET_MAX_LEN 16
> -//
> -//  ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof
> (NULL-Terminator)
> -//
> -#define ISCSI_CHAP_SECRET_STORAGE 17
> -
> -#define ISCSI_CHAP_NAME_MAX_LEN   126
> -#define ISCSI_CHAP_NAME_STORAGE   127
> -
> -#define ISID_CONFIGURABLE_MIN_LEN 6
> -#define ISID_CONFIGURABLE_MAX_LEN 12
> -#define ISID_CONFIGURABLE_STORAGE 13
> -
> -#pragma pack(1)
> -typedef struct {
> -  CHAR16  InitiatorName[ISCSI_NAME_MAX_SIZE];
> -
> -  UINT8   Enabled;
> -
> -  UINT8   InitiatorInfoFromDhcp;
> -  CHAR16  LocalIp[IP4_STR_MAX_SIZE];
> -  CHAR16  SubnetMask[IP4_STR_MAX_SIZE];
> -  CHAR16  Gateway[IP4_STR_MAX_SIZE];
> -
> -  CHAR16  TargetName[ISCSI_NAME_MAX_SIZE];
> -  CHAR16  TargetIp[IP4_STR_MAX_SIZE];
> -  UINT16  TargetPort;
> -  CHAR16  BootLun[ISCSI_LUN_STR_MAX_LEN];
> -  UINT8   TargetInfoFromDhcp;
> -
> -  UINT8   CHAPType;
> -  CHAR16  CHAPName[ISCSI_CHAP_NAME_STORAGE];
> -  CHAR16  CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> -  CHAR16  ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
> -  CHAR16  ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> -
> -  CHAR16  IsId[ISID_CONFIGURABLE_STORAGE];
> -} ISCSI_CONFIG_IFR_NVDATA;
> -#pragma pack()
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> deleted file mode 100644
> index 4c4dcaa8f68d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -/** @file
> -  The header file of IScsiDhcp.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_DHCP_H_
> -#define _ISCSI_DHCP_H_
> -
> -#include <Protocol/Dhcp4.h>
> -
> -#define ISCSI_ROOT_PATH_ID              "iscsi:"
> -#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
> -
> -#define RP_FIELD_IDX_SERVERNAME         0
> -#define RP_FIELD_IDX_PROTOCOL           1
> -#define RP_FIELD_IDX_PORT               2
> -#define RP_FIELD_IDX_LUN                3
> -#define RP_FIELD_IDX_TARGETNAME         4
> -#define RP_FIELD_IDX_MAX                5
> -
> -typedef struct _ISCSI_ROOT_PATH_FIELD {
> -  CHAR8 *Str;
> -  UINT8 Len;
> -} ISCSI_ROOT_PATH_FIELD;
> -
> -/**
> -  Parse the DHCP ACK to get the address configuration and DNS information.
> -
> -  @param[in]       Image            The handle of the driver image.
> -  @param[in]       Controller       The handle of the controller;
> -  @param[in, out]  ConfigData       The session configuration data.
> -
> -  @retval EFI_SUCCESS           The DNS information is got from the DHCP ACK.
> -  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
> -  @retval EFI_NO_MEDIA          There was a media error.
> -  @retval Others                Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiDoDhcp (
> -  IN     EFI_HANDLE                 Image,
> -  IN     EFI_HANDLE                 Controller,
> -  IN OUT ISCSI_SESSION_CONFIG_DATA  *ConfigData
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> deleted file mode 100644
> index d6a619f00fc0..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> +++ /dev/null
> @@ -1,140 +0,0 @@
> -/** @file
> -  The header file of IScsiDriver.c.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_DRIVER_H_
> -#define _ISCSI_DRIVER_H_
> -
> -#include <Uefi.h>
> -#include <Protocol/DevicePath.h>
> -#include <Protocol/LoadedImage.h>
> -#include <Protocol/HiiConfigAccess.h>
> -#include <Protocol/HiiDatabase.h>
> -#include <Library/UefiDriverEntryPoint.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiLib.h>
> -#include <Library/DevicePathLib.h>
> -#include <Protocol/DriverBinding.h>
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME"
> -
> -typedef struct _ISCSI_PRIVATE_PROTOCOL {
> -  UINT32  Reserved;
> -} ISCSI_PRIVATE_PROTOCOL;
> -
> -//
> -// EFI Driver Binding Protocol for iSCSI driver.
> -//
> -
> -/**
> -  Tests to see if this driver supports a given controller. If a child device is
> provided,
> -  it further tests to see if this driver supports creating a handle for the
> specified child device.
> -
> -  @param[in]  This                 A pointer to the
> EFI_DRIVER_BINDING_PROTOCOL instance.
> -  @param[in]  ControllerHandle     The handle of the controller to test. This
> handle
> -                                   must support a protocol interface that supplies
> -                                   an I/O abstraction to the driver.
> -  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
> device path.
> -                                   This parameter is ignored by device drivers, and is optional
> for bus drivers.
> -
> -
> -  @retval EFI_SUCCESS              The device specified by ControllerHandle and
> -                                   RemainingDevicePath is supported by the driver specified
> by This.
> -  @retval EFI_ALREADY_STARTED      The device specified by
> ControllerHandle and
> -                                   RemainingDevicePath is already being managed by the
> driver
> -                                   specified by This.
> -  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle
> and
> -                                   RemainingDevicePath is already being managed by a
> different
> -                                   driver or an application that requires exclusive acces.
> -                                   Currently not implemented.
> -  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle
> and
> -                                   RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingSupported (
> -  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> -  IN EFI_HANDLE                   ControllerHandle,
> -  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> -  );
> -
> -/**
> -  Start this driver on ControllerHandle. The Start() function is designed to be
> -  invoked from the EFI boot service ConnectController(). As a result, much of
> -  the error checking on the parameters to Start() has been moved into this
> -  common boot service. It is legal to call Start() from other locations,
> -  but the following calling restrictions must be followed or the system
> behavior will not be deterministic.
> -  1. ControllerHandle must be a valid EFI_HANDLE.
> -  2. If RemainingDevicePath is not NULL, then it must be a pointer to a
> naturally aligned
> -     EFI_DEVICE_PATH_PROTOCOL.
> -  3. Prior to calling Start(), the Supported() function for the driver specified
> by This must
> -     have been called with the same calling parameters, and Supported() must
> have returned EFI_SUCCESS.
> -
> -  @param[in]  This                 A pointer to the
> EFI_DRIVER_BINDING_PROTOCOL instance.
> -  @param[in]  ControllerHandle     The handle of the controller to start. This
> handle
> -                                   must support a protocol interface that supplies
> -                                   an I/O abstraction to the driver.
> -  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a
> device path.
> -                                   This parameter is ignored by device drivers, and is optional
> for bus drivers.
> -
> -  @retval EFI_SUCCESS              The device was started.
> -  @retval EFI_DEVICE_ERROR         The device could not be started due to a
> device error.
> -                                   Currently not implemented.
> -  @retval EFI_OUT_OF_RESOURCES     The request could not be completed
> due to a lack of resources.
> -  @retval Others                   The driver failded to start the device.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStart (
> -  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> -  IN EFI_HANDLE                   ControllerHandle,
> -  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> -  );
> -
> -/**
> -  Stop this driver on ControllerHandle.
> -
> -  Release the control of this controller and remove the IScsi functions. The
> Stop()
> -  function is designed to be invoked from the EFI boot service
> DisconnectController().
> -  As a result, much of the error checking on the parameters to Stop() has
> been moved
> -  into this common boot service. It is legal to call Stop() from other locations,
> -  but the following calling restrictions must be followed or the system
> behavior will not be deterministic.
> -  1. ControllerHandle must be a valid EFI_HANDLE that was used on a
> previous call to this
> -     same driver's Start() function.
> -  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a
> valid
> -     EFI_HANDLE. In addition, all of these handles must have been created in
> this driver's
> -     Start() function, and the Start() function must have called OpenProtocol()
> on
> -     ControllerHandle with an Attribute of
> EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
> -
> -  @param[in]  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> -  @param[in]  ControllerHandle  A handle to the device being stopped. The
> handle must
> -                                support a bus specific I/O protocol for the driver
> -                                to use to stop the device.
> -  @param[in]  NumberOfChildren  The number of child device handles in
> ChildHandleBuffer.Not used.
> -  @param[in]  ChildHandleBuffer An array of child handles to be freed. May
> be NULL
> -                                if NumberOfChildren is 0.Not used.
> -
> -  @retval EFI_SUCCESS           The device was stopped.
> -  @retval EFI_DEVICE_ERROR      The device could not be stopped due to a
> device error.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStop (
> -  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> -  IN EFI_HANDLE                   ControllerHandle,
> -  IN UINTN                        NumberOfChildren,
> -  IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> deleted file mode 100644
> index 48729e3029f7..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> +++ /dev/null
> @@ -1,134 +0,0 @@
> -## @file
> -#  This module produces EFI iSCSI Initiator Name Protocol.
> -#
> -#  This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4
> Protocol
> -#  and EFI DHCPv4 Protocol, to provide the capability to do the transport for
> SCSI
> -#  data over TCP/IP. It installs EFI HII Configuration Access Protocol to
> provide
> -#  one way to configurate the iSCSI setting. This driver only supports IPv4
> network
> -#  stack.
> -#
> -#  Notes:
> -#  1) This driver can't co-work with the IScsiDxe driver in NetworkPkg.
> -#  2) This driver might have some issues that have been fixed in the IScsiDxe
> driver
> -#     in NetworkPkg.
> -#  3) This driver supports fewer features than the IScsiDxe driver in
> NetworkPkg
> -#     (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword
> support).
> -#  4) IScsiDxe driver in NetworkPkg is recommended for use instead of this
> one even
> -#     though both of them can be used.
> -#
> -#  Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -#  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                      = IScsi4Dxe
> -  MODULE_UNI_FILE                = IScsi4Dxe.uni
> -  FILE_GUID                      = 4579B72D-7EC4-4dd4-8486-083C86B182A7
> -  MODULE_TYPE                    = UEFI_DRIVER
> -  VERSION_STRING                 = 1.0
> -  ENTRY_POINT                    = IScsiDriverEntryPoint
> -  UNLOAD_IMAGE                   = EfiIScsiUnload
> -
> -#
> -# The following information is for reference only and not required by the
> build tools.
> -#
> -#  VALID_ARCHITECTURES           = IA32 X64 EBC
> -#
> -#  DRIVER_BINDING                =  gIScsiDriverBinding
> -#  COMPONENT_NAME                =  gIScsiComponentName
> -#  COMPONENT_NAME2               =  gIScsiComponentName2
> -#
> -
> -[Sources]
> -  IScsiTcp4Io.h
> -  IScsiProto.h
> -  IScsiMisc.h
> -  IScsiIbft.h
> -  IScsiExtScsiPassThru.h
> -  IScsiDriver.h
> -  IScsiDhcp.h
> -  IScsiCommon.h
> -  IScsiCHAP.h
> -  IScsiInitiatorName.h
> -  ComponentName.h
> -  Md5.h
> -  IScsiTcp4Io.c
> -  IScsiProto.c
> -  IScsiMisc.c
> -  IScsiInitiatorName.c
> -  IScsiIbft.c
> -  IScsiExtScsiPassThru.c
> -  IScsiDriver.c
> -  IScsiDhcp.c
> -  IScsiCHAP.c
> -  ComponentName.c
> -  Md5.c
> -  IScsiConfigDxeStrings.uni
> -  IScsiConfigDxe.vfr
> -  IScsiConfig.c
> -  IScsiConfig.h
> -  IScsiImpl.h
> -  IScsiConfigNVDataStruc.h
> -
> -[Packages]
> -  MdePkg/MdePkg.dec
> -  MdeModulePkg/MdeModulePkg.dec
> -
> -[LibraryClasses]
> -  UefiDriverEntryPoint
> -  UefiLib
> -  BaseLib
> -  UefiBootServicesTableLib
> -  UefiRuntimeServicesTableLib
> -  BaseMemoryLib
> -  MemoryAllocationLib
> -  DevicePathLib
> -  DebugLib
> -  PrintLib
> -  HiiLib
> -  NetLib
> -
> -[Protocols]
> -  ## PRODUCES
> -  ## UNDEFINED # Variable
> -  gEfiIScsiInitiatorNameProtocolGuid
> -  gEfiExtScsiPassThruProtocolGuid               ## BY_START
> -  gEfiTcp4ProtocolGuid                          ## TO_START
> -  gEfiTcp4ServiceBindingProtocolGuid            ## TO_START
> -  gEfiDhcp4ProtocolGuid                         ## TO_START
> -  gEfiDhcp4ServiceBindingProtocolGuid           ## TO_START
> -  ## TO_START
> -  ## PRODUCES
> -  gEfiDevicePathProtocolGuid
> -  gEfiHiiConfigAccessProtocolGuid               ## PRODUCES
> -  gEfiHiiDatabaseProtocolGuid                   ## CONSUMES
> -  gEfiPciIoProtocolGuid                         ## SOMETIMES_CONSUMES
> -  gEfiAcpiTableProtocolGuid                     ## SOMETIMES_CONSUMES
> -
> -[Guids]
> -  gEfiEventExitBootServicesGuid                 ## SOMETIMES_CONSUMES ##
> Event
> -  gEfiIfrTianoGuid                              ## SOMETIMES_PRODUCES ## UNDEFINED
> -  gEfiAcpiTableGuid                             ## SOMETIMES_CONSUMES ##
> SystemTable
> -  gEfiAcpi10TableGuid                           ## SOMETIMES_CONSUMES ##
> SystemTable
> -  ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList"
> -  ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList"
> -  ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch
> mVendorStorageName
> -  ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr
> mVendorStorageName
> -  ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData
> mVendorStorageName
> -  ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData
> mVendorStorageName
> -  ## SOMETIMES_CONSUMES ## HII
> -  gIp4IScsiConfigGuid
> -  ## SOMETIMES_PRODUCES ## Variable
> -  ## SOMETIMES_CONSUMES ## Variable
> -  gIScsiCHAPAuthInfoGuid
> -
> -[UserExtensions.TianoCore."ExtraFiles"]
> -  IScsi4DxeExtra.uni
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> deleted file mode 100644
> index e635e47b9292..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/** @file
> -  The header file of IScsiExtScsiPassThru.c.
> -
> -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_
> -#define _ISCSI_EXT_SCSI_PASS_THRU_H_
> -
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> gIScsiExtScsiPassThruProtocolTemplate;
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> deleted file mode 100644
> index 4f3828db63c6..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> +++ /dev/null
> @@ -1,38 +0,0 @@
> -/** @file
> -  Some extra definitions for iBFT.
> -
> -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_IBFT_H_
> -#define _ISCSI_IBFT_H_
> -
> -#include <IndustryStandard/Acpi.h>
> -#include <IndustryStandard/IScsiBootFirmwareTable.h>
> -#include <Protocol/AcpiTable.h>
> -#include <Protocol/PciIo.h>
> -
> -#define IBFT_TABLE_VAR_NAME L"iBFT"
> -#define IBFT_MAX_SIZE       4096
> -#define IBFT_HEAP_OFFSET    2048
> -
> -#define IBFT_ROUNDUP(size)  NET_ROUNDUP ((size),
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT)
> -
> -/**
> -  Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
> -  session status.
> -**/
> -VOID
> -IScsiPublishIbft (
> -  VOID
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> deleted file mode 100644
> index 8a5ee2149eb2..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> +++ /dev/null
> @@ -1,168 +0,0 @@
> -/** @file
> -  The header file of IScsiImpl.c.
> -
> -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_IMPL_H_
> -#define _ISCSI_IMPL_H_
> -
> -#include <Uefi.h>
> -
> -#include <IndustryStandard/Dhcp.h>
> -
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/NetLib.h>
> -#include <Library/PrintLib.h>
> -#include <Library/UefiRuntimeServicesTableLib.h>
> -
> -#include <Guid/EventGroup.h>
> -
> -#include "IScsiCommon.h"
> -#include "IScsiDriver.h"
> -#include "IScsiInitiatorName.h"
> -#include "ComponentName.h"
> -#include "IScsiConfigNVDataStruc.h"
> -#include "IScsiExtScsiPassThru.h"
> -#include "IScsiProto.h"
> -#include "IScsiMisc.h"
> -#include "IScsiCHAP.h"
> -#include "IScsiConfig.h"
> -#include "IScsiDhcp.h"
> -#include "IScsiTcp4Io.h"
> -#include "IScsiIbft.h"
> -
> -
> -#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N')
> -
> -struct _ISCSI_SESSION {
> -  UINT32                    Signature;
> -
> -  ISCSI_SESSION_CONFIG_DATA ConfigData;
> -  ISCSI_CHAP_AUTH_DATA      AuthData;
> -
> -  CHAR8                     InitiatorName[ISCSI_NAME_MAX_SIZE];
> -  UINTN                     InitiatorNameLength;
> -  UINT8                     State;
> -
> -  UINT8                     Isid[6];
> -  UINT16                    Tsih;
> -
> -  UINT32                    CmdSN;
> -  UINT32                    ExpCmdSN;
> -  UINT32                    MaxCmdSN;
> -
> -  UINT32                    InitiatorTaskTag;
> -  UINT16                    NextCid;
> -
> -  LIST_ENTRY                Conns;
> -  UINT32                    NumConns;
> -
> -  LIST_ENTRY                TcbList;
> -
> -  //
> -  // session-wide parameters
> -  //
> -  UINT16                    TargetPortalGroupTag;
> -  UINT32                    MaxConnections;
> -  BOOLEAN                   InitialR2T;
> -  BOOLEAN                   ImmediateData;
> -  UINT32                    MaxBurstLength;
> -  UINT32                    FirstBurstLength;
> -  UINT32                    DefaultTime2Wait;
> -  UINT32                    DefaultTime2Retain;
> -  UINT16                    MaxOutstandingR2T;
> -  BOOLEAN                   DataPDUInOrder;
> -  BOOLEAN                   DataSequenceInOrder;
> -  UINT8                     ErrorRecoveryLevel;
> -};
> -
> -#define ISCSI_CONNECTION_SIGNATURE  SIGNATURE_32 ('I', 'S', 'C', 'N')
> -
> -struct _ISCSI_CONNECTION {
> -  UINT32            Signature;
> -  LIST_ENTRY        Link;
> -
> -  EFI_EVENT         TimeoutEvent;
> -
> -  ISCSI_SESSION     *Session;
> -
> -  UINT8             State;
> -  UINT8             CurrentStage;
> -  UINT8             NextStage;
> -
> -  UINT8             CHAPStep;
> -
> -  BOOLEAN           PartialReqSent;
> -  BOOLEAN           PartialRspRcvd;
> -
> -  BOOLEAN           TransitInitiated;
> -
> -  UINT16            Cid;
> -  UINT32            ExpStatSN;
> -
> -  //
> -  // queues...
> -  //
> -  NET_BUF_QUEUE     RspQue;
> -
> -  TCP4_IO           Tcp4Io;
> -
> -  //
> -  // connection-only parameters
> -  //
> -  UINT32            MaxRecvDataSegmentLength;
> -  ISCSI_DIGEST_TYPE HeaderDigest;
> -  ISCSI_DIGEST_TYPE DataDigest;
> -};
> -
> -#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A')
> -
> -#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \
> -  CR ( \
> -  PassThru, \
> -  ISCSI_DRIVER_DATA, \
> -  IScsiExtScsiPassThru, \
> -  ISCSI_DRIVER_DATA_SIGNATURE \
> -  )
> -#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \
> -  CR ( \
> -  Identifier, \
> -  ISCSI_DRIVER_DATA, \
> -  IScsiIdentifier, \
> -  ISCSI_DRIVER_DATA_SIGNATURE \
> -  )
> -#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \
> -  CR ( \
> -  s, \
> -  ISCSI_DRIVER_DATA, \
> -  Session, \
> -  ISCSI_DRIVER_DATA_SIGNATURE \
> -  )
> -
> -struct _ISCSI_DRIVER_DATA {
> -  UINT32                          Signature;
> -  EFI_HANDLE                      Image;
> -  EFI_HANDLE                      Controller;
> -  ISCSI_PRIVATE_PROTOCOL          IScsiIdentifier;
> -  EFI_HANDLE                      ChildHandle;
> -  EFI_EVENT                       ExitBootServiceEvent;
> -
> -  EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru;
> -  EFI_EXT_SCSI_PASS_THRU_MODE     ExtScsiPassThruMode;
> -  EFI_HANDLE                      ExtScsiPassThruHandle;
> -  EFI_DEVICE_PATH_PROTOCOL        *DevicePath;
> -
> -  ISCSI_SESSION                   Session;
> -};
> -
> -#endif
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> deleted file mode 100644
> index f967fb383095..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> +++ /dev/null
> @@ -1,74 +0,0 @@
> -/** @file
> -  The header file for EFI iSCSI Initiator Name Protocol.
> -
> -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_INITIATOR_NAME_H_
> -#define _ISCSI_INITIATOR_NAME_H_
> -
> -#include <Protocol/IScsiInitiatorName.h>
> -
> -extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL  gIScsiInitiatorName;
> -
> -//
> -// EFI iSCSI Initiator Name Protocol for IScsi driver.
> -//
> -
> -/**
> -  Retrieves the current set value of iSCSI Initiator Name.
> -
> -  @param[in]       This       Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> -  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer
> / Actual size of the
> -                              variable data buffer.
> -  @param[out]      Buffer     Pointer to the buffer for data to be read.
> -
> -  @retval EFI_SUCCESS           Data was successfully retrieved into the
> provided buffer and the
> -                                BufferSize was sufficient to handle the iSCSI initiator name.
> -  @retval EFI_BUFFER_TOO_SMALL  BufferSize is too small for the result.
> -  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> -  @retval EFI_DEVICE_ERROR      The iSCSI initiator name could not be
> retrieved due to a hardware error.
> -  @retval Others                Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> -  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
> -  IN OUT UINTN                              *BufferSize,
> -  OUT    VOID                               *Buffer
> -  );
> -
> -/**
> -  Sets the iSCSI Initiator Name.
> -
> -  @param[in]       This       Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> -  @param[in, out]  BufferSize Size of the buffer in bytes pointed to by Buffer.
> -  @param[in]       Buffer     Pointer to the buffer for data to be written.
> -
> -  @retval EFI_SUCCESS           Data was successfully stored by the protocol.
> -  @retval EFI_UNSUPPORTED       Platform policies do not allow for data to be
> written.
> -                                Currently not implemented.
> -  @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or
> BufferSize exceeds the maximum allowed limit.
> -  @retval EFI_DEVICE_ERROR      The data could not be stored due to a
> hardware error.
> -  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold
> the data.
> -  @retval EFI_PROTOCOL_ERROR    Input iSCSI initiator name does not
> adhere to RFC 3720
> -                                (and other related protocols).
> -  @retval Others                Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> -  IN     EFI_ISCSI_INITIATOR_NAME_PROTOCOL  *This,
> -  IN OUT UINTN                              *BufferSize,
> -  IN     VOID                               *Buffer
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> deleted file mode 100644
> index 500e00373b25..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> +++ /dev/null
> @@ -1,317 +0,0 @@
> -/** @file
> -  Miscellaneous definitions for iSCSI driver.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_MISC_H_
> -#define _ISCSI_MISC_H_
> -
> -#include <Library/BaseLib.h>
> -
> -typedef struct _ISCSI_SESSION_CONFIG_DATA
> ISCSI_SESSION_CONFIG_DATA;
> -
> -///
> -/// IPv4 Device Path Node Length
> -///
> -#define IP4_NODE_LEN_NEW_VERSIONS    27
> -
> -#pragma pack(1)
> -typedef struct {
> -  BOOLEAN           Enabled;
> -
> -  BOOLEAN           InitiatorInfoFromDhcp;
> -  EFI_IPv4_ADDRESS  LocalIp;
> -  EFI_IPv4_ADDRESS  SubnetMask;
> -  EFI_IPv4_ADDRESS  Gateway;
> -
> -  BOOLEAN           TargetInfoFromDhcp;
> -  CHAR8             TargetName[ISCSI_NAME_MAX_SIZE];
> -  EFI_IPv4_ADDRESS  TargetIp;
> -  UINT16            TargetPort;
> -  UINT8             BootLun[8];
> -
> -  UINT8             IsId[6];
> -} ISCSI_SESSION_CONFIG_NVDATA;
> -#pragma pack()
> -
> -struct _ISCSI_SESSION_CONFIG_DATA {
> -  ISCSI_SESSION_CONFIG_NVDATA NvData;
> -
> -  EFI_IPv4_ADDRESS            PrimaryDns;
> -  EFI_IPv4_ADDRESS            SecondaryDns;
> -  EFI_IPv4_ADDRESS            DhcpServer;
> -};
> -
> -/**
> -  Calculate the prefix length of the IPv4 subnet mask.
> -
> -  @param[in]  SubnetMask The IPv4 subnet mask.
> -
> -  @return The prefix length of the subnet mask.
> -  @retval 0 Other errors as indicated.
> -**/
> -UINT8
> -IScsiGetSubnetMaskPrefixLength (
> -  IN EFI_IPv4_ADDRESS  *SubnetMask
> -  );
> -
> -/**
> -  Convert the hexadecimal encoded LUN string into the 64-bit LUN.
> -
> -  @param[in]   Str             The hexadecimal encoded LUN string.
> -  @param[out]  Lun             Storage to return the 64-bit LUN.
> -
> -  @retval EFI_SUCCESS           The 64-bit LUN is stored in Lun.
> -  @retval EFI_INVALID_PARAMETER The string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToLun (
> -  IN  CHAR8  *Str,
> -  OUT UINT8  *Lun
> -  );
> -
> -/**
> -  Convert the 64-bit LUN into the hexadecimal encoded LUN string.
> -
> -  @param[in]   Lun The 64-bit LUN.
> -  @param[out]  Str The storage to return the hexadecimal encoded LUN
> string.
> -**/
> -VOID
> -IScsiLunToUnicodeStr (
> -  IN UINT8    *Lun,
> -  OUT CHAR16  *Str
> -  );
> -
> -/**
> -  Convert the ASCII string into a UNICODE string.
> -
> -  @param[in]   Source      The ASCII string.
> -  @param[out]  Destination The storage to return the UNICODE string.
> -
> -  @return CHAR16 *         Pointer to the UNICODE string.
> -**/
> -CHAR16 *
> -IScsiAsciiStrToUnicodeStr (
> -  IN  CHAR8   *Source,
> -  OUT CHAR16  *Destination
> -  );
> -
> -/**
> -  Convert the UNICODE string into an ASCII string.
> -
> -  @param[in]  Source       The UNICODE string.
> -  @param[out] Destination  The storage to return the ASCII string.
> -
> -  @return CHAR8 *          Pointer to the ASCII string.
> -**/
> -CHAR8 *
> -IScsiUnicodeStrToAsciiStr (
> -  IN  CHAR16  *Source,
> -  OUT CHAR8   *Destination
> -  );
> -
> -/**
> -  Convert the mac address into a hexadecimal encoded "-" seperated string.
> -
> -  @param[in]  Mac     The mac address.
> -  @param[in]  Len     Length in bytes of the mac address.
> -  @param[in]  VlanId  VLAN ID of the network device.
> -  @param[out] Str     The storage to return the mac string.
> -**/
> -VOID
> -IScsiMacAddrToStr (
> -  IN  EFI_MAC_ADDRESS  *Mac,
> -  IN  UINT32           Len,
> -  IN  UINT16           VlanId,
> -  OUT CHAR16           *Str
> -  );
> -
> -/**
> -  Convert the decimal dotted IPv4 address into the binary IPv4 address.
> -
> -  @param[in]   Str             The UNICODE string.
> -  @param[out]  Ip              The storage to return the ASCII string.
> -
> -  @retval EFI_SUCCESS           The binary IP address is returned in Ip.
> -  @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToIp (
> -  IN  CHAR8             *Str,
> -  OUT EFI_IPv4_ADDRESS  *Ip
> -  );
> -
> -/**
> -  Convert the binary encoded buffer into a hexadecimal encoded string.
> -
> -  @param[in]       BinBuffer   The buffer containing the binary data.
> -  @param[in]       BinLength   Length of the binary buffer.
> -  @param[in, out]  HexStr      Pointer to the string.
> -  @param[in, out]  HexLength   The length of the string.
> -
> -  @retval EFI_SUCCESS          The binary data is converted to the hexadecimal
> string
> -                               and the length of the string is updated.
> -  @retval EFI_BUFFER_TOO_SMALL The string is too small.
> -  @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiBinToHex (
> -  IN     UINT8  *BinBuffer,
> -  IN     UINT32 BinLength,
> -  IN OUT CHAR8  *HexStr,
> -  IN OUT UINT32 *HexLength
> -  );
> -
> -/**
> -  Convert the hexadecimal string into a binary encoded buffer.
> -
> -  @param[in, out]  BinBuffer   The binary buffer.
> -  @param[in, out]  BinLength   Length of the binary buffer.
> -  @param[in]       HexStr      The hexadecimal string.
> -
> -  @retval EFI_SUCCESS          The hexadecimal string is converted into a binary
> -                               encoded buffer.
> -  @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the
> converted data.
> -**/
> -EFI_STATUS
> -IScsiHexToBin (
> -  IN OUT UINT8  *BinBuffer,
> -  IN OUT UINT32 *BinLength,
> -  IN     CHAR8  *HexStr
> -  );
> -
> -/**
> -  Generate random numbers.
> -
> -  @param[in, out]  Rand       The buffer to contain random numbers.
> -  @param[in]       RandLength The length of the Rand buffer.
> -**/
> -VOID
> -IScsiGenRandom (
> -  IN OUT UINT8  *Rand,
> -  IN     UINTN  RandLength
> -  );
> -
> -/**
> -  Create the iSCSI driver data..
> -
> -  @param[in] Image      The handle of the driver image.
> -  @param[in] Controller The handle of the controller.
> -
> -  @return The iSCSI driver data created.
> -  @retval NULL Other errors as indicated.
> -**/
> -ISCSI_DRIVER_DATA *
> -IScsiCreateDriverData (
> -  IN EFI_HANDLE  Image,
> -  IN EFI_HANDLE  Controller
> -  );
> -
> -/**
> -  Clean the iSCSI driver data.
> -
> -  @param[in]               Private The iSCSI driver data.
> -
> -  @retval EFI_SUCCES       The clean operation is successful.
> -  @retval Others           Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCleanDriverData (
> -  IN ISCSI_DRIVER_DATA  *Private
> -  );
> -
> -/**
> -  Check wheather the Controller is configured to use DHCP protocol.
> -
> -  @param[in]  Controller           The handle of the controller.
> -
> -  @retval TRUE                     The handle of the controller need the Dhcp
> protocol.
> -  @retval FALSE                    The handle of the controller does not need the
> Dhcp protocol.
> -
> -**/
> -BOOLEAN
> -IScsiDhcpIsConfigured (
> -  IN EFI_HANDLE  Controller
> -  );
> -
> -/**
> -  Get the various configuration data of this iSCSI instance.
> -
> -  @param[in]  Private   The iSCSI driver data.
> -
> -  @retval EFI_SUCCESS   The configuration of this instance is got.
> -  @retval EFI_ABORTED   The operation was aborted.
> -  @retval Others        Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiGetConfigData (
> -  IN ISCSI_DRIVER_DATA  *Private
> -  );
> -
> -/**
> -  Get the device path of the iSCSI tcp connection and update it.
> -
> -  @param[in]  Private The iSCSI driver data.
> -
> -  @return The updated device path.
> -  @retval NULL Other errors as indicated.
> -**/
> -EFI_DEVICE_PATH_PROTOCOL *
> -IScsiGetTcpConnDevicePath (
> -  IN ISCSI_DRIVER_DATA  *Private
> -  );
> -
> -/**
> -  Abort the session when the transition from BS to RT is initiated.
> -
> -  @param[in]   Event  The event signaled.
> -  @param[in]  Context The iSCSI driver data.
> -**/
> -VOID
> -EFIAPI
> -IScsiOnExitBootService (
> -  IN EFI_EVENT  Event,
> -  IN VOID       *Context
> -  );
> -
> -/**
> -  Tests whether a controller handle is being managed by IScsi driver.
> -
> -  This function tests whether the driver specified by DriverBindingHandle is
> -  currently managing the controller specified by ControllerHandle.  This test
> -  is performed by evaluating if the the protocol specified by ProtocolGuid is
> -  present on ControllerHandle and is was opened by DriverBindingHandle
> and Nic
> -  Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
> -  If ProtocolGuid is NULL, then ASSERT().
> -
> -  @param  ControllerHandle     A handle for a controller to test.
> -  @param  DriverBindingHandle  Specifies the driver binding handle for the
> -                               driver.
> -  @param  ProtocolGuid         Specifies the protocol that the driver specified
> -                               by DriverBindingHandle opens in its Start()
> -                               function.
> -
> -  @retval EFI_SUCCESS          ControllerHandle is managed by the driver
> -                               specified by DriverBindingHandle.
> -  @retval EFI_UNSUPPORTED      ControllerHandle is not managed by the
> driver
> -                               specified by DriverBindingHandle.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiTestManagedDevice (
> -  IN  EFI_HANDLE       ControllerHandle,
> -  IN  EFI_HANDLE       DriverBindingHandle,
> -  IN  EFI_GUID         *ProtocolGuid
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> deleted file mode 100644
> index 6469df0434a1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> +++ /dev/null
> @@ -1,1005 +0,0 @@
> -/** @file
> -  The header file of iSCSI Protocol that defines many specific data structures.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_PROTO_H_
> -#define _ISCSI_PROTO_H_
> -
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -//
> -// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32
> -//
> -#define ISCSI_SEQ_EQ(s1, s2)  ((s1) == (s2))
> -#define ISCSI_SEQ_LT(s1, s2) \
> -    ( \
> -      (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \
> -      (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \
> -    )
> -#define ISCSI_SEQ_GT(s1, s2) \
> -    ( \
> -      (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \
> -      (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \
> -    )
> -
> -#define ISCSI_WELL_KNOWN_PORT                   3260
> -#define ISCSI_MAX_CONNS_PER_SESSION             1
> -
> -#define DEFAULT_MAX_RECV_DATA_SEG_LEN           8192
> -#define MAX_RECV_DATA_SEG_LEN_IN_FFP            65536
> -#define DEFAULT_MAX_OUTSTANDING_R2T             1
> -
> -#define ISCSI_VERSION_MAX                       0x00
> -#define ISCSI_VERSION_MIN                       0x00
> -
> -#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME
> EFI_TIMER_PERIOD_SECONDS(20)
> -#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME
> EFI_TIMER_PERIOD_SECONDS(20)
> -
> -#define ISCSI_KEY_AUTH_METHOD                   "AuthMethod"
> -#define ISCSI_KEY_HEADER_DIGEST                 "HeaderDigest"
> -#define ISCSI_KEY_DATA_DIGEST                   "DataDigest"
> -#define ISCSI_KEY_MAX_CONNECTIONS               "MaxConnections"
> -#define ISCSI_KEY_TARGET_NAME                   "TargetName"
> -#define ISCSI_KEY_INITIATOR_NAME                "InitiatorName"
> -#define ISCSI_KEY_TARGET_ALIAS                  "TargetAlias"
> -#define ISCSI_KEY_INITIATOR_ALIAS               "InitiatorAlias"
> -#define ISCSI_KEY_TARGET_ADDRESS                "TargetAddress"
> -#define ISCSI_KEY_INITIAL_R2T                   "InitialR2T"
> -#define ISCSI_KEY_IMMEDIATE_DATA                "ImmediateData"
> -#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG
> "TargetPortalGroupTag"
> -#define ISCSI_KEY_MAX_BURST_LENGTH              "MaxBurstLength"
> -#define ISCSI_KEY_FIRST_BURST_LENGTH            "FirstBurstLength"
> -#define ISCSI_KEY_DEFAULT_TIME2WAIT             "DefaultTime2Wait"
> -#define ISCSI_KEY_DEFAULT_TIME2RETAIN           "DefaultTime2Retain"
> -#define ISCSI_KEY_MAX_OUTSTANDING_R2T           "MaxOutstandingR2T"
> -#define ISCSI_KEY_DATA_PDU_IN_ORDER             "DataPDUInOrder"
> -#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER
> "DataSequenceInOrder"
> -#define ISCSI_KEY_ERROR_RECOVERY_LEVEL          "ErrorRecoveryLevel"
> -#define ISCSI_KEY_SESSION_TYPE                  "SessionType"
> -#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH
> "MaxRecvDataSegmentLength"
> -
> -#define ISCSI_KEY_VALUE_NONE                    "None"
> -
> -///
> -/// connection state for initiator
> -///
> -
> -#define CONN_STATE_FREE                         0
> -#define CONN_STATE_XPT_WAIT                     1
> -#define CONN_STATE_IN_LOGIN                     2
> -#define CONN_STATE_LOGGED_IN                    3
> -#define CONN_STATE_IN_LOGOUT                    4
> -#define CONN_STATE_LOGOUT_REQUESTED             5
> -#define CONN_STATE_CLEANUP_WAIT                 6
> -#define CONN_STATE_IN_CLEANUP                   7
> -
> -///
> -/// session state for initiator
> -///
> -#define SESSION_STATE_FREE                      0
> -#define SESSION_STATE_LOGGED_IN                 1
> -#define SESSION_STATE_FAILED                    2
> -
> -typedef enum {
> -  DataIn  = 0,
> -  DataOut = 1,
> -  DataBi  = 2
> -} DATA_DIRECTION;
> -
> -#define ISCSI_RESERVED_TAG                  0xffffffff
> -
> -#define ISCSI_REQ_IMMEDIATE                 0x40
> -#define ISCSI_OPCODE_MASK                   0x3F
> -
> -#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs)  ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->OpCode) = ((Op) | (Flgs)))
> -#define ISCSI_GET_OPCODE(PduHdr)            ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)
> -#define ISCSI_CHECK_OPCODE(PduHdr, Op)      ((((PduHdr)->OpCode) &
> ISCSI_OPCODE_MASK) == (Op))
> -#define ISCSI_IMMEDIATE_ON(PduHdr)          ((PduHdr)->OpCode &
> ISCSI_REQ_IMMEDIATE)
> -#define ISCSI_SET_FLAG(PduHdr, Flag)        (((ISCSI_BASIC_HEADER *)
> (PduHdr))->Flags |= (BOOLEAN)(Flag))
> -#define ISCSI_CLEAR_FLAG(PduHdr, Flag)      (((ISCSI_BASIC_HEADER *)
> (PduHdr))->Flags &= ~(Flag))
> -#define ISCSI_FLAG_ON(PduHdr, Flag)         ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->Flags & (Flag)) == (Flag))
> -#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt)  ((PduHdr)->Flags = (UINT8)
> ((PduHdr)->Flags | ((Cur) << 2 | (Nxt))))
> -#define ISCSI_GET_CURRENT_STAGE(PduHdr)     (((PduHdr)->Flags >> 2) &
> 0x3)
> -#define ISCSI_GET_NEXT_STAGE(PduHdr)        (((PduHdr)->Flags) & 0x3)
> -
> -#define ISCSI_GET_PAD_LEN(DataLen)          ((~(DataLen) + 1) & 0x3)
> -#define ISCSI_ROUNDUP(DataLen)              (((DataLen) + 3) &~(0x3))
> -
> -#define HTON24(Dst, Src) \
> -  do { \
> -    (Dst)[0]  = (UINT8) (((Src) >> 16) & 0xFF); \
> -    (Dst)[1]  = (UINT8) (((Src) >> 8) & 0xFF); \
> -    (Dst)[2]  = (UINT8) ((Src) & 0xFF); \
> -  } while (0);
> -
> -#define NTOH24(src)                         (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))
> -
> -#define ISCSI_GET_DATASEG_LEN(PduHdr)       NTOH24
> (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)
> -#define ISCSI_SET_DATASEG_LEN(PduHdr, Len)  HTON24
> (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))
> -
> -//
> -// initiator opcodes
> -//
> -#define ISCSI_OPCODE_NOP_OUT        0x00
> -#define ISCSI_OPCODE_SCSI_CMD       0x01
> -#define ISCSI_OPCODE_SCSI_TMF_REQ   0x02
> -#define ISCSI_OPCODE_LOGIN_REQ      0x03
> -#define ISCSI_OPCODE_TEXT_REQ       0x04
> -#define ISCSI_OPCODE_SCSI_DATA_OUT  0x05
> -#define ISCSI_OPCODE_LOGOUT_REQ     0x06
> -#define ISCSI_OPCODE_SNACK_REQ      0x10
> -#define ISCSI_OPCODE_VENDOR_I0      0x1c
> -#define ISCSI_OPCODE_VENDOR_I1      0x1d
> -#define ISCSI_OPCODE_VENDOR_I2      0x1e
> -
> -//
> -// target opcodes
> -//
> -#define ISCSI_OPCODE_NOP_IN       0x20
> -#define ISCSI_OPCODE_SCSI_RSP     0x21
> -#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22
> -#define ISCSI_OPCODE_LOGIN_RSP    0x23
> -#define ISCSI_OPCODE_TEXT_RSP     0x24
> -#define ISCSI_OPCODE_SCSI_DATA_IN 0x25
> -#define ISCSI_OPCODE_LOGOUT_RSP   0x26
> -#define ISCSI_OPCODE_R2T          0x31
> -#define ISCSI_OPCODE_ASYNC_MSG    0x32
> -#define ISCSI_OPCODE_VENDOR_T0    0x3c
> -#define ISCSI_OPCODE_VENDOR_T1    0x3d
> -#define ISCSI_OPCODE_VENDOR_T2    0x3e
> -#define ISCSI_OPCODE_REJECT       0x3f
> -
> -#define ISCSI_BHS_FLAG_FINAL      0x80
> -
> -///
> -/// iSCSI Basic Header Segment
> -///
> -typedef struct _ISCSI_BASIC_HEADER {
> -  UINT8   OpCode;
> -  UINT8   Flags;
> -  UINT16  OpCodeSpecific1;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  OpCodeSpecific2[7];
> -} ISCSI_BASIC_HEADER;
> -
> -//
> -// Defined AHS types, others are reserved.
> -//
> -#define ISCSI_AHS_TYPE_EXT_CDB              0x1
> -#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2
> -
> -typedef struct _ISCSI_ADDTIONAL_HEADER {
> -  UINT16  Length;
> -  UINT8   Type;
> -  UINT8   TypeSpecific[1];
> -} ISCSI_ADDITIONAL_HEADER;
> -
> -typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {
> -  UINT16  Length;
> -  UINT8   Type;
> -  UINT8   Reserved;
> -  UINT32  ExpReadDataLength;
> -} ISCSI_BI_EXP_READ_DATA_LEN_AHS;
> -
> -#define SCSI_CMD_PDU_FLAG_READ        0x40
> -#define SCSI_CMD_PDU_FLAG_WRITE       0x20
> -
> -#define ISCSI_CMD_PDU_TASK_ATTR_MASK  0x07
> -
> -//
> -// task attributes
> -//
> -#define ISCSI_TASK_ATTR_UNTAGGED  0x00
> -#define ISCSI_TASK_ATTR_SIMPLE    0x01
> -#define ISCSI_TASK_ATTR_ORDERD    0x02
> -#define ISCSI_TASK_ATTR_HOQ       0x03
> -#define ISCSI_TASK_ATTR_ACA       0x04
> -
> -///
> -/// SCSI Command
> -///
> -typedef struct _SCSI_COMMAND {
> -  UINT8   OpCode;
> -  UINT8   Flags;
> -  UINT16  Reserved;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  ExpDataXferLength;
> -  UINT32  CmdSN;
> -  UINT32  ExpStatSN;
> -  UINT8   Cdb[16];
> -} SCSI_COMMAND;
> -
> -//
> -// flag bit definitions in SCSI response
> -//
> -#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW  0x10
> -#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08
> -#define SCSI_RSP_PDU_FLAG_OVERFLOW          0x04
> -#define SCSI_RSP_PDU_FLAG_UNDERFLOW         0x02
> -
> -//
> -// iSCSI service response codes
> -//
> -#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET  0x00
> -#define ISCSI_SERVICE_RSP_TARGET_FAILURE              0x01
> -
> -///
> -/// SCSI Response
> -///
> -typedef struct _SCSI_RESPONSE {
> -  UINT8   OpCode;
> -  UINT8   Flags;
> -  UINT8   Response;
> -  UINT8   Status;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Reserved[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  SNACKTag;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT32  ExpDataSN;
> -  UINT32  BiReadResidualCount;
> -  UINT32  ResidualCount;
> -} SCSI_RESPONSE;
> -
> -typedef struct _ISCSI_SENSE_DATA {
> -  UINT16  Length;
> -  UINT8   Data[2];
> -} ISCSI_SENSE_DATA;
> -
> -///
> -/// iSCSI Task Managment Function Request
> -///
> -typedef struct _ISCSI_TMF_REQUEST {
> -  UINT8   OpCode;
> -  UINT8   Fuction;
> -  UINT16  Reserved1;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  ReferencedTaskTag;
> -  UINT32  CmdSN;
> -  UINT32  ExpStatSN;
> -  UINT32  RefCmdSN;
> -  UINT32  ExpDataSN;
> -  UINT32  Reserved2[2];
> -} ISCSI_TMF_REQUEST;
> -
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE           0
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST              1
> -#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST               2
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT        3
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4
> -#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED               5
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED        6
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED           255
> -
> -///
> -/// iSCSI Task Management Function Response
> -///
> -typedef struct _ISCSI_TMF_RESPONSE {
> -  UINT8   OpCode;
> -  UINT8   Reserved1;
> -  UINT8   Response;
> -  UINT8   Reserved2;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT32  Reserver3[2];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  Reserved4;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT32  Reserved[3];
> -} ISCSI_TMF_RESPONSE;
> -
> -///
> -/// SCSI Data-Out
> -///
> -typedef struct _ISCSI_SCSI_DATA_OUT {
> -  UINT8   OpCode;
> -  UINT8   Reserved1[3];
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  TargetTransferTag;
> -  UINT32  Reserved2;
> -  UINT32  ExpStatSN;
> -  UINT32  Reserved3;
> -  UINT32  DataSN;
> -  UINT32  BufferOffset;
> -  UINT32  Reserved4;
> -} ISCSI_SCSI_DATA_OUT;
> -
> -#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE  0x40
> -#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW
> SCSI_RSP_PDU_FLAG_OVERFLOW
> -#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW
> SCSI_RSP_PDU_FLAG_UNDERFLOW
> -#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID  0x01
> -
> -///
> -/// SCSI Data-In
> -///
> -typedef struct _ISCSI_SCSI_DATA_IN {
> -  UINT8   OpCode;
> -  UINT8   Flags;
> -  UINT8   Reserved1;
> -  UINT8   Status;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  TargetTransferTag;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT32  DataSN;
> -  UINT32  BufferOffset;
> -  UINT32  ResidualCount;
> -} ISCSI_SCSI_DATA_IN;
> -
> -#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL
> (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset)
> -
> -///
> -/// Ready To Transfer
> -///
> -typedef struct _ISCSI_READY_TO_TRANSFER {
> -  UINT8   OpCode;
> -  UINT8   Reserved1[3];
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  TargetTransferTag;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT32  R2TSeqNum;
> -  UINT32  BufferOffset;
> -  UINT32  DesiredDataTransferLength;
> -} ISCSI_READY_TO_TRANSFER;
> -
> -typedef struct _ISCSI_ASYNC_MESSAGE {
> -  UINT8   OpCode;
> -  UINT8   Reserved1[8];
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  Reserved2;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT8   AsyncEvent;
> -  UINT8   AsyncVCode;
> -  UINT16  Parameter1;
> -  UINT16  Parameter2;
> -  UINT16  Parameter3;
> -  UINT32  Reserved3;
> -} ISCSI_ASYNC_MESSAGE;
> -
> -#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT  0x80
> -#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40
> -
> -///
> -/// Login Request
> -///
> -typedef struct _ISCSI_LOGIN_REQUEST {
> -  UINT8   OpCode;
> -  UINT8   Flags;
> -  UINT8   VersionMax;
> -  UINT8   VersionMin;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Isid[6];
> -  UINT16  Tsih;
> -  UINT32  InitiatorTaskTag;
> -  UINT16  Cid;
> -  UINT16  Reserved1;
> -  UINT32  CmdSN;
> -  UINT32  ExpStatSN;
> -  UINT32  Reserved2[4];
> -} ISCSI_LOGIN_REQUEST;
> -
> -#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT
> ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT
> -#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE
> ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE
> -
> -#define ISCSI_LOGIN_STATUS_SUCCESS          0
> -#define ISCSI_LOGIN_STATUS_REDIRECTION      1
> -#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR  2
> -#define ISCSI_LOGIN_STATUS_TARGET_ERROR     3
> -
> -///
> -/// Login Response
> -///
> -typedef struct _ISCSI_LOGIN_RESPONSE {
> -  UINT8   OpCode;
> -  UINT8   Flags;
> -  UINT8   VersionMax;
> -  UINT8   VersionActive;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Isid[6];
> -  UINT16  Tsih;
> -  UINT32  InitiatorTaskTag;
> -  UINT32  Reserved1;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT8   StatusClass;
> -  UINT8   StatusDetail;
> -  UINT8   Reserved2[10];
> -} ISCSI_LOGIN_RESPONSE;
> -
> -#define ISCSI_LOGOUT_REASON_CLOSE_SESSION                   0
> -#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION                1
> -#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY
> 2
> -
> -///
> -/// Logout Request
> -///
> -typedef struct _ISCSI_LOGOUT_REQUEST {
> -  UINT8   OpCode;
> -  UINT8   ReasonCode;
> -  UINT16  Reserved1;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT32  Reserved2[2];
> -  UINT32  InitiatorTaskTag;
> -  UINT16  Cid;
> -  UINT16  Reserved3;
> -  UINT32  CmdSN;
> -  UINT32  ExpStatSN;
> -  UINT32  Reserved4[4];
> -} ISCSI_LOGOUT_REQUEST;
> -
> -#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS  0
> -#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND           1
> -#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED  2
> -#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED          3
> -
> -///
> -/// Logout Response
> -///
> -typedef struct _ISCSI_LOGOUT_RESPONSE {
> -  UINT8   OpCode;
> -  UINT8   Reserved1;
> -  UINT8   Response;
> -  UINT8   Reserved2;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT32  Reserved3[2];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  Reserved4;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT32  Reserved5;
> -  UINT16  Time2Wait;
> -  UINT16  Time2Retain;
> -  UINT32  Reserved6;
> -} ISCSI_LOGOUT_RESPONSE;
> -
> -#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T  0
> -#define ISCSI_SNACK_REQUEST_TYPE_STATUS       1
> -#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK     2
> -#define ISCSI_SNACK_REQUEST_TYPE_RDATA        3
> -
> -///
> -/// SNACK Request
> -///
> -typedef struct _ISCSI_SNACK_REQUEST {
> -  UINT8   OpCode;
> -  UINT8   Type;
> -  UINT16  Reserved1;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  TargetTransferTag;
> -  UINT32  Reserved2;
> -  UINT32  ExpStatSN;
> -  UINT32  Reserved[2];
> -  UINT32  BegRun;
> -  UINT32  RunLength;
> -} ISCSI_SNACK_REQUEST;
> -
> -///
> -/// Reject
> -///
> -typedef struct _ISCSI_REJECT {
> -  UINT8   OpCode;
> -  UINT8   Reserved1;
> -  UINT8   Reason;
> -  UINT8   Reserved2;
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT32  Reserved3[2];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  Reserved4;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT32  DataSN;
> -  UINT32  Reserved5[2];
> -} ISCSI_REJECT;
> -
> -///
> -/// NOP-Out
> -///
> -typedef struct _ISCSI_NOP_OUT {
> -  UINT8   OpCode;
> -  UINT8   Reserved1[3];
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  TargetTransferTag;
> -  UINT32  CmdSN;
> -  UINT32  ExpStatSN;
> -  UINT32  Reserved2[4];
> -} ISCSI_NOP_OUT;
> -
> -///
> -/// NOP-In
> -///
> -typedef struct _ISCSI_NOP_IN {
> -  UINT8   OpCode;
> -  UINT8   Reserved1[3];
> -  UINT8   TotalAHSLength;
> -  UINT8   DataSegmentLength[3];
> -  UINT8   Lun[8];
> -  UINT32  InitiatorTaskTag;
> -  UINT32  TargetTransferTag;
> -  UINT32  StatSN;
> -  UINT32  ExpCmdSN;
> -  UINT32  MaxCmdSN;
> -  UINT32  Reserved2[3];
> -} ISCSI_NOP_IN;
> -
> -#define ISCSI_SECURITY_NEGOTIATION          0
> -#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1
> -#define ISCSI_FULL_FEATURE_PHASE            3
> -
> -typedef enum {
> -  IScsiDigestNone,
> -  IScsiDigestCRC32
> -} ISCSI_DIGEST_TYPE;
> -
> -typedef struct _ISCSI_XFER_CONTEXT {
> -  UINT32  TargetTransferTag;
> -  UINT32  Offset;
> -  UINT32  DesiredLength;
> -  UINT32  ExpDataSN;
> -} ISCSI_XFER_CONTEXT;
> -
> -typedef struct _ISCSI_IN_BUFFER_CONTEXT {
> -  UINT8   *InData;
> -  UINT32  InDataLen;
> -} ISCSI_IN_BUFFER_CONTEXT;
> -
> -typedef struct _ISCSI_TCB {
> -  LIST_ENTRY          Link;
> -
> -  BOOLEAN             SoFarInOrder;
> -  UINT32              ExpDataSN;
> -  BOOLEAN             FbitReceived;
> -  BOOLEAN             StatusXferd;
> -  UINT32              ActiveR2Ts;
> -  UINT32              Response;
> -  CHAR8               *Reason;
> -  UINT32              InitiatorTaskTag;
> -  UINT32              CmdSN;
> -  UINT32              SNACKTag;
> -
> -  ISCSI_XFER_CONTEXT  XferContext;
> -
> -  ISCSI_CONNECTION    *Conn;
> -} ISCSI_TCB;
> -
> -typedef struct _ISCSI_KEY_VALUE_PAIR {
> -  LIST_ENTRY      List;
> -
> -  CHAR8           *Key;
> -  CHAR8           *Value;
> -} ISCSI_KEY_VALUE_PAIR;
> -
> -/**
> -  Attach the iSCSI connection to the iSCSI session.
> -
> -  @param[in, out]  Session The iSCSI session.
> -  @param[in, out]  Conn    The iSCSI connection.
> -**/
> -VOID
> -IScsiAttatchConnection (
> -  IN OUT ISCSI_SESSION     *Session,
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  );
> -
> -/**
> -  Detach the iSCSI connection from the session it belongs to.
> -
> -  @param[in, out]  Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiDetatchConnection (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  );
> -
> -/**
> -  This function does the iSCSI connection login.
> -
> -  @param[in, out]  Conn      The iSCSI connection to login.
> -
> -  @retval EFI_SUCCESS        The iSCSI connection is logged into the iSCSI
> target.
> -  @retval EFI_TIMEOUT        Timeout happened during the login procedure.
> -  @retval Others             Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConnLogin (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  );
> -
> -/**
> -  Create a TCP connection for the iSCSI session.
> -
> -  @param[in]  Private The iSCSI driver data.
> -  @param[in]  Session Maximum CmdSN from the target.
> -
> -  @return The newly created iSCSI connection.
> -**/
> -ISCSI_CONNECTION *
> -IScsiCreateConnection (
> -  IN ISCSI_DRIVER_DATA  *Private,
> -  IN ISCSI_SESSION      *Session
> -  );
> -
> -/**
> -  Destroy an iSCSI connection.
> -
> -  @param[in]  Conn The connection to destroy.
> -**/
> -VOID
> -IScsiDestroyConnection (
> -  IN ISCSI_CONNECTION  *Conn
> -  );
> -
> -/**
> -  Login the iSCSI session.
> -
> -  @param[in]  Private          The iSCSI driver data.
> -
> -  @retval EFI_SUCCESS          The iSCSI session login procedure finished.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_NO_MEDIA         There was a media error.
> -  @retval Others               Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiSessionLogin (
> -  IN ISCSI_DRIVER_DATA  *Private
> -  );
> -
> -/**
> -  Build and send the iSCSI login request to the iSCSI target according to
> -  the current login stage.
> -
> -  @param[in]  Conn             The connection in the iSCSI login phase.
> -
> -  @retval EFI_SUCCESS          The iSCSI login request PDU is built and sent on
> this
> -                               connection.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_DEVICE_ERROR     Some kind of device error happened.
> -**/
> -EFI_STATUS
> -IScsiSendLoginReq (
> -  IN ISCSI_CONNECTION  *Conn
> -  );
> -
> -/**
> -  Receive and process the iSCSI login response.
> -
> -  @param[in]  Conn             The connection in the iSCSI login phase.
> -
> -  @retval EFI_SUCCESS          The iSCSI login response PDU is received and
> processed.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceiveLoginRsp (
> -  IN ISCSI_CONNECTION  *Conn
> -  );
> -
> -/**
> -  Add an iSCSI key-value pair as a string into the data segment of the Login
> Request PDU.
> -  The DataSegmentLength and the actual size of the net buffer containing
> this PDU will be
> -  updated.
> -
> -  @param[in, out]  Pdu         The iSCSI PDU whose data segment the key-
> value pair will
> -                               be added to.
> -  @param[in]       Key         The key name string.
> -  @param[in]       Value       The value string.
> -
> -  @retval EFI_SUCCESS          The key-valu pair is added to the PDU's
> datasegment and
> -                               the correspondence length fields are updated.
> -  @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to
> add the key-value
> -                               pair.
> -**/
> -EFI_STATUS
> -IScsiAddKeyValuePair (
> -  IN OUT NET_BUF      *Pdu,
> -  IN CHAR8            *Key,
> -  IN CHAR8            *Value
> -  );
> -
> -/**
> -  Prepare the iSCSI login request to be sent according to the current login
> status.
> -
> -  @param[in, out]  Conn The connection in the iSCSI login phase.
> -
> -  @return The pointer to the net buffer containing the iSCSI login request
> built.
> -  @retval Others    Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiPrepareLoginReq (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  );
> -
> -/**
> -  Process the iSCSI Login Response.
> -
> -  @param[in, out]  Conn The connection on which the iSCSI login response is
> received.
> -  @param[in, out]  Pdu  The iSCSI login response PDU.
> -
> -  @retval EFI_SUCCESS        The iSCSI login response PDU is processed and all
> check are passed.
> -  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> -  @retval EFI_MEDIA_CHANGED  Target is redirected.
> -  @retval Others             Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiProcessLoginRsp (
> -  IN OUT ISCSI_CONNECTION  *Conn,
> -  IN OUT NET_BUF           *Pdu
> -  );
> -
> -/**
> -  Updated the target information according the data received in the iSCSI
> -  login response with an target redirection status.
> -
> -  @param[in, out] Session      The iSCSI session.
> -  @param[in]      Data         The data segment which should contain the
> -                               TargetAddress key-value list.
> -  @param[in]      Len          Length of the data.
> -
> -  @retval EFI_SUCCESS          The target address is updated.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_NOT_FOUND        The TargetAddress key is not found.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateTargetAddress (
> -  IN OUT ISCSI_SESSION  *Session,
> -  IN CHAR8              *Data,
> -  IN UINT32             Len
> -  );
> -
> -/**
> -  The callback function to free the net buffer list.
> -
> -  @param[in]  Arg The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiFreeNbufList (
> -  VOID *Arg
> -  );
> -
> -/**
> -  Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI
> PDU header and
> -  an optional data segment. The two parts will be put into two blocks of
> buffers in the
> -  net buffer. The digest check will be conducted in this function if needed
> and the digests
> -  will be trimmed from the PDU buffer.
> -
> -  @param[in]   Conn        The iSCSI connection to receive data from.
> -  @param[out]  Pdu         The received iSCSI pdu.
> -  @param[in]   Context     The context used to describe information on the
> caller provided
> -                           buffer to receive data segment of the iSCSI pdu, it's optional.
> -  @param[in]  HeaderDigest Whether there will be header digest received.
> -  @param[in]  DataDigest   Whether there will be data digest.
> -  @param[in]  TimeoutEvent The timeout event, it's optional.
> -
> -  @retval EFI_SUCCESS          An iSCSI pdu is received.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error
> happened.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceivePdu (
> -  IN ISCSI_CONNECTION                      *Conn,
> -  OUT NET_BUF                              **Pdu,
> -  IN ISCSI_IN_BUFFER_CONTEXT               *Context, OPTIONAL
> -  IN BOOLEAN                               HeaderDigest,
> -  IN BOOLEAN                               DataDigest,
> -  IN EFI_EVENT                             TimeoutEvent OPTIONAL
> -  );
> -
> -/**
> -  Check and get the result of the prameter negotiation.
> -
> -  @param[in, out]  Conn          The connection in iSCSI login.
> -
> -  @retval EFI_SUCCESS          The parmeter check is passed and negotiation is
> finished.
> -  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error
> happened.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiCheckOpParams (
> -  IN OUT ISCSI_CONNECTION  *Conn
> -  );
> -
> -/**
> -  Fill the oprational prameters.
> -
> -  @param[in]       Conn        The connection in iSCSI login.
> -  @param[in, out]  Pdu         The iSCSI login request PDU to fill the parameters.
> -
> -  @retval EFI_SUCCESS          The parmeters are filled into the iSCSI login
> request PDU.
> -**/
> -EFI_STATUS
> -IScsiFillOpParams (
> -  IN ISCSI_CONNECTION  *Conn,
> -  IN OUT NET_BUF       *Pdu
> -  );
> -
> -/**
> -  Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
> -
> -  @param[in, out]  Pdu         The iSCSI pdu which contains segments to pad.
> -  @param[in]       Len         The length of the last semgnet in the PDU.
> -
> -  @retval EFI_SUCCESS          The segment is padded or no need to pad it.
> -  @retval EFI_OUT_OF_RESOURCES There is not enough remaining free
> space to add the
> -                               padding bytes.
> -**/
> -EFI_STATUS
> -IScsiPadSegment (
> -  IN OUT NET_BUF  *Pdu,
> -  IN UINT32       Len
> -  );
> -
> -/**
> -  Build a key-value list from the data segment.
> -
> -  @param[in]  Data The data segment containing the key-value pairs.
> -  @param[in]  Len  Length of the data segment.
> -
> -  @return The key-value list.
> -  @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiBuildKeyValueList (
> -  IN CHAR8  *Data,
> -  IN UINT32 Len
> -  );
> -
> -/**
> -  Get the value string by the key name from the key-value list. If found,
> -  the key-value entry will be removed from the list.
> -
> -  @param[in, out]  KeyValueList  The key-value list.
> -  @param[in]       Key           The key name to find.
> -
> -  @return The value string.
> -**/
> -CHAR8 *
> -IScsiGetValueByKeyFromList (
> -  IN OUT LIST_ENTRY  *KeyValueList,
> -  IN CHAR8           *Key
> -  );
> -
> -/**
> -  Free the key-value list.
> -
> -  @param[in]  KeyValueList The key-value list.
> -**/
> -VOID
> -IScsiFreeKeyValueList (
> -  IN LIST_ENTRY      *KeyValueList
> -  );
> -
> -/**
> -  Normalize the iSCSI name according to RFC.
> -
> -  @param[in, out]  Name       The iSCSI name.
> -  @param[in]       Len        length of the iSCSI name.
> -
> -  @retval EFI_SUCCESS        The iSCSI name is valid and normalized.
> -  @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in
> the IQN format.
> -**/
> -EFI_STATUS
> -IScsiNormalizeName (
> -  IN OUT CHAR8  *Name,
> -  IN UINTN      Len
> -  );
> -
> -/**
> -  Execute the SCSI command issued through the EXT SCSI PASS THRU
> protocol.
> -
> -  @param[in]       PassThru  The EXT SCSI PASS THRU protocol.
> -  @param[in]       Target    The target ID.
> -  @param[in]       Lun       The LUN.
> -  @param[in, out]  Packet    The request packet containing IO request, SCSI
> command
> -                             buffer and buffers to read/write.
> -
> -  @retval EFI_SUCCES           The SCSI command is executed and the result is
> updated to
> -                               the Packet.
> -  @retval EFI_DEVICE_ERROR     Session state was not as required.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval EFI_NOT_READY        The target can not accept new commands.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiExecuteScsiCommand (
> -  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                 *PassThru,
> -  IN UINT8                                           *Target,
> -  IN UINT64                                          Lun,
> -  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
> -  );
> -
> -/**
> -  Reinstate the session on some error.
> -
> -  @param[in, out]  Private The iSCSI driver data.
> -
> -  @retval EFI_SUCCES  The session is reinstated from some error.
> -  @retval Other       Reinstatement failed.
> -**/
> -EFI_STATUS
> -IScsiSessionReinstatement (
> -  IN OUT ISCSI_DRIVER_DATA  *Private
> -  );
> -
> -/**
> -  Initialize some session parameters before login.
> -
> -  @param[in, out]  Session  The iSCSI session.
> -  @param[in]       Recovery Whether the request is from a fresh new start or
> recovery.
> -**/
> -VOID
> -IScsiSessionInit (
> -  IN OUT ISCSI_SESSION  *Session,
> -  IN BOOLEAN            Recovery
> -  );
> -
> -/**
> -  Abort the iSCSI session, that is, reset all the connection and free the
> -  resources.
> -
> -  @param[in, out]  Session The iSCSI session.
> -
> -  @retval EFI_SUCCES  The session is aborted.
> -**/
> -EFI_STATUS
> -IScsiSessionAbort (
> -  IN OUT ISCSI_SESSION  *Session
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> deleted file mode 100644
> index 9e0f1e0f02c2..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> +++ /dev/null
> @@ -1,142 +0,0 @@
> -/** @file
> -  iSCSI Tcp4 IO related definitions.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _ISCSI_TCP4_IO_H_
> -#define _ISCSI_TCP4_IO_H_
> -
> -#include <Library/NetLib.h>
> -#include <Protocol/Tcp4.h>
> -
> -typedef struct _TCP4_IO_CONFIG_DATA {
> -  EFI_IPv4_ADDRESS  LocalIp;
> -  EFI_IPv4_ADDRESS  SubnetMask;
> -  EFI_IPv4_ADDRESS  Gateway;
> -
> -  EFI_IPv4_ADDRESS  RemoteIp;
> -  UINT16            RemotePort;
> -} TCP4_IO_CONFIG_DATA;
> -
> -typedef struct _TCP4_IO {
> -  EFI_HANDLE                Image;
> -  EFI_HANDLE                Controller;
> -
> -  EFI_HANDLE                Handle;
> -  EFI_TCP4_PROTOCOL         *Tcp4;
> -
> -  EFI_TCP4_CONNECTION_TOKEN ConnToken;
> -  EFI_TCP4_IO_TOKEN         TxToken;
> -  EFI_TCP4_IO_TOKEN         RxToken;
> -  EFI_TCP4_CLOSE_TOKEN      CloseToken;
> -
> -  BOOLEAN                   IsConnDone;
> -  BOOLEAN                   IsTxDone;
> -  BOOLEAN                   IsRxDone;
> -  BOOLEAN                   IsCloseDone;
> -} TCP4_IO;
> -
> -/**
> -  Create a TCP socket with the specified configuration data.
> -
> -  @param[in]  Image      The handle of the driver image.
> -  @param[in]  Controller The handle of the controller.
> -  @param[in]  ConfigData The Tcp4 configuration data.
> -  @param[in]  Tcp4Io     The Tcp4Io.
> -
> -  @retval EFI_SUCCESS    The TCP socket is created and configured.
> -  @retval Others         Failed to create the TCP socket or configure it.
> -**/
> -EFI_STATUS
> -Tcp4IoCreateSocket (
> -  IN EFI_HANDLE           Image,
> -  IN EFI_HANDLE           Controller,
> -  IN TCP4_IO_CONFIG_DATA  *ConfigData,
> -  IN TCP4_IO              *Tcp4Io
> -  );
> -
> -/**
> -  Destroy the socket.
> -
> -  @param[in]  Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
> -**/
> -VOID
> -Tcp4IoDestroySocket (
> -  IN TCP4_IO  *Tcp4Io
> -  );
> -
> -/**
> -  Connect to the other endpoint of the TCP socket.
> -
> -  @param[in, out]  Tcp4Io    The Tcp4Io wrapping the TCP socket.
> -  @param[in]       Timeout   The time to wait for connection done.
> -
> -  @retval EFI_SUCCESS          Connect to the other endpoint of the TCP socket
> successfully.
> -  @retval EFI_TIMEOUT          Failed to connect to the other endpoint of the
> TCP socket in the                               specified time period.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoConnect (
> -  IN OUT TCP4_IO    *Tcp4Io,
> -  IN EFI_EVENT      Timeout
> -  );
> -
> -/**
> -  Reset the socket.
> -
> -  @param[in, out]  Tcp4Io The Tcp4Io wrapping the TCP socket.
> -**/
> -VOID
> -Tcp4IoReset (
> -  IN OUT TCP4_IO  *Tcp4Io
> -  );
> -
> -/**
> -  Transmit the Packet to the other endpoint of the socket.
> -
> -  @param[in]   Tcp4Io          The Tcp4Io wrapping the TCP socket.
> -  @param[in]   Packet          The packet to transmit.
> -
> -  @retval EFI_SUCCESS          The packet is trasmitted.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoTransmit (
> -  IN TCP4_IO  *Tcp4Io,
> -  IN NET_BUF  *Packet
> -  );
> -
> -/**
> -  Receive data from the socket.
> -
> -  @param[in]  Tcp4Io           The Tcp4Io which wraps the socket to be
> destroyed.
> -  @param[in]  Packet           The buffer to hold the data copy from the soket rx
> buffer.
> -  @param[in]  AsyncMode        Is this receive asyncronous or not.
> -  @param[in]  Timeout          The time to wait for receiving the amount of data
> the Packet
> -                               can hold.
> -
> -  @retval EFI_SUCCESS          The required amount of data is received from
> the socket.
> -  @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
> -  @retval EFI_TIMEOUT          Failed to receive the required amount of data in
> the
> -                               specified time period.
> -  @retval Others               Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoReceive (
> -  IN TCP4_IO    *Tcp4Io,
> -  IN NET_BUF    *Packet,
> -  IN BOOLEAN    AsyncMode,
> -  IN EFI_EVENT  Timeout
> -  );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> deleted file mode 100644
> index 1541b2d8ece1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> +++ /dev/null
> @@ -1,80 +0,0 @@
> -/** @file
> -  Header file for Md5.
> -
> -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#ifndef _MD5_H_
> -#define _MD5_H_
> -
> -#include <Uefi.h>
> -#include <Library/BaseLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/NetLib.h>
> -
> -#define MD5_HASHSIZE  16
> -
> -typedef struct _MD5_CTX {
> -  EFI_STATUS  Status;
> -  UINT64      Length;
> -  UINT32      States[MD5_HASHSIZE / sizeof (UINT32)];
> -  UINT8       M[64];
> -  UINTN       Count;
> -} MD5_CTX;
> -
> -/**
> -  Initialize four 32-bits chaining variables and use them to do the Md5
> transform.
> -
> -  @param[out]  Md5Ctx The data structure of Md5.
> -
> -  @retval EFI_SUCCESS Initialization is ok.
> -**/
> -EFI_STATUS
> -MD5Init (
> -  OUT MD5_CTX  *Md5Ctx
> -  );
> -
> -/**
> -  the external interface of Md5 algorithm
> -
> -  @param[in, out]  Md5Ctx  The data structure of storing the original data
> -                           segment and the final result.
> -  @param[in]       Data    The data wanted to be transformed.
> -  @param[in]       DataLen The length of data.
> -
> -  @retval EFI_SUCCESS The transform is ok.
> -  @retval Others      Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Update (
> -  IN  OUT MD5_CTX  *Md5Ctx,
> -  IN  VOID         *Data,
> -  IN  UINTN        DataLen
> -  );
> -
> -/**
> -  Accumulate the MD5 value of every data segment and generate the finial
> -  result according to MD5 algorithm.
> -
> -  @param[in, out]   Md5Ctx  The data structure of storing the original data
> -                            segment and the final result.
> -  @param[out]      HashVal  The final 128-bits output.
> -
> -  @retval EFI_SUCCESS  The transform is ok.
> -  @retval Others       Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Final (
> -  IN  OUT MD5_CTX  *Md5Ctx,
> -  OUT UINT8        *HashVal
> -  );
> -
> -#endif
> --
> 2.19.1.windows.1



  reply	other threads:[~2018-12-20  2:09 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-20  1:41 [PATCH v2 0/6] Delete TCP, PXE, iSCSI driver in MdeModulePkg Siyuan Fu
2018-12-20  1:41 ` [PATCH v2 1/6] MdeModulePkg: Delete Tcp4Dxe " Siyuan Fu
2018-12-20  2:09   ` Ni, Ruiyu
2018-12-20  4:59   ` Wang, Jian J
2018-12-20  1:41 ` [PATCH v2 2/6] NetworkPkg: Remove some clarification from TcpDxe.inf Siyuan Fu
2018-12-20  1:41 ` [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg Siyuan Fu
2018-12-20  2:07   ` Ni, Ruiyu [this message]
2018-12-20  4:43   ` Wang, Jian J
2018-12-20  1:41 ` [PATCH v2 4/6] NetworkPkg: Remove some clarification from IScsiDxe.inf Siyuan Fu
2018-12-20  1:41 ` [PATCH v2 5/6] MdeModulePkg: Delete UefiPxeBcDxe in MdeModulePkg Siyuan Fu
2018-12-20  4:56   ` Wang, Jian J
2018-12-20  1:41 ` [PATCH v2 6/6] NetworkPkg: Remove some clarification from UefiPxeBcDxe.inf Siyuan Fu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=734D49CCEBEEF84792F5B80ED585239D5BF6740D@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox