[edk2] [PATCH 1/2] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg.

Fu Siyuan siyuan.fu at intel.com
Tue Dec 18 21:42:04 PST 2018


REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278

This patch is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe drivers
in MdeModulePkg. These drivers will not be maintained and can't co-work
with the dual-stack drivers in NetworkPkg.

People should use below NetworkPkg drivers instead:
  NetworkPkg/IScsiDxe/IScsiDxe.inf
  NetworkPkg/TcpDxe/TcpDxe.inf
  NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
These drivers are actively maintained with more bug fixes and new feature
support.

Cc: Star Zeng <star.zeng at intel.com>
Cc: Jian J Wang <jian.j.wang at intel.com>
Cc: Jiaxin Wu <jiaxin.wu at intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Fu Siyuan <siyuan.fu at intel.com>
---
 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/Universal/Network/Tcp4Dxe/ComponentName.c             |  433 ---
 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c                  | 1201 --------
 MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c             |  990 -------
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c            |  717 -----
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c                |  782 -----
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c                 | 1497 ----------
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c                    |  112 -
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c                  |  674 -----
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c                  |  940 ------
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c                |  352 ---
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c                | 1238 --------
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c                 |  584 ----
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c        |  365 ---
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c            | 1999 -------------
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c          |  665 -----
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c            | 2989 --------------------
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c           |  454 ---
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c         |  221 --
 MdeModulePkg/MdeModulePkg.dsc                                      |    3 -
 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 -
 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h                  |  131 -
 MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h                    |  954 -------
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h                |  342 ---
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf                 |   94 -
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni                 |   23 -
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni            |   20 -
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h                  |  781 -----
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h                  |  494 ----
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h                |  130 -
 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h                 |  357 ---
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h            |  502 ----
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h          |  102 -
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h            |  189 --
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h           |  137 -
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h         |  134 -
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni      |   25 -
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni |   20 -
 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf       |  102 -
 69 files changed, 32598 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_VERSION;
-  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_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_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_SELECTED |
-                            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_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_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_TYPE_NO_CHAP;
-    } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
-      Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_CHAP;
-    } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
-      Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_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_TYPE_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_TYPE_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/Universal/Network/Tcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c
deleted file mode 100644
index f1227691ec21..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/** @file
-  UEFI Component Name(2) protocol implementation for Tcp4Dxe driver.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-/**
-  Retrieves a Unicode string that is the user readable name of the driver.
-
-  This function retrieves the user readable name of a driver in the form of a
-  Unicode string. If the driver specified by This has a user readable name in
-  the language specified by Language, then a pointer to the driver name is
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
-  by This does not support the language specified by Language,
-  then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
-                                EFI_COMPONENT_NAME_PROTOCOL instance.
-
-  @param[in]  Language          A pointer to a Null-terminated ASCII string
-                                array indicating the language. This is the
-                                language of the driver name that the caller is
-                                requesting, and it must match one of the
-                                languages specified in SupportedLanguages. The
-                                number of languages supported by a driver is up
-                                to the driver writer. Language is specified
-                                in RFC 4646 or ISO 639-2 language code format.
-
-  @param[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
-TcpComponentNameGetDriverName (
-  IN     EFI_COMPONENT_NAME_PROTOCOL  *This,
-  IN     CHAR8                        *Language,
-     OUT CHAR16                       **DriverName
-  );
-
-
-/**
-  Retrieves a Unicode string that is the user readable name of the controller
-  that is being managed by a driver.
-
-  This function retrieves the user readable name of the controller specified by
-  ControllerHandle and ChildHandle in the form of a Unicode string. If the
-  driver specified by This has a user readable name in the language specified by
-  Language, then a pointer to the controller name is returned in ControllerName,
-  and EFI_SUCCESS is returned.  If the driver specified by This is not currently
-  managing the controller specified by ControllerHandle and ChildHandle,
-  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
-  support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
-                                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 Null-terminated ASCII string
-                                array indicating the language.  This is the
-                                language of the driver name that the caller is
-                                requesting, and it must match one of the
-                                languages specified in SupportedLanguages. The
-                                number of languages supported by a driver is up
-                                to the driver writer. Language is specified in
-                                RFC 4646 or ISO 639-2 language code format.
-
-  @param[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
-TcpComponentNameGetControllerName (
-  IN     EFI_COMPONENT_NAME_PROTOCOL  *This,
-  IN     EFI_HANDLE                   ControllerHandle,
-  IN     EFI_HANDLE                   ChildHandle        OPTIONAL,
-  IN     CHAR8                        *Language,
-     OUT CHAR16                       **ControllerName
-  );
-
-
-///
-/// EFI Component Name Protocol
-///
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL  gTcp4ComponentName = {
-  TcpComponentNameGetDriverName,
-  TcpComponentNameGetControllerName,
-  "eng"
-};
-
-///
-/// EFI Component Name 2 Protocol
-///
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2 = {
-  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) TcpComponentNameGetDriverName,
-  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) TcpComponentNameGetControllerName,
-  "en"
-};
-
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mTcpDriverNameTable[] = {
-  {
-    "eng;en",
-    L"Tcp Network Service Driver"
-  },
-  {
-    NULL,
-    NULL
-  }
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable = NULL;
-
-/**
-  Retrieves a Unicode string that is the user readable name of the driver.
-
-  This function retrieves the user readable name of a driver in the form of a
-  Unicode string. If the driver specified by This has a user readable name in
-  the language specified by Language, then a pointer to the driver name is
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
-  by This does not support the language specified by Language,
-  then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
-                                EFI_COMPONENT_NAME_PROTOCOL instance.
-
-  @param[in]  Language          A pointer to a Null-terminated ASCII string
-                                array indicating the language. This is the
-                                language of the driver name that the caller is
-                                requesting, and it must match one of the
-                                languages specified in SupportedLanguages. The
-                                number of languages supported by a driver is up
-                                to the driver writer. Language is specified
-                                in RFC 4646 or ISO 639-2 language code format.
-
-  @param[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
-TcpComponentNameGetDriverName (
-  IN     EFI_COMPONENT_NAME_PROTOCOL  *This,
-  IN     CHAR8                        *Language,
-     OUT CHAR16                       **DriverName
-  )
-{
-  return LookupUnicodeString2 (
-           Language,
-           This->SupportedLanguages,
-           mTcpDriverNameTable,
-           DriverName,
-           (BOOLEAN) (This == &gTcp4ComponentName)
-           );
-}
-
-/**
-  Update the component name for the Tcp4 child handle.
-
-  @param  Tcp4[in]                   A pointer to the EFI_TCP4_PROTOCOL.
-
-
-  @retval EFI_SUCCESS                Update the ControllerNameTable of this instance successfully.
-  @retval EFI_INVALID_PARAMETER      The input parameter is invalid.
-
-**/
-EFI_STATUS
-UpdateName (
-  IN  EFI_TCP4_PROTOCOL             *Tcp4
-  )
-{
-  EFI_STATUS                       Status;
-  CHAR16                           HandleName[80];
-  EFI_TCP4_CONFIG_DATA             Tcp4ConfigData;
-
-  if (Tcp4 == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Format the child name into the string buffer as:
-  // TCPv4 (SrcPort=59, DestPort=60, ActiveFlag=TRUE)
-  //
-  ZeroMem (&Tcp4ConfigData, sizeof (Tcp4ConfigData));
-  Status = Tcp4->GetModeData (Tcp4, NULL, &Tcp4ConfigData, NULL, NULL, NULL);
-  if (!EFI_ERROR (Status)) {
-    UnicodeSPrint (HandleName, sizeof (HandleName),
-      L"TCPv4 (SrcPort=%d, DestPort=%d, ActiveFlag=%s)",
-      Tcp4ConfigData.AccessPoint.StationPort,
-      Tcp4ConfigData.AccessPoint.RemotePort,
-      (Tcp4ConfigData.AccessPoint.ActiveFlag ? L"TRUE" : L"FALSE")
-      );
-  } else if (Status == EFI_NOT_STARTED) {
-    UnicodeSPrint (
-      HandleName,
-      sizeof (HandleName),
-      L"TCPv4 (Not started)"
-      );
-  } else {
-    return Status;
-  }
-
-  if (gTcpControllerNameTable != NULL) {
-    FreeUnicodeStringTable (gTcpControllerNameTable);
-    gTcpControllerNameTable = NULL;
-  }
-
-  Status = AddUnicodeString2 (
-             "eng",
-             gTcp4ComponentName.SupportedLanguages,
-             &gTcpControllerNameTable,
-             HandleName,
-             TRUE
-             );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return AddUnicodeString2 (
-           "en",
-           gTcp4ComponentName2.SupportedLanguages,
-           &gTcpControllerNameTable,
-           HandleName,
-           FALSE
-           );
-}
-
-/**
-  Retrieves a Unicode string that is the user readable name of the controller
-  that is being managed by a driver.
-
-  This function retrieves the user readable name of the controller specified by
-  ControllerHandle and ChildHandle in the form of a Unicode string. If the
-  driver specified by This has a user readable name in the language specified by
-  Language, then a pointer to the controller name is returned in ControllerName,
-  and EFI_SUCCESS is returned.  If the driver specified by This is not currently
-  managing the controller specified by ControllerHandle and ChildHandle,
-  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
-  support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
-                                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 Null-terminated ASCII string
-                                array indicating the language.  This is the
-                                language of the driver name that the caller is
-                                requesting, and it must match one of the
-                                languages specified in SupportedLanguages. The
-                                number of languages supported by a driver is up
-                                to the driver writer. Language is specified in
-                                RFC 4646 or ISO 639-2 language code format.
-
-  @param[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
-TcpComponentNameGetControllerName (
-  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_TCP4_PROTOCOL             *Tcp4;
-
-  //
-  // Only provide names for child handles.
-  //
-  if (ChildHandle == NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Make sure this driver produced ChildHandle
-  //
-  Status = EfiTestChildHandle (
-             ControllerHandle,
-             ChildHandle,
-             &gEfiIp4ProtocolGuid
-             );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Retrieve an instance of a produced protocol from ChildHandle
-  //
-  Status = gBS->OpenProtocol (
-                  ChildHandle,
-                  &gEfiTcp4ProtocolGuid,
-                  (VOID **)&Tcp4,
-                  NULL,
-                  NULL,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Update the component name for this child handle.
-  //
-  Status = UpdateName (Tcp4);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return LookupUnicodeString2 (
-           Language,
-           This->SupportedLanguages,
-           gTcpControllerNameTable,
-           ControllerName,
-           (BOOLEAN)(This == &gTcp4ComponentName)
-           );
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
deleted file mode 100644
index adb5aa35cdf2..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
+++ /dev/null
@@ -1,1201 +0,0 @@
-/** @file
-  Implementation of the Socket.
-
-Copyright (c) 2005 - 2017, 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<BR>
-
-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 "SockImpl.h"
-
-/**
-  Get the length of the data that can be retrieved from the socket
-  receive buffer.
-
-  @param  SockBuffer            Pointer to the socket receive buffer.
-  @param  IsUrg                 Pointer to a BOOLEAN variable. If TRUE the data is
-                                OOB.
-  @param  BufLen                The maximum length of the data buffer to store the
-                                received data in socket layer.
-
-  @return The length of the data can be retreived.
-
-**/
-UINT32
-SockTcpDataToRcv (
-  IN     SOCK_BUFFER    *SockBuffer,
-     OUT BOOLEAN        *IsUrg,
-  IN     UINT32         BufLen
-  );
-
-/**
-  Process the send token.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockProcessSndToken (
-  IN OUT SOCKET *Sock
-  );
-
-/**
-  Supporting function for both SockImpl and SockInterface.
-
-  @param Event             The Event this notify function registered to, ignored.
-
-**/
-VOID
-EFIAPI
-SockFreeFoo (
-  IN EFI_EVENT Event
-  )
-{
-  return ;
-}
-
-
-/**
-  Get the length of the data that can be retrieved from the socket
-  receive buffer.
-
-  @param  SockBuffer            Pointer to the socket receive buffer.
-  @param  IsUrg                 Pointer to a BOOLEAN variable. If TRUE the data is
-                                OOB.
-  @param  BufLen                The maximum length of the data buffer to store the
-                                received data in socket layer.
-
-  @return The length of the data can be retreived.
-
-**/
-UINT32
-SockTcpDataToRcv (
-  IN     SOCK_BUFFER    *SockBuffer,
-     OUT BOOLEAN        *IsUrg,
-  IN     UINT32         BufLen
-  )
-{
-  NET_BUF       *RcvBufEntry;
-  UINT32        DataLen;
-  TCP_RSV_DATA  *TcpRsvData;
-  BOOLEAN       Urg;
-  ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0));
-
-  RcvBufEntry = SockBufFirst (SockBuffer);
-  ASSERT (RcvBufEntry != NULL);
-
-  TcpRsvData  = (TCP_RSV_DATA *) RcvBufEntry->ProtoData;
-
-  *IsUrg      = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE);
-
-  if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) {
-
-    DataLen = MIN (TcpRsvData->UrgLen, BufLen);
-
-    if (DataLen < TcpRsvData->UrgLen) {
-      TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen;
-    } else {
-      TcpRsvData->UrgLen = 0;
-    }
-
-    return DataLen;
-
-  }
-
-  DataLen     = RcvBufEntry->TotalSize;
-
-  RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry);
-
-  while ((BufLen > DataLen) && (RcvBufEntry != NULL)) {
-
-    TcpRsvData  = (TCP_RSV_DATA *) RcvBufEntry->ProtoData;
-
-    Urg         = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE);
-
-    if (*IsUrg != Urg) {
-      break;
-    }
-
-    if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) {
-
-      if (TcpRsvData->UrgLen + DataLen < BufLen) {
-        TcpRsvData->UrgLen = 0;
-      } else {
-        TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen);
-      }
-
-      return MIN (TcpRsvData->UrgLen + DataLen, BufLen);
-
-    }
-
-    DataLen += RcvBufEntry->TotalSize;
-
-    RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry);
-  }
-
-  DataLen = MIN (BufLen, DataLen);
-  return DataLen;
-}
-
-
-/**
-  Copy data from socket buffer to application provided receive buffer.
-
-  @param  Sock                  Pointer to the socket.
-  @param  TcpRxData             Pointer to the application provided receive buffer.
-  @param  RcvdBytes             The maximum length of the data can be copied.
-  @param  IsOOB                 If TRUE the data is OOB, FALSE the data is normal.
-
-**/
-VOID
-SockSetTcpRxData (
-  IN SOCKET     *Sock,
-  IN VOID       *TcpRxData,
-  IN UINT32     RcvdBytes,
-  IN BOOLEAN    IsOOB
-  )
-{
-  UINT32                  Index;
-  UINT32                  CopyBytes;
-  UINT32                  OffSet;
-  EFI_TCP4_RECEIVE_DATA   *RxData;
-  EFI_TCP4_FRAGMENT_DATA  *Fragment;
-
-  RxData  = (EFI_TCP4_RECEIVE_DATA *) TcpRxData;
-
-  OffSet  = 0;
-
-  ASSERT (RxData->DataLength >= RcvdBytes);
-
-  RxData->DataLength  = RcvdBytes;
-  RxData->UrgentFlag  = IsOOB;
-
-  for (Index = 0; (Index < RxData->FragmentCount) && (RcvdBytes > 0); Index++) {
-
-    Fragment  = &RxData->FragmentTable[Index];
-    CopyBytes = MIN ((UINT32) (Fragment->FragmentLength), RcvdBytes);
-
-    NetbufQueCopy (
-      Sock->RcvBuffer.DataQueue,
-      OffSet,
-      CopyBytes,
-      Fragment->FragmentBuffer
-      );
-
-    Fragment->FragmentLength = CopyBytes;
-    RcvdBytes -= CopyBytes;
-    OffSet += CopyBytes;
-  }
-}
-
-
-/**
-  Get received data from the socket layer to the receive token.
-
-  @param  Sock                  Pointer to the socket.
-  @param  RcvToken              Pointer to the application provided receive token.
-
-  @return The length of data received in this token.
-
-**/
-UINT32
-SockProcessRcvToken (
-  IN     SOCKET        *Sock,
-  IN OUT SOCK_IO_TOKEN *RcvToken
-  )
-{
-  UINT32                 TokenRcvdBytes;
-  EFI_TCP4_RECEIVE_DATA  *RxData;
-  BOOLEAN                IsUrg;
-
-  ASSERT (Sock != NULL);
-
-  ASSERT (SockStream == Sock->Type);
-
-  RxData = RcvToken->Packet.RxData;
-
-  TokenRcvdBytes = SockTcpDataToRcv (
-                      &Sock->RcvBuffer,
-                      &IsUrg,
-                      (UINT32) RxData->DataLength
-                      );
-
-  //
-  // Copy data from RcvBuffer of socket to user
-  // provided RxData and set the fields in TCP RxData
-  //
-  SockSetTcpRxData (Sock, RxData, TokenRcvdBytes, IsUrg);
-
-  NetbufQueTrim (Sock->RcvBuffer.DataQueue, TokenRcvdBytes);
-  SIGNAL_TOKEN (&(RcvToken->Token), EFI_SUCCESS);
-
-  return TokenRcvdBytes;
-}
-
-
-/**
-  Process the TCP send data, buffer the tcp txdata and append
-  the buffer to socket send buffer,then try to send it.
-
-  @param  Sock                  Pointer to the socket.
-  @param  TcpTxData             Pointer to the application provided send buffer.
-
-  @retval EFI_SUCCESS           The operation is completed successfully.
-  @retval EFI_OUT_OF_RESOURCES  Failed due to resource limit.
-
-**/
-EFI_STATUS
-SockProcessTcpSndData (
-  IN SOCKET   *Sock,
-  IN VOID     *TcpTxData
-  )
-{
-  NET_BUF                 *SndData;
-  EFI_STATUS              Status;
-  EFI_TCP4_TRANSMIT_DATA  *TxData;
-
-  TxData = (EFI_TCP4_TRANSMIT_DATA *) TcpTxData;
-
-  //
-  // transform this TxData into a NET_BUFFER
-  // and insert it into Sock->SndBuffer
-  //
-  SndData = NetbufFromExt (
-              (NET_FRAGMENT *) TxData->FragmentTable,
-              (UINT32) TxData->FragmentCount,
-              0,
-              0,
-              SockFreeFoo,
-              NULL
-              );
-
-  if (NULL == SndData) {
-    DEBUG ((EFI_D_ERROR, "SockKProcessSndData: Failed to"
-      " call NetBufferFromExt\n"));
-
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  NetbufQueAppend (Sock->SndBuffer.DataQueue, SndData);
-
-  //
-  // notify the low layer protocol to handle this send token
-  //
-  if (TxData->Urgent) {
-    Status = Sock->ProtoHandler (Sock, SOCK_SNDURG, NULL);
-
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-
-  if (TxData->Push) {
-    Status = Sock->ProtoHandler (Sock, SOCK_SNDPUSH, NULL);
-
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-
-  //
-  // low layer protocol should really handle the sending
-  // process when catching SOCK_SND request
-  //
-  Status = Sock->ProtoHandler (Sock, SOCK_SND, NULL);
-
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Flush the tokens in the specific token list.
-
-  @param  Sock                  Pointer to the socket.
-  @param  PendingTokenList      Pointer to the token list to be flushed.
-
-**/
-VOID
-SockFlushPendingToken (
-  IN SOCKET         *Sock,
-  IN LIST_ENTRY     *PendingTokenList
-  )
-{
-  SOCK_TOKEN            *SockToken;
-  SOCK_COMPLETION_TOKEN *Token;
-
-  ASSERT ((Sock != NULL) && (PendingTokenList != NULL));
-
-  while (!IsListEmpty (PendingTokenList)) {
-    SockToken = NET_LIST_HEAD (
-                  PendingTokenList,
-                  SOCK_TOKEN,
-                  TokenList
-                  );
-
-    Token = SockToken->Token;
-    SIGNAL_TOKEN (Token, Sock->SockError);
-
-    RemoveEntryList (&(SockToken->TokenList));
-    FreePool (SockToken);
-  }
-}
-
-
-/**
-  Wake up the connection token while the connection is successfully established,
-  then try to process any pending send token.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockWakeConnToken (
-  IN OUT SOCKET *Sock
-  )
-{
-  ASSERT (Sock->ConnectionToken != NULL);
-
-  SIGNAL_TOKEN (Sock->ConnectionToken, EFI_SUCCESS);
-  Sock->ConnectionToken = NULL;
-
-  //
-  // check to see if some pending send token existed?
-  //
-  SockProcessSndToken (Sock);
-  return ;
-}
-
-
-/**
-  Wake up the listen token while the connection is established successfully.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockWakeListenToken (
-  IN OUT SOCKET *Sock
-  )
-{
-  SOCKET                *Parent;
-  SOCK_TOKEN            *SockToken;
-  EFI_TCP4_LISTEN_TOKEN *ListenToken;
-
-  Parent = Sock->Parent;
-
-  ASSERT ((Parent != NULL) && SOCK_IS_LISTENING (Parent) && SOCK_IS_CONNECTED (Sock));
-
-  if (!IsListEmpty (&Parent->ListenTokenList)) {
-    SockToken = NET_LIST_HEAD (
-                  &Parent->ListenTokenList,
-                  SOCK_TOKEN,
-                  TokenList
-                  );
-
-    ListenToken = (EFI_TCP4_LISTEN_TOKEN *) SockToken->Token;
-    ListenToken->NewChildHandle = Sock->SockHandle;
-
-    SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS);
-
-    RemoveEntryList (&SockToken->TokenList);
-    FreePool (SockToken);
-
-    RemoveEntryList (&Sock->ConnectionList);
-
-    Parent->ConnCnt--;
-    DEBUG ((EFI_D_NET, "SockWakeListenToken: accept a socket, now conncnt is %d", Parent->ConnCnt));
-
-    Sock->Parent = NULL;
-  }
-}
-
-
-/**
-  Wake up the receive token while some data is received.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockWakeRcvToken (
-  IN SOCKET *Sock
-  )
-{
-  UINT32        RcvdBytes;
-  UINT32        TokenRcvdBytes;
-  SOCK_TOKEN    *SockToken;
-  SOCK_IO_TOKEN *RcvToken;
-
-  ASSERT (Sock->RcvBuffer.DataQueue != NULL);
-
-  RcvdBytes = (Sock->RcvBuffer.DataQueue)->BufSize;
-
-  ASSERT (RcvdBytes > 0);
-
-  while (RcvdBytes > 0 && !IsListEmpty (&Sock->RcvTokenList)) {
-
-    SockToken = NET_LIST_HEAD (
-                  &Sock->RcvTokenList,
-                  SOCK_TOKEN,
-                  TokenList
-                  );
-
-    RcvToken        = (SOCK_IO_TOKEN *) SockToken->Token;
-    TokenRcvdBytes  = SockProcessRcvToken (Sock, RcvToken);
-
-    if (0 == TokenRcvdBytes) {
-      return ;
-    }
-
-    RemoveEntryList (&(SockToken->TokenList));
-    FreePool (SockToken);
-    RcvdBytes -= TokenRcvdBytes;
-  }
-}
-
-
-/**
-  Process the send token.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockProcessSndToken (
-  IN OUT SOCKET *Sock
-  )
-{
-  UINT32                  FreeSpace;
-  SOCK_TOKEN              *SockToken;
-  UINT32                  DataLen;
-  SOCK_IO_TOKEN           *SndToken;
-  EFI_TCP4_TRANSMIT_DATA  *TxData;
-  EFI_STATUS              Status;
-
-  ASSERT ((Sock != NULL) && (SockStream == Sock->Type));
-
-  FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF);
-
-  //
-  // to determine if process a send token using
-  // socket layer flow control policy
-  //
-  while ((FreeSpace >= Sock->SndBuffer.LowWater) &&
-         !IsListEmpty (&Sock->SndTokenList)) {
-
-    SockToken = NET_LIST_HEAD (
-                  &(Sock->SndTokenList),
-                  SOCK_TOKEN,
-                  TokenList
-                  );
-
-    //
-    // process this token
-    //
-    RemoveEntryList (&(SockToken->TokenList));
-    InsertTailList (
-      &(Sock->ProcessingSndTokenList),
-      &(SockToken->TokenList)
-      );
-
-    //
-    // Proceess it in the light of  SockType
-    //
-    SndToken  = (SOCK_IO_TOKEN *) SockToken->Token;
-    TxData    = SndToken->Packet.TxData;
-
-    DataLen = (UINT32) TxData->DataLength;
-    Status  = SockProcessTcpSndData (Sock, TxData);
-
-    if (EFI_ERROR (Status)) {
-      goto OnError;
-    }
-
-    if (DataLen >= FreeSpace) {
-      FreeSpace = 0;
-
-    } else {
-      FreeSpace -= DataLen;
-
-    }
-  }
-
-  return ;
-
-OnError:
-
-  RemoveEntryList (&SockToken->TokenList);
-  SIGNAL_TOKEN (SockToken->Token, Status);
-  FreePool (SockToken);
-}
-
-
-/**
-  Create a socket with initial data SockInitData.
-
-  @param  SockInitData          Pointer to the initial data of the socket.
-
-  @return Pointer to the newly created socket, return NULL when exception occured.
-
-**/
-SOCKET *
-SockCreate (
-  IN SOCK_INIT_DATA *SockInitData
-  )
-{
-  SOCKET      *Sock;
-  SOCKET      *Parent;
-  EFI_STATUS  Status;
-
-  ASSERT ((SockInitData != NULL) && (SockInitData->ProtoHandler != NULL));
-  ASSERT (SockInitData->Type == SockStream);
-  ASSERT ((SockInitData->ProtoData != NULL) && (SockInitData->DataSize <= PROTO_RESERVED_LEN));
-
-  Parent = SockInitData->Parent;
-
-  if ((Parent != NULL) && (Parent->ConnCnt == Parent->BackLog)) {
-    DEBUG (
-      (EFI_D_ERROR,
-      "SockCreate: Socket parent has "
-      "reached its connection limit with %d ConnCnt and %d BackLog\n",
-      Parent->ConnCnt,
-      Parent->BackLog)
-      );
-
-    return NULL;
-  }
-
-  Sock = AllocateZeroPool (sizeof (SOCKET));
-  if (NULL == Sock) {
-
-    DEBUG ((EFI_D_ERROR, "SockCreate: No resource to create a new socket\n"));
-    return NULL;
-  }
-
-  InitializeListHead (&Sock->Link);
-  InitializeListHead (&Sock->ConnectionList);
-  InitializeListHead (&Sock->ListenTokenList);
-  InitializeListHead (&Sock->RcvTokenList);
-  InitializeListHead (&Sock->SndTokenList);
-  InitializeListHead (&Sock->ProcessingSndTokenList);
-
-  EfiInitializeLock (&(Sock->Lock), TPL_CALLBACK);
-
-  Sock->SndBuffer.DataQueue = NetbufQueAlloc ();
-  if (NULL == Sock->SndBuffer.DataQueue) {
-    DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate"
-      " SndBuffer for new socket\n"));
-
-    goto OnError;
-  }
-
-  Sock->RcvBuffer.DataQueue = NetbufQueAlloc ();
-  if (NULL == Sock->RcvBuffer.DataQueue) {
-    DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate "
-      "RcvBuffer for new socket\n"));
-
-    goto OnError;
-  }
-
-  Sock->Signature           = SOCK_SIGNATURE;
-
-  Sock->Parent              = Parent;
-  Sock->BackLog             = SockInitData->BackLog;
-  Sock->ProtoHandler        = SockInitData->ProtoHandler;
-  Sock->SndBuffer.HighWater = SockInitData->SndBufferSize;
-  Sock->RcvBuffer.HighWater = SockInitData->RcvBufferSize;
-  Sock->Type                = SockInitData->Type;
-  Sock->DriverBinding       = SockInitData->DriverBinding;
-  Sock->State               = SockInitData->State;
-  Sock->CreateCallback      = SockInitData->CreateCallback;
-  Sock->DestroyCallback     = SockInitData->DestroyCallback;
-  Sock->Context             = SockInitData->Context;
-
-  Sock->SockError           = EFI_ABORTED;
-  Sock->SndBuffer.LowWater  = SOCK_BUFF_LOW_WATER;
-  Sock->RcvBuffer.LowWater  = SOCK_BUFF_LOW_WATER;
-
-  //
-  // Install protocol on Sock->SockHandle
-  //
-  CopyMem (
-    &(Sock->NetProtocol.TcpProtocol),
-    SockInitData->Protocol,
-    sizeof (EFI_TCP4_PROTOCOL)
-    );
-
-  //
-  // copy the protodata into socket
-  //
-  CopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize);
-
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &Sock->SockHandle,
-                  &gEfiTcp4ProtocolGuid,
-                  &(Sock->NetProtocol.TcpProtocol),
-                  NULL
-                  );
-
-  if (EFI_ERROR (Status)) {
-    DEBUG ((EFI_D_ERROR, "SockCreate: Install TCP protocol in "
-      "socket failed with %r\n", Status));
-
-    goto OnError;
-  }
-
-  if (Parent != NULL) {
-    ASSERT (Parent->BackLog > 0);
-    ASSERT (SOCK_IS_LISTENING (Parent));
-
-    //
-    // need to add it into Parent->ConnectionList
-    // if the Parent->ConnCnt < Parent->BackLog
-    //
-    Parent->ConnCnt++;
-
-    DEBUG (
-      (EFI_D_NET,
-      "SockCreate: Create a new socket and add to parent, now conncnt is %d\n",
-      Parent->ConnCnt)
-      );
-
-    InsertTailList (&Parent->ConnectionList, &Sock->ConnectionList);
-  }
-
-  if (Sock->CreateCallback != NULL) {
-    Status = Sock->CreateCallback (Sock, Sock->Context);
-    if (EFI_ERROR (Status)) {
-      goto OnError;
-    }
-  }
-
-  return Sock;
-
-OnError:
-
-  if (Sock->SockHandle != NULL) {
-    gBS->UninstallMultipleProtocolInterfaces (
-           Sock->SockHandle,
-           &gEfiTcp4ProtocolGuid,
-           &(Sock->NetProtocol.TcpProtocol),
-           NULL
-           );
-  }
-
-  if (NULL != Sock->SndBuffer.DataQueue) {
-    NetbufQueFree (Sock->SndBuffer.DataQueue);
-  }
-
-  if (NULL != Sock->RcvBuffer.DataQueue) {
-    NetbufQueFree (Sock->RcvBuffer.DataQueue);
-  }
-
-  FreePool (Sock);
-
-  return NULL;
-}
-
-
-/**
-  Destroy a socket.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockDestroy (
-  IN OUT SOCKET *Sock
-  )
-{
-  ASSERT (SockStream == Sock->Type);
-
-  //
-  // Flush the completion token buffered
-  // by sock and rcv, snd buffer
-  //
-  if (!SOCK_IS_UNCONFIGURED (Sock)) {
-
-    SockConnFlush (Sock);
-    SockSetState (Sock, SO_CLOSED);
-    Sock->ConfigureState = SO_UNCONFIGURED;
-
-  }
-  //
-  // Destroy the RcvBuffer Queue and SendBuffer Queue
-  //
-  NetbufQueFree (Sock->RcvBuffer.DataQueue);
-  NetbufQueFree (Sock->SndBuffer.DataQueue);
-
-  //
-  // Remove it from parent connection list if needed
-  //
-  if (Sock->Parent != NULL) {
-
-    RemoveEntryList (&(Sock->ConnectionList));
-    (Sock->Parent->ConnCnt)--;
-
-    DEBUG (
-      (EFI_D_NET,
-      "SockDestroy: Delete a unaccepted socket from parent"
-      "now conncnt is %d\n",
-      Sock->Parent->ConnCnt)
-      );
-
-    Sock->Parent = NULL;
-  }
-
-  FreePool (Sock);
-  return ;
-}
-
-
-/**
-  Flush the sndBuffer and rcvBuffer of socket.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockConnFlush (
-  IN OUT SOCKET *Sock
-  )
-{
-  SOCKET  *Child;
-
-  ASSERT (Sock != NULL);
-
-  //
-  // Clear the flag in this socket
-  //
-  Sock->Flag = 0;
-
-  //
-  // Flush the SndBuffer and RcvBuffer of Sock
-  //
-  NetbufQueFlush (Sock->SndBuffer.DataQueue);
-  NetbufQueFlush (Sock->RcvBuffer.DataQueue);
-
-  //
-  // Signal the pending token
-  //
-  if (Sock->ConnectionToken != NULL) {
-    SIGNAL_TOKEN (Sock->ConnectionToken, Sock->SockError);
-    Sock->ConnectionToken = NULL;
-  }
-
-  if (Sock->CloseToken != NULL) {
-    SIGNAL_TOKEN (Sock->CloseToken, Sock->SockError);
-    Sock->CloseToken = NULL;
-  }
-
-  SockFlushPendingToken (Sock, &(Sock->ListenTokenList));
-  SockFlushPendingToken (Sock, &(Sock->RcvTokenList));
-  SockFlushPendingToken (Sock, &(Sock->SndTokenList));
-  SockFlushPendingToken (Sock, &(Sock->ProcessingSndTokenList));
-
-  //
-  // Destroy the pending connection, if it is a listening socket
-  //
-  if (SOCK_IS_LISTENING (Sock)) {
-    while (!IsListEmpty (&Sock->ConnectionList)) {
-      Child = NET_LIST_HEAD (
-                &Sock->ConnectionList,
-                SOCKET,
-                ConnectionList
-                );
-
-      SockDestroyChild (Child);
-    }
-
-    Sock->ConnCnt = 0;
-  }
-
-  return ;
-}
-
-
-/**
-  Set the state of the socket.
-
-  @param  Sock                  Pointer to the socket.
-  @param  State                 The new socket state to be set.
-
-**/
-VOID
-SockSetState (
-  IN OUT SOCKET     *Sock,
-  IN     UINT8      State
-  )
-{
-  Sock->State = State;
-}
-
-
-/**
-  Clone a new socket including its associated protocol control block.
-
-  @param  Sock                  Pointer to the socket to be cloned.
-
-  @return Pointer to the newly cloned socket. If NULL, error condition occurred.
-
-**/
-SOCKET *
-SockClone (
-  IN SOCKET *Sock
-  )
-{
-  SOCKET          *ClonedSock;
-  SOCK_INIT_DATA  InitData;
-
-  InitData.BackLog         = Sock->BackLog;
-  InitData.Parent          = Sock;
-  InitData.State           = Sock->State;
-  InitData.ProtoHandler    = Sock->ProtoHandler;
-  InitData.Type            = Sock->Type;
-  InitData.RcvBufferSize   = Sock->RcvBuffer.HighWater;
-  InitData.SndBufferSize   = Sock->SndBuffer.HighWater;
-  InitData.DriverBinding   = Sock->DriverBinding;
-  InitData.Protocol        = &(Sock->NetProtocol);
-  InitData.CreateCallback  = Sock->CreateCallback;
-  InitData.DestroyCallback = Sock->DestroyCallback;
-  InitData.Context         = Sock->Context;
-  InitData.ProtoData       = Sock->ProtoReserved;
-  InitData.DataSize        = sizeof (Sock->ProtoReserved);
-
-  ClonedSock               = SockCreate (&InitData);
-
-  if (NULL == ClonedSock) {
-    DEBUG ((EFI_D_ERROR, "SockClone: no resource to create a cloned sock\n"));
-    return NULL;
-  }
-
-  SockSetState (ClonedSock, SO_CONNECTING);
-  ClonedSock->ConfigureState = Sock->ConfigureState;
-
-  return ClonedSock;
-}
-
-
-/**
-  Called by the low layer protocol to indicate the socket a connection is
-  established.
-
-  This function just changes the socket's state to SO_CONNECTED
-  and signals the token used for connection establishment.
-
-  @param  Sock                  Pointer to the socket associated with the
-                                established connection.
-**/
-VOID
-SockConnEstablished (
-  IN SOCKET *Sock
-  )
-{
-
-  ASSERT (SO_CONNECTING == Sock->State);
-
-  SockSetState (Sock, SO_CONNECTED);
-
-  if (NULL == Sock->Parent) {
-    SockWakeConnToken (Sock);
-  } else {
-    SockWakeListenToken (Sock);
-  }
-
-  return ;
-}
-
-
-/**
-  Called by the low layer protocol to indicate the connection is closed.
-
-  This function flushes the socket, sets the state to SO_CLOSED and signals
-  the close token.
-
-  @param  Sock                  Pointer to the socket associated with the closed
-                                connection.
-
-**/
-VOID
-SockConnClosed (
-  IN OUT SOCKET *Sock
-  )
-{
-  if (Sock->CloseToken != NULL) {
-    SIGNAL_TOKEN (Sock->CloseToken, EFI_SUCCESS);
-    Sock->CloseToken = NULL;
-  }
-
-  SockConnFlush (Sock);
-  SockSetState (Sock, SO_CLOSED);
-
-  if (Sock->Parent != NULL) {
-    SockDestroyChild (Sock);
-  }
-
-}
-
-
-/**
-  Called by low layer protocol to indicate that some data is sent or processed.
-
-  This function trims the sent data in the socket send buffer, signals the data
-  token if proper.
-
-  @param  Sock                  Pointer to the socket.
-  @param  Count                 The length of the data processed or sent, in bytes.
-
-**/
-VOID
-SockDataSent (
-  IN SOCKET     *Sock,
-  IN UINT32     Count
-  )
-{
-  SOCK_TOKEN            *SockToken;
-  SOCK_COMPLETION_TOKEN *SndToken;
-
-  ASSERT (!IsListEmpty (&Sock->ProcessingSndTokenList));
-  ASSERT (Count <= (Sock->SndBuffer.DataQueue)->BufSize);
-
-  NetbufQueTrim (Sock->SndBuffer.DataQueue, Count);
-
-  //
-  // To check if we can signal some snd token in this socket
-  //
-  while (Count > 0) {
-    SockToken = NET_LIST_HEAD (
-                  &(Sock->ProcessingSndTokenList),
-                  SOCK_TOKEN,
-                  TokenList
-                  );
-
-    SndToken = SockToken->Token;
-
-    if (SockToken->RemainDataLen <= Count) {
-
-      RemoveEntryList (&(SockToken->TokenList));
-      SIGNAL_TOKEN (SndToken, EFI_SUCCESS);
-      Count -= SockToken->RemainDataLen;
-      FreePool (SockToken);
-    } else {
-
-      SockToken->RemainDataLen -= Count;
-      Count = 0;
-    }
-  }
-
-  //
-  // to judge if we can process some send token in
-  // Sock->SndTokenList, if so process those send token
-  //
-  SockProcessSndToken (Sock);
-  return ;
-}
-
-
-/**
-  Called by the low layer protocol to copy some data in socket send
-  buffer starting from the specific offset to a buffer provided by
-  the caller.
-
-  @param  Sock                  Pointer to the socket.
-  @param  Offset                The start point of the data to be copied.
-  @param  Len                   The length of the data to be copied.
-  @param  Dest                  Pointer to the destination to copy the data.
-
-  @return The data size copied.
-
-**/
-UINT32
-SockGetDataToSend (
-  IN SOCKET      *Sock,
-  IN UINT32      Offset,
-  IN UINT32      Len,
-  IN UINT8       *Dest
-  )
-{
-  ASSERT ((Sock != NULL) && SockStream == Sock->Type);
-
-  return NetbufQueCopy (
-          Sock->SndBuffer.DataQueue,
-          Offset,
-          Len,
-          Dest
-          );
-}
-
-
-/**
-  Called by the low layer protocol to deliver received data to socket layer.
-
-  This function will append the data to the socket receive buffer, set ther
-  urgent data length and then check if any receive token can be signaled.
-
-  @param  Sock                  Pointer to the socket.
-  @param  NetBuffer             Pointer to the buffer that contains the received
-                                data.
-  @param  UrgLen                The length of the urgent data in the received data.
-
-**/
-VOID
-SockDataRcvd (
-  IN     SOCKET    *Sock,
-  IN OUT NET_BUF   *NetBuffer,
-  IN     UINT32    UrgLen
-  )
-{
-  ASSERT ((Sock != NULL) && (Sock->RcvBuffer.DataQueue != NULL) &&
-    UrgLen <= NetBuffer->TotalSize);
-
-  NET_GET_REF (NetBuffer);
-
-  ((TCP_RSV_DATA *) (NetBuffer->ProtoData))->UrgLen = UrgLen;
-
-  NetbufQueAppend (Sock->RcvBuffer.DataQueue, NetBuffer);
-
-  SockWakeRcvToken (Sock);
-  return ;
-}
-
-
-/**
-  Get the length of the free space of the specific socket buffer.
-
-  @param  Sock                  Pointer to the socket.
-  @param  Which                 Flag to indicate which socket buffer to check,
-                                either send buffer or receive buffer.
-
-  @return The length of the free space, in bytes.
-
-**/
-UINT32
-SockGetFreeSpace (
-  IN SOCKET  *Sock,
-  IN UINT32  Which
-  )
-{
-  UINT32      BufferCC;
-  SOCK_BUFFER *SockBuffer;
-
-  ASSERT ((Sock != NULL) && ((SOCK_SND_BUF == Which) || (SOCK_RCV_BUF == Which)));
-
-  if (SOCK_SND_BUF == Which) {
-    SockBuffer = &(Sock->SndBuffer);
-  } else {
-    SockBuffer = &(Sock->RcvBuffer);
-  }
-
-  BufferCC = (SockBuffer->DataQueue)->BufSize;
-
-  if (BufferCC >= SockBuffer->HighWater) {
-
-    return 0;
-  }
-
-  return SockBuffer->HighWater - BufferCC;
-}
-
-
-
-/**
-  Called by the low layer protocol to indicate that there will be no more data
-  from the communication peer.
-
-  This function set the socket's state to SO_NO_MORE_DATA and signal all queued
-  IO tokens with the error status EFI_CONNECTION_FIN.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockNoMoreData (
-  IN OUT SOCKET *Sock
-  )
-{
-  EFI_STATUS  Err;
-
-  SOCK_NO_MORE_DATA (Sock);
-
-  if (!IsListEmpty (&Sock->RcvTokenList)) {
-
-    ASSERT (0 == GET_RCV_DATASIZE (Sock));
-
-    Err = Sock->SockError;
-
-    SOCK_ERROR (Sock, EFI_CONNECTION_FIN);
-
-    SockFlushPendingToken (Sock, &Sock->RcvTokenList);
-
-    SOCK_ERROR (Sock, Err);
-
-  }
-
-}
-
-
-/**
-  Get the first buffer block in the specific socket buffer.
-
-  @param  Sockbuf               Pointer to the socket buffer.
-
-  @return Pointer to the first buffer in the queue. NULL if the queue is empty.
-
-**/
-NET_BUF *
-SockBufFirst (
-  IN SOCK_BUFFER *Sockbuf
-  )
-{
-  LIST_ENTRY      *NetbufList;
-
-  NetbufList = &(Sockbuf->DataQueue->BufList);
-
-  if (IsListEmpty (NetbufList)) {
-    return NULL;
-  }
-
-  return NET_LIST_HEAD (NetbufList, NET_BUF, List);
-}
-
-
-/**
-  Get the next buffer block in the specific socket buffer.
-
-  @param  Sockbuf               Pointer to the socket buffer.
-  @param  SockEntry             Pointer to the buffer block prior to the required
-                                one.
-
-  @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is
-          the tail or head entry.
-
-**/
-NET_BUF *
-SockBufNext (
-  IN SOCK_BUFFER *Sockbuf,
-  IN NET_BUF     *SockEntry
-  )
-{
-  LIST_ENTRY      *NetbufList;
-
-  NetbufList = &(Sockbuf->DataQueue->BufList);
-
-  if ((SockEntry->List.ForwardLink == NetbufList) ||
-      (SockEntry->List.BackLink == &SockEntry->List) ||
-      (SockEntry->List.ForwardLink == &SockEntry->List)) {
-
-    return NULL;
-  }
-
-  return NET_LIST_USER_STRUCT (SockEntry->List.ForwardLink, NET_BUF, List);
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c
deleted file mode 100644
index cd20b8bcb2dd..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c
+++ /dev/null
@@ -1,990 +0,0 @@
-/** @file
-  Interface function of the Socket.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "SockImpl.h"
-
-
-/**
-  Check whether the Event is in the List.
-
-  @param  List                 Pointer to the token list to be searched.
-  @param  Event                The event to be checked.
-
-  @retval  TRUE                The specific Event exists in the List.
-  @retval  FALSE               The specific Event is not in the List.
-
-**/
-BOOLEAN
-SockTokenExistedInList (
-  IN LIST_ENTRY     *List,
-  IN EFI_EVENT      Event
-  )
-{
-  LIST_ENTRY      *ListEntry;
-  SOCK_TOKEN      *SockToken;
-
-  NET_LIST_FOR_EACH (ListEntry, List) {
-    SockToken = NET_LIST_USER_STRUCT (
-                  ListEntry,
-                  SOCK_TOKEN,
-                  TokenList
-                  );
-
-    if (Event == SockToken->Token->Event) {
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
-
-
-/**
-  Call SockTokenExistedInList() to check whether the Event is
-  in the related socket's lists.
-
-  @param  Sock                 Pointer to the instance's socket.
-  @param  Event                The event to be checked.
-
-  @retval  TRUE                The Event exists in related socket's lists.
-  @retval  FALSE               The Event is not in related socket's lists.
-
-**/
-BOOLEAN
-SockTokenExisted (
-  IN SOCKET    *Sock,
-  IN EFI_EVENT Event
-  )
-{
-
-  if (SockTokenExistedInList (&Sock->SndTokenList, Event) ||
-      SockTokenExistedInList (&Sock->ProcessingSndTokenList, Event) ||
-      SockTokenExistedInList (&Sock->RcvTokenList, Event) ||
-      SockTokenExistedInList (&Sock->ListenTokenList, Event)) {
-
-    return TRUE;
-  }
-
-  if ((Sock->ConnectionToken != NULL) &&
-      (Sock->ConnectionToken->Event == Event)) {
-
-    return TRUE;
-  }
-
-  if ((Sock->CloseToken != NULL) && (Sock->CloseToken->Event == Event)) {
-    return TRUE;
-  }
-
-  return FALSE;
-}
-
-
-/**
-  Buffer a token into the specific list of socket Sock.
-
-  @param  Sock                 Pointer to the instance's socket.
-  @param  List                 Pointer to the list to store the token.
-  @param  Token                Pointer to the token to be buffered.
-  @param  DataLen              The data length of the buffer contained in Token.
-
-  @return Pointer to the token that wraps Token. If NULL, error condition occurred.
-
-**/
-SOCK_TOKEN *
-SockBufferToken (
-  IN SOCKET         *Sock,
-  IN LIST_ENTRY     *List,
-  IN VOID           *Token,
-  IN UINT32         DataLen
-  )
-{
-  SOCK_TOKEN  *SockToken;
-
-  SockToken = AllocatePool (sizeof (SOCK_TOKEN));
-  if (NULL == SockToken) {
-
-    DEBUG ((EFI_D_ERROR, "SockBufferIOToken: No Memory "
-      "to allocate SockToken\n"));
-
-    return NULL;
-  }
-
-  SockToken->Sock           = Sock;
-  SockToken->Token          = (SOCK_COMPLETION_TOKEN *) Token;
-  SockToken->RemainDataLen  = DataLen;
-  InsertTailList (List, &SockToken->TokenList);
-
-  return SockToken;
-}
-
-
-/**
-  Destroy the socket Sock and its associated protocol control block.
-
-  @param  Sock                 The socket to be destroyed.
-
-  @retval EFI_SUCCESS          The socket Sock is destroyed successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
-
-**/
-EFI_STATUS
-SockDestroyChild (
-  IN SOCKET *Sock
-  )
-{
-  EFI_STATUS       Status;
-  TCP4_PROTO_DATA  *ProtoData;
-  TCP_CB           *Tcb;
-  VOID             *SockProtocol;
-
-  ASSERT ((Sock != NULL) && (Sock->ProtoHandler != NULL));
-
-  if (Sock->InDestroy) {
-    return EFI_SUCCESS;
-  }
-
-  Sock->InDestroy = TRUE;
-
-  ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
-  Tcb       = ProtoData->TcpPcb;
-
-  ASSERT (Tcb != NULL);
-
-  //
-  // Close the IP protocol.
-  //
-  gBS->CloseProtocol (
-         Tcb->IpInfo->ChildHandle,
-         &gEfiIp4ProtocolGuid,
-         ProtoData->TcpService->IpIo->Image,
-         Sock->SockHandle
-         );
-
-  if (Sock->DestroyCallback != NULL) {
-    Sock->DestroyCallback (Sock, Sock->Context);
-  }
-
-  //
-  // Retrieve the protocol installed on this sock
-  //
-  Status = gBS->OpenProtocol (
-                  Sock->SockHandle,
-                  &gEfiTcp4ProtocolGuid,
-                  &SockProtocol,
-                  Sock->DriverBinding,
-                  Sock->SockHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockDestroyChild: Open protocol installed "
-      "on socket failed with %r\n", Status));
-  }
-
-  //
-  // Uninstall the protocol installed on this sock
-  // in the light of Sock->SockType
-  //
-  gBS->UninstallMultipleProtocolInterfaces (
-        Sock->SockHandle,
-        &gEfiTcp4ProtocolGuid,
-        SockProtocol,
-        NULL
-        );
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockDestroyChild: Get the lock to "
-      "access socket failed with %r\n", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  //
-  // force protocol layer to detach the PCB
-  //
-  Status = Sock->ProtoHandler (Sock, SOCK_DETACH, NULL);
-
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockDestroyChild: Protocol detach socket"
-      " failed with %r\n", Status));
-
-    Sock->InDestroy = FALSE;
-  } else if (SOCK_IS_CONFIGURED (Sock)) {
-
-    SockConnFlush (Sock);
-    SockSetState (Sock, SO_CLOSED);
-
-    Sock->ConfigureState = SO_UNCONFIGURED;
-  }
-
-  EfiReleaseLock (&(Sock->Lock));
-
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  SockDestroy (Sock);
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Create a socket and its associated protocol control block
-  with the intial data SockInitData and protocol specific
-  data ProtoData.
-
-  @param  SockInitData         Inital data to setting the socket.
-
-  @return Pointer to the newly created socket. If NULL, error condition occured.
-
-**/
-SOCKET *
-SockCreateChild (
-  IN SOCK_INIT_DATA *SockInitData
-  )
-{
-  SOCKET      *Sock;
-  VOID        *SockProtocol;
-  EFI_STATUS  Status;
-
-  //
-  // create a new socket
-  //
-  Sock = SockCreate (SockInitData);
-  if (NULL == Sock) {
-
-    DEBUG ((EFI_D_ERROR, "SockCreateChild: No resource to "
-      "create a new socket\n"));
-
-    return NULL;
-  }
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockCreateChild: Get the lock to "
-      "access socket failed with %r\n", Status));
-
-    goto ERROR;
-  }
-  //
-  // inform the protocol layer to attach the socket
-  // with a new protocol control block
-  //
-  Status = Sock->ProtoHandler (Sock, SOCK_ATTACH, NULL);
-  EfiReleaseLock (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockCreateChild: Protocol failed to"
-      " attach a socket with %r\n", Status));
-
-    goto ERROR;
-  }
-
-  return Sock;
-
-ERROR:
-
-  if (Sock->DestroyCallback != NULL) {
-    Sock->DestroyCallback (Sock, Sock->Context);
-  }
-
-  gBS->OpenProtocol (
-         Sock->SockHandle,
-         &gEfiTcp4ProtocolGuid,
-         &SockProtocol,
-         Sock->DriverBinding,
-         Sock->SockHandle,
-         EFI_OPEN_PROTOCOL_GET_PROTOCOL
-         );
-  //
-  // Uninstall the protocol installed on this sock
-  //
-  gBS->UninstallMultipleProtocolInterfaces (
-        Sock->SockHandle,
-        &gEfiTcp4ProtocolGuid,
-        SockProtocol,
-        NULL
-        );
-   SockDestroy (Sock);
-   return NULL;
-}
-
-
-/**
-  Configure the specific socket Sock using configuration data ConfigData.
-
-  @param  Sock                 Pointer to the socket to be configured.
-  @param  ConfigData           Pointer to the configuration data.
-
-  @retval EFI_SUCCESS          The socket is configured successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket or the
-                               socket is already configured.
-
-**/
-EFI_STATUS
-SockConfigure (
-  IN SOCKET *Sock,
-  IN VOID   *ConfigData
-  )
-{
-  EFI_STATUS  Status;
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockConfigure: Get the access for "
-      "socket failed with %r", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (SOCK_IS_CONFIGURED (Sock)) {
-    Status = EFI_ACCESS_DENIED;
-    goto OnExit;
-  }
-
-  ASSERT (Sock->State == SO_CLOSED);
-
-  Status = Sock->ProtoHandler (Sock, SOCK_CONFIGURE, ConfigData);
-
-OnExit:
-  EfiReleaseLock (&(Sock->Lock));
-
-  return Status;
-}
-
-
-/**
-  Initiate a connection establishment process.
-
-  @param  Sock                 Pointer to the socket to initiate the initate the
-                               connection.
-  @param  Token                Pointer to the token used for the connection
-                               operation.
-
-  @retval EFI_SUCCESS          The connection is initialized successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not configured to
-                               be an active one, or the token is already in one of
-                               this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-
-**/
-EFI_STATUS
-SockConnect (
-  IN SOCKET *Sock,
-  IN VOID   *Token
-  )
-{
-  EFI_STATUS  Status;
-  EFI_EVENT   Event;
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockConnect: Get the access for "
-      "socket failed with %r", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (SOCK_IS_NO_MAPPING (Sock)) {
-    Status = EFI_NO_MAPPING;
-    goto OnExit;
-  }
-
-  if (SOCK_IS_UNCONFIGURED (Sock)) {
-
-    Status = EFI_NOT_STARTED;
-    goto OnExit;
-  }
-
-  if (!SOCK_IS_CLOSED (Sock) || !SOCK_IS_CONFIGURED_ACTIVE (Sock)) {
-
-    Status = EFI_ACCESS_DENIED;
-    goto OnExit;
-  }
-
-  Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;
-
-  if (SockTokenExisted (Sock, Event)) {
-
-    Status = EFI_ACCESS_DENIED;
-    goto OnExit;
-  }
-
-  Sock->ConnectionToken = (SOCK_COMPLETION_TOKEN *) Token;
-  SockSetState (Sock, SO_CONNECTING);
-  Status = Sock->ProtoHandler (Sock, SOCK_CONNECT, NULL);
-
-OnExit:
-  EfiReleaseLock (&(Sock->Lock));
-  return Status;
-}
-
-
-/**
-  Issue a listen token to get an existed connected network instance
-  or wait for a connection if there is none.
-
-  @param  Sock                 Pointer to the socket to accept connections.
-  @param  Token                The token to accept a connection.
-
-  @retval EFI_SUCCESS          Either a connection is accpeted or the Token is
-                               buffered for further acception.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not configured to
-                               be a passive one, or the token is already in one of
-                               this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-  @retval EFI_OUT_OF_RESOURCE  Failed to buffer the Token due to memory limit.
-
-**/
-EFI_STATUS
-SockAccept (
-  IN SOCKET *Sock,
-  IN VOID   *Token
-  )
-{
-  EFI_TCP4_LISTEN_TOKEN *ListenToken;
-  LIST_ENTRY            *ListEntry;
-  EFI_STATUS            Status;
-  SOCKET                *Socket;
-  EFI_EVENT             Event;
-
-  ASSERT (SockStream == Sock->Type);
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockAccept: Get the access for socket"
-      " failed with %r", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (SOCK_IS_NO_MAPPING (Sock)) {
-    Status = EFI_NO_MAPPING;
-    goto Exit;
-  }
-
-  if (SOCK_IS_UNCONFIGURED (Sock)) {
-
-    Status = EFI_NOT_STARTED;
-    goto Exit;
-  }
-
-  if (!SOCK_IS_LISTENING (Sock)) {
-
-    Status = EFI_ACCESS_DENIED;
-    goto Exit;
-  }
-
-  Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;
-
-  if (SockTokenExisted (Sock, Event)) {
-
-    Status = EFI_ACCESS_DENIED;
-    goto Exit;
-  }
-
-  ListenToken = (EFI_TCP4_LISTEN_TOKEN *) Token;
-
-  //
-  // Check if a connection has already in this Sock->ConnectionList
-  //
-  NET_LIST_FOR_EACH (ListEntry, &Sock->ConnectionList) {
-
-    Socket = NET_LIST_USER_STRUCT (ListEntry, SOCKET, ConnectionList);
-
-    if (SOCK_IS_CONNECTED (Socket)) {
-      ListenToken->NewChildHandle = Socket->SockHandle;
-      SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS);
-
-      RemoveEntryList (ListEntry);
-
-      ASSERT (Socket->Parent != NULL);
-
-      Socket->Parent->ConnCnt--;
-
-      DEBUG (
-        (EFI_D_NET,
-        "SockAccept: Accept a socket, now conncount is %d",
-        Socket->Parent->ConnCnt)
-        );
-      Socket->Parent = NULL;
-
-      goto Exit;
-    }
-  }
-
-  //
-  // Buffer this token for latter incoming connection request
-  //
-  if (NULL == SockBufferToken (Sock, &(Sock->ListenTokenList), Token, 0)) {
-
-    Status = EFI_OUT_OF_RESOURCES;
-  }
-
-Exit:
-  EfiReleaseLock (&(Sock->Lock));
-
-  return Status;
-}
-
-
-/**
-  Issue a token with data to the socket to send out.
-
-  @param  Sock                 Pointer to the socket to process the token with
-                               data.
-  @param  Token                The token with data that needs to send out.
-
-  @retval EFI_SUCCESS          The token is processed successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not in a
-                               synchronized state , or the token is already in one
-                               of this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-  @retval EFI_OUT_OF_RESOURCE  Failed to buffer the token due to memory limit.
-
-**/
-EFI_STATUS
-SockSend (
-  IN SOCKET *Sock,
-  IN VOID   *Token
-  )
-{
-  SOCK_IO_TOKEN           *SndToken;
-  EFI_EVENT               Event;
-  UINT32                  FreeSpace;
-  EFI_TCP4_TRANSMIT_DATA  *TxData;
-  EFI_STATUS              Status;
-  SOCK_TOKEN              *SockToken;
-  UINT32                  DataLen;
-
-  ASSERT (SockStream == Sock->Type);
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockSend: Get the access for socket"
-      " failed with %r", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (SOCK_IS_NO_MAPPING (Sock)) {
-    Status = EFI_NO_MAPPING;
-    goto Exit;
-  }
-
-  SndToken  = (SOCK_IO_TOKEN *) Token;
-  TxData    = (EFI_TCP4_TRANSMIT_DATA *) SndToken->Packet.TxData;
-
-  if (SOCK_IS_UNCONFIGURED (Sock)) {
-    Status = EFI_NOT_STARTED;
-    goto Exit;
-  }
-
-  if (!(SOCK_IS_CONNECTING (Sock) || SOCK_IS_CONNECTED (Sock))) {
-
-    Status = EFI_ACCESS_DENIED;
-    goto Exit;
-  }
-
-  //
-  // check if a token is already in the token buffer
-  //
-  Event = SndToken->Token.Event;
-
-  if (SockTokenExisted (Sock, Event)) {
-    Status = EFI_ACCESS_DENIED;
-    goto Exit;
-  }
-
-  DataLen = (UINT32) TxData->DataLength;
-
-  //
-  // process this sending token now or buffer it only?
-  //
-  FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF);
-
-  if ((FreeSpace < Sock->SndBuffer.LowWater) || !SOCK_IS_CONNECTED (Sock)) {
-
-    SockToken = SockBufferToken (
-                  Sock,
-                  &Sock->SndTokenList,
-                  SndToken,
-                  DataLen
-                  );
-
-    if (NULL == SockToken) {
-      Status = EFI_OUT_OF_RESOURCES;
-    }
-  } else {
-
-    SockToken = SockBufferToken (
-                  Sock,
-                  &Sock->ProcessingSndTokenList,
-                  SndToken,
-                  DataLen
-                  );
-
-    if (NULL == SockToken) {
-      DEBUG ((EFI_D_ERROR, "SockSend: Failed to buffer IO token into"
-        " socket processing SndToken List\n", Status));
-
-      Status = EFI_OUT_OF_RESOURCES;
-      goto Exit;
-    }
-
-    Status = SockProcessTcpSndData (Sock, TxData);
-
-    if (EFI_ERROR (Status)) {
-      DEBUG ((EFI_D_ERROR, "SockSend: Failed to process "
-        "Snd Data\n", Status));
-
-      RemoveEntryList (&(SockToken->TokenList));
-      FreePool (SockToken);
-    }
-  }
-
-Exit:
-  EfiReleaseLock (&(Sock->Lock));
-  return Status;
-}
-
-
-/**
-  Issue a token to get data from the socket.
-
-  @param  Sock                 Pointer to the socket to get data from.
-  @param  Token                The token to store the received data from the
-                               socket.
-
-  @retval EFI_SUCCESS          The token is processed successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not in a
-                               synchronized state , or the token is already in one
-                               of this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-  @retval EFI_CONNECTION_FIN   The connection is closed and there is no more data.
-  @retval EFI_OUT_OF_RESOURCE  Failed to buffer the token due to memory limit.
-
-**/
-EFI_STATUS
-SockRcv (
-  IN SOCKET *Sock,
-  IN VOID   *Token
-  )
-{
-  SOCK_IO_TOKEN *RcvToken;
-  UINT32        RcvdBytes;
-  EFI_STATUS    Status;
-  EFI_EVENT     Event;
-
-  ASSERT (SockStream == Sock->Type);
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockRcv: Get the access for socket"
-      " failed with %r", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (SOCK_IS_NO_MAPPING (Sock)) {
-
-    Status = EFI_NO_MAPPING;
-    goto Exit;
-  }
-
-  if (SOCK_IS_UNCONFIGURED (Sock)) {
-
-    Status = EFI_NOT_STARTED;
-    goto Exit;
-  }
-
-  if (!(SOCK_IS_CONNECTED (Sock) || SOCK_IS_CONNECTING (Sock))) {
-
-    Status = EFI_ACCESS_DENIED;
-    goto Exit;
-  }
-
-  RcvToken = (SOCK_IO_TOKEN *) Token;
-
-  //
-  // check if a token is already in the token buffer of this socket
-  //
-  Event = RcvToken->Token.Event;
-  if (SockTokenExisted (Sock, Event)) {
-    Status = EFI_ACCESS_DENIED;
-    goto Exit;
-  }
-
-  RcvToken  = (SOCK_IO_TOKEN *) Token;
-  RcvdBytes = GET_RCV_DATASIZE (Sock);
-
-  //
-  // check whether an error has happened before
-  //
-  if (EFI_ABORTED != Sock->SockError) {
-
-    SIGNAL_TOKEN (&(RcvToken->Token), Sock->SockError);
-    Sock->SockError = EFI_ABORTED;
-    goto Exit;
-  }
-
-  //
-  // check whether can not receive and there is no any
-  // data buffered in Sock->RcvBuffer
-  //
-  if (SOCK_IS_NO_MORE_DATA (Sock) && (0 == RcvdBytes)) {
-
-    Status = EFI_CONNECTION_FIN;
-    goto Exit;
-  }
-
-  if (RcvdBytes != 0) {
-    SockProcessRcvToken (Sock, RcvToken);
-
-    Status = Sock->ProtoHandler (Sock, SOCK_CONSUMED, NULL);
-  } else {
-
-    if (NULL == SockBufferToken (Sock, &Sock->RcvTokenList, RcvToken, 0)) {
-      Status = EFI_OUT_OF_RESOURCES;
-    }
-  }
-
-Exit:
-  EfiReleaseLock (&(Sock->Lock));
-  return Status;
-}
-
-
-/**
-  Reset the socket and its associated protocol control block.
-
-  @param  Sock                 Pointer to the socket to be flushed.
-
-  @retval EFI_SUCCESS          The socket is flushed successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
-
-**/
-EFI_STATUS
-SockFlush (
-  IN SOCKET *Sock
-  )
-{
-  EFI_STATUS  Status;
-
-  ASSERT (SockStream == Sock->Type);
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockFlush: Get the access for socket"
-      " failed with %r", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (!SOCK_IS_CONFIGURED (Sock)) {
-    goto Exit;
-  }
-
-  Status = Sock->ProtoHandler (Sock, SOCK_FLUSH, NULL);
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "SockFlush: Protocol failed handling"
-      " SOCK_FLUSH with %r", Status));
-
-    goto Exit;
-  }
-
-  SOCK_ERROR (Sock, EFI_ABORTED);
-  SockConnFlush (Sock);
-  SockSetState (Sock, SO_CLOSED);
-
-  Sock->ConfigureState = SO_UNCONFIGURED;
-
-Exit:
-  EfiReleaseLock (&(Sock->Lock));
-  return Status;
-}
-
-
-/**
-  Close or abort the socket associated connection.
-
-  @param  Sock                 Pointer to the socket of the connection to close or
-                               abort.
-  @param  Token                The token for close operation.
-  @param  OnAbort              TRUE for aborting the connection, FALSE to close it.
-
-  @retval EFI_SUCCESS          The close or abort operation is initialized
-                               successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not in a
-                               synchronized state , or the token is already in one
-                               of this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-
-**/
-EFI_STATUS
-SockClose (
-  IN SOCKET  *Sock,
-  IN VOID    *Token,
-  IN BOOLEAN OnAbort
-  )
-{
-  EFI_STATUS  Status;
-  EFI_EVENT   Event;
-
-  ASSERT (SockStream == Sock->Type);
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-    DEBUG ((EFI_D_ERROR, "SockClose: Get the access for socket"
-      " failed with %r", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (SOCK_IS_NO_MAPPING (Sock)) {
-    Status = EFI_NO_MAPPING;
-    goto Exit;
-  }
-
-  if (SOCK_IS_UNCONFIGURED (Sock)) {
-    Status = EFI_NOT_STARTED;
-    goto Exit;
-  }
-
-  if (SOCK_IS_DISCONNECTING (Sock)) {
-    Status = EFI_ACCESS_DENIED;
-    goto Exit;
-  }
-
-  Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;
-
-  if (SockTokenExisted (Sock, Event)) {
-    Status = EFI_ACCESS_DENIED;
-    goto Exit;
-  }
-
-  Sock->CloseToken = Token;
-  SockSetState (Sock, SO_DISCONNECTING);
-
-  if (OnAbort) {
-    Status = Sock->ProtoHandler (Sock, SOCK_ABORT, NULL);
-  } else {
-    Status = Sock->ProtoHandler (Sock, SOCK_CLOSE, NULL);
-  }
-
-Exit:
-  EfiReleaseLock (&(Sock->Lock));
-  return Status;
-}
-
-
-/**
-  Get the mode data of the low layer protocol.
-
-  @param  Sock                 Pointer to the socket to get mode data from.
-  @param  Mode                 Pointer to the data to store the low layer mode
-                               information.
-
-  @retval EFI_SUCCESS          The mode data is got successfully.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-
-**/
-EFI_STATUS
-SockGetMode (
-  IN     SOCKET *Sock,
-  IN OUT VOID   *Mode
-  )
-{
-  return Sock->ProtoHandler (Sock, SOCK_MODE, Mode);
-}
-
-
-
-
-
-/**
-  Add or remove route information in IP route table associated
-  with this socket.
-
-  @param  Sock                 Pointer to the socket associated with the IP route
-                               table to operate on.
-  @param  RouteInfo            Pointer to the route information to be processed.
-
-  @retval EFI_SUCCESS          The route table is updated successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is  not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-
-**/
-EFI_STATUS
-SockRoute (
-  IN SOCKET    *Sock,
-  IN VOID      *RouteInfo
-  )
-{
-  EFI_STATUS  Status;
-
-  Status = EfiAcquireLockOrFail (&(Sock->Lock));
-  if (EFI_ERROR (Status)) {
-    DEBUG ((EFI_D_ERROR, "SockRoute: Get the access for socket"
-      " failed with %r", Status));
-
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (SOCK_IS_NO_MAPPING (Sock)) {
-    Status = EFI_NO_MAPPING;
-    goto Exit;
-  }
-
-  if (SOCK_IS_UNCONFIGURED (Sock)) {
-    Status = EFI_NOT_STARTED;
-    goto Exit;
-  }
-
-  Status = Sock->ProtoHandler (Sock, SOCK_ROUTE, RouteInfo);
-
-Exit:
-  EfiReleaseLock (&(Sock->Lock));
-  return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c
deleted file mode 100644
index a0f97d603171..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c
+++ /dev/null
@@ -1,717 +0,0 @@
-/** @file
-  Tcp request dispatcher implementation.
-
-(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-#define TCP_COMP_VAL(Min, Max, Default, Val) \
-  ((((Val) <= (Max)) && ((Val) >= (Min))) ? (Val) : (Default))
-
-/**
-  Add or remove a route entry in the IP route table associated with this TCP instance.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-  @param  RouteInfo             Pointer to the route info to be processed.
-
-  @retval EFI_SUCCESS           The operation completed successfully.
-  @retval EFI_NOT_STARTED       The driver instance has not been started.
-  @retval EFI_NO_MAPPING        When using the default address, configuration(DHCP,
-                                BOOTP, RARP, etc.) is not finished yet.
-  @retval EFI_OUT_OF_RESOURCES  Could not add the entry to the routing table.
-  @retval EFI_NOT_FOUND         This route is not in the routing table
-                                (when RouteInfo->DeleteRoute is TRUE).
-  @retval EFI_ACCESS_DENIED     The route is already defined in the routing table
-                                (when RouteInfo->DeleteRoute is FALSE).
-**/
-EFI_STATUS
-Tcp4Route (
-  IN TCP_CB           *Tcb,
-  IN TCP4_ROUTE_INFO  *RouteInfo
-  )
-{
-  EFI_IP4_PROTOCOL  *Ip4;
-
-  Ip4 = Tcb->IpInfo->Ip.Ip4;
-
-  ASSERT (Ip4 != NULL);
-
-  return Ip4->Routes (
-              Ip4,
-              RouteInfo->DeleteRoute,
-              RouteInfo->SubnetAddress,
-              RouteInfo->SubnetMask,
-              RouteInfo->GatewayAddress
-              );
-
-}
-
-
-/**
-  Get the operational settings of this TCP instance.
-
-  @param  Tcb                    Pointer to the TCP_CB of this TCP instance.
-  @param  Mode                   Pointer to the buffer to store the operational
-                                 settings.
-
-  @retval EFI_SUCCESS            The mode data is read.
-  @retval EFI_NOT_STARTED        No configuration data is available because this
-                                 instance hasn't been started.
-
-**/
-EFI_STATUS
-Tcp4GetMode (
-  IN     TCP_CB         *Tcb,
-  IN OUT TCP4_MODE_DATA *Mode
-  )
-{
-  SOCKET                *Sock;
-  EFI_TCP4_CONFIG_DATA  *ConfigData;
-  EFI_TCP4_ACCESS_POINT *AccessPoint;
-  EFI_TCP4_OPTION       *Option;
-  EFI_IP4_PROTOCOL      *Ip;
-
-  Sock = Tcb->Sk;
-
-  if (!SOCK_IS_CONFIGURED (Sock) && (Mode->Tcp4ConfigData != NULL)) {
-    return EFI_NOT_STARTED;
-  }
-
-  if (Mode->Tcp4State != NULL) {
-    *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State;
-  }
-
-  if (Mode->Tcp4ConfigData != NULL) {
-
-    ConfigData                      = Mode->Tcp4ConfigData;
-    AccessPoint                     = &(ConfigData->AccessPoint);
-    Option                          = ConfigData->ControlOption;
-
-    ConfigData->TypeOfService       = Tcb->Tos;
-    ConfigData->TimeToLive          = Tcb->Ttl;
-
-    AccessPoint->UseDefaultAddress  = Tcb->UseDefaultAddr;
-
-    IP4_COPY_ADDRESS (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip);
-    IP4_COPY_ADDRESS (&AccessPoint->SubnetMask, &Tcb->SubnetMask);
-    AccessPoint->StationPort        = NTOHS (Tcb->LocalEnd.Port);
-
-    IP4_COPY_ADDRESS (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip);
-    AccessPoint->RemotePort         = NTOHS (Tcb->RemoteEnd.Port);
-    AccessPoint->ActiveFlag         = (BOOLEAN) (Tcb->State != TCP_LISTEN);
-
-    if (Option != NULL) {
-      Option->ReceiveBufferSize       = GET_RCV_BUFFSIZE (Tcb->Sk);
-      Option->SendBufferSize          = GET_SND_BUFFSIZE (Tcb->Sk);
-      Option->MaxSynBackLog           = GET_BACKLOG (Tcb->Sk);
-
-      Option->ConnectionTimeout       = Tcb->ConnectTimeout / TCP_TICK_HZ;
-      Option->DataRetries             = Tcb->MaxRexmit;
-      Option->FinTimeout              = Tcb->FinWait2Timeout / TCP_TICK_HZ;
-      Option->TimeWaitTimeout         = Tcb->TimeWaitTimeout / TCP_TICK_HZ;
-      Option->KeepAliveProbes         = Tcb->MaxKeepAlive;
-      Option->KeepAliveTime           = Tcb->KeepAliveIdle / TCP_TICK_HZ;
-      Option->KeepAliveInterval       = Tcb->KeepAlivePeriod / TCP_TICK_HZ;
-
-      Option->EnableNagle         = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE));
-      Option->EnableTimeStamp     = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS));
-      Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS));
-
-      Option->EnableSelectiveAck      = FALSE;
-      Option->EnablePathMtuDiscovery  = FALSE;
-    }
-  }
-
-  Ip = Tcb->IpInfo->Ip.Ip4;
-  ASSERT (Ip != NULL);
-
-  return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode->MnpConfigData, Mode->SnpModeData);
-}
-
-
-/**
-  If AP->StationPort isn't zero, check whether the access point
-  is registered, else generate a random station port for this
-  access point.
-
-  @param  AP                     Pointer to the access point.
-
-  @retval EFI_SUCCESS            The check is passed or the port is assigned.
-  @retval EFI_INVALID_PARAMETER  The non-zero station port is already used.
-  @retval EFI_OUT_OF_RESOURCES   No port can be allocated.
-
-**/
-EFI_STATUS
-Tcp4Bind (
-  IN EFI_TCP4_ACCESS_POINT *AP
-  )
-{
-  BOOLEAN Cycle;
-
-  if (0 != AP->StationPort) {
-    //
-    // check if a same endpoint is bound
-    //
-    if (TcpFindTcbByPeer (&AP->StationAddress, AP->StationPort)) {
-
-      return EFI_INVALID_PARAMETER;
-    }
-  } else {
-    //
-    // generate a random port
-    //
-    Cycle = FALSE;
-
-    if (TCP4_PORT_USER_RESERVED == mTcp4RandomPort) {
-      mTcp4RandomPort = TCP4_PORT_KNOWN;
-    }
-
-    mTcp4RandomPort++;
-
-    while (TcpFindTcbByPeer (&AP->StationAddress, mTcp4RandomPort)) {
-
-      mTcp4RandomPort++;
-
-      if (mTcp4RandomPort <= TCP4_PORT_KNOWN) {
-
-        if (Cycle) {
-          DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated "
-            "for this pcb\n"));
-
-          return EFI_OUT_OF_RESOURCES;
-        }
-
-        mTcp4RandomPort = TCP4_PORT_KNOWN + 1;
-
-        Cycle = TRUE;
-      }
-
-    }
-
-    AP->StationPort = mTcp4RandomPort;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Flush the Tcb add its associated protocols.
-
-  @param  Tcb                    Pointer to the TCP_CB to be flushed.
-
-**/
-VOID
-Tcp4FlushPcb (
-  IN TCP_CB *Tcb
-  )
-{
-  SOCKET           *Sock;
-
-  IpIoConfigIp (Tcb->IpInfo, NULL);
-
-  Sock     = Tcb->Sk;
-
-  if (SOCK_IS_CONFIGURED (Sock)) {
-    RemoveEntryList (&Tcb->List);
-
-    //
-    // Uninstall the device path protocol.
-    //
-    if (Sock->DevicePath != NULL) {
-      gBS->UninstallProtocolInterface (
-             Sock->SockHandle,
-             &gEfiDevicePathProtocolGuid,
-             Sock->DevicePath
-             );
-      FreePool (Sock->DevicePath);
-    }
-  }
-
-  NetbufFreeList (&Tcb->SndQue);
-  NetbufFreeList (&Tcb->RcvQue);
-  Tcb->State = TCP_CLOSED;
-}
-
-/**
-  Attach a Pcb to the socket.
-
-  @param  Sk                     Pointer to the socket of this TCP instance.
-
-  @retval EFI_SUCCESS            The operation is completed successfully.
-  @retval EFI_OUT_OF_RESOURCES   Failed due to resource limit.
-
-**/
-EFI_STATUS
-Tcp4AttachPcb (
-  IN SOCKET  *Sk
-  )
-{
-  TCP_CB            *Tcb;
-  TCP4_PROTO_DATA   *ProtoData;
-  IP_IO             *IpIo;
-  EFI_STATUS        Status;
-  VOID              *Ip;
-
-  Tcb = AllocateZeroPool (sizeof (TCP_CB));
-
-  if (Tcb == NULL) {
-
-    DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a TCB\n"));
-
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  ProtoData  = (TCP4_PROTO_DATA *) Sk->ProtoReserved;
-  IpIo       = ProtoData->TcpService->IpIo;
-
-  //
-  // Create an IpInfo for this Tcb.
-  //
-  Tcb->IpInfo = IpIoAddIp (IpIo);
-  if (Tcb->IpInfo == NULL) {
-
-    FreePool (Tcb);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  //
-  // Open the new created IP instance BY_CHILD.
-  //
-  Status = gBS->OpenProtocol (
-                  Tcb->IpInfo->ChildHandle,
-                  &gEfiIp4ProtocolGuid,
-                  &Ip,
-                  IpIo->Image,
-                  Sk->SockHandle,
-                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
-                  );
-  if (EFI_ERROR (Status)) {
-    IpIoRemoveIp (IpIo, Tcb->IpInfo);
-    return Status;
-  }
-
-  InitializeListHead (&Tcb->List);
-  InitializeListHead (&Tcb->SndQue);
-  InitializeListHead (&Tcb->RcvQue);
-
-  Tcb->State        = TCP_CLOSED;
-  Tcb->Sk           = Sk;
-  ProtoData->TcpPcb = Tcb;
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Detach the Pcb of the socket.
-
-  @param  Sk                     Pointer to the socket of this TCP instance.
-
-**/
-VOID
-Tcp4DetachPcb (
-  IN SOCKET  *Sk
-  )
-{
-  TCP4_PROTO_DATA  *ProtoData;
-  TCP_CB           *Tcb;
-
-  ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved;
-  Tcb       = ProtoData->TcpPcb;
-
-  ASSERT (Tcb != NULL);
-
-  Tcp4FlushPcb (Tcb);
-
-  IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo);
-
-  FreePool (Tcb);
-
-  ProtoData->TcpPcb = NULL;
-}
-
-
-/**
-  Configure the Pcb using CfgData.
-
-  @param  Sk                     Pointer to the socket of this TCP instance.
-  @param  CfgData                Pointer to the TCP configuration data.
-
-  @retval EFI_SUCCESS            The operation is completed successfully.
-  @retval EFI_INVALID_PARAMETER  A same access point has been configured in
-                                 another TCP instance.
-  @retval EFI_OUT_OF_RESOURCES   Failed due to resource limit.
-
-**/
-EFI_STATUS
-Tcp4ConfigurePcb (
-  IN SOCKET               *Sk,
-  IN EFI_TCP4_CONFIG_DATA *CfgData
-  )
-{
-  EFI_IP4_CONFIG_DATA IpCfgData;
-  EFI_STATUS          Status;
-  EFI_TCP4_OPTION     *Option;
-  TCP4_PROTO_DATA     *TcpProto;
-  TCP_CB              *Tcb;
-
-  ASSERT ((CfgData != NULL) && (Sk != NULL) && (Sk->SockHandle != NULL));
-
-  TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved;
-  Tcb      = TcpProto->TcpPcb;
-
-  ASSERT (Tcb != NULL);
-
-  //
-  // Add Ip for send pkt to the peer
-  //
-  CopyMem (&IpCfgData, &mIp4IoDefaultIpConfigData, sizeof (IpCfgData));
-  IpCfgData.DefaultProtocol   = EFI_IP_PROTO_TCP;
-  IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress;
-  IpCfgData.StationAddress    = CfgData->AccessPoint.StationAddress;
-  IpCfgData.SubnetMask        = CfgData->AccessPoint.SubnetMask;
-  IpCfgData.ReceiveTimeout    = (UINT32) (-1);
-
-  //
-  // Configure the IP instance this Tcb consumes.
-  //
-  Status = IpIoConfigIp (Tcb->IpInfo, &IpCfgData);
-  if (EFI_ERROR (Status)) {
-    goto OnExit;
-  }
-
-  //
-  // Get the default address info if the instance is configured to use default address.
-  //
-  if (CfgData->AccessPoint.UseDefaultAddress) {
-    CfgData->AccessPoint.StationAddress = IpCfgData.StationAddress;
-    CfgData->AccessPoint.SubnetMask     = IpCfgData.SubnetMask;
-  }
-
-  //
-  // check if we can bind this endpoint in CfgData
-  //
-  Status = Tcp4Bind (&(CfgData->AccessPoint));
-
-  if (EFI_ERROR (Status)) {
-    DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed "
-      "with %r\n", Status));
-
-    goto OnExit;
-  }
-
-  //
-  // Initalize the operating information in this Tcb
-  //
-  ASSERT (Tcb->State == TCP_CLOSED &&
-    IsListEmpty (&Tcb->SndQue) &&
-    IsListEmpty (&Tcb->RcvQue));
-
-  TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE);
-  Tcb->State            = TCP_CLOSED;
-
-  Tcb->SndMss           = 536;
-  Tcb->RcvMss           = TcpGetRcvMss (Sk);
-
-  Tcb->SRtt             = 0;
-  Tcb->Rto              = 3 * TCP_TICK_HZ;
-
-  Tcb->CWnd             = Tcb->SndMss;
-  Tcb->Ssthresh         = 0xffffffff;
-
-  Tcb->CongestState     = TCP_CONGEST_OPEN;
-
-  Tcb->KeepAliveIdle    = TCP_KEEPALIVE_IDLE_MIN;
-  Tcb->KeepAlivePeriod  = TCP_KEEPALIVE_PERIOD;
-  Tcb->MaxKeepAlive     = TCP_MAX_KEEPALIVE;
-  Tcb->MaxRexmit        = TCP_MAX_LOSS;
-  Tcb->FinWait2Timeout  = TCP_FIN_WAIT2_TIME;
-  Tcb->TimeWaitTimeout  = TCP_TIME_WAIT_TIME;
-  Tcb->ConnectTimeout   = TCP_CONNECT_TIME;
-
-  //
-  // initialize Tcb in the light of CfgData
-  //
-  Tcb->Ttl            = CfgData->TimeToLive;
-  Tcb->Tos            = CfgData->TypeOfService;
-
-  Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress;
-
-  CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR));
-  Tcb->LocalEnd.Port  = HTONS (CfgData->AccessPoint.StationPort);
-  IP4_COPY_ADDRESS (&Tcb->SubnetMask, &CfgData->AccessPoint.SubnetMask);
-
-  if (CfgData->AccessPoint.ActiveFlag) {
-    CopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));
-    Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort);
-  } else {
-    Tcb->RemoteEnd.Ip   = 0;
-    Tcb->RemoteEnd.Port = 0;
-  }
-
-  Option              = CfgData->ControlOption;
-
-  if (Option != NULL) {
-    SET_RCV_BUFFSIZE (
-      Sk,
-      (UINT32) (TCP_COMP_VAL (
-                  TCP_RCV_BUF_SIZE_MIN,
-                  TCP_RCV_BUF_SIZE,
-                  TCP_RCV_BUF_SIZE,
-                  Option->ReceiveBufferSize
-                  )
-               )
-      );
-    SET_SND_BUFFSIZE (
-      Sk,
-      (UINT32) (TCP_COMP_VAL (
-                  TCP_SND_BUF_SIZE_MIN,
-                  TCP_SND_BUF_SIZE,
-                  TCP_SND_BUF_SIZE,
-                  Option->SendBufferSize
-                  )
-               )
-      );
-
-    SET_BACKLOG (
-      Sk,
-      (UINT32) (TCP_COMP_VAL (
-                  TCP_BACKLOG_MIN,
-                  TCP_BACKLOG,
-                  TCP_BACKLOG,
-                  Option->MaxSynBackLog
-                  )
-               )
-      );
-
-    Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL (
-                                TCP_MAX_LOSS_MIN,
-                                TCP_MAX_LOSS,
-                                TCP_MAX_LOSS,
-                                Option->DataRetries
-                                );
-    Tcb->FinWait2Timeout = TCP_COMP_VAL (
-                              TCP_FIN_WAIT2_TIME,
-                              TCP_FIN_WAIT2_TIME_MAX,
-                              TCP_FIN_WAIT2_TIME,
-                              (UINT32) (Option->FinTimeout * TCP_TICK_HZ)
-                              );
-
-    if (Option->TimeWaitTimeout != 0) {
-      Tcb->TimeWaitTimeout = TCP_COMP_VAL (
-                               TCP_TIME_WAIT_TIME,
-                               TCP_TIME_WAIT_TIME_MAX,
-                               TCP_TIME_WAIT_TIME,
-                               (UINT32) (Option->TimeWaitTimeout * TCP_TICK_HZ)
-                               );
-    } else {
-      Tcb->TimeWaitTimeout = 0;
-    }
-
-    if (Option->KeepAliveProbes != 0) {
-      TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE);
-
-      Tcb->MaxKeepAlive = (UINT8) TCP_COMP_VAL (
-                                    TCP_MAX_KEEPALIVE_MIN,
-                                    TCP_MAX_KEEPALIVE,
-                                    TCP_MAX_KEEPALIVE,
-                                    Option->KeepAliveProbes
-                                    );
-      Tcb->KeepAliveIdle = TCP_COMP_VAL (
-                             TCP_KEEPALIVE_IDLE_MIN,
-                             TCP_KEEPALIVE_IDLE_MAX,
-                             TCP_KEEPALIVE_IDLE_MIN,
-                             (UINT32) (Option->KeepAliveTime * TCP_TICK_HZ)
-                             );
-      Tcb->KeepAlivePeriod = TCP_COMP_VAL (
-                               TCP_KEEPALIVE_PERIOD_MIN,
-                               TCP_KEEPALIVE_PERIOD,
-                               TCP_KEEPALIVE_PERIOD,
-                               (UINT32) (Option->KeepAliveInterval * TCP_TICK_HZ)
-                               );
-    }
-
-    Tcb->ConnectTimeout = TCP_COMP_VAL (
-                            TCP_CONNECT_TIME_MIN,
-                            TCP_CONNECT_TIME,
-                            TCP_CONNECT_TIME,
-                            (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ)
-                            );
-
-    if (!Option->EnableNagle) {
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE);
-    }
-
-    if (!Option->EnableTimeStamp) {
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_TS);
-    }
-
-    if (!Option->EnableWindowScaling) {
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_WS);
-    }
-  }
-
-  //
-  // The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is
-  // determined, construct the IP device path and install it.
-  //
-  Status = TcpInstallDevicePath (Sk);
-  if (EFI_ERROR (Status)) {
-    goto OnExit;
-  }
-
-  //
-  // update state of Tcb and socket
-  //
-  if (!CfgData->AccessPoint.ActiveFlag) {
-
-    TcpSetState (Tcb, TCP_LISTEN);
-    SockSetState (Sk, SO_LISTENING);
-
-    Sk->ConfigureState = SO_CONFIGURED_PASSIVE;
-  } else {
-
-    Sk->ConfigureState = SO_CONFIGURED_ACTIVE;
-  }
-
-  TcpInsertTcb (Tcb);
-
-OnExit:
-
-  return Status;
-}
-
-
-/**
-  The procotol handler provided to the socket layer, used to
-  dispatch the socket level requests by calling the corresponding
-  TCP layer functions.
-
-  @param  Sock                   Pointer to the socket of this TCP instance.
-  @param  Request                The code of this operation request.
-  @param  Data                   Pointer to the operation specific data passed in
-                                 together with the operation request.
-
-  @retval EFI_SUCCESS            The socket request is completed successfully.
-  @retval other                  The error status returned by the corresponding TCP
-                                 layer function.
-
-**/
-EFI_STATUS
-Tcp4Dispatcher (
-  IN SOCKET                  *Sock,
-  IN UINT8                   Request,
-  IN VOID                    *Data    OPTIONAL
-  )
-{
-  TCP_CB            *Tcb;
-  TCP4_PROTO_DATA   *ProtoData;
-  EFI_IP4_PROTOCOL  *Ip;
-
-  ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
-  Tcb       = ProtoData->TcpPcb;
-
-  switch (Request) {
-  case SOCK_POLL:
-    Ip = ProtoData->TcpService->IpIo->Ip.Ip4;
-    Ip->Poll (Ip);
-    break;
-
-  case SOCK_CONSUMED:
-    //
-    // After user received data from socket buffer, socket will
-    // notify TCP using this message to give it a chance to send out
-    // window update information
-    //
-    ASSERT (Tcb != NULL);
-    TcpOnAppConsume (Tcb);
-    break;
-
-  case SOCK_SND:
-
-    ASSERT (Tcb != NULL);
-    TcpOnAppSend (Tcb);
-    break;
-
-  case SOCK_CLOSE:
-
-    TcpOnAppClose (Tcb);
-
-    break;
-
-  case SOCK_ABORT:
-
-    TcpOnAppAbort (Tcb);
-
-    break;
-
-  case SOCK_SNDPUSH:
-    Tcb->SndPsh = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk);
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH);
-
-    break;
-
-  case SOCK_SNDURG:
-    Tcb->SndUp = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk) - 1;
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG);
-
-    break;
-
-  case SOCK_CONNECT:
-
-    TcpOnAppConnect (Tcb);
-
-    break;
-
-  case SOCK_ATTACH:
-
-    return Tcp4AttachPcb (Sock);
-
-  case SOCK_FLUSH:
-
-    Tcp4FlushPcb (Tcb);
-
-    break;
-
-  case SOCK_DETACH:
-
-    Tcp4DetachPcb (Sock);
-
-    break;
-
-  case SOCK_CONFIGURE:
-
-    return Tcp4ConfigurePcb (
-            Sock,
-            (EFI_TCP4_CONFIG_DATA *) Data
-            );
-
-  case SOCK_MODE:
-
-    ASSERT ((Data != NULL) && (Tcb != NULL));
-
-    return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data);
-
-  case SOCK_ROUTE:
-
-    ASSERT ((Data != NULL) && (Tcb != NULL));
-
-    return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data);
-
-  default:
-    return EFI_UNSUPPORTED;
-  }
-
-  return EFI_SUCCESS;
-
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
deleted file mode 100644
index 2ff8eee8693b..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
+++ /dev/null
@@ -1,782 +0,0 @@
-/** @file
-  Tcp driver function.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-
-UINT16                                mTcp4RandomPort;
-extern EFI_COMPONENT_NAME_PROTOCOL    gTcp4ComponentName;
-extern EFI_COMPONENT_NAME2_PROTOCOL   gTcp4ComponentName2;
-extern EFI_UNICODE_STRING_TABLE       *gTcpControllerNameTable;
-
-TCP4_HEARTBEAT_TIMER  mTcp4Timer = {
-  NULL,
-  0
-};
-
-EFI_TCP4_PROTOCOL mTcp4ProtocolTemplate = {
-  Tcp4GetModeData,
-  Tcp4Configure,
-  Tcp4Routes,
-  Tcp4Connect,
-  Tcp4Accept,
-  Tcp4Transmit,
-  Tcp4Receive,
-  Tcp4Close,
-  Tcp4Cancel,
-  Tcp4Poll
-};
-
-SOCK_INIT_DATA mTcp4DefaultSockData = {
-  SockStream,
-  0,
-  NULL,
-  TCP_BACKLOG,
-  TCP_SND_BUF_SIZE,
-  TCP_RCV_BUF_SIZE,
-  &mTcp4ProtocolTemplate,
-  Tcp4CreateSocketCallback,
-  Tcp4DestroySocketCallback,
-  NULL,
-  NULL,
-  0,
-  Tcp4Dispatcher,
-  NULL,
-};
-
-EFI_DRIVER_BINDING_PROTOCOL mTcp4DriverBinding = {
-  Tcp4DriverBindingSupported,
-  Tcp4DriverBindingStart,
-  Tcp4DriverBindingStop,
-  0xa,
-  NULL,
-  NULL
-};
-
-EFI_SERVICE_BINDING_PROTOCOL mTcp4ServiceBinding = {
-  Tcp4ServiceBindingCreateChild,
-  Tcp4ServiceBindingDestroyChild
-};
-
-
-/**
-  Create and start the heartbeat timer for TCP driver.
-
-  @retval EFI_SUCCESS            The timer is successfully created and started.
-  @retval other                  The timer is not created.
-
-**/
-EFI_STATUS
-Tcp4CreateTimer (
-  VOID
-  )
-{
-  EFI_STATUS  Status;
-
-  Status = EFI_SUCCESS;
-
-  if (mTcp4Timer.RefCnt == 0) {
-
-    Status = gBS->CreateEvent (
-                    EVT_TIMER | EVT_NOTIFY_SIGNAL,
-                    TPL_NOTIFY,
-                    TcpTicking,
-                    NULL,
-                    &mTcp4Timer.TimerEvent
-                    );
-    if (!EFI_ERROR (Status)) {
-
-      Status = gBS->SetTimer (
-                      mTcp4Timer.TimerEvent,
-                      TimerPeriodic,
-                      (UINT64) (TICKS_PER_SECOND / TCP_TICK_HZ)
-                      );
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-
-    mTcp4Timer.RefCnt++;
-  }
-
-  return Status;
-}
-
-
-/**
-  Stop and destroy the heartbeat timer for TCP driver.
-
-**/
-VOID
-Tcp4DestroyTimer (
-  VOID
-  )
-{
-  ASSERT (mTcp4Timer.RefCnt > 0);
-
-  mTcp4Timer.RefCnt--;
-
-  if (mTcp4Timer.RefCnt > 0) {
-    return;
-  }
-
-  gBS->SetTimer (mTcp4Timer.TimerEvent, TimerCancel, 0);
-  gBS->CloseEvent (mTcp4Timer.TimerEvent);
-  mTcp4Timer.TimerEvent = NULL;
-}
-
-/**
-  Callback function which provided by user to remove one node in NetDestroyLinkList process.
-
-  @param[in]    Entry           The entry to be removed.
-  @param[in]    Context         Pointer to the callback context corresponds to the Context in NetDestroyLinkList.
-
-  @retval EFI_SUCCESS           The entry has been removed successfully.
-  @retval Others                Fail to remove the entry.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DestroyChildEntryInHandleBuffer (
-  IN LIST_ENTRY         *Entry,
-  IN VOID               *Context
-  )
-{
-  SOCKET                        *Sock;
-  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;
-  UINTN                         NumberOfChildren;
-  EFI_HANDLE                    *ChildHandleBuffer;
-
-  if (Entry == NULL || Context == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Sock = NET_LIST_USER_STRUCT_S (Entry, SOCKET, Link, SOCK_SIGNATURE);
-  ServiceBinding    = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding;
-  NumberOfChildren  = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren;
-  ChildHandleBuffer = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer;
-
-  if (!NetIsInHandleBuffer (Sock->SockHandle, NumberOfChildren, ChildHandleBuffer)) {
-    return EFI_SUCCESS;
-  }
-
-  return ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle);
-}
-
-/**
-  The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle.
-
-  @param  ImageHandle   The firmware allocated handle for this
-                        driver image.
-  @param  SystemTable   Pointer to the EFI system table.
-
-  @retval EFI_SUCCESS   Driver loaded.
-  @retval other         Driver not loaded.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverEntryPoint (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  EFI_STATUS  Status;
-  UINT32      Seed;
-
-  //
-  // Install the TCP4 Driver Binding Protocol
-  //
-  Status = EfiLibInstallDriverBindingComponentName2 (
-             ImageHandle,
-             SystemTable,
-             &mTcp4DriverBinding,
-             ImageHandle,
-             &gTcp4ComponentName,
-             &gTcp4ComponentName2
-             );
-  ASSERT_EFI_ERROR (Status);
-  //
-  // Initialize ISS and random port.
-  //
-  Seed            = NetRandomInitSeed ();
-  mTcpGlobalIss   = NET_RANDOM (Seed) % mTcpGlobalIss;
-  mTcp4RandomPort = (UINT16) (TCP4_PORT_KNOWN +
-                    (UINT16) (NET_RANDOM(Seed) % TCP4_PORT_KNOWN));
-
-  return Status;
-}
-
-
-/**
-  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  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param  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  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 access.
-  @retval EFI_UNSUPPORTED      The device specified by ControllerHandle and
-                               RemainingDevicePath is not supported by the driver
-                               specified by This.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  )
-{
-  EFI_STATUS  Status;
-
-  //
-  // Test for the Tcp4ServiceBinding Protocol
-  //
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiTcp4ServiceBindingProtocolGuid,
-                  NULL,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
-                  );
-  if (!EFI_ERROR (Status)) {
-    return EFI_ALREADY_STARTED;
-  }
-
-  //
-  // Test for the Ip4 Protocol
-  //
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiIp4ServiceBindingProtocolGuid,
-                  NULL,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
-                  );
-
-  return Status;
-}
-
-
-/**
-  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  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param  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  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_ALREADY_STARTED  The device could not be started due to a device error.
-  @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack
-                               of resources.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  )
-{
-  EFI_STATUS               Status;
-  TCP4_SERVICE_DATA        *TcpServiceData;
-  IP_IO_OPEN_DATA          OpenData;
-
-  TcpServiceData = AllocateZeroPool (sizeof (TCP4_SERVICE_DATA));
-
-  if (NULL == TcpServiceData) {
-    DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough"
-      " resource to create a Tcp Servcie Data\n"));
-
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  //
-  // Create a new IP IO to Consume it
-  //
-  TcpServiceData->IpIo = IpIoCreate (
-                           This->DriverBindingHandle,
-                           ControllerHandle,
-                           IP_VERSION_4
-                           );
-  if (NULL == TcpServiceData->IpIo) {
-
-    DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough"
-      " resource to create an Ip Io\n"));
-
-    Status = EFI_OUT_OF_RESOURCES;
-    goto ON_ERROR;
-  }
-
-  //
-  // Configure and start IpIo.
-  //
-  ZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA));
-
-  CopyMem (
-    &OpenData.IpConfigData.Ip4CfgData,
-    &mIp4IoDefaultIpConfigData,
-    sizeof (EFI_IP4_CONFIG_DATA)
-    );
-
-  OpenData.IpConfigData.Ip4CfgData.DefaultProtocol = EFI_IP_PROTO_TCP;
-
-  OpenData.PktRcvdNotify = Tcp4RxCallback;
-  Status                 = IpIoOpen (TcpServiceData->IpIo, &OpenData);
-
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  //
-  // Create the timer event used by TCP driver
-  //
-  Status = Tcp4CreateTimer ();
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Create TcpTimer"
-      " Event failed with %r\n", Status));
-
-    goto ON_ERROR;
-  }
-
-  //
-  // Install the Tcp4ServiceBinding Protocol on the
-  // controller handle
-  //
-  TcpServiceData->Tcp4ServiceBinding = mTcp4ServiceBinding;
-
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &ControllerHandle,
-                  &gEfiTcp4ServiceBindingProtocolGuid,
-                  &TcpServiceData->Tcp4ServiceBinding,
-                  NULL
-                  );
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Install Tcp4 Service Binding"
-      " Protocol failed for %r\n", Status));
-
-    Tcp4DestroyTimer ();
-    goto ON_ERROR;
-  }
-
-  //
-  // Initialize member in TcpServiceData
-  //
-  TcpServiceData->ControllerHandle    = ControllerHandle;
-  TcpServiceData->Signature           = TCP4_DRIVER_SIGNATURE;
-  TcpServiceData->DriverBindingHandle = This->DriverBindingHandle;
-
-  InitializeListHead (&TcpServiceData->SocketList);
-
-  return EFI_SUCCESS;
-
-ON_ERROR:
-
-  if (TcpServiceData->IpIo != NULL) {
-    IpIoDestroy (TcpServiceData->IpIo);
-    TcpServiceData->IpIo = NULL;
-  }
-
-  FreePool (TcpServiceData);
-
-  return Status;
-}
-
-
-/**
-  Stop this driver on ControllerHandle.
-
-  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  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param  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  NumberOfChildren  The number of child device handles in ChildHandleBuffer.
-  @param  ChildHandleBuffer An array of child handles to be freed. May be NULL if
-                            NumberOfChildren is 0.
-
-  @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
-Tcp4DriverBindingStop (
-  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN  EFI_HANDLE                   ControllerHandle,
-  IN  UINTN                        NumberOfChildren,
-  IN  EFI_HANDLE                   *ChildHandleBuffer
-  )
-{
-  EFI_STATUS                                Status;
-  EFI_HANDLE                                NicHandle;
-  EFI_SERVICE_BINDING_PROTOCOL              *ServiceBinding;
-  TCP4_SERVICE_DATA                         *TcpServiceData;
-  LIST_ENTRY                                *List;
-  TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT  Context;
-
-  // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed.
-  //
-  NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);
-  if (NicHandle == NULL) {
-    return EFI_SUCCESS;
-  }
-
-  //
-  // Retrieve the TCP driver Data Structure
-  //
-  Status = gBS->OpenProtocol (
-                  NicHandle,
-                  &gEfiTcp4ServiceBindingProtocolGuid,
-                  (VOID **) &ServiceBinding,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-
-    DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStop: Locate Tcp4 Service "
-      " Binding Protocol failed with %r\n", Status));
-
-    return EFI_DEVICE_ERROR;
-  }
-
-  TcpServiceData = TCP4_FROM_THIS (ServiceBinding);
-
-  if (NumberOfChildren != 0) {
-    List = &TcpServiceData->SocketList;
-    Context.ServiceBinding = ServiceBinding;
-    Context.NumberOfChildren = NumberOfChildren;
-    Context.ChildHandleBuffer = ChildHandleBuffer;
-    Status = NetDestroyLinkList (
-               List,
-               Tcp4DestroyChildEntryInHandleBuffer,
-               &Context,
-               NULL
-               );
-  } else if (IsListEmpty (&TcpServiceData->SocketList)) {
-    //
-    // Uninstall TCP servicebinding protocol
-    //
-    gBS->UninstallMultipleProtocolInterfaces (
-           NicHandle,
-           &gEfiTcp4ServiceBindingProtocolGuid,
-           ServiceBinding,
-           NULL
-           );
-
-    //
-    // Destroy the IpIO consumed by TCP driver
-    //
-    IpIoDestroy (TcpServiceData->IpIo);
-    TcpServiceData->IpIo = NULL;
-
-    //
-    // Destroy the heartbeat timer.
-    //
-    Tcp4DestroyTimer ();
-
-    if (gTcpControllerNameTable != NULL) {
-      FreeUnicodeStringTable (gTcpControllerNameTable);
-      gTcpControllerNameTable = NULL;
-    }
-
-    //
-    // Release the TCP service data
-    //
-    FreePool (TcpServiceData);
-
-    Status = EFI_SUCCESS;
-  }
-
-  return Status;
-}
-
-/**
-  Open Ip4 and device path protocols for a created socket, and insert it in
-  socket list.
-
-  @param  This                Pointer to the socket just created
-  @param  Context             Context of the socket
-
-  @retval EFI_SUCCESS         This protocol is installed successfully.
-  @retval other               Some error occured.
-
-**/
-EFI_STATUS
-Tcp4CreateSocketCallback (
-  IN SOCKET  *This,
-  IN VOID    *Context
-  )
-{
-  EFI_STATUS         Status;
-  TCP4_SERVICE_DATA  *TcpServiceData;
-  EFI_IP4_PROTOCOL   *Ip4;
-
-  TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;
-
-  //
-  // Open the default Ip4 protocol of IP_IO BY_DRIVER.
-  //
-  Status = gBS->OpenProtocol (
-                  TcpServiceData->IpIo->ChildHandle,
-                  &gEfiIp4ProtocolGuid,
-                  (VOID **) &Ip4,
-                  TcpServiceData->DriverBindingHandle,
-                  This->SockHandle,
-                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Open the device path on the handle where service binding resides on.
-  //
-  Status = gBS->OpenProtocol (
-                  TcpServiceData->ControllerHandle,
-                  &gEfiDevicePathProtocolGuid,
-                  (VOID **) &This->ParentDevicePath,
-                  TcpServiceData->DriverBindingHandle,
-                  This->SockHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    gBS->CloseProtocol (
-           TcpServiceData->IpIo->ChildHandle,
-           &gEfiIp4ProtocolGuid,
-           TcpServiceData->DriverBindingHandle,
-           This->SockHandle
-           );
-  } else {
-    //
-    // Insert this socket into the SocketList.
-    //
-    InsertTailList (&TcpServiceData->SocketList, &This->Link);
-  }
-
-  return Status;
-}
-
-/**
-  Close Ip4 and device path protocols for a socket, and remove it from socket list.
-
-  @param  This                Pointer to the socket to be removed
-  @param  Context             Context of the socket
-
-**/
-VOID
-Tcp4DestroySocketCallback (
-  IN SOCKET  *This,
-  IN VOID    *Context
-  )
-{
-  TCP4_SERVICE_DATA  *TcpServiceData;
-
-  TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;
-
-  //
-  // Remove this node from the list.
-  //
-  RemoveEntryList (&This->Link);
-
-  //
-  // Close the Ip4 protocol.
-  //
-  gBS->CloseProtocol (
-         TcpServiceData->IpIo->ChildHandle,
-         &gEfiIp4ProtocolGuid,
-         TcpServiceData->DriverBindingHandle,
-         This->SockHandle
-         );
-}
-
-/**
-  Creates a child handle and installs a protocol.
-
-  The CreateChild() function installs a protocol on ChildHandle. If ChildHandle
-  is a pointer to NULL, then a new handle is created and returned in ChildHandle.
-  If ChildHandle is not a pointer to NULL, then the protocol installs on the existing
-  ChildHandle.
-
-  @param  This        Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
-  @param  ChildHandle Pointer to the handle of the child to create. If it is NULL, then
-                      a new handle is created. If it is a pointer to an existing UEFI
-                      handle, then the protocol is added to the existing UEFI handle.
-
-  @retval EFI_SUCCES            The protocol was added to ChildHandle.
-  @retval EFI_INVALID_PARAMETER ChildHandle is NULL.
-  @retval EFI_OUT_OF_RESOURCES  There are not enough resources available to create
-                                the child.
-  @retval other                 The child handle was not created.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4ServiceBindingCreateChild (
-  IN     EFI_SERVICE_BINDING_PROTOCOL  *This,
-  IN OUT EFI_HANDLE                    *ChildHandle
-  )
-{
-  SOCKET            *Sock;
-  TCP4_SERVICE_DATA *TcpServiceData;
-  TCP4_PROTO_DATA   TcpProto;
-  EFI_STATUS        Status;
-  EFI_TPL           OldTpl;
-
-  if (NULL == This || NULL == ChildHandle) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  OldTpl              = gBS->RaiseTPL (TPL_CALLBACK);
-  Status              = EFI_SUCCESS;
-  TcpServiceData      = TCP4_FROM_THIS (This);
-  TcpProto.TcpService = TcpServiceData;
-  TcpProto.TcpPcb     = NULL;
-
-  //
-  // Create a tcp instance with defualt Tcp default
-  // sock init data and TcpProto
-  //
-  mTcp4DefaultSockData.ProtoData     = &TcpProto;
-  mTcp4DefaultSockData.DataSize      = sizeof (TCP4_PROTO_DATA);
-  mTcp4DefaultSockData.DriverBinding = TcpServiceData->DriverBindingHandle;
-
-  Sock = SockCreateChild (&mTcp4DefaultSockData);
-  if (NULL == Sock) {
-    DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingCreateChild: "
-      "No resource to create a Tcp Child\n"));
-
-    Status = EFI_OUT_OF_RESOURCES;
-  } else {
-    *ChildHandle = Sock->SockHandle;
-  }
-
-  mTcp4DefaultSockData.ProtoData = NULL;
-
-  gBS->RestoreTPL (OldTpl);
-  return Status;
-}
-
-
-/**
-  Destroys a child handle with a protocol installed on it.
-
-  The DestroyChild() function does the opposite of CreateChild(). It removes a protocol
-  that was installed by CreateChild() from ChildHandle. If the removed protocol is the
-  last protocol on ChildHandle, then ChildHandle is destroyed.
-
-  @param  This         Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
-  @param  ChildHandle  Handle of the child to destroy
-
-  @retval EFI_SUCCES            The protocol was removed from ChildHandle.
-  @retval EFI_UNSUPPORTED       ChildHandle does not support the protocol that is
-                                being removed.
-  @retval EFI_INVALID_PARAMETER Child handle is NULL.
-  @retval EFI_ACCESS_DENIED     The protocol could not be removed from the ChildHandle
-                                because its services are being used.
-  @retval other                 The child handle was not destroyed.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4ServiceBindingDestroyChild (
-  IN EFI_SERVICE_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                    ChildHandle
-  )
-{
-  EFI_STATUS         Status;
-  EFI_TCP4_PROTOCOL  *Tcp4;
-  SOCKET             *Sock;
-
-  if (NULL == This || NULL == ChildHandle) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // retrieve the Tcp4 protocol from ChildHandle
-  //
-  Status = gBS->OpenProtocol (
-                  ChildHandle,
-                  &gEfiTcp4ProtocolGuid,
-                  (VOID **) &Tcp4,
-                  mTcp4DriverBinding.DriverBindingHandle,
-                  ChildHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    Status = EFI_UNSUPPORTED;
-  } else {
-    //
-    // destroy this sock and related Tcp protocol control
-    // block
-    //
-    Sock = SOCK_FROM_THIS (Tcp4);
-
-    SockDestroyChild (Sock);
-  }
-
-  return Status;
-}
-
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c
deleted file mode 100644
index f48efdac7cd8..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c
+++ /dev/null
@@ -1,1497 +0,0 @@
-/** @file
-  TCP input process routines.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-
-/**
-  Check whether the sequence number of the incoming segment is acceptable.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Seg      Pointer to the incoming segment.
-
-  @retval 1       The sequence number is acceptable.
-  @retval 0       The sequence number is not acceptable.
-
-**/
-INTN
-TcpSeqAcceptable (
-  IN TCP_CB  *Tcb,
-  IN TCP_SEG *Seg
-  )
-{
-  return (TCP_SEQ_LEQ (Tcb->RcvNxt, Seg->End) &&
-          TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd));
-}
-
-
-/**
-  NewReno fast recovery, RFC3782.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Seg      Segment that triggers the fast recovery.
-
-**/
-VOID
-TcpFastRecover (
-  IN OUT TCP_CB  *Tcb,
-  IN     TCP_SEG *Seg
-  )
-{
-  UINT32  FlightSize;
-  UINT32  Acked;
-
-  //
-  // Step 1: Three duplicate ACKs and not in fast recovery
-  //
-  if (Tcb->CongestState != TCP_CONGEST_RECOVER) {
-
-    //
-    // Step 1A: Invoking fast retransmission.
-    //
-    FlightSize        = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
-
-    Tcb->Ssthresh     = MAX (FlightSize >> 1, (UINT32) (2 * Tcb->SndMss));
-    Tcb->Recover      = Tcb->SndNxt;
-
-    Tcb->CongestState = TCP_CONGEST_RECOVER;
-    TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
-
-    //
-    // Step 2: Entering fast retransmission
-    //
-    TcpRetransmit (Tcb, Tcb->SndUna);
-    Tcb->CWnd = Tcb->Ssthresh + 3 * Tcb->SndMss;
-
-    DEBUG ((EFI_D_NET, "TcpFastRecover: enter fast retransmission"
-      " for TCB %p, recover point is %d\n", Tcb, Tcb->Recover));
-    return;
-  }
-
-  //
-  // During fast recovery, execute Step 3, 4, 5 of RFC3782
-  //
-  if (Seg->Ack == Tcb->SndUna) {
-
-    //
-    // Step 3: Fast Recovery,
-    // If this is a duplicated ACK, increse Cwnd by SMSS.
-    //
-
-    // Step 4 is skipped here only to be executed later
-    // by TcpToSendData
-    //
-    Tcb->CWnd += Tcb->SndMss;
-    DEBUG ((EFI_D_NET, "TcpFastRecover: received another"
-      " duplicated ACK (%d) for TCB %p\n", Seg->Ack, Tcb));
-
-  } else {
-
-    //
-    // New data is ACKed, check whether it is a
-    // full ACK or partial ACK
-    //
-    if (TCP_SEQ_GEQ (Seg->Ack, Tcb->Recover)) {
-
-      //
-      // Step 5 - Full ACK:
-      // deflate the congestion window, and exit fast recovery
-      //
-      FlightSize        = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
-
-      Tcb->CWnd         = MIN (Tcb->Ssthresh, FlightSize + Tcb->SndMss);
-
-      Tcb->CongestState = TCP_CONGEST_OPEN;
-      DEBUG ((EFI_D_NET, "TcpFastRecover: received a full ACK(%d)"
-        " for TCB %p, exit fast recovery\n", Seg->Ack, Tcb));
-
-    } else {
-
-      //
-      // Step 5 - Partial ACK:
-      // fast retransmit the first unacknowledge field
-      // , then deflate the CWnd
-      //
-      TcpRetransmit (Tcb, Seg->Ack);
-      Acked = TCP_SUB_SEQ (Seg->Ack, Tcb->SndUna);
-
-      //
-      // Deflate the CWnd by the amount of new data
-      // ACKed by SEG.ACK. If more than one SMSS data
-      // is ACKed, add back SMSS byte to CWnd after
-      //
-      if (Acked >= Tcb->SndMss) {
-        Acked -= Tcb->SndMss;
-
-      }
-
-      Tcb->CWnd -= Acked;
-
-      DEBUG ((EFI_D_NET, "TcpFastRecover: received a partial"
-        " ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
-
-    }
-  }
-}
-
-
-/**
-  NewReno fast loss recovery, RFC3792.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Seg      Segment that triggers the fast loss recovery.
-
-**/
-VOID
-TcpFastLossRecover (
-  IN OUT TCP_CB  *Tcb,
-  IN     TCP_SEG *Seg
-  )
-{
-  if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
-
-    //
-    // New data is ACKed, check whether it is a
-    // full ACK or partial ACK
-    //
-    if (TCP_SEQ_GEQ (Seg->Ack, Tcb->LossRecover)) {
-
-      //
-      // Full ACK: exit the loss recovery.
-      //
-      Tcb->LossTimes    = 0;
-      Tcb->CongestState = TCP_CONGEST_OPEN;
-
-      DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a "
-        "full ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
-
-    } else {
-
-      //
-      // Partial ACK:
-      // fast retransmit the first unacknowledge field.
-      //
-      TcpRetransmit (Tcb, Seg->Ack);
-      DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a "
-        "partial ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
-    }
-  }
-}
-
-
-/**
-  Compute the RTT as specified in RFC2988.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Measure  Currently measured RTT in heart beats.
-
-**/
-VOID
-TcpComputeRtt (
-  IN OUT TCP_CB *Tcb,
-  IN     UINT32 Measure
-  )
-{
-  INT32 Var;
-
-  //
-  // Step 2.3: Compute the RTO for subsequent RTT measurement.
-  //
-  if (Tcb->SRtt != 0) {
-
-    Var = Tcb->SRtt - (Measure << TCP_RTT_SHIFT);
-
-    if (Var < 0) {
-      Var = -Var;
-    }
-
-    Tcb->RttVar = (3 * Tcb->RttVar + Var) >> 2;
-    Tcb->SRtt   = 7 * (Tcb->SRtt >> 3) + Measure;
-
-  } else {
-    //
-    // Step 2.2: compute the first RTT measure
-    //
-    Tcb->SRtt   = Measure << TCP_RTT_SHIFT;
-    Tcb->RttVar = Measure << (TCP_RTT_SHIFT - 1);
-  }
-
-  Tcb->Rto = (Tcb->SRtt + MAX (8, 4 * Tcb->RttVar)) >> TCP_RTT_SHIFT;
-
-  //
-  // Step 2.4: Limit the RTO to at least 1 second
-  // Step 2.5: Limit the RTO to a maxium value that
-  // is at least 60 second
-  //
-  if (Tcb->Rto < TCP_RTO_MIN) {
-    Tcb->Rto = TCP_RTO_MIN;
-
-  } else if (Tcb->Rto > TCP_RTO_MAX) {
-    Tcb->Rto = TCP_RTO_MAX;
-
-  }
-
-  DEBUG ((EFI_D_NET, "TcpComputeRtt: new RTT for TCB %p"
-    " computed SRTT: %d RTTVAR: %d RTO: %d\n",
-    Tcb, Tcb->SRtt, Tcb->RttVar, Tcb->Rto));
-
-}
-
-
-/**
-  Trim the data, SYN and FIN to fit into the window defined by Left and Right.
-
-  @param  Nbuf     Buffer that contains received TCP segment without IP header.
-  @param  Left     The sequence number of the window's left edge.
-  @param  Right    The sequence number of the window's right edge.
-
-**/
-VOID
-TcpTrimSegment (
-  IN NET_BUF   *Nbuf,
-  IN TCP_SEQNO Left,
-  IN TCP_SEQNO Right
-  )
-{
-  TCP_SEG   *Seg;
-  TCP_SEQNO Urg;
-  UINT32    Drop;
-
-  Seg = TCPSEG_NETBUF (Nbuf);
-
-  //
-  // If the segment is completely out of window,
-  // truncate every thing, include SYN and FIN.
-  //
-  if (TCP_SEQ_LEQ (Seg->End, Left) || TCP_SEQ_LEQ (Right, Seg->Seq)) {
-
-    TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN);
-    TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN);
-
-    Seg->Seq = Seg->End;
-    NetbufTrim (Nbuf, Nbuf->TotalSize, NET_BUF_HEAD);
-    return;
-  }
-
-  //
-  // Adjust the buffer header
-  //
-  if (TCP_SEQ_LT (Seg->Seq, Left)) {
-
-    Drop      = TCP_SUB_SEQ (Left, Seg->Seq);
-    Urg       = Seg->Seq + Seg->Urg;
-    Seg->Seq  = Left;
-
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-      TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN);
-      Drop--;
-    }
-
-    //
-    // Adjust the urgent point
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG)) {
-
-      if (TCP_SEQ_LT (Urg, Seg->Seq)) {
-
-        TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG);
-      } else {
-        Seg->Urg = (UINT16) TCP_SUB_SEQ (Urg, Seg->Seq);
-      }
-    }
-
-    if (Drop != 0) {
-      NetbufTrim (Nbuf, Drop, NET_BUF_HEAD);
-    }
-  }
-
-  //
-  // Adjust the buffer tail
-  //
-  if (TCP_SEQ_GT (Seg->End, Right)) {
-
-    Drop      = TCP_SUB_SEQ (Seg->End, Right);
-    Seg->End  = Right;
-
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
-      TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN);
-      Drop--;
-    }
-
-    if (Drop != 0) {
-      NetbufTrim (Nbuf, Drop, NET_BUF_TAIL);
-    }
-  }
-
-  ASSERT (TcpVerifySegment (Nbuf) != 0);
-}
-
-
-/**
-  Trim off the data outside the tcb's receive window.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf     Pointer to the NET_BUF containing the received tcp segment.
-
-**/
-VOID
-TcpTrimInWnd (
-  IN TCP_CB  *Tcb,
-  IN NET_BUF *Nbuf
-  )
-{
-  TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd);
-}
-
-
-/**
-  Process the data and FIN flag, check whether to deliver
-  data to the socket layer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-  @retval 0        No error occurred to deliver data.
-  @retval -1       Error condition occurred. Proper response is to reset the
-                   connection.
-
-**/
-INTN
-TcpDeliverData (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  LIST_ENTRY      *Entry;
-  NET_BUF         *Nbuf;
-  TCP_SEQNO       Seq;
-  TCP_SEG         *Seg;
-  UINT32          Urgent;
-
-  ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
-
-  //
-  // make sure there is some data queued,
-  // and TCP is in a proper state
-  //
-  if (IsListEmpty (&Tcb->RcvQue) || !TCP_CONNECTED (Tcb->State)) {
-
-    return 0;
-  }
-
-  //
-  // Deliver data to the socket layer
-  //
-  Entry = Tcb->RcvQue.ForwardLink;
-  Seq   = Tcb->RcvNxt;
-
-  while (Entry != &Tcb->RcvQue) {
-    Nbuf  = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
-    Seg   = TCPSEG_NETBUF (Nbuf);
-
-    ASSERT (TcpVerifySegment (Nbuf) != 0);
-    ASSERT (Nbuf->Tcp == NULL);
-
-    if (TCP_SEQ_GT (Seg->Seq, Seq)) {
-      break;
-    }
-
-    Entry       = Entry->ForwardLink;
-    Seq         = Seg->End;
-    Tcb->RcvNxt = Seq;
-
-    RemoveEntryList (&Nbuf->List);
-
-    //
-    // RFC793 Eighth step: process FIN in sequence
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
-
-      //
-      // The peer sends to us junky data after FIN,
-      // reset the connection.
-      //
-      if (!IsListEmpty (&Tcb->RcvQue)) {
-        DEBUG ((EFI_D_ERROR, "TcpDeliverData: data received after"
-          " FIN from peer of TCB %p, reset connection\n", Tcb));
-
-        NetbufFree (Nbuf);
-        return -1;
-      }
-
-      DEBUG ((EFI_D_NET, "TcpDeliverData: processing FIN "
-        "from peer of TCB %p\n", Tcb));
-
-      switch (Tcb->State) {
-      case TCP_SYN_RCVD:
-      case TCP_ESTABLISHED:
-
-        TcpSetState (Tcb, TCP_CLOSE_WAIT);
-        break;
-
-      case TCP_FIN_WAIT_1:
-
-        if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
-
-          TcpSetState (Tcb, TCP_CLOSING);
-          break;
-        }
-
-      //
-      // fall through
-      //
-      case TCP_FIN_WAIT_2:
-
-        TcpSetState (Tcb, TCP_TIME_WAIT);
-        TcpClearAllTimer (Tcb);
-
-        if (Tcb->TimeWaitTimeout != 0) {
-
-          TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
-        } else {
-
-          DEBUG ((EFI_D_WARN, "Connection closed immediately "
-            "because app disables TIME_WAIT timer for %p\n", Tcb));
-
-          TcpSendAck (Tcb);
-          TcpClose (Tcb);
-        }
-        break;
-
-      case TCP_CLOSE_WAIT:
-      case TCP_CLOSING:
-      case TCP_LAST_ACK:
-      case TCP_TIME_WAIT:
-        //
-        // The peer sends to us junk FIN byte. Discard
-        // the buffer then reset the connection
-        //
-        NetbufFree (Nbuf);
-        return -1;
-      default:
-        break;
-      }
-
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-
-      Seg->End--;
-    }
-
-    //
-    // Don't delay the ack if PUSH flag is on.
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_PSH)) {
-
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-    }
-
-    if (Nbuf->TotalSize != 0) {
-      Urgent = 0;
-
-      if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) &&
-          TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvUp)) {
-
-        if (TCP_SEQ_LEQ (Seg->End, Tcb->RcvUp)) {
-          Urgent = Nbuf->TotalSize;
-        } else {
-          Urgent = TCP_SUB_SEQ (Tcb->RcvUp, Seg->Seq) + 1;
-        }
-      }
-
-      SockDataRcvd (Tcb->Sk, Nbuf, Urgent);
-    }
-
-    if (TCP_FIN_RCVD (Tcb->State)) {
-
-      SockNoMoreData (Tcb->Sk);
-    }
-
-    NetbufFree (Nbuf);
-  }
-
-  return 0;
-}
-
-
-/**
-  Store the data into the reassemble queue.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf     Pointer to the buffer containing the data to be queued.
-
-**/
-VOID
-TcpQueueData (
-  IN OUT TCP_CB  *Tcb,
-  IN     NET_BUF *Nbuf
-  )
-{
-  TCP_SEG         *Seg;
-  LIST_ENTRY      *Head;
-  LIST_ENTRY      *Prev;
-  LIST_ENTRY      *Cur;
-  NET_BUF         *Node;
-
-  ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL));
-
-  NET_GET_REF (Nbuf);
-
-  Seg   = TCPSEG_NETBUF (Nbuf);
-  Head  = &Tcb->RcvQue;
-
-  //
-  // Fast path to process normal case. That is,
-  // no out-of-order segments are received.
-  //
-  if (IsListEmpty (Head)) {
-
-    InsertTailList (Head, &Nbuf->List);
-    return;
-  }
-
-  //
-  // Find the point to insert the buffer
-  //
-  for (Prev = Head, Cur = Head->ForwardLink;
-       Cur != Head;
-       Prev = Cur, Cur = Cur->ForwardLink) {
-
-    Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List);
-
-    if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->Seq)) {
-      break;
-    }
-  }
-
-  //
-  // Check whether the current segment overlaps with the
-  // previous segment.
-  //
-  if (Prev != Head) {
-    Node = NET_LIST_USER_STRUCT (Prev, NET_BUF, List);
-
-    if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->End)) {
-
-      if (TCP_SEQ_LEQ (Seg->End, TCPSEG_NETBUF (Node)->End)) {
-
-        NetbufFree (Nbuf);
-        return;
-      }
-
-      TcpTrimSegment (Nbuf, TCPSEG_NETBUF (Node)->End, Seg->End);
-    }
-  }
-
-  InsertHeadList (Prev, &Nbuf->List);
-
-  TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-
-  //
-  // Check the segments after the insert point.
-  //
-  while (Cur != Head) {
-    Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List);
-
-    if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->End, Seg->End)) {
-
-      Cur = Cur->ForwardLink;
-
-      RemoveEntryList (&Node->List);
-      NetbufFree (Node);
-      continue;
-    }
-
-    if (TCP_SEQ_LT (TCPSEG_NETBUF (Node)->Seq, Seg->End)) {
-
-      if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->Seq, Seg->Seq)) {
-
-        RemoveEntryList (&Nbuf->List);
-        NetbufFree (Nbuf);
-        return ;
-      }
-
-      TcpTrimSegment (Nbuf, Seg->Seq, TCPSEG_NETBUF (Node)->Seq);
-      break;
-    }
-
-    Cur = Cur->ForwardLink;
-  }
-}
-
-
-/**
-  Ajust the send queue or the retransmit queue.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Ack      The acknowledge seuqence number of the received segment.
-
-**/
-VOID
-TcpAdjustSndQue (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Ack
-  )
-{
-  LIST_ENTRY      *Head;
-  LIST_ENTRY      *Cur;
-  NET_BUF         *Node;
-  TCP_SEG         *Seg;
-
-  Head  = &Tcb->SndQue;
-  Cur   = Head->ForwardLink;
-
-  while (Cur != Head) {
-    Node  = NET_LIST_USER_STRUCT (Cur, NET_BUF, List);
-    Seg   = TCPSEG_NETBUF (Node);
-
-    if (TCP_SEQ_GEQ (Seg->Seq, Ack)) {
-      break;
-    }
-
-    //
-    // Remove completely ACKed segments
-    //
-    if (TCP_SEQ_LEQ (Seg->End, Ack)) {
-      Cur = Cur->ForwardLink;
-
-      RemoveEntryList (&Node->List);
-      NetbufFree (Node);
-      continue;
-    }
-
-    TcpTrimSegment (Node, Ack, Seg->End);
-    break;
-  }
-}
-
-
-/**
-  Process the received TCP segments.
-
-  @param  Nbuf     Buffer that contains received TCP segment without IP header.
-  @param  Src      Source address of the segment, or the peer's IP address.
-  @param  Dst      Destination address of the segment, or the local end's IP
-                   address.
-
-  @retval 0        Segment is processed successfully. It is either accepted or
-                   discarded. But no connection is reset by the segment.
-  @retval -1       A connection is reset by the segment.
-
-**/
-INTN
-TcpInput (
-  IN NET_BUF *Nbuf,
-  IN UINT32  Src,
-  IN UINT32  Dst
-  )
-{
-  TCP_CB      *Tcb;
-  TCP_CB      *Parent;
-  TCP_OPTION  Option;
-  TCP_HEAD    *Head;
-  INT32       Len;
-  TCP_SEG     *Seg;
-  TCP_SEQNO   Right;
-  TCP_SEQNO   Urg;
-  INT32       Usable;
-
-  NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE);
-
-  Parent  = NULL;
-  Tcb     = NULL;
-
-  Head    = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL);
-  ASSERT (Head != NULL);
-
-  if (Nbuf->TotalSize < sizeof (TCP_HEAD)) {
-    DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n"));
-    goto DISCARD;
-  }
-
-  Len     = Nbuf->TotalSize - (Head->HeadLen << 2);
-
-  if ((Head->HeadLen < 5) || (Len < 0) ||
-      (TcpChecksum (Nbuf, NetPseudoHeadChecksum (Src, Dst, 6, 0)) != 0)) {
-
-    DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n"));
-    goto DISCARD;
-  }
-
-  if (TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)) {
-    Len++;
-  }
-
-  if (TCP_FLG_ON (Head->Flag, TCP_FLG_FIN)) {
-    Len++;
-  }
-
-  Tcb = TcpLocateTcb (
-          Head->DstPort,
-          Dst,
-          Head->SrcPort,
-          Src,
-          (BOOLEAN) TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)
-          );
-
-  if ((Tcb == NULL) || (Tcb->State == TCP_CLOSED)) {
-    DEBUG ((EFI_D_NET, "TcpInput: send reset because no TCB found\n"));
-
-    Tcb = NULL;
-    goto SEND_RESET;
-  }
-
-  Seg = TcpFormatNetbuf (Tcb, Nbuf);
-
-  //
-  // RFC1122 recommended reaction to illegal option
-  // (in fact, an illegal option length) is reset.
-  //
-  if (TcpParseOption (Nbuf->Tcp, &Option) == -1) {
-    DEBUG ((EFI_D_ERROR, "TcpInput: reset the peer because"
-      " of malformed option for TCB %p\n", Tcb));
-
-    goto SEND_RESET;
-  }
-
-  //
-  // From now on, the segment is headless
-  //
-  NetbufTrim (Nbuf, (Head->HeadLen << 2), NET_BUF_HEAD);
-  Nbuf->Tcp = NULL;
-
-  //
-  // Process the segment in LISTEN state.
-  //
-  if (Tcb->State == TCP_LISTEN) {
-    //
-    // First step: Check RST
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) {
-      DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment "
-        "for TCB %p in listening\n", Tcb));
-
-      goto DISCARD;
-    }
-
-    //
-    // Second step: Check ACK.
-    // Any ACK sent to TCP in LISTEN is reseted.
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
-      DEBUG ((EFI_D_WARN, "TcpInput: send reset because of"
-        " segment with ACK for TCB %p in listening\n", Tcb));
-
-      goto SEND_RESET;
-    }
-
-    //
-    // Third step: Check SYN
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-      //
-      // create a child TCB to handle the data
-      //
-      Parent  = Tcb;
-
-      Tcb     = TcpCloneTcb (Parent);
-      if (Tcb == NULL) {
-        DEBUG ((EFI_D_ERROR, "TcpInput: discard a segment because"
-          " failed to clone a child for TCB %p\n", Tcb));
-
-        goto DISCARD;
-      }
-
-      DEBUG ((EFI_D_NET, "TcpInput: create a child for TCB %p"
-        " in listening\n", Tcb));
-
-      //
-      // init the TCB structure
-      //
-      Tcb->LocalEnd.Ip    = Dst;
-      Tcb->LocalEnd.Port  = Head->DstPort;
-      Tcb->RemoteEnd.Ip   = Src;
-      Tcb->RemoteEnd.Port = Head->SrcPort;
-
-      TcpInitTcbLocal (Tcb);
-      TcpInitTcbPeer (Tcb, Seg, &Option);
-
-      TcpSetState (Tcb, TCP_SYN_RCVD);
-      TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout);
-      TcpTrimInWnd (Tcb, Nbuf);
-
-      goto StepSix;
-    }
-
-    goto DISCARD;
-
-  } else if (Tcb->State == TCP_SYN_SENT) {
-    //
-    // First step: Check ACK bit
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK) && (Seg->Ack != Tcb->Iss + 1)) {
-
-      DEBUG ((EFI_D_WARN, "TcpInput: send reset because of "
-        "wrong ACK received for TCB %p in SYN_SENT\n", Tcb));
-
-      goto SEND_RESET;
-    }
-
-    //
-    // Second step: Check RST bit
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) {
-
-      if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
-
-        DEBUG ((EFI_D_WARN, "TcpInput: connection reset by"
-          " peer for TCB %p in SYN_SENT\n", Tcb));
-
-        SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
-        goto DROP_CONNECTION;
-      } else {
-
-        DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment "
-          "because of no ACK for TCB %p in SYN_SENT\n", Tcb));
-
-        goto DISCARD;
-      }
-    }
-
-    //
-    // Third step: Check security and precedence. Skipped
-    //
-
-    //
-    // Fourth step: Check SYN. Pay attention to simultaneous open
-    //
-    if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-
-      TcpInitTcbPeer (Tcb, Seg, &Option);
-
-      if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
-
-        Tcb->SndUna = Seg->Ack;
-      }
-
-      TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
-
-      if (TCP_SEQ_GT (Tcb->SndUna, Tcb->Iss)) {
-
-        TcpSetState (Tcb, TCP_ESTABLISHED);
-
-        TcpClearTimer (Tcb, TCP_TIMER_CONNECT);
-        TcpDeliverData (Tcb);
-
-        if ((Tcb->CongestState == TCP_CONGEST_OPEN) &&
-            TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
-
-          TcpComputeRtt (Tcb, Tcb->RttMeasure);
-          TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
-        }
-
-        TcpTrimInWnd (Tcb, Nbuf);
-
-        TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-
-        DEBUG ((EFI_D_NET, "TcpInput: connection established"
-          " for TCB %p in SYN_SENT\n", Tcb));
-
-        goto StepSix;
-      } else {
-        //
-        // Received a SYN segment without ACK, simultaneous open.
-        //
-        TcpSetState (Tcb, TCP_SYN_RCVD);
-
-        ASSERT (Tcb->SndNxt == Tcb->Iss + 1);
-        TcpAdjustSndQue (Tcb, Tcb->SndNxt);
-
-        TcpTrimInWnd (Tcb, Nbuf);
-
-        DEBUG ((EFI_D_WARN, "TcpInput: simultaneous open "
-          "for TCB %p in SYN_SENT\n", Tcb));
-
-        goto StepSix;
-      }
-    }
-
-    goto DISCARD;
-  }
-
-  //
-  // Process segment in SYN_RCVD or TCP_CONNECTED states
-  //
-
-  //
-  // Clear probe timer since the RecvWindow is opened.
-  //
-  if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) {
-    TcpClearTimer (Tcb, TCP_TIMER_PROBE);
-    Tcb->ProbeTimerOn = FALSE;
-  }
-
-  //
-  // First step: Check whether SEG.SEQ is acceptable
-  //
-  if (TcpSeqAcceptable (Tcb, Seg) == 0) {
-    DEBUG ((EFI_D_WARN, "TcpInput: sequence acceptance"
-      " test failed for segment of TCB %p\n", Tcb));
-
-    if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) {
-      TcpSendAck (Tcb);
-    }
-
-    goto DISCARD;
-  }
-
-  if ((TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2)) &&
-      (Tcb->RcvWl2 == Seg->End) &&
-      !TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN | TCP_FLG_FIN)) {
-
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-  }
-
-  //
-  // Second step: Check the RST
-  //
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) {
-
-    DEBUG ((EFI_D_WARN, "TcpInput: connection reset for TCB %p\n", Tcb));
-
-    if (Tcb->State == TCP_SYN_RCVD) {
-
-      SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_REFUSED);
-
-      //
-      // This TCB comes from either a LISTEN TCB,
-      // or active open TCB with simultanous open.
-      // Do NOT signal user CONNECTION refused
-      // if it comes from a LISTEN TCB.
-      //
-    } else if ((Tcb->State == TCP_ESTABLISHED) ||
-               (Tcb->State == TCP_FIN_WAIT_1) ||
-               (Tcb->State == TCP_FIN_WAIT_2) ||
-               (Tcb->State == TCP_CLOSE_WAIT)) {
-
-      SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
-
-    } else {
-
-    }
-
-    goto DROP_CONNECTION;
-  }
-
-  //
-  // Trim the data and flags.
-  //
-  TcpTrimInWnd (Tcb, Nbuf);
-
-  //
-  // Third step: Check security and precedence, Ignored
-  //
-
-  //
-  // Fourth step: Check the SYN bit.
-  //
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-
-    DEBUG ((EFI_D_WARN, "TcpInput: connection reset "
-      "because received extra SYN for TCB %p\n", Tcb));
-
-    SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
-    goto RESET_THEN_DROP;
-  }
-
-  //
-  // Fifth step: Check the ACK
-  //
-  if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
-    DEBUG ((EFI_D_WARN, "TcpInput: segment discard because"
-      " of no ACK for connected TCB %p\n", Tcb));
-
-    goto DISCARD;
-
-  }
-
-  if (Tcb->State == TCP_SYN_RCVD) {
-
-    if (TCP_SEQ_LT (Tcb->SndUna, Seg->Ack) &&
-        TCP_SEQ_LEQ (Seg->Ack, Tcb->SndNxt)) {
-
-      Tcb->SndWnd     = Seg->Wnd;
-      Tcb->SndWndMax  = MAX (Tcb->SndWnd, Tcb->SndWndMax);
-      Tcb->SndWl1     = Seg->Seq;
-      Tcb->SndWl2     = Seg->Ack;
-      TcpSetState (Tcb, TCP_ESTABLISHED);
-
-      TcpClearTimer (Tcb, TCP_TIMER_CONNECT);
-      TcpDeliverData (Tcb);
-
-      DEBUG ((EFI_D_NET, "TcpInput: connection established "
-        " for TCB %p in SYN_RCVD\n", Tcb));
-
-      //
-      // Continue the process as ESTABLISHED state
-      //
-    } else {
-      DEBUG ((EFI_D_WARN, "TcpInput: send reset because of"
-        " wrong ACK for TCB %p in SYN_RCVD\n", Tcb));
-
-      goto SEND_RESET;
-    }
-  }
-
-  if (TCP_SEQ_LT (Seg->Ack, Tcb->SndUna)) {
-
-    DEBUG ((EFI_D_WARN, "TcpInput: ignore the out-of-data"
-      " ACK for connected TCB %p\n", Tcb));
-
-    goto StepSix;
-
-  } else if (TCP_SEQ_GT (Seg->Ack, Tcb->SndNxt)) {
-
-    DEBUG ((EFI_D_WARN, "TcpInput: discard segment for "
-      "future ACK for connected TCB %p\n", Tcb));
-
-    TcpSendAck (Tcb);
-    goto DISCARD;
-  }
-
-  //
-  // From now on: SND.UNA <= SEG.ACK <= SND.NXT.
-  //
-  if (TCP_FLG_ON (Option.Flag, TCP_OPTION_RCVD_TS)) {
-    //
-    // update TsRecent as specified in page 16 RFC1323.
-    // RcvWl2 equals to the variable "LastAckSent"
-    // defined there.
-    //
-    if (TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2) &&
-        TCP_SEQ_LT (Tcb->RcvWl2, Seg->End)) {
-
-      Tcb->TsRecent     = Option.TSVal;
-      Tcb->TsRecentAge  = mTcpTick;
-    }
-
-    TcpComputeRtt (Tcb, TCP_SUB_TIME (mTcpTick, Option.TSEcr));
-
-  } else if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
-
-    ASSERT (Tcb->CongestState == TCP_CONGEST_OPEN);
-
-    TcpComputeRtt (Tcb, Tcb->RttMeasure);
-    TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
-  }
-
-  if (Seg->Ack == Tcb->SndNxt) {
-
-    TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
-  } else {
-
-    TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);
-  }
-
-  //
-  // Count duplicate acks.
-  //
-  if ((Seg->Ack == Tcb->SndUna) &&
-      (Tcb->SndUna != Tcb->SndNxt) &&
-      (Seg->Wnd == Tcb->SndWnd) &&
-      (0 == Len)) {
-
-    Tcb->DupAck++;
-  } else {
-
-    Tcb->DupAck = 0;
-  }
-
-  //
-  // Congestion avoidance, fast recovery and fast retransmission.
-  //
-  if (((Tcb->CongestState == TCP_CONGEST_OPEN) && (Tcb->DupAck < 3)) ||
-      (Tcb->CongestState == TCP_CONGEST_LOSS)) {
-
-    if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
-
-      if (Tcb->CWnd < Tcb->Ssthresh) {
-
-        Tcb->CWnd += Tcb->SndMss;
-      } else {
-
-        Tcb->CWnd += MAX (Tcb->SndMss * Tcb->SndMss / Tcb->CWnd, 1);
-      }
-
-      Tcb->CWnd = MIN (Tcb->CWnd, TCP_MAX_WIN << Tcb->SndWndScale);
-    }
-
-    if (Tcb->CongestState == TCP_CONGEST_LOSS) {
-      TcpFastLossRecover (Tcb, Seg);
-    }
-  } else {
-
-    TcpFastRecover (Tcb, Seg);
-  }
-
-  if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
-
-    TcpAdjustSndQue (Tcb, Seg->Ack);
-    Tcb->SndUna = Seg->Ack;
-
-    if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) &&
-        TCP_SEQ_LT (Tcb->SndUp, Seg->Ack)) {
-
-      TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG);
-    }
-  }
-
-  //
-  // Update window info
-  //
-  if (TCP_SEQ_LT (Tcb->SndWl1, Seg->Seq) ||
-      ((Tcb->SndWl1 == Seg->Seq) && TCP_SEQ_LEQ (Tcb->SndWl2, Seg->Ack))) {
-
-    Right = Seg->Ack + Seg->Wnd;
-
-    if (TCP_SEQ_LT (Right, Tcb->SndWl2 + Tcb->SndWnd)) {
-
-      if ((Tcb->SndWl1 == Seg->Seq) &&
-          (Tcb->SndWl2 == Seg->Ack) &&
-          (Len == 0)) {
-
-        goto NO_UPDATE;
-      }
-
-      DEBUG ((EFI_D_WARN, "TcpInput: peer shrinks the"
-        " window for connected TCB %p\n", Tcb));
-
-      if ((Tcb->CongestState == TCP_CONGEST_RECOVER) &&
-          (TCP_SEQ_LT (Right, Tcb->Recover))) {
-
-        Tcb->Recover = Right;
-      }
-
-      if ((Tcb->CongestState == TCP_CONGEST_LOSS) &&
-          (TCP_SEQ_LT (Right, Tcb->LossRecover))) {
-
-        Tcb->LossRecover = Right;
-      }
-
-      if (TCP_SEQ_LT (Right, Tcb->SndNxt)) {
-        //
-        // Check for Window Retraction in RFC7923 section 2.4.
-        // The lower n bits of the peer's actual receive window is wiped out if TCP
-        // window scale is enabled, it will look like the peer is shrinking the window.
-        // Check whether the SndNxt is out of the advertised receive window by more than
-        // 2^Rcv.Wind.Shift before moving the SndNxt to the left.
-        //
-        DEBUG (
-          (EFI_D_WARN,
-          "TcpInput: peer advise negative useable window for connected TCB %p\n",
-          Tcb)
-          );
-        Usable = TCP_SUB_SEQ (Tcb->SndNxt, Right);
-        if ((Usable >> Tcb->SndWndScale) > 0) {
-          DEBUG (
-            (EFI_D_WARN,
-            "TcpInput: SndNxt is out of window by more than window scale for TCB %p\n",
-            Tcb)
-            );
-          Tcb->SndNxt = Right;
-        }
-        if (Right == Tcb->SndUna) {
-
-          TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
-          TcpSetProbeTimer (Tcb);
-        }
-      }
-    }
-
-    Tcb->SndWnd     = Seg->Wnd;
-    Tcb->SndWndMax  = MAX (Tcb->SndWnd, Tcb->SndWndMax);
-    Tcb->SndWl1     = Seg->Seq;
-    Tcb->SndWl2     = Seg->Ack;
-  }
-
-NO_UPDATE:
-
-  if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT) &&
-      (Tcb->SndUna == Tcb->SndNxt)) {
-
-    DEBUG ((EFI_D_NET, "TcpInput: local FIN is ACKed by"
-      " peer for connected TCB %p\n", Tcb));
-
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED);
-  }
-
-  //
-  // Transit the state if proper.
-  //
-  switch (Tcb->State) {
-  case TCP_FIN_WAIT_1:
-
-    if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
-
-      TcpSetState (Tcb, TCP_FIN_WAIT_2);
-
-      TcpClearAllTimer (Tcb);
-      TcpSetTimer (Tcb, TCP_TIMER_FINWAIT2, Tcb->FinWait2Timeout);
-    }
-
-  case TCP_FIN_WAIT_2:
-
-    break;
-
-  case TCP_CLOSE_WAIT:
-    break;
-
-  case TCP_CLOSING:
-
-    if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
-
-      TcpSetState (Tcb, TCP_TIME_WAIT);
-
-      TcpClearAllTimer (Tcb);
-
-      if (Tcb->TimeWaitTimeout != 0) {
-
-        TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
-      } else {
-
-        DEBUG ((EFI_D_WARN, "Connection closed immediately "
-          "because app disables TIME_WAIT timer for %p\n", Tcb));
-
-        TcpClose (Tcb);
-      }
-    }
-    break;
-
-  case TCP_LAST_ACK:
-
-    if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
-
-      TcpSetState (Tcb, TCP_CLOSED);
-    }
-
-    break;
-
-  case TCP_TIME_WAIT:
-
-    TcpSendAck (Tcb);
-
-    if (Tcb->TimeWaitTimeout != 0) {
-
-      TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
-    } else {
-
-      DEBUG ((EFI_D_WARN, "Connection closed immediately "
-        "because app disables TIME_WAIT timer for %p\n", Tcb));
-
-      TcpClose (Tcb);
-    }
-    break;
-
-  default:
-    break;
-  }
-
-  //
-  // Sixth step: Check the URG bit.update the Urg point
-  // if in TCP_CAN_RECV, otherwise, leave the RcvUp intact.
-  //
-StepSix:
-
-  Tcb->Idle = 0;
-  TcpSetKeepaliveTimer (Tcb);
-
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG) &&
-      !TCP_FIN_RCVD (Tcb->State))
-  {
-
-    DEBUG ((EFI_D_NET, "TcpInput: received urgent data "
-      "from peer for connected TCB %p\n", Tcb));
-
-    Urg = Seg->Seq + Seg->Urg;
-
-    if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) &&
-        TCP_SEQ_GT (Urg, Tcb->RcvUp)) {
-
-      Tcb->RcvUp = Urg;
-    } else {
-
-      Tcb->RcvUp = Urg;
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG);
-    }
-  }
-
-  //
-  // Seventh step: Process the segment data
-  //
-  if (Seg->End != Seg->Seq) {
-
-    if (TCP_FIN_RCVD (Tcb->State)) {
-
-      DEBUG ((EFI_D_WARN, "TcpInput: connection reset because"
-        " data is lost for connected TCB %p\n", Tcb));
-
-      goto RESET_THEN_DROP;
-    }
-
-    if (TCP_LOCAL_CLOSED (Tcb->State) && (Nbuf->TotalSize != 0)) {
-      DEBUG ((EFI_D_WARN, "TcpInput: connection reset because"
-        " data is lost for connected TCB %p\n", Tcb));
-
-      goto RESET_THEN_DROP;
-    }
-
-    TcpQueueData (Tcb, Nbuf);
-    if (TcpDeliverData (Tcb) == -1) {
-      goto RESET_THEN_DROP;
-    }
-
-    if (!IsListEmpty (&Tcb->RcvQue)) {
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-    }
-  }
-
-  //
-  // Eighth step: check the FIN.
-  // This step is moved to TcpDeliverData. FIN will be
-  // processed in sequence there. Check the comments in
-  // the beginning of the file header for information.
-  //
-
-  //
-  // Tcb is a new child of the listening Parent,
-  // commit it.
-  //
-  if (Parent != NULL) {
-    Tcb->Parent = Parent;
-    TcpInsertTcb (Tcb);
-  }
-
-  if ((Tcb->State != TCP_CLOSED) &&
-      (TcpToSendData (Tcb, 0) == 0) &&
-      (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || (Nbuf->TotalSize != 0))) {
-
-    TcpToSendAck (Tcb);
-  }
-
-  NetbufFree (Nbuf);
-  return 0;
-
-RESET_THEN_DROP:
-  TcpSendReset (Tcb, Head, Len, Dst, Src);
-
-DROP_CONNECTION:
-  ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
-
-  NetbufFree (Nbuf);
-  TcpClose (Tcb);
-
-  return -1;
-
-SEND_RESET:
-
-  TcpSendReset (Tcb, Head, Len, Dst, Src);
-
-DISCARD:
-
-  //
-  // Tcb is a child of Parent, and it doesn't survive
-  //
-  DEBUG ((EFI_D_WARN, "Tcp4Input: Discard a packet\n"));
-  NetbufFree (Nbuf);
-
-  if ((Parent != NULL) && (Tcb != NULL)) {
-
-    ASSERT (Tcb->Sk != NULL);
-    TcpClose (Tcb);
-  }
-
-  return 0;
-}
-
-
-/**
-  Process the received ICMP error messages for TCP.
-
-  @param  Nbuf     Buffer that contains part of the TCP segment without IP header
-                   truncated from the ICMP error packet.
-  @param  IcmpErr  The ICMP error code interpreted from ICMP error packet.
-  @param  Src      Source address of the ICMP error message.
-  @param  Dst      Destination address of the ICMP error message.
-
-**/
-VOID
-TcpIcmpInput (
-  IN NET_BUF     *Nbuf,
-  IN UINT8       IcmpErr,
-  IN UINT32      Src,
-  IN UINT32      Dst
-  )
-{
-  TCP_HEAD         *Head;
-  TCP_CB           *Tcb;
-  TCP_SEQNO        Seq;
-  EFI_STATUS       IcmpErrStatus;
-  BOOLEAN          IcmpErrIsHard;
-  BOOLEAN          IcmpErrNotify;
-
-  if (Nbuf->TotalSize < sizeof (TCP_HEAD)) {
-    goto CLEAN_EXIT;
-  }
-
-  Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL);
-  ASSERT (Head != NULL);
-  Tcb = TcpLocateTcb (
-          Head->DstPort,
-          Dst,
-          Head->SrcPort,
-          Src,
-          FALSE
-          );
-  if (Tcb == NULL || Tcb->State == TCP_CLOSED) {
-
-    goto CLEAN_EXIT;
-  }
-
-  //
-  // Validate the sequence number.
-  //
-  Seq = NTOHL (Head->Seq);
-  if (!(TCP_SEQ_LEQ (Tcb->SndUna, Seq) && TCP_SEQ_LT (Seq, Tcb->SndNxt))) {
-
-    goto CLEAN_EXIT;
-  }
-
-  IcmpErrStatus = IpIoGetIcmpErrStatus (
-                    IcmpErr,
-                    IP_VERSION_4,
-                    &IcmpErrIsHard,
-                    &IcmpErrNotify
-                    );
-
-  if (IcmpErrNotify) {
-
-    SOCK_ERROR (Tcb->Sk, IcmpErrStatus);
-  }
-
-  if (IcmpErrIsHard) {
-
-    TcpClose (Tcb);
-  }
-
-CLEAN_EXIT:
-  NetbufFree (Nbuf);
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c
deleted file mode 100644
index b98d1e783a2f..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/** @file
-  I/O interfaces between TCP and IpIo.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-
-/**
-  Packet receive callback function provided to IP_IO, used to call
-  the proper function to handle the packet received by IP.
-
-  @param  Status      Status of the received packet.
-  @param  IcmpErr     ICMP error number.
-  @param  NetSession  Pointer to the net session of this packet.
-  @param  Pkt         Pointer to the recieved packet.
-  @param  Context     Pointer to the context configured in IpIoOpen(), not used
-                      now.
-
-**/
-VOID
-EFIAPI
-Tcp4RxCallback (
-  IN EFI_STATUS                       Status,
-  IN UINT8                            IcmpErr,
-  IN EFI_NET_SESSION_DATA             *NetSession,
-  IN NET_BUF                          *Pkt,
-  IN VOID                             *Context    OPTIONAL
-  )
-{
-  if (EFI_SUCCESS == Status) {
-    TcpInput (Pkt, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]);
-  } else {
-    TcpIcmpInput (Pkt, IcmpErr, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]);
-  }
-}
-
-
-/**
-  Send the segment to IP via IpIo function.
-
-  @param  Tcb         Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf        Pointer to the TCP segment to be sent.
-  @param  Src         Source address of the TCP segment.
-  @param  Dest        Destination address of the TCP segment.
-
-  @retval 0           The segment was sent out successfully.
-  @retval -1          The segment was failed to send.
-
-**/
-INTN
-TcpSendIpPacket (
-  IN TCP_CB    *Tcb,
-  IN NET_BUF   *Nbuf,
-  IN UINT32    Src,
-  IN UINT32    Dest
-  )
-{
-  EFI_STATUS       Status;
-  IP_IO            *IpIo;
-  IP_IO_OVERRIDE   Override;
-  SOCKET           *Sock;
-  VOID             *IpSender;
-  TCP4_PROTO_DATA  *TcpProto;
-  EFI_IP_ADDRESS   Source;
-  EFI_IP_ADDRESS   Destination;
-
-  Source.Addr[0]      = Src;
-  Destination.Addr[0] = Dest;
-
-  if (NULL == Tcb) {
-
-    IpIo     = NULL;
-    IpSender = IpIoFindSender (&IpIo, IP_VERSION_4, &Source);
-
-    if (IpSender == NULL) {
-      DEBUG ((EFI_D_WARN, "TcpSendIpPacket: No appropriate IpSender.\n"));
-      return -1;
-    }
-  } else {
-
-    Sock     = Tcb->Sk;
-    TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
-    IpIo     = TcpProto->TcpService->IpIo;
-    IpSender = Tcb->IpInfo;
-  }
-
-  Override.Ip4OverrideData.TypeOfService            = 0;
-  Override.Ip4OverrideData.TimeToLive               = 255;
-  Override.Ip4OverrideData.DoNotFragment            = FALSE;
-  Override.Ip4OverrideData.Protocol                 = EFI_IP_PROTO_TCP;
-  ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&Override.Ip4OverrideData.SourceAddress, &Src, sizeof (EFI_IPv4_ADDRESS));
-
-  Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, &Destination, &Override);
-
-  if (EFI_ERROR (Status)) {
-    DEBUG ((EFI_D_ERROR, "TcpSendIpPacket: return %r error\n", Status));
-    return -1;
-  }
-
-  return 0;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c
deleted file mode 100644
index d8fc68c0a97d..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c
+++ /dev/null
@@ -1,674 +0,0 @@
-/** @file
-  Implementation of TCP4 protocol services.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-
-/**
-  Check the integrity of the data buffer.
-
-  @param  DataLen                  The total length of the data buffer.
-  @param  FragmentCount            The fragment count of the fragment table.
-  @param  FragmentTable            Pointer to the fragment table of the data
-                                   buffer.
-
-  @retval EFI_SUCCESS              The integrity check is passed.
-  @retval EFI_INVALID_PARAMETER    The integrity check is failed.
-
-**/
-EFI_STATUS
-Tcp4ChkDataBuf (
-  IN UINT32                 DataLen,
-  IN UINT32                 FragmentCount,
-  IN EFI_TCP4_FRAGMENT_DATA *FragmentTable
-  )
-{
-  UINT32 Index;
-
-  UINT32 Len;
-
-  for (Index = 0, Len = 0; Index < FragmentCount; Index++) {
-    Len = Len + (UINT32) FragmentTable[Index].FragmentLength;
-  }
-
-  if (DataLen != Len) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Get the current operational status.
-
-  The GetModeData() function copies the current operational settings of this
-  EFI TCPv4 Protocol instance into user-supplied buffers. This function can
-  also be used to retrieve the operational setting of underlying drivers
-  such as IPv4, MNP, or SNP.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  Tcp4State                Pointer to the buffer to receive the current TCP
-                                   state.
-  @param  Tcp4ConfigData           Pointer to the buffer to receive the current TCP
-                                   configuration.
-  @param  Ip4ModeData              Pointer to the buffer to receive the current IPv4
-                                   configuration data used by the TCPv4 instance.
-  @param  MnpConfigData            Pointer to the buffer to receive the current MNP
-                                   configuration data indirectly used by the TCPv4
-                                   Instance.
-  @param  SnpModeData              Pointer to the buffer to receive the current SNP
-                                   configuration data indirectly used by the TCPv4
-                                   Instance.
-
-  @retval EFI_SUCCESS              The mode data was read.
-  @retval EFI_NOT_STARTED          No configuration data is available because this
-                                   instance hasn't been started.
-  @retval EFI_INVALID_PARAMETER    This is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4GetModeData (
-  IN      EFI_TCP4_PROTOCOL                  *This,
-     OUT  EFI_TCP4_CONNECTION_STATE          *Tcp4State       OPTIONAL,
-     OUT  EFI_TCP4_CONFIG_DATA               *Tcp4ConfigData  OPTIONAL,
-     OUT  EFI_IP4_MODE_DATA                  *Ip4ModeData     OPTIONAL,
-     OUT  EFI_MANAGED_NETWORK_CONFIG_DATA    *MnpConfigData   OPTIONAL,
-     OUT  EFI_SIMPLE_NETWORK_MODE            *SnpModeData     OPTIONAL
-  )
-{
-  TCP4_MODE_DATA  TcpMode;
-  SOCKET          *Sock;
-
-  if (NULL == This) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Sock                    = SOCK_FROM_THIS (This);
-
-  TcpMode.Tcp4State       = Tcp4State;
-  TcpMode.Tcp4ConfigData  = Tcp4ConfigData;
-  TcpMode.Ip4ModeData     = Ip4ModeData;
-  TcpMode.MnpConfigData   = MnpConfigData;
-  TcpMode.SnpModeData     = SnpModeData;
-
-  return SockGetMode (Sock, &TcpMode);
-}
-
-
-/**
-  Initialize or brutally reset the operational parameters for
-  this EFI TCPv4 instance.
-
-  The Configure() function does the following:
-  * Initialize this EFI TCPv4 instance, i.e., initialize the communication end
-  setting, specify active open or passive open for an instance.
-  * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous
-  tokens, flush transmission and receiving buffer directly without informing
-  the communication peer.
-  No other TCPv4 Protocol operation can be executed by this instance
-  until it is configured properly. For an active TCP4 instance, after a proper
-  configuration it may call Connect() to initiates the three-way handshake.
-  For a passive TCP4 instance, its state will transit to Tcp4StateListen after
-  configuration, and Accept() may be called to listen the incoming TCP connection
-  request. If TcpConfigData is set to NULL, the instance is reset. Resetting
-  process will be done brutally, the state machine will be set to Tcp4StateClosed
-  directly, the receive queue and transmit queue will be flushed, and no traffic is
-  allowed through this instance.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  TcpConfigData            Pointer to the configure data to configure the
-                                   instance.
-
-  @retval EFI_SUCCESS              The operational settings are set, changed, or
-                                   reset successfully.
-  @retval EFI_NO_MAPPING           When using a default address, configuration
-                                   (through DHCP, BOOTP, RARP, etc.) is not
-                                   finished.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_ACCESS_DENIED        Configuring TCP instance when it is already
-                                   configured.
-  @retval EFI_DEVICE_ERROR         An unexpected network or system error occurred.
-  @retval EFI_UNSUPPORTED          One or more of the control options are not
-                                   supported in the implementation.
-  @retval EFI_OUT_OF_RESOURCES     Could not allocate enough system resources.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Configure (
-  IN EFI_TCP4_PROTOCOL        *This,
-  IN EFI_TCP4_CONFIG_DATA     *TcpConfigData     OPTIONAL
-  )
-{
-  EFI_TCP4_OPTION  *Option;
-  SOCKET           *Sock;
-  EFI_STATUS       Status;
-  IP4_ADDR         Ip;
-  IP4_ADDR         SubnetMask;
-
-  if (NULL == This) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Tcp protocol related parameter check will be conducted here
-  //
-  if (NULL != TcpConfigData) {
-
-    CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));
-    if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {
-      return EFI_INVALID_PARAMETER;
-    }
-
-    if (TcpConfigData->AccessPoint.ActiveFlag &&
-      (0 == TcpConfigData->AccessPoint.RemotePort || (Ip == 0))) {
-      return EFI_INVALID_PARAMETER;
-    }
-
-    if (!TcpConfigData->AccessPoint.UseDefaultAddress) {
-
-      CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof (IP4_ADDR));
-      CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, sizeof (IP4_ADDR));
-      if (!IP4_IS_VALID_NETMASK (NTOHL (SubnetMask)) ||
-          (SubnetMask != 0 && !NetIp4IsUnicast (NTOHL (Ip), NTOHL (SubnetMask)))) {
-        return EFI_INVALID_PARAMETER;
-      }
-    }
-
-    Option = TcpConfigData->ControlOption;
-    if ((NULL != Option) &&
-        (Option->EnableSelectiveAck || Option->EnablePathMtuDiscovery)) {
-      return EFI_UNSUPPORTED;
-    }
-  }
-
-  Sock = SOCK_FROM_THIS (This);
-
-  if (NULL == TcpConfigData) {
-    return SockFlush (Sock);
-  }
-
-  Status = SockConfigure (Sock, TcpConfigData);
-
-  if (EFI_NO_MAPPING == Status) {
-    Sock->ConfigureState = SO_NO_MAPPING;
-  }
-
-  return Status;
-}
-
-
-/**
-  Add or delete routing entries.
-
-  The Routes() function adds or deletes a route from the instance's routing table.
-  The most specific route is selected by comparing the SubnetAddress with the
-  destination IP address's arithmetical AND to the SubnetMask.
-  The default route is added with both SubnetAddress and SubnetMask set to 0.0.0.0.
-  The default route matches all destination IP addresses if there is no more specific route.
-  Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent to
-  the destination host if its address can be found in the Address Resolution Protocol (ARP)
-  cache or it is on the local subnet. If the instance is configured to use default
-  address, a direct route to the local network will be added automatically.
-  Each TCP instance has its own independent routing table. Instance that uses the
-  default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's routing table.
-  The copy will be updated automatically whenever the IP driver reconfigures its
-  instance. As a result, the previous modification to the instance's local copy
-  will be lost. The priority of checking the route table is specific with IP
-  implementation and every IP implementation must comply with RFC 1122.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  DeleteRoute              If TRUE, delete the specified route from routing
-                                   table; if FALSE, add the specified route to
-                                   routing table.
-                                   DestinationAddress and SubnetMask are used as
-                                   the keywords to search route entry.
-  @param  SubnetAddress            The destination network.
-  @param  SubnetMask               The subnet mask for the destination network.
-  @param  GatewayAddress           The gateway address for this route.
-                                   It must be on the same subnet with the station
-                                   address unless a direct route is specified.
-
-  @retval EFI_SUCCESS              The operation completed successfully.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance has not been
-                                   configured.
-  @retval EFI_NO_MAPPING           When using a default address, configuration
-                                   (through DHCP, BOOTP, RARP, etc.) is not
-                                   finished.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     Could not allocate enough resources to add the
-                                   entry to the routing table.
-  @retval EFI_NOT_FOUND            This route is not in the routing table.
-  @retval EFI_ACCESS_DENIED        This route is already in the routing table.
-  @retval EFI_UNSUPPORTED          The TCP driver does not support this operation.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Routes (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN BOOLEAN                     DeleteRoute,
-  IN EFI_IPv4_ADDRESS            *SubnetAddress,
-  IN EFI_IPv4_ADDRESS            *SubnetMask,
-  IN EFI_IPv4_ADDRESS            *GatewayAddress
-  )
-{
-  SOCKET          *Sock;
-  TCP4_ROUTE_INFO RouteInfo;
-
-  if (NULL == This) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Sock                      = SOCK_FROM_THIS (This);
-
-  RouteInfo.DeleteRoute     = DeleteRoute;
-  RouteInfo.SubnetAddress   = SubnetAddress;
-  RouteInfo.SubnetMask      = SubnetMask;
-  RouteInfo.GatewayAddress  = GatewayAddress;
-
-  return SockRoute (Sock, &RouteInfo);
-}
-
-
-/**
-  Initiate a nonblocking TCP connection request for an active TCP instance.
-
-  The Connect() function will initiate an active open to the remote peer configured
-  in current TCP instance if it is configured active. If the connection succeeds
-  or fails due to any error, the ConnectionToken->CompletionToken.Event will be
-  signaled and ConnectionToken->CompletionToken.Status will be updated accordingly.
-  This function can only be called for the TCP instance in Tcp4StateClosed state.
-  The instance will transfer into Tcp4StateSynSent if the function returns EFI_SUCCESS.
-  If TCP three way handshake succeeds, its state will become Tcp4StateEstablished,
-  otherwise, the state will return to Tcp4StateClosed.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance
-  @param  ConnectionToken          Pointer to the connection token to return when
-                                   the TCP three way handshake finishes.
-
-  @retval EFI_SUCCESS              The connection request is successfully initiated
-                                   and the state of this TCPv4 instance has
-                                   been changed to Tcp4StateSynSent.
-  @retval EFI_NOT_STARTED          This EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_ACCESS_DENIED        The instance is not configured as an active one
-                                   or it is not in Tcp4StateClosed state.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     The driver can't allocate enough resource to
-                                   initiate the active open.
-  @retval EFI_DEVICE_ERROR         An unexpected system or network error occurred.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Connect (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN EFI_TCP4_CONNECTION_TOKEN   *ConnectionToken
-  )
-{
-  SOCKET  *Sock;
-
-  if (NULL == This ||
-      NULL == ConnectionToken ||
-      NULL == ConnectionToken->CompletionToken.Event) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Sock = SOCK_FROM_THIS (This);
-
-  return SockConnect (Sock, ConnectionToken);
-}
-
-
-/**
-  Listen on the passive instance to accept an incoming connection request.
-
-  The Accept() function initiates an asynchronous accept request to wait for an
-  incoming connection on the passive TCP instance. If a remote peer successfully
-  establishes a connection with this instance, a new TCP instance will be created
-  and its handle will be returned in ListenToken->NewChildHandle. The newly created
-  instance is configured by inheriting the passive instance's configuration and is
-  ready for use upon return. The instance is in the Tcp4StateEstablished state.
-  The ListenToken->CompletionToken.Event will be signaled when a new connection
-  is accepted, user aborts the listen or connection is reset. This function only
-  can be called when current TCP instance is in Tcp4StateListen state.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance
-  @param  ListenToken              Pointer to the listen token to return when
-                                   operation finishes.
-
-  @retval EFI_SUCCESS              The listen token has been queued successfully.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_ACCESS_DENIED        The instatnce is not a passive one or it is not
-                                   in Tcp4StateListen state or a same listen token
-                                   has already existed in the listen token queue of
-                                   this TCP instance.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     Could not allocate enough resources to finish
-                                   the operation.
-  @retval EFI_DEVICE_ERROR         Any unexpected and not belonged to above category error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Accept (
-  IN EFI_TCP4_PROTOCOL             *This,
-  IN EFI_TCP4_LISTEN_TOKEN         *ListenToken
-  )
-{
-  SOCKET  *Sock;
-
-  if (NULL == This ||
-      NULL == ListenToken ||
-      NULL == ListenToken->CompletionToken.Event) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Sock = SOCK_FROM_THIS (This);
-
-  return SockAccept (Sock, ListenToken);
-}
-
-
-/**
-  Queues outgoing data into the transmit queue.
-
-  The Transmit() function queues a sending request to this TCPv4 instance along
-  with the user data. The status of the token is updated and the event in the token
-  will be signaled once the data is sent out or some error occurs.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance
-  @param  Token                    Pointer to the completion token to queue to the
-                                   transmit queue
-
-  @retval EFI_SUCCESS              The data has been queued for transmission.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_NO_MAPPING           When using a default address, configuration
-                                   (DHCP, BOOTP, RARP, etc.) is not finished yet.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_ACCESS_DENIED        One or more of the following conditions is TRUE:
-                                   * A transmit completion token with the same
-                                     Token-> CompletionToken.Event was already in the
-                                     transmission queue.
-                                   * The current instance is in Tcp4StateClosed state
-                                   * The current instance is a passive one and
-                                     it is in Tcp4StateListen state.
-                                   * User has called Close() to disconnect this
-                                     connection.
-  @retval EFI_NOT_READY            The completion token could not be queued because
-                                   the transmit queue is full.
-  @retval EFI_OUT_OF_RESOURCES     Could not queue the transmit data because of
-                                   resource shortage.
-  @retval EFI_NETWORK_UNREACHABLE  There is no route to the destination network or
-                                   address.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Transmit (
-  IN EFI_TCP4_PROTOCOL            *This,
-  IN EFI_TCP4_IO_TOKEN            *Token
-  )
-{
-  SOCKET      *Sock;
-  EFI_STATUS  Status;
-
-  if (NULL == This ||
-      NULL == Token ||
-      NULL == Token->CompletionToken.Event ||
-      NULL == Token->Packet.TxData ||
-      0 == Token->Packet.TxData->FragmentCount ||
-      0 == Token->Packet.TxData->DataLength
-      ) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status = Tcp4ChkDataBuf (
-            (UINT32) Token->Packet.TxData->DataLength,
-            (UINT32) Token->Packet.TxData->FragmentCount,
-            Token->Packet.TxData->FragmentTable
-            );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Sock = SOCK_FROM_THIS (This);
-
-  return SockSend (Sock, Token);
-
-}
-
-
-/**
-  Place an asynchronous receive request into the receiving queue.
-
-  The Receive() function places a completion token into the receive packet queue.
-  This function is always asynchronous. The caller must allocate the
-  Token->CompletionToken.Event and the FragmentBuffer used to receive data. He also
-  must fill the DataLength which represents the whole length of all FragmentBuffer.
-  When the receive operation completes, the EFI TCPv4 Protocol driver updates the
-  Token->CompletionToken.Status and Token->Packet.RxData fields and the
-  Token->CompletionToken.Event is signaled. If got data the data and its length
-  will be copy into the FragmentTable, in the same time the full length of received
-  data will be recorded in the DataLength fields. Providing a proper notification
-  function and context for the event will enable the user to receive the notification
-  and receiving status. That notification function is guaranteed to not be re-entered.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  Token                    Pointer to a token that is associated with the
-                                   receive data descriptor.
-
-  @retval EFI_SUCCESS              The receive completion token was cached.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_NO_MAPPING           When using a default address, configuration
-                                   (DHCP, BOOTP, RARP, etc.) is not finished yet.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     The receive completion token could not be queued
-                                   due to a lack of system resources.
-  @retval EFI_DEVICE_ERROR         An unexpected system or network error occurred.
-                                   The EFI TCPv4 Protocol instance has been reset
-                                   to startup defaults.
-  @retval EFI_ACCESS_DENIED        One or more of the following conditions is TRUE:
-                                   * A receive completion token with the same
-                                     Token->CompletionToken.Event was already in
-                                     the receive queue.
-                                   * The current instance is in Tcp4StateClosed state.
-                                   * The current instance is a passive one and it
-                                     is in Tcp4StateListen state.
-                                   * User has called Close() to disconnect this
-                                     connection.
-  @retval EFI_CONNECTION_FIN       The communication peer has closed the connection
-                                   and there is no any buffered data in the receive
-                                   buffer of this instance.
-  @retval EFI_NOT_READY            The receive request could not be queued because
-                                   the receive queue is full.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Receive (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN EFI_TCP4_IO_TOKEN           *Token
-  )
-{
-  SOCKET      *Sock;
-  EFI_STATUS  Status;
-
-  if (NULL == This ||
-      NULL == Token ||
-      NULL == Token->CompletionToken.Event ||
-      NULL == Token->Packet.RxData ||
-      0 == Token->Packet.RxData->FragmentCount ||
-      0 == Token->Packet.RxData->DataLength
-      ) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status = Tcp4ChkDataBuf (
-            (UINT32) Token->Packet.RxData->DataLength,
-            (UINT32) Token->Packet.RxData->FragmentCount,
-            Token->Packet.RxData->FragmentTable
-            );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Sock = SOCK_FROM_THIS (This);
-
-  return SockRcv (Sock, Token);
-
-}
-
-
-/**
-  Disconnecting a TCP connection gracefully or reset a TCP connection.
-
-  Initiate an asynchronous close token to TCP driver. After Close() is called,
-  any buffered transmission data will be sent by TCP driver and the current
-  instance will have a graceful close working flow described as RFC 793 if
-  AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP
-  driver to fast disconnect this connection. When the close operation completes
-  successfully the TCP instance is in Tcp4StateClosed state, all pending
-  asynchronous operation is signaled and any buffers used for TCP network traffic
-  is flushed.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  CloseToken               Pointer to the close token to return when
-                                   operation finishes.
-
-  @retval EFI_SUCCESS              The operation completed successfully.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_ACCESS_DENIED        One or more of the following are TRUE:
-                                   * Configure() has been called with TcpConfigData
-                                     set to NULL and this function has not returned.
-                                   * Previous Close() call on this instance has not
-                                     finished.
-  @retval EFI_INVALID_PARAMETER    One ore more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     Could not allocate enough resource to finish the
-                                   operation.
-  @retval EFI_DEVICE_ERROR         Any unexpected and not belonged to above
-                                   category error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Close (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN EFI_TCP4_CLOSE_TOKEN        *CloseToken
-  )
-{
-  SOCKET  *Sock;
-
-  if (NULL == This ||
-      NULL == CloseToken ||
-      NULL == CloseToken->CompletionToken.Event) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Sock = SOCK_FROM_THIS (This);
-
-  return SockClose (Sock, CloseToken, CloseToken->AbortOnClose);
-}
-
-
-/**
-  Abort an asynchronous connection, listen, transmission or receive request.
-
-  The Cancel() function aborts a pending connection, listen, transmit or receive
-  request. If Token is not NULL and the token is in the connection, listen,
-  transmission or receive queue when it is being cancelled, its Token->Status
-  will be set to EFI_ABORTED and then Token->Event will be signaled. If the token
-  is not in one of the queues, which usually means that the asynchronous operation
-  has completed, EFI_NOT_FOUND is returned. If Token is NULL all asynchronous token
-  issued by Connect(), Accept(), Transmit() and Receive()will be aborted.
-  NOTE: It has not been implemented currently.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  Token                    Pointer to a token that has been issued by
-                                   Connect(), Accept(), Transmit() or Receive(). If
-                                   NULL, all pending tokens issued by above four
-                                   functions will be aborted.
-
-  @retval  EFI_SUCCESS             The asynchronous I/O request is aborted and Token->Event
-                                   is signaled.
-  @retval  EFI_INVALID_PARAMETER   This is NULL.
-  @retval  EFI_NOT_STARTED         This instance hasn's been configured.
-  @retval  EFI_NO_MAPPING          When using the default address, configuration
-                                   (DHCP, BOOTP,RARP, etc.) hasn's finished yet.
-  @retval  EFI_NOT_FOUND           The asynchronous I/O request isn's found in the
-                                   transmission or receive queue. It has either
-                                   completed or wasn's issued by Transmit() and Receive().
-  @retval  EFI_UNSUPPORTED         The operation is not supported in current
-                                   implementation.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Cancel (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN EFI_TCP4_COMPLETION_TOKEN   *Token    OPTIONAL
-  )
-{
-  return EFI_UNSUPPORTED;
-}
-
-
-/**
-  Poll to receive incoming data and transmit outgoing segments.
-
-  The Poll() function increases the rate that data is moved between the network
-  and application and can be called when the TCP instance is created successfully.
-  Its use is optional. In some implementations, the periodical timer in the MNP
-  driver may not poll the underlying communications device fast enough to avoid
-  drop packets. Drivers and applications that are experiencing packet loss should
-  try calling the Poll() function in a high frequency.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-
-  @retval EFI_SUCCESS              Incoming or outgoing data was processed.
-  @retval EFI_INVALID_PARAMETER    This is NULL.
-  @retval EFI_DEVICE_ERROR         An unexpected system or network error occurred.
-  @retval EFI_NOT_READY            No incoming or outgoing data was processed.
-  @retval EFI_TIMEOUT              Data was dropped out of the transmission or
-                                   receive queue. Consider increasing the polling
-                                   rate.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Poll (
-  IN EFI_TCP4_PROTOCOL        *This
-  )
-{
-  SOCKET      *Sock;
-  EFI_STATUS  Status;
-
-  if (NULL == This) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Sock    = SOCK_FROM_THIS (This);
-
-  Status  = Sock->ProtoHandler (Sock, SOCK_POLL, NULL);
-
-  return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
deleted file mode 100644
index 7fd8bb1fbe09..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
+++ /dev/null
@@ -1,940 +0,0 @@
-/** @file
-  Misc support routines for tcp.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-#include <Library/DevicePathLib.h>
-
-LIST_ENTRY      mTcpRunQue = {
-  &mTcpRunQue,
-  &mTcpRunQue
-};
-
-LIST_ENTRY      mTcpListenQue = {
-  &mTcpListenQue,
-  &mTcpListenQue
-};
-
-TCP_SEQNO       mTcpGlobalIss = 0x4d7e980b;
-
-CHAR16   *mTcpStateName[] = {
-  L"TCP_CLOSED",
-  L"TCP_LISTEN",
-  L"TCP_SYN_SENT",
-  L"TCP_SYN_RCVD",
-  L"TCP_ESTABLISHED",
-  L"TCP_FIN_WAIT_1",
-  L"TCP_FIN_WAIT_2",
-  L"TCP_CLOSING",
-  L"TCP_TIME_WAIT",
-  L"TCP_CLOSE_WAIT",
-  L"TCP_LAST_ACK"
-};
-
-
-/**
-  Initialize the Tcb local related members.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpInitTcbLocal (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  //
-  // Compute the checksum of the fixed parts of pseudo header
-  //
-  Tcb->HeadSum = NetPseudoHeadChecksum (
-                  Tcb->LocalEnd.Ip,
-                  Tcb->RemoteEnd.Ip,
-                  0x06,
-                  0
-                  );
-
-  Tcb->Iss    = TcpGetIss ();
-  Tcb->SndUna = Tcb->Iss;
-  Tcb->SndNxt = Tcb->Iss;
-
-  Tcb->SndWl2 = Tcb->Iss;
-  Tcb->SndWnd = 536;
-
-  Tcb->RcvWnd = GET_RCV_BUFFSIZE (Tcb->Sk);
-
-  //
-  // First window size is never scaled
-  //
-  Tcb->RcvWndScale  = 0;
-  Tcb->RetxmitSeqMax = 0;
-
-  Tcb->ProbeTimerOn = FALSE;
-}
-
-
-/**
-  Initialize the peer related members.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-  @param  Seg                   Pointer to the segment that contains the peer's
-                                intial info.
-  @param  Opt                   Pointer to the options announced by the peer.
-
-**/
-VOID
-TcpInitTcbPeer (
-  IN OUT TCP_CB     *Tcb,
-  IN     TCP_SEG    *Seg,
-  IN     TCP_OPTION *Opt
-  )
-{
-  UINT16  RcvMss;
-
-  ASSERT ((Tcb != NULL) && (Seg != NULL) && (Opt != NULL));
-  ASSERT (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN));
-
-  Tcb->SndWnd     = Seg->Wnd;
-  Tcb->SndWndMax  = Tcb->SndWnd;
-  Tcb->SndWl1     = Seg->Seq;
-
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
-    Tcb->SndWl2 = Seg->Ack;
-  } else {
-    Tcb->SndWl2 = Tcb->Iss + 1;
-  }
-
-  if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_MSS)) {
-    Tcb->SndMss = (UINT16) MAX (64, Opt->Mss);
-
-    RcvMss = TcpGetRcvMss (Tcb->Sk);
-    if (Tcb->SndMss > RcvMss) {
-      Tcb->SndMss = RcvMss;
-    }
-
-  } else {
-    //
-    // One end doesn't support MSS option, use default.
-    //
-    Tcb->RcvMss = 536;
-  }
-
-  Tcb->CWnd   = Tcb->SndMss;
-
-  Tcb->Irs    = Seg->Seq;
-  Tcb->RcvNxt = Tcb->Irs + 1;
-
-  Tcb->RcvWl2 = Tcb->RcvNxt;
-
-  if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_WS) &&
-      !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)) {
-
-    Tcb->SndWndScale  = Opt->WndScale;
-
-    Tcb->RcvWndScale  = TcpComputeScale (Tcb);
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS);
-
-  } else {
-    //
-    // One end doesn't support window scale option. use zero.
-    //
-    Tcb->RcvWndScale = 0;
-  }
-
-  if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_TS) &&
-      !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)) {
-
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_TS);
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS);
-
-    Tcb->TsRecent = Opt->TSVal;
-
-    //
-    // Compute the effective SndMss per RFC1122
-    // section 4.2.2.6. If timestamp option is
-    // enabled, it will always occupy 12 bytes.
-    //
-    Tcb->SndMss -= TCP_OPTION_TS_ALIGNED_LEN;
-  }
-}
-
-
-/**
-  Locate a listen TCB that matchs the Local and Remote.
-
-  @param  Local                 Pointer to the local (IP, Port).
-  @param  Remote                Pointer to the remote (IP, Port).
-
-  @return  Pointer to the TCP_CB with the least number of wildcard,
-           if NULL no match is found.
-
-**/
-TCP_CB *
-TcpLocateListenTcb (
-  IN TCP_PEER *Local,
-  IN TCP_PEER *Remote
-  )
-{
-  LIST_ENTRY      *Entry;
-  TCP_CB          *Node;
-  TCP_CB          *Match;
-  INTN            Last;
-  INTN            Cur;
-
-  Last  = 4;
-  Match = NULL;
-
-  NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {
-    Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
-    if ((Local->Port != Node->LocalEnd.Port) ||
-        !TCP_PEER_MATCH (Remote, &Node->RemoteEnd) ||
-        !TCP_PEER_MATCH (Local, &Node->LocalEnd)) {
-
-      continue;
-    }
-
-    //
-    // Compute the number of wildcard
-    //
-    Cur = 0;
-    if (Node->RemoteEnd.Ip == 0) {
-      Cur++;
-    }
-
-    if (Node->RemoteEnd.Port == 0) {
-      Cur++;
-    }
-
-    if (Node->LocalEnd.Ip == 0) {
-      Cur++;
-    }
-
-    if (Cur < Last) {
-      if (Cur == 0) {
-        return Node;
-      }
-
-      Last  = Cur;
-      Match = Node;
-    }
-  }
-
-  return Match;
-}
-
-
-/**
-  Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>.
-
-  @param  Addr                  Pointer to the IP address needs to match.
-  @param  Port                  The port number needs to match.
-
-  @return  The Tcb which matches the <Addr Port> paire exists or not.
-
-**/
-BOOLEAN
-TcpFindTcbByPeer (
-  IN EFI_IPv4_ADDRESS  *Addr,
-  IN TCP_PORTNO        Port
-  )
-{
-  TCP_PORTNO      LocalPort;
-  LIST_ENTRY      *Entry;
-  TCP_CB          *Tcb;
-
-  ASSERT ((Addr != NULL) && (Port != 0));
-
-  LocalPort = HTONS (Port);
-
-  NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {
-    Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
-    if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&
-      (LocalPort == Tcb->LocalEnd.Port)) {
-
-      return TRUE;
-    }
-  }
-
-  NET_LIST_FOR_EACH (Entry, &mTcpRunQue) {
-    Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
-    if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&
-      (LocalPort == Tcb->LocalEnd.Port)) {
-
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
-
-
-/**
-  Locate the TCP_CB related to the socket pair.
-
-  @param  LocalPort             The local port number.
-  @param  LocalIp               The local IP address.
-  @param  RemotePort            The remote port number.
-  @param  RemoteIp              The remote IP address.
-  @param  Syn                   Whether to search the listen sockets, if TRUE, the
-                                listen sockets are searched.
-
-  @return  Pointer to the related TCP_CB, if NULL no match is found.
-
-**/
-TCP_CB *
-TcpLocateTcb (
-  IN TCP_PORTNO  LocalPort,
-  IN UINT32      LocalIp,
-  IN TCP_PORTNO  RemotePort,
-  IN UINT32      RemoteIp,
-  IN BOOLEAN     Syn
-  )
-{
-  TCP_PEER        Local;
-  TCP_PEER        Remote;
-  LIST_ENTRY      *Entry;
-  TCP_CB          *Tcb;
-
-  Local.Port  = LocalPort;
-  Local.Ip    = LocalIp;
-
-  Remote.Port = RemotePort;
-  Remote.Ip   = RemoteIp;
-
-  //
-  // First check for exact match.
-  //
-  NET_LIST_FOR_EACH (Entry, &mTcpRunQue) {
-    Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
-    if (TCP_PEER_EQUAL (&Remote, &Tcb->RemoteEnd) &&
-        TCP_PEER_EQUAL (&Local, &Tcb->LocalEnd)) {
-
-      RemoveEntryList (&Tcb->List);
-      InsertHeadList (&mTcpRunQue, &Tcb->List);
-
-      return Tcb;
-    }
-  }
-
-  //
-  // Only check listen queue when SYN flag is on
-  //
-  if (Syn) {
-    return TcpLocateListenTcb (&Local, &Remote);
-  }
-
-  return NULL;
-}
-
-
-/**
-  Insert a Tcb into the proper queue.
-
-  @param  Tcb                   Pointer to the TCP_CB to be inserted.
-
-  @retval 0                     The Tcb is inserted successfully.
-  @retval -1                    Error condition occurred.
-
-**/
-INTN
-TcpInsertTcb (
-  IN TCP_CB *Tcb
-  )
-{
-  LIST_ENTRY       *Entry;
-  LIST_ENTRY       *Head;
-  TCP_CB           *Node;
-
-  ASSERT (
-    (Tcb != NULL) &&
-    ((Tcb->State == TCP_LISTEN) ||
-     (Tcb->State == TCP_SYN_SENT) ||
-     (Tcb->State == TCP_SYN_RCVD) ||
-     (Tcb->State == TCP_CLOSED))
-    );
-
-  if (Tcb->LocalEnd.Port == 0) {
-    return -1;
-  }
-
-  Head = &mTcpRunQue;
-
-  if (Tcb->State == TCP_LISTEN) {
-    Head = &mTcpListenQue;
-  }
-
-  //
-  // Check that Tcb isn't already on the list.
-  //
-  NET_LIST_FOR_EACH (Entry, Head) {
-    Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
-    if (TCP_PEER_EQUAL (&Tcb->LocalEnd, &Node->LocalEnd) &&
-        TCP_PEER_EQUAL (&Tcb->RemoteEnd, &Node->RemoteEnd)) {
-
-      return -1;
-    }
-  }
-
-  InsertHeadList (Head, &Tcb->List);
-
-  return 0;
-}
-
-
-/**
-  Clone a TCB_CB from Tcb.
-
-  @param  Tcb                   Pointer to the TCP_CB to be cloned.
-
-  @return  Pointer to the new cloned TCP_CB, if NULL error condition occurred.
-
-**/
-TCP_CB *
-TcpCloneTcb (
-  IN TCP_CB *Tcb
-  )
-{
-  TCP_CB               *Clone;
-
-  Clone = AllocatePool (sizeof (TCP_CB));
-
-  if (Clone == NULL) {
-    return NULL;
-
-  }
-
-  CopyMem (Clone, Tcb, sizeof (TCP_CB));
-
-  //
-  // Increate the reference count of the shared IpInfo.
-  //
-  NET_GET_REF (Tcb->IpInfo);
-
-  InitializeListHead (&Clone->List);
-  InitializeListHead (&Clone->SndQue);
-  InitializeListHead (&Clone->RcvQue);
-
-  Clone->Sk = SockClone (Tcb->Sk);
-  if (Clone->Sk == NULL) {
-    DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n"));
-    FreePool (Clone);
-    return NULL;
-  }
-
-  ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone;
-
-  return Clone;
-}
-
-
-/**
-  Compute an ISS to be used by a new connection.
-
-  @return  The result ISS.
-
-**/
-TCP_SEQNO
-TcpGetIss (
-  VOID
-  )
-{
-  mTcpGlobalIss += 2048;
-  return mTcpGlobalIss;
-}
-
-
-/**
-  Get the local mss.
-
-  @param  Sock        Pointer to the socket to get mss
-
-  @return  The mss size.
-
-**/
-UINT16
-TcpGetRcvMss (
-  IN SOCKET  *Sock
-  )
-{
-  EFI_IP4_MODE_DATA       Ip4Mode;
-  TCP4_PROTO_DATA         *TcpProto;
-  EFI_IP4_PROTOCOL        *Ip;
-
-  ASSERT (Sock != NULL);
-
-  TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
-  Ip       = TcpProto->TcpService->IpIo->Ip.Ip4;
-  ASSERT (Ip != NULL);
-
-  Ip->GetModeData (Ip, &Ip4Mode, NULL, NULL);
-
-  return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD));
-}
-
-
-/**
-  Set the Tcb's state.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-  @param  State                 The state to be set.
-
-**/
-VOID
-TcpSetState (
-  IN OUT TCP_CB  *Tcb,
-  IN     UINT8   State
-  )
-{
-  ASSERT (Tcb->State < (sizeof (mTcpStateName) / sizeof (CHAR16 *)));
-  ASSERT (State < (sizeof (mTcpStateName) / sizeof (CHAR16 *)));
-
-  DEBUG (
-    (EFI_D_NET,
-    "Tcb (%p) state %s --> %s\n",
-    Tcb,
-    mTcpStateName[Tcb->State],
-    mTcpStateName[State])
-    );
-
-  Tcb->State = State;
-
-  switch (State) {
-  case TCP_ESTABLISHED:
-
-    SockConnEstablished (Tcb->Sk);
-
-    if (Tcb->Parent != NULL) {
-      //
-      // A new connection is accepted by a listening socket, install
-      // the device path.
-      //
-      TcpInstallDevicePath (Tcb->Sk);
-    }
-
-    break;
-
-  case TCP_CLOSED:
-
-    SockConnClosed (Tcb->Sk);
-
-    break;
-  default:
-    break;
-  }
-}
-
-
-/**
-  Compute the TCP segment's checksum.
-
-  @param  Nbuf                  Pointer to the buffer that contains the TCP
-                                segment.
-  @param  HeadSum               The checksum value of the fixed part of pseudo
-                                header.
-
-  @return  The checksum value.
-
-**/
-UINT16
-TcpChecksum (
-  IN NET_BUF *Nbuf,
-  IN UINT16  HeadSum
-  )
-{
-  UINT16  Checksum;
-
-  Checksum  = NetbufChecksum (Nbuf);
-  Checksum  = NetAddChecksum (Checksum, HeadSum);
-
-  Checksum  = NetAddChecksum (
-                Checksum,
-                HTONS ((UINT16) Nbuf->TotalSize)
-                );
-
-  return (UINT16) ~Checksum;
-}
-
-/**
-  Translate the information from the head of the received TCP
-  segment Nbuf contains and fill it into a TCP_SEG structure.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf                  Pointer to the buffer contains the TCP segment.
-
-  @return  Pointer to the TCP_SEG that contains the translated TCP head information.
-
-**/
-TCP_SEG *
-TcpFormatNetbuf (
-  IN     TCP_CB  *Tcb,
-  IN OUT NET_BUF *Nbuf
-  )
-{
-  TCP_SEG   *Seg;
-  TCP_HEAD  *Head;
-
-  Seg       = TCPSEG_NETBUF (Nbuf);
-  Head      = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL);
-  ASSERT (Head != NULL);
-  Nbuf->Tcp = Head;
-
-  Seg->Seq  = NTOHL (Head->Seq);
-  Seg->Ack  = NTOHL (Head->Ack);
-  Seg->End  = Seg->Seq + (Nbuf->TotalSize - (Head->HeadLen << 2));
-
-  Seg->Urg  = NTOHS (Head->Urg);
-  Seg->Wnd  = (NTOHS (Head->Wnd) << Tcb->SndWndScale);
-  Seg->Flag = Head->Flag;
-
-  //
-  // SYN and FIN flag occupy one sequence space each.
-  //
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-    //
-    // RFC requires that initial window not be scaled
-    //
-    Seg->Wnd = NTOHS (Head->Wnd);
-    Seg->End++;
-  }
-
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
-    Seg->End++;
-  }
-
-  return Seg;
-}
-
-
-/**
-  Reset the connection related with Tcb.
-
-  @param  Tcb                   Pointer to the TCP_CB of the connection to be
-                                reset.
-
-**/
-VOID
-TcpResetConnection (
-  IN TCP_CB *Tcb
-  )
-{
-  NET_BUF   *Nbuf;
-  TCP_HEAD  *Nhead;
-
-  Nbuf = NetbufAlloc (TCP_MAX_HEAD);
-
-  if (Nbuf == NULL) {
-    return ;
-  }
-
-  Nhead = (TCP_HEAD *) NetbufAllocSpace (
-                        Nbuf,
-                        sizeof (TCP_HEAD),
-                        NET_BUF_TAIL
-                        );
-
-  ASSERT (Nhead != NULL);
-
-  Nbuf->Tcp       = Nhead;
-
-  Nhead->Flag     = TCP_FLG_RST;
-  Nhead->Seq      = HTONL (Tcb->SndNxt);
-  Nhead->Ack      = HTONL (Tcb->RcvNxt);
-  Nhead->SrcPort  = Tcb->LocalEnd.Port;
-  Nhead->DstPort  = Tcb->RemoteEnd.Port;
-  Nhead->HeadLen  = (UINT8) (sizeof (TCP_HEAD) >> 2);
-  Nhead->Res      = 0;
-  Nhead->Wnd      = HTONS (0xFFFF);
-  Nhead->Checksum = 0;
-  Nhead->Urg      = 0;
-  Nhead->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum);
-
-  TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip);
-
-  NetbufFree (Nbuf);
-}
-
-
-/**
-  Initialize an active connection.
-
-  @param  Tcb                   Pointer to the TCP_CB that wants to initiate a
-                                connection.
-
-**/
-VOID
-TcpOnAppConnect (
-  IN OUT TCP_CB  *Tcb
-  )
-{
-  TcpInitTcbLocal (Tcb);
-  TcpSetState (Tcb, TCP_SYN_SENT);
-
-  TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout);
-  TcpToSendData (Tcb, 1);
-}
-
-
-/**
-  Initiate the connection close procedure, called when
-  applications want to close the connection.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpOnAppClose (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  ASSERT (Tcb != NULL);
-
-  if (!IsListEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk) != 0) {
-
-    DEBUG ((EFI_D_WARN, "TcpOnAppClose: connection reset "
-      "because data is lost for TCB %p\n", Tcb));
-
-    TcpResetConnection (Tcb);
-    TcpClose (Tcb);
-    return;
-  }
-
-  switch (Tcb->State) {
-  case TCP_CLOSED:
-  case TCP_LISTEN:
-  case TCP_SYN_SENT:
-    TcpSetState (Tcb, TCP_CLOSED);
-    break;
-
-  case TCP_SYN_RCVD:
-  case TCP_ESTABLISHED:
-    TcpSetState (Tcb, TCP_FIN_WAIT_1);
-    break;
-
-  case TCP_CLOSE_WAIT:
-    TcpSetState (Tcb, TCP_LAST_ACK);
-    break;
-  default:
-    break;
-  }
-
-  TcpToSendData (Tcb, 1);
-}
-
-
-/**
-  Check whether the application's newly delivered data can be sent out.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-
-  @retval 0                     Whether the data is sent out or is buffered for
-                                further sending.
-  @retval -1                    The Tcb is not in a state that data is permitted to
-                                be sent out.
-
-**/
-INTN
-TcpOnAppSend (
-  IN OUT TCP_CB *Tcb
-  )
-{
-
-  switch (Tcb->State) {
-  case TCP_CLOSED:
-    return -1;
-
-  case TCP_LISTEN:
-    return -1;
-
-  case TCP_SYN_SENT:
-  case TCP_SYN_RCVD:
-    return 0;
-
-  case TCP_ESTABLISHED:
-  case TCP_CLOSE_WAIT:
-    TcpToSendData (Tcb, 0);
-    return 0;
-
-  case TCP_FIN_WAIT_1:
-  case TCP_FIN_WAIT_2:
-  case TCP_CLOSING:
-  case TCP_LAST_ACK:
-  case TCP_TIME_WAIT:
-    return -1;
-
-  default:
-    break;
-  }
-
-  return 0;
-}
-
-
-/**
-  Application has consumed some data, check whether
-  to send a window updata ack or a delayed ack.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpOnAppConsume (
-  IN TCP_CB *Tcb
-  )
-{
-  UINT32 TcpOld;
-
-  switch (Tcb->State) {
-  case TCP_CLOSED:
-    return;
-
-  case TCP_LISTEN:
-    return;
-
-  case TCP_SYN_SENT:
-  case TCP_SYN_RCVD:
-    return;
-
-  case TCP_ESTABLISHED:
-    TcpOld = TcpRcvWinOld (Tcb);
-    if (TcpRcvWinNow (Tcb) > TcpOld) {
-
-      if (TcpOld < Tcb->RcvMss) {
-
-        DEBUG ((EFI_D_NET, "TcpOnAppConsume: send a window"
-          " update for a window closed Tcb %p\n", Tcb));
-
-        TcpSendAck (Tcb);
-      } else if (Tcb->DelayedAck == 0) {
-
-        DEBUG ((EFI_D_NET, "TcpOnAppConsume: scheduled a delayed"
-          " ACK to update window for Tcb %p\n", Tcb));
-
-        Tcb->DelayedAck = 1;
-      }
-    }
-
-    break;
-
-  case TCP_CLOSE_WAIT:
-    return;
-
-  case TCP_FIN_WAIT_1:
-  case TCP_FIN_WAIT_2:
-  case TCP_CLOSING:
-  case TCP_LAST_ACK:
-  case TCP_TIME_WAIT:
-    return;
-
-  default:
-    break;
-  }
-}
-
-
-/**
-  Abort the connection by sending a reset segment, called
-  when the application wants to abort the connection.
-
-  @param  Tcb                   Pointer to the TCP_CB of the TCP instance.
-
-**/
-VOID
-TcpOnAppAbort (
-  IN TCP_CB *Tcb
-  )
-{
-  DEBUG ((EFI_D_WARN, "TcpOnAppAbort: connection reset "
-    "issued by application for TCB %p\n", Tcb));
-
-  switch (Tcb->State) {
-  case TCP_SYN_RCVD:
-  case TCP_ESTABLISHED:
-  case TCP_FIN_WAIT_1:
-  case TCP_FIN_WAIT_2:
-  case TCP_CLOSE_WAIT:
-    TcpResetConnection (Tcb);
-    break;
-  default:
-    break;
-  }
-
-  TcpSetState (Tcb, TCP_CLOSED);
-}
-
-/**
-  Install the device path protocol on the TCP instance.
-
-  @param  Sock             Pointer to the socket representing the TCP instance.
-
-  @retval  EFI_SUCCESS     The device path protocol is installed.
-  @retval  other           Failed to install the device path protocol.
-
-**/
-EFI_STATUS
-TcpInstallDevicePath (
-  IN SOCKET *Sock
-  )
-{
-  TCP4_PROTO_DATA    *TcpProto;
-  TCP4_SERVICE_DATA  *TcpService;
-  TCP_CB             *Tcb;
-  IPv4_DEVICE_PATH   Ip4DPathNode;
-  EFI_STATUS         Status;
-  TCP_PORTNO         LocalPort;
-  TCP_PORTNO         RemotePort;
-
-  TcpProto   = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
-  TcpService = TcpProto->TcpService;
-  Tcb        = TcpProto->TcpPcb;
-
-  LocalPort = NTOHS (Tcb->LocalEnd.Port);
-  RemotePort = NTOHS (Tcb->RemoteEnd.Port);
-  NetLibCreateIPv4DPathNode (
-    &Ip4DPathNode,
-    TcpService->ControllerHandle,
-    Tcb->LocalEnd.Ip,
-    LocalPort,
-    Tcb->RemoteEnd.Ip,
-    RemotePort,
-    EFI_IP_PROTO_TCP,
-    Tcb->UseDefaultAddr
-    );
-
-  IP4_COPY_ADDRESS (&Ip4DPathNode.SubnetMask, &Tcb->SubnetMask);
-
-  Sock->DevicePath = AppendDevicePathNode (
-                       Sock->ParentDevicePath,
-                       (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode
-                       );
-  if (Sock->DevicePath == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Status = gBS->InstallProtocolInterface (
-                  &Sock->SockHandle,
-                  &gEfiDevicePathProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  Sock->DevicePath
-                  );
-  if (EFI_ERROR (Status)) {
-    FreePool (Sock->DevicePath);
-  }
-
-  return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c
deleted file mode 100644
index e84310f6c693..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/** @file
-  Routines to process TCP option.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-/**
-    Get a UINT16 value from buffer.
-
-    @param Buf                  Pointer to input buffer.
-
-    @return                     The UINT16 value get from buffer.
-
-**/
-UINT16
-TcpGetUint16 (
-  IN UINT8 *Buf
-  )
-{
-  UINT16  Value;
-  CopyMem (&Value, Buf, sizeof (UINT16));
-  return NTOHS (Value);
-}
-
-/**
-    Get a UINT32 value from buffer.
-
-    @param Buf                  Pointer to input buffer.
-
-    @return                     The UINT32 value get from buffer.
-
-**/
-UINT32
-TcpGetUint32 (
-  IN UINT8 *Buf
-  )
-{
-  UINT32  Value;
-  CopyMem (&Value, Buf, sizeof (UINT32));
-  return NTOHL (Value);
-}
-
-/**
-    Put a UINT32 value in buffer.
-
-    @param Buf                  Pointer to the buffer.
-    @param Data                 The UINT32 Date to put in buffer
-
-**/
-VOID
-TcpPutUint32 (
-     OUT UINT8  *Buf,
-  IN     UINT32 Data
-  )
-{
-  Data = HTONL (Data);
-  CopyMem (Buf, &Data, sizeof (UINT32));
-}
-
-
-/**
-  Compute the window scale value according to the given buffer size.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @return         The scale value.
-
-**/
-UINT8
-TcpComputeScale (
-  IN TCP_CB *Tcb
-  )
-{
-  UINT8   Scale;
-  UINT32  BufSize;
-
-  ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
-
-  BufSize = GET_RCV_BUFFSIZE (Tcb->Sk);
-
-  Scale   = 0;
-  while ((Scale < TCP_OPTION_MAX_WS) &&
-         ((UINT32) (TCP_OPTION_MAX_WIN << Scale) < BufSize)) {
-
-    Scale++;
-  }
-
-  return Scale;
-}
-
-
-/**
-  Build the TCP option in three-way handshake.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf    Pointer to the buffer to store the options.
-
-  @return         The total length of the TCP option field.
-
-**/
-UINT16
-TcpSynBuildOption (
-  IN TCP_CB  *Tcb,
-  IN NET_BUF *Nbuf
-  )
-{
-  UINT8   *Data;
-  UINT16  Len;
-
-  ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL));
-
-  Len = 0;
-
-  //
-  // Add timestamp option if not disabled by application
-  // and it is the first SYN segment or the peer has sent
-  // us its timestamp.
-  //
-  if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS) &&
-      (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) ||
-        TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS))) {
-
-    Data = NetbufAllocSpace (
-            Nbuf,
-            TCP_OPTION_TS_ALIGNED_LEN,
-            NET_BUF_HEAD
-            );
-
-    ASSERT (Data != NULL);
-    Len += TCP_OPTION_TS_ALIGNED_LEN;
-
-    TcpPutUint32 (Data, TCP_OPTION_TS_FAST);
-    TcpPutUint32 (Data + 4, mTcpTick);
-    TcpPutUint32 (Data + 8, 0);
-  }
-
-  //
-  // Build window scale option, only when are configured
-  // to send WS option, and either we are doing active
-  // open or we have received WS option from peer.
-  //
-  if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS) &&
-      (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) ||
-        TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS))) {
-
-    Data = NetbufAllocSpace (
-            Nbuf,
-            TCP_OPTION_WS_ALIGNED_LEN,
-            NET_BUF_HEAD
-            );
-
-    ASSERT (Data != NULL);
-
-    Len += TCP_OPTION_WS_ALIGNED_LEN;
-    TcpPutUint32 (Data, TCP_OPTION_WS_FAST | TcpComputeScale (Tcb));
-  }
-
-  //
-  // Build MSS option
-  //
-  Data = NetbufAllocSpace (Nbuf, TCP_OPTION_MSS_LEN, 1);
-  ASSERT (Data != NULL);
-
-  Len += TCP_OPTION_MSS_LEN;
-  TcpPutUint32 (Data, TCP_OPTION_MSS_FAST | Tcb->RcvMss);
-
-  return Len;
-}
-
-
-/**
-  Build the TCP option in synchronized states.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf    Pointer to the buffer to store the options.
-
-  @return         The total length of the TCP option field.
-
-**/
-UINT16
-TcpBuildOption (
-  IN TCP_CB  *Tcb,
-  IN NET_BUF *Nbuf
-  )
-{
-  UINT8   *Data;
-  UINT16  Len;
-
-  ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL));
-  Len = 0;
-
-  //
-  // Build Timestamp option
-  //
-  if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_TS) &&
-      !TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_RST)) {
-
-    Data = NetbufAllocSpace (
-            Nbuf,
-            TCP_OPTION_TS_ALIGNED_LEN,
-            NET_BUF_HEAD
-            );
-
-    ASSERT (Data != NULL);
-    Len += TCP_OPTION_TS_ALIGNED_LEN;
-
-    TcpPutUint32 (Data, TCP_OPTION_TS_FAST);
-    TcpPutUint32 (Data + 4, mTcpTick);
-    TcpPutUint32 (Data + 8, Tcb->TsRecent);
-  }
-
-  return Len;
-}
-
-
-/**
-  Parse the supported options.
-
-  @param  Tcp     Pointer to the TCP_CB of this TCP instance.
-  @param  Option  Pointer to the TCP_OPTION used to store the successfully pasrsed
-                  options.
-
-  @retval 0       The options are successfully pasrsed.
-  @retval -1      Ilegal option was found.
-
-**/
-INTN
-TcpParseOption (
-  IN     TCP_HEAD   *Tcp,
-  IN OUT TCP_OPTION *Option
-  )
-{
-  UINT8 *Head;
-  UINT8 TotalLen;
-  UINT8 Cur;
-  UINT8 Type;
-  UINT8 Len;
-
-  ASSERT ((Tcp != NULL) && (Option != NULL));
-
-  Option->Flag  = 0;
-
-  TotalLen      = (UINT8) ((Tcp->HeadLen << 2) - sizeof (TCP_HEAD));
-  if (TotalLen <= 0) {
-    return 0;
-  }
-
-  Head = (UINT8 *) (Tcp + 1);
-
-  //
-  // Fast process of timestamp option
-  //
-  if ((TotalLen == TCP_OPTION_TS_ALIGNED_LEN) &&
-      (TcpGetUint32 (Head) == TCP_OPTION_TS_FAST)) {
-
-    Option->TSVal = TcpGetUint32 (Head + 4);
-    Option->TSEcr = TcpGetUint32 (Head + 8);
-    Option->Flag  = TCP_OPTION_RCVD_TS;
-
-    return 0;
-  }
-
-  //
-  // Slow path to process the options.
-  //
-  Cur = 0;
-
-  while (Cur < TotalLen) {
-    Type = Head[Cur];
-
-    switch (Type) {
-    case TCP_OPTION_MSS:
-      Len = Head[Cur + 1];
-
-      if ((Len != TCP_OPTION_MSS_LEN) ||
-          (TotalLen - Cur < TCP_OPTION_MSS_LEN)) {
-
-        return -1;
-      }
-
-      Option->Mss = TcpGetUint16 (&Head[Cur + 2]);
-      TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_MSS);
-
-      Cur += TCP_OPTION_MSS_LEN;
-      break;
-
-    case TCP_OPTION_WS:
-      Len = Head[Cur + 1];
-
-      if ((Len != TCP_OPTION_WS_LEN) ||
-          (TotalLen - Cur < TCP_OPTION_WS_LEN)) {
-
-        return -1;
-      }
-
-      Option->WndScale = (UINT8) MIN (14, Head[Cur + 2]);
-      TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_WS);
-
-      Cur += TCP_OPTION_WS_LEN;
-      break;
-
-    case TCP_OPTION_TS:
-      Len = Head[Cur + 1];
-
-      if ((Len != TCP_OPTION_TS_LEN) ||
-          (TotalLen - Cur < TCP_OPTION_TS_LEN)) {
-
-        return -1;
-      }
-
-      Option->TSVal = TcpGetUint32 (&Head[Cur + 2]);
-      Option->TSEcr = TcpGetUint32 (&Head[Cur + 6]);
-      TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_TS);
-
-      Cur += TCP_OPTION_TS_LEN;
-      break;
-
-    case TCP_OPTION_NOP:
-      Cur++;
-      break;
-
-    case TCP_OPTION_EOP:
-      Cur = TotalLen;
-      break;
-
-    default:
-      Len = Head[Cur + 1];
-
-      if ((TotalLen - Cur) < Len || Len < 2) {
-        return -1;
-      }
-
-      Cur = (UINT8) (Cur + Len);
-      break;
-    }
-
-  }
-
-  return 0;
-}
-
-
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c
deleted file mode 100644
index 760b09a1eda1..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c
+++ /dev/null
@@ -1,1238 +0,0 @@
-/** @file
-  TCP output process routines.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-UINT8  mTcpOutFlag[] = {
-  0,                          // TCP_CLOSED
-  0,                          // TCP_LISTEN
-  TCP_FLG_SYN,                // TCP_SYN_SENT
-  TCP_FLG_SYN | TCP_FLG_ACK,  // TCP_SYN_RCVD
-  TCP_FLG_ACK,                // TCP_ESTABLISHED
-  TCP_FLG_FIN | TCP_FLG_ACK,  // TCP_FIN_WAIT_1
-  TCP_FLG_ACK,                // TCP_FIN_WAIT_2
-  TCP_FLG_ACK | TCP_FLG_FIN,  // TCP_CLOSING
-  TCP_FLG_ACK,                // TCP_TIME_WAIT
-  TCP_FLG_ACK,                // TCP_CLOSE_WAIT
-  TCP_FLG_FIN | TCP_FLG_ACK   // TCP_LAST_ACK
-};
-
-
-/**
-  Compute the sequence space left in the old receive window.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @return The sequence space left in the old receive window.
-
-**/
-UINT32
-TcpRcvWinOld (
-  IN TCP_CB *Tcb
-  )
-{
-  UINT32  OldWin;
-
-  OldWin = 0;
-
-  if (TCP_SEQ_GT (Tcb->RcvWl2 + Tcb->RcvWnd, Tcb->RcvNxt)) {
-
-    OldWin = TCP_SUB_SEQ (
-              Tcb->RcvWl2 + Tcb->RcvWnd,
-              Tcb->RcvNxt
-              );
-  }
-
-  return OldWin;
-}
-
-
-/**
-  Compute the current receive window.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @return The size of the current receive window, in bytes.
-
-**/
-UINT32
-TcpRcvWinNow (
-  IN TCP_CB *Tcb
-  )
-{
-  SOCKET  *Sk;
-  UINT32  Win;
-  UINT32  Increase;
-  UINT32  OldWin;
-
-  Sk = Tcb->Sk;
-  ASSERT (Sk != NULL);
-
-  OldWin    = TcpRcvWinOld (Tcb);
-
-  Win       = SockGetFreeSpace (Sk, SOCK_RCV_BUF);
-
-  Increase  = 0;
-  if (Win > OldWin) {
-    Increase = Win - OldWin;
-  }
-
-  //
-  // Receiver's SWS: don't advertise a bigger window
-  // unless it can be increased by at least one Mss or
-  // half of the receive buffer.
-  //
-  if ((Increase > Tcb->SndMss) ||
-      (2 * Increase >= GET_RCV_BUFFSIZE (Sk))) {
-
-    return Win;
-  }
-
-  return OldWin;
-}
-
-
-/**
-  Compute the value to fill in the window size field of the outgoing segment.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Syn     The flag to indicate whether the outgoing segment is a SYN
-                  segment.
-
-  @return The value of the local receive window size used to fill the outing segment.
-
-**/
-UINT16
-TcpComputeWnd (
-  IN OUT TCP_CB  *Tcb,
-  IN     BOOLEAN Syn
-  )
-{
-  UINT32  Wnd;
-
-  //
-  // RFC requires that initial window not be scaled
-  //
-  if (Syn) {
-
-    Wnd = GET_RCV_BUFFSIZE (Tcb->Sk);
-  } else {
-
-    Wnd         = TcpRcvWinNow (Tcb);
-
-    Tcb->RcvWnd = Wnd;
-  }
-
-  Wnd = MIN (Wnd >> Tcb->RcvWndScale, 0xffff);
-  return NTOHS ((UINT16) Wnd);
-}
-
-
-/**
-  Get the maximum SndNxt.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @return The sequence number of the maximum SndNxt.
-
-**/
-TCP_SEQNO
-TcpGetMaxSndNxt (
-  IN TCP_CB *Tcb
-  )
-{
-  LIST_ENTRY      *Entry;
-  NET_BUF         *Nbuf;
-
-  if (IsListEmpty (&Tcb->SndQue)) {
-    return Tcb->SndNxt;
-  }
-
-  Entry = Tcb->SndQue.BackLink;
-  Nbuf  = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
-
-  ASSERT (TCP_SEQ_GEQ (TCPSEG_NETBUF (Nbuf)->End, Tcb->SndNxt));
-  return TCPSEG_NETBUF (Nbuf)->End;
-}
-
-
-/**
-  Compute how much data to send.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Force   Whether to ignore the sender's SWS avoidance algorithm and send
-                  out data by force.
-
-  @return The length of the data can be sent, if 0, no data can be sent.
-
-**/
-UINT32
-TcpDataToSend (
-  IN TCP_CB *Tcb,
-  IN INTN   Force
-  )
-{
-  SOCKET  *Sk;
-  UINT32  Win;
-  UINT32  Len;
-  UINT32  Left;
-  UINT32  Limit;
-
-  Sk = Tcb->Sk;
-  ASSERT (Sk != NULL);
-
-  //
-  // TCP should NOT send data beyond the send window
-  // and congestion window. The right edge of send
-  // window is defined as SND.WL2 + SND.WND. The right
-  // edge of congestion window is defined as SND.UNA +
-  // CWND.
-  //
-  Win   = 0;
-  Limit = Tcb->SndWl2 + Tcb->SndWnd;
-
-  if (TCP_SEQ_GT (Limit, Tcb->SndUna + Tcb->CWnd)) {
-
-    Limit = Tcb->SndUna + Tcb->CWnd;
-  }
-
-  if (TCP_SEQ_GT (Limit, Tcb->SndNxt)) {
-    Win = TCP_SUB_SEQ (Limit, Tcb->SndNxt);
-  }
-
-  //
-  // The data to send contains two parts: the data on the
-  // socket send queue, and the data on the TCB's send
-  // buffer. The later can be non-zero if the peer shrinks
-  // its advertised window.
-  //
-  Left  = GET_SND_DATASIZE (Sk) +
-          TCP_SUB_SEQ (TcpGetMaxSndNxt (Tcb), Tcb->SndNxt);
-
-  Len   = MIN (Win, Left);
-
-  if (Len > Tcb->SndMss) {
-    Len = Tcb->SndMss;
-  }
-
-  if ((Force != 0)|| (Len == 0 && Left == 0)) {
-    return Len;
-  }
-
-  if (Len == 0 && Left != 0) {
-    goto SetPersistTimer;
-  }
-
-  //
-  // Sender's SWS avoidance: Don't send a small segment unless
-  // a)A full-sized segment can be sent,
-  // b)at least one-half of the maximum sized windows that
-  // the other end has ever advertised.
-  // c)It can send everything it has and either it isn't
-  // expecting an ACK or the Nagle algorithm is disabled.
-  //
-  if ((Len == Tcb->SndMss) || (2 * Len >= Tcb->SndWndMax)) {
-
-    return Len;
-  }
-
-  if ((Len == Left) &&
-      ((Tcb->SndNxt == Tcb->SndUna) ||
-      TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE))) {
-
-    return Len;
-  }
-
-  //
-  // RFC1122 suggests to set a timer when SWSA forbids TCP
-  // sending more data, and combine it with probe timer.
-  //
-SetPersistTimer:
-  if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) {
-
-    DEBUG (
-      (EFI_D_WARN,
-      "TcpDataToSend: enter persistent state for TCB %p\n",
-      Tcb)
-      );
-
-    if (!Tcb->ProbeTimerOn) {
-      TcpSetProbeTimer (Tcb);
-    }
-  }
-
-  return 0;
-}
-
-
-/**
-  Build the TCP header of the TCP segment and transmit the segment by IP.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf    Pointer to the buffer containing the segment to be sent out.
-
-  @retval 0       The segment is sent out successfully.
-  @retval other   Error condition occurred.
-
-**/
-INTN
-TcpTransmitSegment (
-  IN OUT TCP_CB  *Tcb,
-  IN     NET_BUF *Nbuf
-  )
-{
-  UINT16    Len;
-  TCP_HEAD  *Head;
-  TCP_SEG   *Seg;
-  BOOLEAN   Syn;
-  UINT32    DataLen;
-
-  ASSERT ((Nbuf != NULL) && (Nbuf->Tcp == NULL) && (TcpVerifySegment (Nbuf) != 0));
-
-  DataLen = Nbuf->TotalSize;
-
-  Seg     = TCPSEG_NETBUF (Nbuf);
-  Syn     = TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN);
-
-  if (Syn) {
-
-    Len = TcpSynBuildOption (Tcb, Nbuf);
-  } else {
-
-    Len = TcpBuildOption (Tcb, Nbuf);
-  }
-
-  ASSERT ((Len % 4 == 0) && (Len <= 40));
-
-  Len += sizeof (TCP_HEAD);
-
-  Head = (TCP_HEAD *) NetbufAllocSpace (
-                        Nbuf,
-                        sizeof (TCP_HEAD),
-                        NET_BUF_HEAD
-                        );
-
-  ASSERT (Head != NULL);
-
-  Nbuf->Tcp       = Head;
-
-  Head->SrcPort   = Tcb->LocalEnd.Port;
-  Head->DstPort   = Tcb->RemoteEnd.Port;
-  Head->Seq       = NTOHL (Seg->Seq);
-  Head->Ack       = NTOHL (Tcb->RcvNxt);
-  Head->HeadLen   = (UINT8) (Len >> 2);
-  Head->Res       = 0;
-  Head->Wnd       = TcpComputeWnd (Tcb, Syn);
-  Head->Checksum  = 0;
-
-  //
-  // Check whether to set the PSH flag.
-  //
-  TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_PSH);
-
-  if (DataLen != 0) {
-    if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_PSH) &&
-        TCP_SEQ_BETWEEN (Seg->Seq, Tcb->SndPsh, Seg->End)) {
-
-      TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH);
-      TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH);
-
-    } else if ((Seg->End == Tcb->SndNxt) &&
-               (GET_SND_DATASIZE (Tcb->Sk) == 0)) {
-
-      TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH);
-    }
-  }
-
-  //
-  // Check whether to set the URG flag and the urgent pointer.
-  //
-  TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG);
-
-  if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) &&
-      TCP_SEQ_LEQ (Seg->Seq, Tcb->SndUp)) {
-
-    TCP_SET_FLG (Seg->Flag, TCP_FLG_URG);
-
-    if (TCP_SEQ_LT (Tcb->SndUp, Seg->End)) {
-
-      Seg->Urg = (UINT16) TCP_SUB_SEQ (Tcb->SndUp, Seg->Seq);
-    } else {
-
-      Seg->Urg = (UINT16) MIN (
-                            TCP_SUB_SEQ (Tcb->SndUp,
-                            Seg->Seq),
-                            0xffff
-                            );
-    }
-  }
-
-  Head->Flag      = Seg->Flag;
-  Head->Urg       = NTOHS (Seg->Urg);
-  Head->Checksum  = TcpChecksum (Nbuf, Tcb->HeadSum);
-
-  //
-  // update the TCP session's control information
-  //
-  Tcb->RcvWl2 = Tcb->RcvNxt;
-  if (Syn) {
-    Tcb->RcvWnd = NTOHS (Head->Wnd);
-  }
-
-  //
-  // clear delayedack flag
-  //
-  Tcb->DelayedAck = 0;
-
-  return TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip);
-}
-
-
-/**
-  Get a segment from the Tcb's SndQue.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Seq     The sequence number of the segment.
-  @param  Len     The maximum length of the segment.
-
-  @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegmentSndQue (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Seq,
-  IN UINT32    Len
-  )
-{
-  LIST_ENTRY      *Head;
-  LIST_ENTRY      *Cur;
-  NET_BUF         *Node;
-  TCP_SEG         *Seg;
-  NET_BUF         *Nbuf;
-  TCP_SEQNO       End;
-  UINT8           *Data;
-  UINT8           Flag;
-  INT32           Offset;
-  INT32           CopyLen;
-
-  ASSERT ((Tcb != NULL) && TCP_SEQ_LEQ (Seq, Tcb->SndNxt) && (Len > 0));
-
-  //
-  // Find the segment that contains the Seq.
-  //
-  Head  = &Tcb->SndQue;
-
-  Node  = NULL;
-  Seg   = NULL;
-
-  NET_LIST_FOR_EACH (Cur, Head) {
-    Node  = NET_LIST_USER_STRUCT (Cur, NET_BUF, List);
-    Seg   = TCPSEG_NETBUF (Node);
-
-    if (TCP_SEQ_LT (Seq, Seg->End) && TCP_SEQ_LEQ (Seg->Seq, Seq)) {
-
-      break;
-    }
-  }
-
-  ASSERT (Cur  != Head);
-  ASSERT (Node != NULL);
-  ASSERT (Seg  != NULL);
-
-  //
-  // Return the buffer if it can be returned without
-  // adjustment:
-  //
-  if ((Seg->Seq == Seq) &&
-      TCP_SEQ_LEQ (Seg->End, Seg->Seq + Len) &&
-      !NET_BUF_SHARED (Node)) {
-
-    NET_GET_REF (Node);
-    return Node;
-  }
-
-  //
-  // Create a new buffer and copy data there.
-  //
-  Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD);
-
-  if (Nbuf == NULL) {
-    return NULL;
-  }
-
-  NetbufReserve (Nbuf, TCP_MAX_HEAD);
-
-  Flag  = Seg->Flag;
-  End   = Seg->End;
-
-  if (TCP_SEQ_LT (Seq + Len, Seg->End)) {
-    End = Seq + Len;
-  }
-
-  CopyLen = TCP_SUB_SEQ (End, Seq);
-  Offset  = TCP_SUB_SEQ (Seq, Seg->Seq);
-
-  //
-  // If SYN is set and out of the range, clear the flag.
-  // Because the sequence of the first byte is SEG.SEQ+1,
-  // adjust Offset by -1. If SYN is in the range, copy
-  // one byte less.
-  //
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-
-    if (TCP_SEQ_LT (Seg->Seq, Seq)) {
-
-      TCP_CLEAR_FLG (Flag, TCP_FLG_SYN);
-      Offset--;
-    } else {
-
-      CopyLen--;
-    }
-  }
-
-  //
-  // If FIN is set and in the range, copy one byte less,
-  // and if it is out of the range, clear the flag.
-  //
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
-
-    if (Seg->End == End) {
-
-      CopyLen--;
-    } else {
-
-      TCP_CLEAR_FLG (Flag, TCP_FLG_FIN);
-    }
-  }
-
-  ASSERT (CopyLen >= 0);
-
-  //
-  // copy data to the segment
-  //
-  if (CopyLen != 0) {
-    Data = NetbufAllocSpace (Nbuf, CopyLen, NET_BUF_TAIL);
-    ASSERT (Data != NULL);
-
-    if ((INT32) NetbufCopy (Node, Offset, CopyLen, Data) != CopyLen) {
-      goto OnError;
-    }
-  }
-
-  CopyMem (TCPSEG_NETBUF (Nbuf), Seg, sizeof (TCP_SEG));
-
-  TCPSEG_NETBUF (Nbuf)->Seq   = Seq;
-  TCPSEG_NETBUF (Nbuf)->End   = End;
-  TCPSEG_NETBUF (Nbuf)->Flag  = Flag;
-
-  return Nbuf;
-
-OnError:
-  NetbufFree (Nbuf);
-  return NULL;
-}
-
-
-/**
-  Get a segment from the Tcb's socket buffer.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Seq     The sequence number of the segment.
-  @param  Len     The maximum length of the segment.
-
-  @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegmentSock (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Seq,
-  IN UINT32    Len
-  )
-{
-  NET_BUF *Nbuf;
-  UINT8   *Data;
-  UINT32  DataGet;
-
-  ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
-
-  Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD);
-
-  if (Nbuf == NULL) {
-    DEBUG ((EFI_D_ERROR, "TcpGetSegmentSock: failed to allocate "
-      "a netbuf for TCB %p\n",Tcb));
-
-    return NULL;
-  }
-
-  NetbufReserve (Nbuf, TCP_MAX_HEAD);
-
-  DataGet = 0;
-
-  if (Len != 0) {
-    //
-    // copy data to the segment.
-    //
-    Data = NetbufAllocSpace (Nbuf, Len, NET_BUF_TAIL);
-    ASSERT (Data != NULL);
-
-    DataGet = SockGetDataToSend (Tcb->Sk, 0, Len, Data);
-  }
-
-  NET_GET_REF (Nbuf);
-
-  TCPSEG_NETBUF (Nbuf)->Seq = Seq;
-  TCPSEG_NETBUF (Nbuf)->End = Seq + Len;
-
-  InsertTailList (&(Tcb->SndQue), &(Nbuf->List));
-
-  if (DataGet != 0) {
-
-    SockDataSent (Tcb->Sk, DataGet);
-  }
-
-  return Nbuf;
-}
-
-
-/**
-  Get a segment starting from sequence Seq of a maximum
-  length of Len.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Seq     The sequence number of the segment.
-  @param  Len     The maximum length of the segment.
-
-  @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegment (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Seq,
-  IN UINT32    Len
-  )
-{
-  NET_BUF *Nbuf;
-
-  ASSERT (Tcb != NULL);
-
-  //
-  // Compare the SndNxt with the max sequence number sent.
-  //
-  if ((Len != 0) && TCP_SEQ_LT (Seq, TcpGetMaxSndNxt (Tcb))) {
-
-    Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len);
-  } else {
-
-    Nbuf = TcpGetSegmentSock (Tcb, Seq, Len);
-  }
-
-  ASSERT (TcpVerifySegment (Nbuf) != 0);
-  return Nbuf;
-}
-
-
-/**
-  Retransmit the segment from sequence Seq.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Seq     The sequence number of the segment to be retransmitted.
-
-  @retval 0       Retransmission succeeded.
-  @retval -1      Error condition occurred.
-
-**/
-INTN
-TcpRetransmit (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Seq
-  )
-{
-  NET_BUF *Nbuf;
-  UINT32  Len;
-
-  //
-  // Compute the maxium length of retransmission. It is
-  // limited by three factors:
-  // 1. Less than SndMss
-  // 2. must in the current send window
-  // 3. will not change the boundaries of queued segments.
-  //
-
-  //
-  // Handle the Window Retraction if TCP window scale is enabled according to RFC7323:
-  //   On first retransmission, or if the sequence number is out of
-  //   window by less than 2^Rcv.Wind.Shift, then do normal
-  //   retransmission(s) without regard to the receiver window as long
-  //   as the original segment was in window when it was sent.
-  //
-  if ((Tcb->SndWndScale != 0) &&
-      (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax) || TCP_SEQ_BETWEEN (Tcb->SndWl2 + Tcb->SndWnd, Seq, Tcb->SndWl2 + Tcb->SndWnd + (1 << Tcb->SndWndScale)))) {
-    Len = TCP_SUB_SEQ (Tcb->SndNxt, Seq);
-    DEBUG (
-      (EFI_D_WARN,
-      "TcpRetransmit: retransmission without regard to the receiver window for TCB %p\n",
-      Tcb)
-      );
-
-  } else if (TCP_SEQ_GEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq)) {
-    Len = TCP_SUB_SEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq);
-
-  } else {
-    DEBUG (
-      (EFI_D_WARN,
-      "TcpRetransmit: retransmission cancelled because send window too small for TCB %p\n",
-      Tcb)
-      );
-
-    return 0;
-  }
-
-  Len = MIN (Len, Tcb->SndMss);
-
-  Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len);
-  if (Nbuf == NULL) {
-    return -1;
-  }
-
-  ASSERT (TcpVerifySegment (Nbuf) != 0);
-
-  if (TcpTransmitSegment (Tcb, Nbuf) != 0) {
-    goto OnError;
-  }
-
-  if (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax)) {
-    Tcb->RetxmitSeqMax = Seq;
-  }
-
-  //
-  // The retransmitted buffer may be on the SndQue,
-  // trim TCP head because all the buffer on SndQue
-  // are headless.
-  //
-  ASSERT (Nbuf->Tcp != NULL);
-  NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD);
-  Nbuf->Tcp = NULL;
-
-  NetbufFree (Nbuf);
-  return 0;
-
-OnError:
-  if (Nbuf != NULL) {
-    NetbufFree (Nbuf);
-  }
-
-  return -1;
-}
-
-
-/**
-  Check whether to send data/SYN/FIN and piggy back an ACK.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Force   Whether to ignore the sender's SWS avoidance algorithm and send
-                  out data by force.
-
-  @return The number of bytes sent.
-
-**/
-INTN
-TcpToSendData (
-  IN OUT TCP_CB *Tcb,
-  IN     INTN Force
-  )
-{
-  UINT32    Len;
-  INTN      Sent;
-  UINT8     Flag;
-  NET_BUF   *Nbuf;
-  TCP_SEG   *Seg;
-  TCP_SEQNO Seq;
-  TCP_SEQNO End;
-
-  ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL) && (Tcb->State != TCP_LISTEN));
-
-  Sent = 0;
-
-  if ((Tcb->State == TCP_CLOSED) ||
-      TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT)) {
-
-    return 0;
-  }
-
-SEND_AGAIN:
-  //
-  // compute how much data can be sent
-  //
-  Len   = TcpDataToSend (Tcb, Force);
-  Seq   = Tcb->SndNxt;
-
-  ASSERT ((Tcb->State) < (ARRAY_SIZE (mTcpOutFlag)));
-  Flag  = mTcpOutFlag[Tcb->State];
-
-  if ((Flag & TCP_FLG_SYN) != 0) {
-
-    Seq = Tcb->Iss;
-    Len = 0;
-  }
-
-  //
-  // only send a segment without data if SYN or
-  // FIN is set.
-  //
-  if ((Len == 0) &&
-      ((Flag & (TCP_FLG_SYN | TCP_FLG_FIN)) == 0)) {
-    return Sent;
-  }
-
-  Nbuf = TcpGetSegment (Tcb, Seq, Len);
-
-  if (Nbuf == NULL) {
-    DEBUG (
-      (EFI_D_ERROR,
-      "TcpToSendData: failed to get a segment for TCB %p\n",
-      Tcb)
-      );
-
-    goto OnError;
-  }
-
-  Seg = TCPSEG_NETBUF (Nbuf);
-
-  //
-  // Set the TcpSeg in Nbuf.
-  //
-  Len = Nbuf->TotalSize;
-  End = Seq + Len;
-  if (TCP_FLG_ON (Flag, TCP_FLG_SYN)) {
-    End++;
-  }
-
-  if ((Flag & TCP_FLG_FIN) != 0) {
-    //
-    // Send FIN if all data is sent, and FIN is
-    // in the window
-    //
-    if ((TcpGetMaxSndNxt (Tcb) == Tcb->SndNxt) &&
-        (GET_SND_DATASIZE (Tcb->Sk) == 0) &&
-        TCP_SEQ_LT (End + 1, Tcb->SndWnd + Tcb->SndWl2)) {
-
-      DEBUG (
-      (EFI_D_NET,
-      "TcpToSendData: send FIN "
-        "to peer for TCB %p in state %s\n",
-        Tcb,
-        mTcpStateName[Tcb->State])
-      );
-
-      End++;
-    } else {
-      TCP_CLEAR_FLG (Flag, TCP_FLG_FIN);
-    }
-  }
-
-  Seg->Seq  = Seq;
-  Seg->End  = End;
-  Seg->Flag = Flag;
-
-  ASSERT (TcpVerifySegment (Nbuf) != 0);
-  ASSERT (TcpCheckSndQue (&Tcb->SndQue) != 0);
-
-  //
-  // don't send an empty segment here.
-  //
-  if (Seg->End == Seg->Seq) {
-    DEBUG ((EFI_D_WARN, "TcpToSendData: created a empty"
-      " segment for TCB %p, free it now\n", Tcb));
-
-    NetbufFree (Nbuf);
-    return Sent;
-  }
-
-  if (TcpTransmitSegment (Tcb, Nbuf) != 0) {
-    NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD);
-    Nbuf->Tcp = NULL;
-
-    if ((Flag & TCP_FLG_FIN) != 0)  {
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT);
-    }
-
-    goto OnError;
-  }
-
-  Sent += TCP_SUB_SEQ (End, Seq);
-
-  //
-  // All the buffer in the SndQue is headless
-  //
-  ASSERT (Nbuf->Tcp != NULL);
-
-  NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD);
-  Nbuf->Tcp = NULL;
-
-  NetbufFree (Nbuf);
-
-  //
-  // update status in TCB
-  //
-  Tcb->DelayedAck = 0;
-
-  if ((Flag & TCP_FLG_FIN) != 0) {
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT);
-  }
-
-  if (TCP_SEQ_GT (End, Tcb->SndNxt)) {
-    Tcb->SndNxt = End;
-  }
-
-  if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) {
-    TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);
-  }
-
-  //
-  // Enable RTT measurement only if not in retransmit.
-  // Karn's algorithm reqires not to update RTT when in loss.
-  //
-  if ((Tcb->CongestState == TCP_CONGEST_OPEN) &&
-      !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
-
-    DEBUG ((EFI_D_NET, "TcpToSendData: set RTT measure "
-      "sequence %d for TCB %p\n", Seq, Tcb));
-
-    TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
-    Tcb->RttSeq     = Seq;
-    Tcb->RttMeasure = 0;
-  }
-
-  if (Len == Tcb->SndMss) {
-    goto SEND_AGAIN;
-  }
-
-  return Sent;
-
-OnError:
-  if (Nbuf != NULL) {
-    NetbufFree (Nbuf);
-  }
-
-  return Sent;
-}
-
-
-/**
-  Send an ACK immediately.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSendAck (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  NET_BUF *Nbuf;
-  TCP_SEG *Seg;
-
-  Nbuf = NetbufAlloc (TCP_MAX_HEAD);
-
-  if (Nbuf == NULL) {
-    return;
-  }
-
-  NetbufReserve (Nbuf, TCP_MAX_HEAD);
-
-  Seg       = TCPSEG_NETBUF (Nbuf);
-  Seg->Seq  = Tcb->SndNxt;
-  Seg->End  = Tcb->SndNxt;
-  Seg->Flag = TCP_FLG_ACK;
-
-  if (TcpTransmitSegment (Tcb, Nbuf) == 0) {
-    TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-    Tcb->DelayedAck = 0;
-  }
-
-  NetbufFree (Nbuf);
-}
-
-
-/**
-  Send a zero probe segment. It can be used by keepalive and zero window probe.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @retval 0       The zero probe segment was sent out successfully.
-  @retval other   Error condition occurred.
-
-**/
-INTN
-TcpSendZeroProbe (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  NET_BUF *Nbuf;
-  TCP_SEG *Seg;
-  INTN     Result;
-
-  Nbuf = NetbufAlloc (TCP_MAX_HEAD);
-
-  if (Nbuf == NULL) {
-    return -1;
-  }
-
-  NetbufReserve (Nbuf, TCP_MAX_HEAD);
-
-  //
-  // SndNxt-1 is out of window. The peer should respond
-  // with an ACK.
-  //
-  Seg       = TCPSEG_NETBUF (Nbuf);
-  Seg->Seq  = Tcb->SndNxt - 1;
-  Seg->End  = Tcb->SndNxt - 1;
-  Seg->Flag = TCP_FLG_ACK;
-
-  Result    = TcpTransmitSegment (Tcb, Nbuf);
-  NetbufFree (Nbuf);
-
-  return Result;
-}
-
-
-/**
-  Check whether to send an ACK or delayed ACK.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpToSendAck (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  UINT32 TcpNow;
-
-  TcpNow = TcpRcvWinNow (Tcb);
-  //
-  // Generally, TCP should send a delayed ACK unless:
-  //   1. ACK at least every other FULL sized segment received,
-  //   2. Packets received out of order
-  //   3. Receiving window is open
-  //
-  if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) ||
-      (Tcb->DelayedAck >= 1) ||
-      (TcpNow > TcpRcvWinOld (Tcb))) {
-    TcpSendAck (Tcb);
-    return;
-  }
-
-  DEBUG ((EFI_D_NET, "TcpToSendAck: scheduled a delayed"
-    " ACK for TCB %p\n", Tcb));
-
-  //
-  // schedule a delayed ACK
-  //
-  Tcb->DelayedAck++;
-}
-
-
-/**
-  Send a RESET segment in response to the segment received.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance, may be NULL.
-  @param  Head    TCP header of the segment that triggers the reset.
-  @param  Len     Length of the segment that triggers the reset.
-  @param  Local   Local IP address.
-  @param  Remote  Remote peer's IP address.
-
-  @retval 0       A reset is sent or no need to send it.
-  @retval -1      No reset is sent.
-
-**/
-INTN
-TcpSendReset (
-  IN TCP_CB    *Tcb,
-  IN TCP_HEAD  *Head,
-  IN INT32     Len,
-  IN UINT32    Local,
-  IN UINT32    Remote
-  )
-{
-  NET_BUF   *Nbuf;
-  TCP_HEAD  *Nhead;
-  UINT16    HeadSum;
-
-  //
-  // Don't respond to a Reset with reset
-  //
-  if ((Head->Flag & TCP_FLG_RST) != 0) {
-    return 0;
-  }
-
-  Nbuf = NetbufAlloc (TCP_MAX_HEAD);
-
-  if (Nbuf == NULL) {
-    return -1;
-  }
-
-  Nhead = (TCP_HEAD *) NetbufAllocSpace (
-                        Nbuf,
-                        sizeof (TCP_HEAD),
-                        NET_BUF_TAIL
-                        );
-
-  ASSERT (Nhead != NULL);
-
-  Nbuf->Tcp   = Nhead;
-  Nhead->Flag = TCP_FLG_RST;
-
-  //
-  // Derive Seq/ACK from the segment if no TCB
-  // associated with it, otherwise from the Tcb
-  //
-  if (Tcb == NULL) {
-
-    if (TCP_FLG_ON (Head->Flag, TCP_FLG_ACK)) {
-      Nhead->Seq  = Head->Ack;
-      Nhead->Ack  = 0;
-    } else {
-      Nhead->Seq = 0;
-      TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK);
-      Nhead->Ack = HTONL (NTOHL (Head->Seq) + Len);
-    }
-  } else {
-
-    Nhead->Seq  = HTONL (Tcb->SndNxt);
-    Nhead->Ack  = HTONL (Tcb->RcvNxt);
-    TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK);
-  }
-
-  Nhead->SrcPort  = Head->DstPort;
-  Nhead->DstPort  = Head->SrcPort;
-  Nhead->HeadLen  = (UINT8) (sizeof (TCP_HEAD) >> 2);
-  Nhead->Res      = 0;
-  Nhead->Wnd      = HTONS (0xFFFF);
-  Nhead->Checksum = 0;
-  Nhead->Urg      = 0;
-
-  HeadSum         = NetPseudoHeadChecksum (Local, Remote, 6, 0);
-  Nhead->Checksum = TcpChecksum (Nbuf, HeadSum);
-
-  TcpSendIpPacket (Tcb, Nbuf, Local, Remote);
-
-  NetbufFree (Nbuf);
-  return 0;
-}
-
-
-/**
-  Verify that the segment is in good shape.
-
-  @param  Nbuf    Buffer that contains the segment to be checked.
-
-  @retval 0       The segment is broken.
-  @retval 1       The segment is in good shape.
-
-**/
-INTN
-TcpVerifySegment (
-  IN NET_BUF *Nbuf
-  )
-{
-  TCP_HEAD  *Head;
-  TCP_SEG   *Seg;
-  UINT32    Len;
-
-  if (Nbuf == NULL) {
-    return 1;
-  }
-
-  NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE);
-
-  Seg   = TCPSEG_NETBUF (Nbuf);
-  Len   = Nbuf->TotalSize;
-  Head  = Nbuf->Tcp;
-
-  if (Head != NULL) {
-    if (Head->Flag != Seg->Flag) {
-      return 0;
-    }
-
-    Len -= (Head->HeadLen << 2);
-  }
-
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-    Len++;
-  }
-
-  if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
-    Len++;
-  }
-
-  if (Seg->Seq + Len != Seg->End) {
-    return 0;
-  }
-
-  return 1;
-}
-
-
-/**
-  Verify that all the segments in SndQue are in good shape.
-
-  @param  Head    Pointer to the head node of the SndQue.
-
-  @retval 0       At least one segment is broken.
-  @retval 1       All segments in the specific queue are in good shape.
-
-**/
-INTN
-TcpCheckSndQue (
-  IN LIST_ENTRY     *Head
-  )
-{
-  LIST_ENTRY      *Entry;
-  NET_BUF         *Nbuf;
-  TCP_SEQNO       Seq;
-
-  if (IsListEmpty (Head)) {
-    return 1;
-  }
-  //
-  // Initialize the Seq
-  //
-  Entry = Head->ForwardLink;
-  Nbuf  = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
-  Seq   = TCPSEG_NETBUF (Nbuf)->Seq;
-
-  NET_LIST_FOR_EACH (Entry, Head) {
-    Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
-
-    if (TcpVerifySegment (Nbuf) == 0) {
-      return 0;
-    }
-
-    //
-    // All the node in the SndQue should has:
-    // SEG.SEQ = LAST_SEG.END
-    //
-    if (Seq != TCPSEG_NETBUF (Nbuf)->Seq) {
-      return 0;
-    }
-
-    Seq = TCPSEG_NETBUF (Nbuf)->End;
-  }
-
-  return 1;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c
deleted file mode 100644
index 4cb0ee7b5e6f..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c
+++ /dev/null
@@ -1,584 +0,0 @@
-/** @file
-  TCP timer related functions.
-
-Copyright (c) 2005 - 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<BR>
-
-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 "Tcp4Main.h"
-
-UINT32    mTcpTick = 1000;
-
-/**
-  Connect timeout handler.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpConnectTimeout (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Timeout handler for TCP retransmission timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpRexmitTimeout (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Timeout handler for window probe timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpProbeTimeout (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Timeout handler for keepalive timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpKeepaliveTimeout (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Timeout handler for FIN_WAIT_2 timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpFinwait2Timeout (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Timeout handler for 2MSL timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-Tcp2MSLTimeout (
-  IN OUT TCP_CB *Tcb
-  );
-
-TCP_TIMER_HANDLER mTcpTimerHandler[TCP_TIMER_NUMBER] = {
-  TcpConnectTimeout,
-  TcpRexmitTimeout,
-  TcpProbeTimeout,
-  TcpKeepaliveTimeout,
-  TcpFinwait2Timeout,
-  Tcp2MSLTimeout,
-};
-
-/**
-  Close the TCP connection.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpClose (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  NetbufFreeList (&Tcb->SndQue);
-  NetbufFreeList (&Tcb->RcvQue);
-
-  TcpSetState (Tcb, TCP_CLOSED);
-}
-
-
-/**
-  Connect timeout handler.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpConnectTimeout (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  if (!TCP_CONNECTED (Tcb->State)) {
-    DEBUG ((EFI_D_ERROR, "TcpConnectTimeout: connection closed "
-      "because conenction timer timeout for TCB %p\n", Tcb));
-
-    if (EFI_ABORTED == Tcb->Sk->SockError) {
-      SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT);
-    }
-
-    if (TCP_SYN_RCVD == Tcb->State) {
-      DEBUG ((EFI_D_WARN, "TcpConnectTimeout: send reset because "
-        "connection timer timeout for TCB %p\n", Tcb));
-
-      TcpResetConnection (Tcb);
-
-    }
-
-    TcpClose (Tcb);
-  }
-}
-
-
-/**
-  Timeout handler for TCP retransmission timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpRexmitTimeout (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  UINT32  FlightSize;
-
-  DEBUG ((EFI_D_WARN, "TcpRexmitTimeout: transmission "
-    "timeout for TCB %p\n", Tcb));
-
-  //
-  // Set the congestion window. FlightSize is the
-  // amount of data that has been sent but not
-  // yet ACKed.
-  //
-  FlightSize        = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
-  Tcb->Ssthresh     = MAX ((UINT32) (2 * Tcb->SndMss), FlightSize / 2);
-
-  Tcb->CWnd         = Tcb->SndMss;
-  Tcb->LossRecover  = Tcb->SndNxt;
-
-  Tcb->LossTimes++;
-  if ((Tcb->LossTimes > Tcb->MaxRexmit) &&
-      !TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_CONNECT)) {
-
-    DEBUG ((EFI_D_ERROR, "TcpRexmitTimeout: connection closed "
-      "because too many timeouts for TCB %p\n", Tcb));
-
-    if (EFI_ABORTED == Tcb->Sk->SockError) {
-      SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT);
-    }
-
-    TcpClose (Tcb);
-    return ;
-  }
-
-  TcpBackoffRto (Tcb);
-  TcpRetransmit (Tcb, Tcb->SndUna);
-  TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);
-
-  Tcb->CongestState = TCP_CONGEST_LOSS;
-  TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
-}
-
-
-/**
-  Timeout handler for window probe timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpProbeTimeout (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  //
-  // This is the timer for sender's SWSA. RFC1122 requires
-  // a timer set for sender's SWSA, and suggest combine it
-  // with window probe timer. If data is sent, don't set
-  // the probe timer, since retransmit timer is on.
-  //
-  if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) {
-
-    ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0);
-    Tcb->ProbeTimerOn = FALSE;
-    return ;
-  }
-
-  TcpSendZeroProbe (Tcb);
-  TcpSetProbeTimer (Tcb);
-}
-
-
-/**
-  Timeout handler for keepalive timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpKeepaliveTimeout (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  Tcb->KeepAliveProbes++;
-
-  //
-  // Too many Keep-alive probes, drop the connection
-  //
-  if (Tcb->KeepAliveProbes > Tcb->MaxKeepAlive) {
-
-    if (EFI_ABORTED == Tcb->Sk->SockError) {
-      SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT);
-    }
-
-    TcpClose (Tcb);
-    return ;
-  }
-
-  TcpSendZeroProbe (Tcb);
-  TcpSetKeepaliveTimer (Tcb);
-}
-
-
-/**
-  Timeout handler for FIN_WAIT_2 timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpFinwait2Timeout (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  DEBUG ((EFI_D_WARN, "TcpFinwait2Timeout: connection closed "
-    "because FIN_WAIT2 timer timeouts for TCB %p\n", Tcb));
-
-  TcpClose (Tcb);
-}
-
-
-/**
-  Timeout handler for 2MSL timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-Tcp2MSLTimeout (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  DEBUG ((EFI_D_WARN, "Tcp2MSLTimeout: connection closed "
-    "because TIME_WAIT timer timeouts for TCB %p\n", Tcb));
-
-  TcpClose (Tcb);
-}
-
-
-/**
-  Update the timer status and the next expire time according to the timers
-  to expire in a specific future time slot.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpUpdateTimer (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  UINT16  Index;
-
-  //
-  // Don't use a too large value to init NextExpire
-  // since mTcpTick wraps around as sequence no does.
-  //
-  Tcb->NextExpire = 65535;
-  TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON);
-
-  for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) {
-
-    if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) &&
-        TCP_TIME_LT (Tcb->Timer[Index], mTcpTick + Tcb->NextExpire)) {
-
-      Tcb->NextExpire = TCP_SUB_TIME (Tcb->Timer[Index], mTcpTick);
-      TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON);
-    }
-  }
-}
-
-
-/**
-  Enable a TCP timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Timer    The index of the timer to be enabled.
-  @param  TimeOut  The timeout value of this timer.
-
-**/
-VOID
-TcpSetTimer (
-  IN OUT TCP_CB *Tcb,
-  IN     UINT16 Timer,
-  IN     UINT32 TimeOut
-  )
-{
-  TCP_SET_TIMER (Tcb->EnabledTimer, Timer);
-  Tcb->Timer[Timer] = mTcpTick + TimeOut;
-
-  TcpUpdateTimer (Tcb);
-}
-
-
-/**
-  Clear one TCP timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Timer    The index of the timer to be cleared.
-
-**/
-VOID
-TcpClearTimer (
-  IN OUT TCP_CB *Tcb,
-  IN     UINT16 Timer
-  )
-{
-  TCP_CLEAR_TIMER (Tcb->EnabledTimer, Timer);
-  TcpUpdateTimer (Tcb);
-}
-
-
-/**
-  Clear all TCP timers.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpClearAllTimer (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  Tcb->EnabledTimer = 0;
-  TcpUpdateTimer (Tcb);
-}
-
-
-/**
-  Enable the window prober timer and set the timeout value.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSetProbeTimer (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  if (!Tcb->ProbeTimerOn) {
-    Tcb->ProbeTime    = Tcb->Rto;
-    Tcb->ProbeTimerOn = TRUE;
-
-  } else {
-    Tcb->ProbeTime <<= 1;
-  }
-
-  if (Tcb->ProbeTime < TCP_RTO_MIN) {
-
-    Tcb->ProbeTime = TCP_RTO_MIN;
-  } else if (Tcb->ProbeTime > TCP_RTO_MAX) {
-
-    Tcb->ProbeTime = TCP_RTO_MAX;
-  }
-
-  TcpSetTimer (Tcb, TCP_TIMER_PROBE, Tcb->ProbeTime);
-}
-
-
-/**
-  Enable the keepalive timer and set the timeout value.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSetKeepaliveTimer (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE)) {
-    return ;
-
-  }
-
-  //
-  // Set the timer to KeepAliveIdle if either
-  // 1. the keepalive timer is off
-  // 2. The keepalive timer is on, but the idle
-  // is less than KeepAliveIdle, that means the
-  // connection is alive since our last probe.
-  //
-  if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_KEEPALIVE) ||
-      (Tcb->Idle < Tcb->KeepAliveIdle)) {
-
-    TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAliveIdle);
-    Tcb->KeepAliveProbes = 0;
-
-  } else {
-
-    TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAlivePeriod);
-  }
-}
-
-
-/**
-  Backoff the RTO.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpBackoffRto (
-  IN OUT TCP_CB *Tcb
-  )
-{
-  //
-  // Fold the RTT estimate if too many times, the estimate
-  // may be wrong, fold it. So the next time a valid
-  // measurement is sampled, we can start fresh.
-  //
-  if ((Tcb->LossTimes >= TCP_FOLD_RTT) && (Tcb->SRtt != 0)) {
-    Tcb->RttVar += Tcb->SRtt >> 2;
-    Tcb->SRtt = 0;
-  }
-
-  Tcb->Rto <<= 1;
-
-  if (Tcb->Rto < TCP_RTO_MIN) {
-
-    Tcb->Rto = TCP_RTO_MIN;
-  } else if (Tcb->Rto > TCP_RTO_MAX) {
-
-    Tcb->Rto = TCP_RTO_MAX;
-  }
-}
-
-
-/**
-  Heart beat timer handler.
-
-  @param  Context        Context of the timer event, ignored.
-
-**/
-VOID
-EFIAPI
-TcpTickingDpc (
-  IN VOID      *Context
-  )
-{
-  LIST_ENTRY      *Entry;
-  LIST_ENTRY      *Next;
-  TCP_CB          *Tcb;
-  INT16           Index;
-
-  mTcpTick++;
-  mTcpGlobalIss += 100;
-
-  //
-  // Don't use LIST_FOR_EACH, which isn't delete safe.
-  //
-  for (Entry = mTcpRunQue.ForwardLink; Entry != &mTcpRunQue; Entry = Next) {
-
-    Next  = Entry->ForwardLink;
-
-    Tcb   = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
-    if (Tcb->State == TCP_CLOSED) {
-      continue;
-    }
-    //
-    // The connection is doing RTT measurement.
-    //
-    if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
-      Tcb->RttMeasure++;
-    }
-
-    Tcb->Idle++;
-
-    if (Tcb->DelayedAck != 0) {
-      TcpSendAck (Tcb);
-    }
-
-    //
-    // No timer is active or no timer expired
-    //
-    if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON) ||
-        ((--Tcb->NextExpire) > 0)) {
-
-      continue;
-    }
-
-    //
-    // Call the timeout handler for each expired timer.
-    //
-    for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) {
-
-      if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) &&
-          TCP_TIME_LEQ (Tcb->Timer[Index], mTcpTick)) {
-        //
-        // disable the timer before calling the handler
-        // in case the handler enables it again.
-        //
-        TCP_CLEAR_TIMER (Tcb->EnabledTimer, Index);
-        mTcpTimerHandler[Index](Tcb);
-
-        //
-        // The Tcb may have been deleted by the timer, or
-        // no other timer is set.
-        //
-        if ((Next->BackLink != Entry) ||
-            (Tcb->EnabledTimer == 0)) {
-          break;
-        }
-      }
-    }
-
-    //
-    // If the Tcb still exist or some timer is set, update the timer
-    //
-    if (Index == TCP_TIMER_NUMBER) {
-      TcpUpdateTimer (Tcb);
-    }
-  }
-}
-
-/**
-  Heart beat timer handler, queues the DPC at TPL_CALLBACK.
-
-  @param  Event    Timer event signaled, ignored.
-  @param  Context  Context of the timer event, ignored.
-
-**/
-VOID
-EFIAPI
-TcpTicking (
-  IN EFI_EVENT Event,
-  IN VOID      *Context
-  )
-{
-  QueueDpc (TPL_CALLBACK, TcpTickingDpc, Context);
-}
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c
deleted file mode 100644
index a085ef61f341..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/** @file
-
-Copyright (c) 2007 - 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 "PxeBcImpl.h"
-
-//
-// EFI Component Name Functions
-//
-/**
-  Retrieves a Unicode string that is the user readable name of the driver.
-
-  This function retrieves the user readable name of a driver in the form of a
-  Unicode string. If the driver specified by This has a user readable name in
-  the language specified by Language, then a pointer to the driver name is
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
-  by This does not support the language specified by Language,
-  then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
-                                EFI_COMPONENT_NAME_PROTOCOL instance.
-
-  @param[in]  Language          A pointer to a Null-terminated ASCII string
-                                array indicating the language. This is the
-                                language of the driver name that the caller is
-                                requesting, and it must match one of the
-                                languages specified in SupportedLanguages. The
-                                number of languages supported by a driver is up
-                                to the driver writer. Language is specified
-                                in RFC 4646 or ISO 639-2 language code format.
-
-  @param[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
-PxeBcComponentNameGetDriverName (
-  IN  EFI_COMPONENT_NAME_PROTOCOL  * This,
-  IN  CHAR8                        *Language,
-  OUT CHAR16                       **DriverName
-  );
-
-/**
-  Retrieves a Unicode string that is the user readable name of the controller
-  that is being managed by a driver.
-
-  This function retrieves the user readable name of the controller specified by
-  ControllerHandle and ChildHandle in the form of a Unicode string. If the
-  driver specified by This has a user readable name in the language specified by
-  Language, then a pointer to the controller name is returned in ControllerName,
-  and EFI_SUCCESS is returned.  If the driver specified by This is not currently
-  managing the controller specified by ControllerHandle and ChildHandle,
-  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
-  support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
-                                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 Null-terminated ASCII string
-                                array indicating the language.  This is the
-                                language of the driver name that the caller is
-                                requesting, and it must match one of the
-                                languages specified in SupportedLanguages. The
-                                number of languages supported by a driver is up
-                                to the driver writer. Language is specified in
-                                RFC 4646 or ISO 639-2 language code format.
-
-  @param[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
-PxeBcComponentNameGetControllerName (
-  IN  EFI_COMPONENT_NAME_PROTOCOL  * This,
-  IN  EFI_HANDLE                   ControllerHandle,
-  IN  EFI_HANDLE                   ChildHandle        OPTIONAL,
-  IN  CHAR8                        *Language,
-  OUT CHAR16                       **ControllerName
-  );
-
-//
-// EFI Component Name Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL     gPxeBcComponentName = {
-  PxeBcComponentNameGetDriverName,
-  PxeBcComponentNameGetControllerName,
-  "eng"
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL    gPxeBcComponentName2 = {
-  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PxeBcComponentNameGetDriverName,
-  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PxeBcComponentNameGetControllerName,
-  "en"
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcDriverNameTable[] = {
-  {
-    "eng;en",
-    L"UEFI PXE Base Code Driver"
-  },
-  {
-    NULL,
-    NULL
-  }
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcControllerNameTable[] = {
-  {
-    "eng;en",
-    L"PXE Controller"
-  },
-  {
-    NULL,
-    NULL
-  }
-};
-
-/**
-  Retrieves a Unicode string that is the user readable name of the driver.
-
-  This function retrieves the user readable name of a driver in the form of a
-  Unicode string. If the driver specified by This has a user readable name in
-  the language specified by Language, then a pointer to the driver name is
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
-  by This does not support the language specified by Language,
-  then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
-                                EFI_COMPONENT_NAME_PROTOCOL instance.
-
-  @param[in]  Language          A pointer to a Null-terminated ASCII string
-                                array indicating the language. This is the
-                                language of the driver name that the caller is
-                                requesting, and it must match one of the
-                                languages specified in SupportedLanguages. The
-                                number of languages supported by a driver is up
-                                to the driver writer. Language is specified
-                                in RFC 4646 or ISO 639-2 language code format.
-
-  @param[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
-PxeBcComponentNameGetDriverName (
-  IN  EFI_COMPONENT_NAME_PROTOCOL  * This,
-  IN  CHAR8                        *Language,
-  OUT CHAR16                       **DriverName
-  )
-{
-  return LookupUnicodeString2 (
-          Language,
-          This->SupportedLanguages,
-          mPxeBcDriverNameTable,
-          DriverName,
-          (BOOLEAN)(This == &gPxeBcComponentName)
-          );
-}
-
-/**
-  Retrieves a Unicode string that is the user readable name of the controller
-  that is being managed by a driver.
-
-  This function retrieves the user readable name of the controller specified by
-  ControllerHandle and ChildHandle in the form of a Unicode string. If the
-  driver specified by This has a user readable name in the language specified by
-  Language, then a pointer to the controller name is returned in ControllerName,
-  and EFI_SUCCESS is returned.  If the driver specified by This is not currently
-  managing the controller specified by ControllerHandle and ChildHandle,
-  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
-  support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
-  @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
-                                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 Null-terminated ASCII string
-                                array indicating the language.  This is the
-                                language of the driver name that the caller is
-                                requesting, and it must match one of the
-                                languages specified in SupportedLanguages. The
-                                number of languages supported by a driver is up
-                                to the driver writer. Language is specified in
-                                RFC 4646 or ISO 639-2 language code format.
-
-  @param[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
-PxeBcComponentNameGetControllerName (
-  IN  EFI_COMPONENT_NAME_PROTOCOL  * This,
-  IN  EFI_HANDLE                   ControllerHandle,
-  IN  EFI_HANDLE                   ChildHandle        OPTIONAL,
-  IN  CHAR8                        *Language,
-  OUT CHAR16                       **ControllerName
-  )
-{
-  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;
-  EFI_HANDLE                  NicHandle;
-  EFI_STATUS                  Status;
-
-  if (ControllerHandle == NULL || ChildHandle != NULL) {
-    return EFI_UNSUPPORTED;
-  }
-
-  NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);
-  if (NicHandle == NULL) {
-    NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);
-
-    if (NicHandle == NULL) {
-      NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);
-
-      if (NicHandle == NULL) {
-        NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);
-
-        if (NicHandle == NULL) {
-          NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);
-
-          if (NicHandle == NULL) {
-            return EFI_UNSUPPORTED;
-          }
-        }
-      }
-    }
-  }
-
-  Status = gBS->OpenProtocol (
-                  NicHandle,
-                  &gEfiPxeBaseCodeProtocolGuid,
-                  (VOID **) &PxeBc,
-                  NULL,
-                  NULL,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return LookupUnicodeString2 (
-           Language,
-           This->SupportedLanguages,
-           mPxeBcControllerNameTable,
-           ControllerName,
-           (BOOLEAN)(This == &gPxeBcComponentName)
-           );
-}
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
deleted file mode 100644
index f7b975f2997f..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
+++ /dev/null
@@ -1,1999 +0,0 @@
-/** @file
-  Support for PxeBc dhcp functions.
-
-Copyright (c) 2013, Red Hat, Inc.
-Copyright (c) 2007 - 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 "PxeBcImpl.h"
-
-//
-// This is a map from the interested DHCP4 option tags' index to the tag value.
-//
-UINT8 mInterestedDhcp4Tags[PXEBC_DHCP4_TAG_INDEX_MAX] = {
-  DHCP4_TAG_BOOTFILE_LEN,
-  DHCP4_TAG_VENDOR,
-  DHCP4_TAG_OVERLOAD,
-  DHCP4_TAG_MSG_TYPE,
-  DHCP4_TAG_SERVER_ID,
-  DHCP4_TAG_VENDOR_CLASS_ID,
-  DHCP4_TAG_BOOTFILE
-};
-
-
-/**
-  This function initialize the DHCP4 message instance.
-
-  This function will pad each item of dhcp4 message packet.
-
-  @param  Seed    Pointer to the message instance of the DHCP4 packet.
-  @param  Udp4    Pointer to the EFI_UDP4_PROTOCOL instance.
-
-**/
-VOID
-PxeBcInitSeedPacket (
-  IN EFI_DHCP4_PACKET  *Seed,
-  IN EFI_UDP4_PROTOCOL *Udp4
-  )
-{
-  EFI_SIMPLE_NETWORK_MODE Mode;
-  EFI_DHCP4_HEADER        *Header;
-
-  Udp4->GetModeData (Udp4, NULL, NULL, NULL, &Mode);
-
-  Seed->Size    = sizeof (EFI_DHCP4_PACKET);
-  Seed->Length  = sizeof (Seed->Dhcp4);
-
-  Header        = &Seed->Dhcp4.Header;
-
-  ZeroMem (Header, sizeof (EFI_DHCP4_HEADER));
-  Header->OpCode    = PXEBC_DHCP4_OPCODE_REQUEST;
-  Header->HwType    = Mode.IfType;
-  Header->HwAddrLen = (UINT8) Mode.HwAddressSize;
-  CopyMem (Header->ClientHwAddr, &Mode.CurrentAddress, Header->HwAddrLen);
-
-  Seed->Dhcp4.Magik     = PXEBC_DHCP4_MAGIC;
-  Seed->Dhcp4.Option[0] = DHCP4_TAG_EOP;
-}
-
-
-/**
-  Copy the DCHP4 packet from srouce to destination.
-
-  @param[in]  Dst          Pointer to the cache buffer for DHCPv4 packet.
-  @param[in]  Src          Pointer to the DHCPv4 packet to be cached.
-
-  @retval     EFI_SUCCESS                Packet is copied.
-  @retval     EFI_BUFFER_TOO_SMALL       Cache buffer is not big enough to hold the packet.
-
-**/
-EFI_STATUS
-PxeBcCopyEfiDhcp4Packet (
-  IN EFI_DHCP4_PACKET  *Dst,
-  IN EFI_DHCP4_PACKET  *Src
-  )
-{
-  if (Dst->Size < Src->Length) {
-    return EFI_BUFFER_TOO_SMALL;
-  }
-
-  CopyMem (&Dst->Dhcp4, &Src->Dhcp4, Src->Length);
-  Dst->Length = Src->Length;
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Copy the dhcp4 packet to the PxeBc private data and parse the dhcp4 packet.
-
-  @param  Private       Pointer to PxeBc private data.
-  @param  OfferIndex    Index of cached packets as complements of pxe mode data,
-                        the index is maximum offer number.
-
-  @retval     EFI_SUCCESS                Cache and parse the packet successfully.
-  @retval     EFI_BUFFER_TOO_SMALL       Cache buffer is not big enough to hold the packet.
-
-**/
-EFI_STATUS
-PxeBcCopyProxyOffer (
-  IN PXEBC_PRIVATE_DATA  *Private,
-  IN UINT32              OfferIndex
-  )
-{
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-  EFI_DHCP4_PACKET        *Offer;
-  EFI_STATUS              Status;
-
-  ASSERT (OfferIndex < Private->NumOffers);
-  ASSERT (OfferIndex < PXEBC_MAX_OFFER_NUM);
-
-  Mode  = Private->PxeBc.Mode;
-  Offer = &Private->Dhcp4Offers[OfferIndex].Packet.Offer;
-
-  Status = PxeBcCopyEfiDhcp4Packet (&Private->ProxyOffer.Packet.Offer, Offer);
-  if (EFI_ERROR(Status)) {
-    return Status;
-  }
-  CopyMem (&Mode->ProxyOffer, &Offer->Dhcp4, Offer->Length);
-  Mode->ProxyOfferReceived = TRUE;
-
-  PxeBcParseCachedDhcpPacket (&Private->ProxyOffer);
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Parse the cached dhcp packet.
-
-  @param  CachedPacket  Pointer to cached dhcp packet.
-
-  @retval TRUE          Succeed to parse and validation.
-  @retval FALSE         Fail to parse or validation.
-
-**/
-BOOLEAN
-PxeBcParseCachedDhcpPacket (
-  IN PXEBC_CACHED_DHCP4_PACKET  *CachedPacket
-  )
-{
-  EFI_DHCP4_PACKET        *Offer;
-  EFI_DHCP4_PACKET_OPTION **Options;
-  EFI_DHCP4_PACKET_OPTION *Option;
-  UINT8                   OfferType;
-  UINTN                   Index;
-  UINT8                   *Ptr8;
-
-  CachedPacket->IsPxeOffer = FALSE;
-  ZeroMem (CachedPacket->Dhcp4Option, sizeof (CachedPacket->Dhcp4Option));
-  ZeroMem (&CachedPacket->PxeVendorOption, sizeof (CachedPacket->PxeVendorOption));
-
-  Offer   = &CachedPacket->Packet.Offer;
-  Options = CachedPacket->Dhcp4Option;
-
-  //
-  // Parse interested dhcp options and store their pointers in CachedPacket->Dhcp4Option.
-  // First, try to parse DHCPv4 options from the DHCP optional parameters field.
-  //
-  for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
-    Options[Index] = PxeBcParseExtendOptions (
-                       Offer->Dhcp4.Option,
-                       GET_OPTION_BUFFER_LEN (Offer),
-                       mInterestedDhcp4Tags[Index]
-                       );
-  }
-  //
-  // Second, Check if bootfilename and serverhostname is overloaded to carry DHCP options refers to rfc-2132.
-  // If yes, try to parse options from the BootFileName field, then ServerName field.
-  //
-  Option = Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD];
-  if (Option != NULL) {
-    if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) != 0) {
-      for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
-        if (Options[Index] == NULL) {
-          Options[Index] = PxeBcParseExtendOptions (
-                             (UINT8 *) Offer->Dhcp4.Header.BootFileName,
-                             sizeof (Offer->Dhcp4.Header.BootFileName),
-                             mInterestedDhcp4Tags[Index]
-                             );
-        }
-      }
-    }
-    if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_SERVER_NAME) != 0) {
-      for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
-        if (Options[Index] == NULL) {
-          Options[Index] = PxeBcParseExtendOptions (
-                             (UINT8 *) Offer->Dhcp4.Header.ServerName,
-                             sizeof (Offer->Dhcp4.Header.ServerName),
-                             mInterestedDhcp4Tags[Index]
-                             );
-        }
-      }
-    }
-  }
-
-  //
-  // Check whether is an offer with PXEClient or not.
-  //
-  Option = Options[PXEBC_DHCP4_TAG_INDEX_CLASS_ID];
-  if ((Option != NULL) && (Option->Length >= 9) &&
-    (CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 9) == 0)) {
-
-    CachedPacket->IsPxeOffer = TRUE;
-  }
-
-  //
-  // Parse pxe vendor options and store their content/pointers in CachedPacket->PxeVendorOption.
-  //
-  Option = Options[PXEBC_DHCP4_TAG_INDEX_VENDOR];
-  if (CachedPacket->IsPxeOffer && (Option != NULL)) {
-
-    if (!PxeBcParseVendorOptions (Option, &CachedPacket->PxeVendorOption)) {
-      return FALSE;
-    }
-  }
-
-
-  //
-  // Parse PXE boot file name:
-  // According to PXE spec, boot file name should be read from DHCP option 67 (bootfile name) if present.
-  // Otherwise, read from boot file field in DHCP header.
-  //
-  if (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {
-    //
-    // RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is null
-    // terminated string. So force to append null terminated character at the end of string.
-    //
-    Ptr8 =  (UINT8*)&Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data[0];
-    Ptr8 += Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Length;
-    if (*(Ptr8 - 1) != '\0') {
-      *Ptr8 = '\0';
-    }
-  } else if (Offer->Dhcp4.Header.BootFileName[0] != 0) {
-    //
-    // If the bootfile is not present and bootfilename is present in dhcp packet, just parse it.
-    // And do not count dhcp option header, or else will destroy the serverhostname.
-    //
-    // Make sure "BootFileName" is not overloaded.
-    //
-    if (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD] == NULL ||
-        (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) == 0) {
-      Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] = (EFI_DHCP4_PACKET_OPTION *) (&Offer->Dhcp4.Header.BootFileName[0] -
-                                            OFFSET_OF (EFI_DHCP4_PACKET_OPTION, Data[0]));
-    }
-  }
-
-  //
-  // Determine offer type of the dhcp packet.
-  //
-  Option = Options[PXEBC_DHCP4_TAG_INDEX_MSG_TYPE];
-  if ((Option == NULL) || (Option->Data[0] == 0)) {
-    //
-    // It's a bootp offer
-    //
-    Option = CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE];
-    if (Option == NULL) {
-      //
-      // bootp offer without bootfilename, discard it.
-      //
-      return FALSE;
-    }
-
-    OfferType = DHCP4_PACKET_TYPE_BOOTP;
-
-  } else {
-
-    if (IS_VALID_DISCOVER_VENDOR_OPTION (CachedPacket->PxeVendorOption.BitMap)) {
-      //
-      // It's a pxe10 offer with PXEClient and discover vendor option.
-      //
-      OfferType = DHCP4_PACKET_TYPE_PXE10;
-    } else if (IS_VALID_MTFTP_VENDOR_OPTION (CachedPacket->PxeVendorOption.BitMap)) {
-      //
-      // It's a wfm11a offer with PXEClient and mtftp vendor option, and
-      // return false since mtftp not supported currently.
-      //
-      return FALSE;
-    } else {
-      //
-      // If the binl offer with only PXEClient.
-      //
-      OfferType = (UINT8) ((CachedPacket->IsPxeOffer) ? DHCP4_PACKET_TYPE_BINL : DHCP4_PACKET_TYPE_DHCP_ONLY);
-    }
-  }
-
-  CachedPacket->OfferType = OfferType;
-
-  return TRUE;
-}
-
-
-/**
-  Offer dhcp service with a BINL dhcp offer.
-
-  @param  Private   Pointer to PxeBc private data.
-  @param  Index     Index of cached packets as complements of pxe mode data,
-                    the index is maximum offer number.
-
-  @retval TRUE      Offer the service successfully under priority BINL.
-  @retval FALSE     Boot Service failed, parse cached dhcp packet failed or this
-                    BINL ack cannot find options set or bootfile name specified.
-
-**/
-BOOLEAN
-PxeBcTryBinl (
-  IN PXEBC_PRIVATE_DATA  *Private,
-  IN UINT32              Index
-  )
-{
-  EFI_DHCP4_PACKET          *Offer;
-  EFI_IP_ADDRESS            ServerIp;
-  EFI_STATUS                Status;
-  PXEBC_CACHED_DHCP4_PACKET *CachedPacket;
-  EFI_DHCP4_PACKET          *Reply;
-
-  ASSERT (Index < PXEBC_MAX_OFFER_NUM);
-  ASSERT (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL);
-
-  Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
-
-  //
-  // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier)
-  // in DHCPOFFER packet.
-  // (It does not comply with PXE Spec, Ver2.1)
-  //
-  if (EFI_IP4_EQUAL (&Offer->Dhcp4.Header.ServerAddr.Addr, &mZeroIp4Addr)) {
-    CopyMem (
-      &ServerIp.Addr[0],
-      Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,
-      sizeof (EFI_IPv4_ADDRESS)
-      );
-  } else {
-    CopyMem (
-      &ServerIp.Addr[0],
-      &Offer->Dhcp4.Header.ServerAddr,
-      sizeof (EFI_IPv4_ADDRESS)
-      );
-  }
-  if (ServerIp.Addr[0] == 0) {
-    return FALSE;
-  }
-
-  CachedPacket = &Private->ProxyOffer;
-  Reply        = &CachedPacket->Packet.Offer;
-
-  Status = PxeBcDiscvBootService (
-            Private,
-            0,
-            NULL,
-            FALSE,
-            &ServerIp,
-            0,
-            NULL,
-            FALSE,
-            Reply
-            );
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
-
-  if (!PxeBcParseCachedDhcpPacket (CachedPacket)) {
-    return FALSE;
-  }
-
-  if ((CachedPacket->OfferType != DHCP4_PACKET_TYPE_PXE10) &&
-      (CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL)) {
-    //
-    // This BINL ack doesn't have discovery options set or bootfile name
-    // specified.
-    //
-    return FALSE;
-  }
-
-  Private->PxeBc.Mode->ProxyOfferReceived = TRUE;
-  CopyMem (&Private->PxeBc.Mode->ProxyOffer, &Reply->Dhcp4, Reply->Length);
-
-  return TRUE;
-}
-
-
-/**
-  Offer dhcp service for each proxy with a BINL dhcp offer.
-
-  @param  Private     Pointer to PxeBc private data
-  @param  OfferIndex  Pointer to the index of cached packets as complements of
-                      pxe mode data, the index is maximum offer number.
-
-  @return If there is no service needed offer return FALSE, otherwise TRUE.
-
-**/
-BOOLEAN
-PxeBcTryBinlProxy (
-  IN  PXEBC_PRIVATE_DATA  *Private,
-  OUT UINT32              *OfferIndex
-  )
-{
-  UINT32  Index;
-
-  for (Index = 0; Index < Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]; Index++) {
-
-    *OfferIndex = Private->BinlIndex[Index];
-    //
-    // Try this BINL proxy offer
-    //
-    if (PxeBcTryBinl (Private, *OfferIndex)) {
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
-
-
-/**
-  This function is to check the selected proxy offer (include BINL dhcp offer and
-  DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code
-  mode structure.
-
-  @param  Private          Pointer to PxeBc private data.
-
-  @retval EFI_SUCCESS                Operational successful.
-  @retval EFI_NO_RESPONSE            Offer dhcp service failed.
-  @retval EFI_BUFFER_TOO_SMALL       Failed to copy the packet to Pxe base code mode.
-
-**/
-EFI_STATUS
-PxeBcCheckSelectedOffer (
-  IN PXEBC_PRIVATE_DATA  *Private
-  )
-{
-  PXEBC_CACHED_DHCP4_PACKET *SelectedOffer;
-  EFI_DHCP4_PACKET_OPTION   **Options;
-  UINT32                    Index;
-  EFI_DHCP4_PACKET          *Offer;
-  UINT32                    ProxyOfferIndex;
-  EFI_STATUS                Status;
-  EFI_PXE_BASE_CODE_MODE    *Mode;
-  EFI_DHCP4_PACKET          *Ack;
-
-  ASSERT (Private->SelectedOffer != 0);
-
-  Status        = EFI_SUCCESS;
-  SelectedOffer = &Private->Dhcp4Offers[Private->SelectedOffer - 1];
-  Options       = SelectedOffer->Dhcp4Option;
-
-  if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BINL) {
-    //
-    // The addresses are acquired from a BINL dhcp offer, try BINL to get
-    // the bootfile name
-    //
-    if (!PxeBcTryBinl (Private, Private->SelectedOffer - 1)) {
-      Status = EFI_NO_RESPONSE;
-    }
-  } else if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) {
-    //
-    // The selected offer to finish the D.O.R.A. is a DHCP only offer, we need
-    // try proxy offers if there are some, othewise the bootfile name must be
-    // set in this DHCP only offer.
-    //
-    if (Private->GotProxyOffer) {
-      //
-      // Get rid of the compiler warning.
-      //
-      ProxyOfferIndex = 0;
-      if (Private->SortOffers) {
-        //
-        // The offers are sorted before selecting, the proxy offer type must be
-        // already determined.
-        //
-        ASSERT (Private->ProxyIndex[Private->ProxyOfferType] > 0);
-
-        if (Private->ProxyOfferType == DHCP4_PACKET_TYPE_BINL) {
-          //
-          // We buffer all received BINL proxy offers, try them all one by one
-          //
-          if (!PxeBcTryBinlProxy (Private, &ProxyOfferIndex)) {
-            Status = EFI_NO_RESPONSE;
-          }
-        } else {
-          //
-          // For other types, only one proxy offer is buffered.
-          //
-          ProxyOfferIndex = Private->ProxyIndex[Private->ProxyOfferType] - 1;
-        }
-      } else {
-        //
-        // The proxy offer type is not determined, choose proxy offer in the
-        // received order.
-        //
-        Status = EFI_NO_RESPONSE;
-
-        ASSERT (Private->NumOffers < PXEBC_MAX_OFFER_NUM);
-        for (Index = 0; Index < Private->NumOffers; Index++) {
-
-          Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
-          if (!IS_PROXY_DHCP_OFFER (Offer)) {
-            //
-            // Skip non proxy dhcp offers.
-            //
-            continue;
-          }
-
-          if (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL) {
-            //
-            // Try BINL
-            //
-            if (!PxeBcTryBinl (Private, Index)) {
-              //
-              // Failed, skip to the next offer
-              //
-              continue;
-            }
-          }
-
-          Private->ProxyOfferType = Private->Dhcp4Offers[Index].OfferType;
-          ProxyOfferIndex         = Index;
-          Status                  = EFI_SUCCESS;
-          break;
-        }
-      }
-
-      if (!EFI_ERROR (Status) && (Private->ProxyOfferType != DHCP4_PACKET_TYPE_BINL)) {
-        //
-        // Copy the proxy offer to Mode and set the flag
-        //
-        Status = PxeBcCopyProxyOffer (Private, ProxyOfferIndex);
-      }
-    } else {
-      //
-      // No proxy offer is received, the bootfile name MUST be set.
-      //
-      ASSERT (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);
-    }
-  }
-
-  if (!EFI_ERROR (Status)) {
-    //
-    // Everything is OK, set the flag and copy the DHCP packets.
-    //
-    Mode  = Private->PxeBc.Mode;
-    Offer = &SelectedOffer->Packet.Offer;
-
-    //
-    // The discover packet is already copied, just set flag here.
-    //
-    Mode->DhcpDiscoverValid = TRUE;
-
-    Ack                     = &Private->Dhcp4Ack.Packet.Ack;
-    if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BOOTP) {
-      //
-      // Other type of ACK is already cached. Bootp is special that we should
-      // use the bootp reply as the ACK and put it into the DHCP_ONLY buffer.
-      //
-      Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Offer);
-    }
-
-    PxeBcParseCachedDhcpPacket (&Private->Dhcp4Ack);
-
-    Mode->DhcpAckReceived = TRUE;
-
-    //
-    // Copy the dhcp ack.
-    //
-    CopyMem (&Mode->DhcpAck, &Ack->Dhcp4, Ack->Length);
-  }
-
-  return Status;
-}
-
-
-/**
-  Cache the Dhcp4 packet offer, Parse and validate each option of the packet.
-
-  @param  Private    Pointer to PxeBc private data.
-  @param  RcvdOffer  Pointer to the received Dhcp proxy offer packet.
-
-  @retval     EFI_SUCCESS      Cache and parse the packet successfully.
-  @retval     Others           Operation failed.
-
-**/
-EFI_STATUS
-PxeBcCacheDhcpOffer (
-  IN PXEBC_PRIVATE_DATA  *Private,
-  IN EFI_DHCP4_PACKET    *RcvdOffer
-  )
-{
-  PXEBC_CACHED_DHCP4_PACKET *CachedOffer;
-  EFI_DHCP4_PACKET          *Offer;
-  UINT8                     OfferType;
-  EFI_STATUS                Status;
-
-  CachedOffer = &Private->Dhcp4Offers[Private->NumOffers];
-  Offer       = &CachedOffer->Packet.Offer;
-
-  //
-  // Cache the orignal dhcp packet
-  //
-  Status = PxeBcCopyEfiDhcp4Packet (Offer, RcvdOffer);
-  if (EFI_ERROR(Status)) {
-    return Status;
-  }
-
-  //
-  // Parse and validate the options (including dhcp option and vendor option)
-  //
-  if (!PxeBcParseCachedDhcpPacket (CachedOffer)) {
-    return EFI_ABORTED;
-  }
-
-  OfferType = CachedOffer->OfferType;
-  if (OfferType >= DHCP4_PACKET_TYPE_MAX) {
-    return EFI_ABORTED;
-  }
-
-  if (OfferType == DHCP4_PACKET_TYPE_BOOTP) {
-
-    if (Private->BootpIndex != 0) {
-      //
-      // Only cache the first bootp offer, discard others.
-      //
-      return EFI_ABORTED;
-    } else {
-      //
-      // Take as a dhcp only offer, but record index specifically.
-      //
-      Private->BootpIndex = Private->NumOffers + 1;
-    }
-  } else {
-
-    if (IS_PROXY_DHCP_OFFER (Offer)) {
-      //
-      // It's a proxy dhcp offer with no your address, including pxe10, wfm11a or binl offer.
-      //
-      Private->GotProxyOffer = TRUE;
-
-      if (OfferType == DHCP4_PACKET_TYPE_BINL) {
-        //
-        // Cache all binl offers.
-        //
-        Private->BinlIndex[Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]] = Private->NumOffers;
-        Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]++;
-      } else if (Private->ProxyIndex[OfferType] != 0) {
-        //
-        // Only cache the first pxe10/wfm11a offers each, discard the others.
-        //
-        return EFI_ABORTED;
-      } else {
-        //
-        // Record index of the proxy dhcp offer with type other than binl.
-        //
-        Private->ProxyIndex[OfferType] = Private->NumOffers + 1;
-      }
-    } else {
-      //
-      // It's a dhcp offer with your address.
-      //
-      ASSERT (Private->ServerCount[OfferType] < PXEBC_MAX_OFFER_NUM);
-      Private->OfferIndex[OfferType][Private->ServerCount[OfferType]] = Private->NumOffers;
-      Private->ServerCount[OfferType]++;
-    }
-  }
-
-  //
-  // Count the accepted offers.
-  //
-  Private->NumOffers++;
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Switch the Ip4 policy to static.
-
-  @param[in]  Private             The pointer to PXEBC_PRIVATE_DATA.
-
-  @retval     EFI_SUCCESS         The policy is already configured to static.
-  @retval     Others              Other error as indicated..
-
-**/
-EFI_STATUS
-PxeBcSetIp4Policy (
-  IN PXEBC_PRIVATE_DATA            *Private
-  )
-{
-  EFI_STATUS                   Status;
-  EFI_IP4_CONFIG2_PROTOCOL     *Ip4Config2;
-  EFI_IP4_CONFIG2_POLICY       Policy;
-  UINTN                        DataSize;
-
-  Ip4Config2 = Private->Ip4Config2;
-  DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
-  Status = Ip4Config2->GetData (
-                       Ip4Config2,
-                       Ip4Config2DataTypePolicy,
-                       &DataSize,
-                       &Policy
-                       );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  if (Policy != Ip4Config2PolicyStatic) {
-    Policy = Ip4Config2PolicyStatic;
-    Status= Ip4Config2->SetData (
-                          Ip4Config2,
-                          Ip4Config2DataTypePolicy,
-                          sizeof (EFI_IP4_CONFIG2_POLICY),
-                          &Policy
-                          );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-
-  return  EFI_SUCCESS;
-}
-
-
-/**
-  Select the specified proxy offer, such as BINL, DHCP_ONLY and so on.
-  If the proxy does not exist, try offers with bootfile.
-
-  @param  Private   Pointer to PxeBc private data.
-
-**/
-VOID
-PxeBcSelectOffer (
-  IN PXEBC_PRIVATE_DATA  *Private
-  )
-{
-  UINT32            Index;
-  UINT32            OfferIndex;
-  EFI_DHCP4_PACKET  *Offer;
-
-  Private->SelectedOffer = 0;
-
-  if (Private->SortOffers) {
-    //
-    // Select offer according to the priority
-    //
-    if (Private->ServerCount[DHCP4_PACKET_TYPE_PXE10] > 0) {
-      //
-      // DHCP with PXE10
-      //
-      Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_PXE10][0] + 1;
-
-    } else if (Private->ServerCount[DHCP4_PACKET_TYPE_WFM11A] > 0) {
-      //
-      // DHCP with WfM
-      //
-      Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_WFM11A][0] + 1;
-
-    } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_PXE10] > 0) &&
-             (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
-            ) {
-      //
-      // DHCP only and proxy DHCP with PXE10
-      //
-      Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
-      Private->ProxyOfferType     = DHCP4_PACKET_TYPE_PXE10;
-
-    } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_WFM11A] > 0) &&
-             (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
-            ) {
-      //
-      // DHCP only and proxy DHCP with WfM
-      //
-      Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
-      Private->ProxyOfferType     = DHCP4_PACKET_TYPE_WFM11A;
-
-    } else if (Private->ServerCount[DHCP4_PACKET_TYPE_BINL] > 0) {
-      //
-      // DHCP with BINL
-      //
-      Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_BINL][0] + 1;
-
-    } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL] > 0) &&
-             (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
-            ) {
-      //
-      // DHCP only and proxy DHCP with BINL
-      //
-      Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
-      Private->ProxyOfferType     = DHCP4_PACKET_TYPE_BINL;
-
-    } else {
-      //
-      // Try offers with bootfile
-      //
-      for (Index = 0; Index < Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY]; Index++) {
-        //
-        // Select the first DHCP only offer with bootfile
-        //
-        OfferIndex = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][Index];
-        if (Private->Dhcp4Offers[OfferIndex].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {
-          Private->SelectedOffer = OfferIndex + 1;
-          break;
-        }
-      }
-
-      if (Private->SelectedOffer == 0) {
-        //
-        // Select the Bootp reply with bootfile if any
-        //
-        Private->SelectedOffer = Private->BootpIndex;
-      }
-    }
-  } else {
-    //
-    // Try the offers in the received order.
-    //
-    for (Index = 0; Index < Private->NumOffers; Index++) {
-
-      Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
-
-      if (IS_PROXY_DHCP_OFFER (Offer)) {
-        //
-        // Skip proxy offers
-        //
-        continue;
-      }
-
-      if ((Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) &&
-          ((!Private->GotProxyOffer) && (Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL))) {
-        //
-        // DHCP only offer but no proxy offer received and no bootfile option in this offer
-        //
-        continue;
-      }
-
-      Private->SelectedOffer = Index + 1;
-      break;
-    }
-  }
-}
-
-
-/**
-  Callback routine.
-
-  EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver
-  to intercept events that occurred in the configuration process. This structure
-  provides advanced control of each state transition of the DHCP process. The
-  returned status code determines the behavior of the EFI DHCPv4 Protocol driver.
-  There are three possible returned values, which are described in the following
-  table.
-
-  @param  This                  Pointer to the EFI DHCPv4 Protocol instance that is used to
-                                configure this callback function.
-  @param  Context               Pointer to the context that is initialized by
-                                EFI_DHCP4_PROTOCOL.Configure().
-  @param  CurrentState          The current operational state of the EFI DHCPv4 Protocol
-                                driver.
-  @param  Dhcp4Event            The event that occurs in the current state, which usually means a
-                                state transition.
-  @param  Packet                The DHCP packet that is going to be sent or already received.
-  @param  NewPacket             The packet that is used to replace the above Packet.
-
-  @retval EFI_SUCCESS           Tells the EFI DHCPv4 Protocol driver to continue the DHCP process.
-  @retval EFI_NOT_READY         Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol
-                                driver will continue to wait for more DHCPOFFER packets until the retry
-                                timeout expires.
-  @retval EFI_ABORTED           Tells the EFI DHCPv4 Protocol driver to abort the current process and
-                                return to the Dhcp4Init or Dhcp4InitReboot state.
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDhcpCallBack (
-  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
-  )
-{
-  PXEBC_PRIVATE_DATA                  *Private;
-  EFI_PXE_BASE_CODE_MODE              *Mode;
-  EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;
-  EFI_DHCP4_PACKET_OPTION             *MaxMsgSize;
-  UINT16                              Value;
-  EFI_STATUS                          Status;
-  BOOLEAN                             Received;
-  EFI_DHCP4_HEADER                    *DhcpHeader;
-
-  if ((Dhcp4Event != Dhcp4RcvdOffer) &&
-      (Dhcp4Event != Dhcp4SelectOffer) &&
-      (Dhcp4Event != Dhcp4SendDiscover) &&
-      (Dhcp4Event != Dhcp4RcvdAck) &&
-      (Dhcp4Event != Dhcp4SendRequest)) {
-    return EFI_SUCCESS;
-  }
-
-  Private   = (PXEBC_PRIVATE_DATA *) Context;
-  Mode      = Private->PxeBc.Mode;
-  Callback  = Private->PxeBcCallback;
-
-  //
-  // Override the Maximum DHCP Message Size.
-  //
-  MaxMsgSize = PxeBcParseExtendOptions (
-                Packet->Dhcp4.Option,
-                GET_OPTION_BUFFER_LEN (Packet),
-                DHCP4_TAG_MAXMSG
-                );
-  if (MaxMsgSize != NULL) {
-    Value = HTONS (PXEBC_DHCP4_MAX_PACKET_SIZE);
-    CopyMem (MaxMsgSize->Data, &Value, sizeof (Value));
-  }
-
-  if ((Dhcp4Event != Dhcp4SelectOffer) && (Callback != NULL)) {
-    Received = (BOOLEAN) ((Dhcp4Event == Dhcp4RcvdOffer) || (Dhcp4Event == Dhcp4RcvdAck));
-    Status = Callback->Callback (
-                        Callback,
-                        Private->Function,
-                        Received,
-                        Packet->Length,
-                        (EFI_PXE_BASE_CODE_PACKET *) &Packet->Dhcp4
-                        );
-    if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {
-      return EFI_ABORTED;
-    }
-  }
-
-  Status = EFI_SUCCESS;
-
-  switch (Dhcp4Event) {
-
-  case Dhcp4SendDiscover:
-  case Dhcp4SendRequest:
-    if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
-      //
-      // If the to be sent packet exceeds the maximum length, abort the DHCP process.
-      //
-      Status = EFI_ABORTED;
-      break;
-    }
-
-    if (Mode->SendGUID) {
-      //
-      // send the system GUID instead of the MAC address as the hardware address
-      // in the DHCP packet header.
-      //
-      DhcpHeader = &Packet->Dhcp4.Header;
-
-      if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) {
-        //
-        // GUID not yet set - send all 0xff's to show programable (via SetVariable)
-        // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff);
-        // GUID not yet set - send all 0's to show not programable
-        //
-        DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n"));
-        ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));
-      }
-
-      DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID);
-    }
-
-    if (Dhcp4Event == Dhcp4SendDiscover) {
-      //
-      // Cache the dhcp discover packet, of which some information will be used later.
-      //
-      CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet->Length);
-    }
-
-    break;
-
-  case Dhcp4RcvdOffer:
-    Status = EFI_NOT_READY;
-    if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
-      //
-      // Ignore the incoming Offers which exceed the maximum length.
-      //
-      break;
-    }
-
-    if (Private->NumOffers < PXEBC_MAX_OFFER_NUM) {
-      //
-      // Cache the dhcp offers in Private->Dhcp4Offers[]
-      // If error happens, just ignore this packet and continue to wait more offer.
-      //
-      PxeBcCacheDhcpOffer (Private, Packet);
-    }
-
-    break;
-
-  case Dhcp4SelectOffer:
-    //
-    // Select an offer, if succeeded, Private->SelectedOffer points to
-    // the index of the selected one.
-    //
-    PxeBcSelectOffer (Private);
-
-    if (Private->SelectedOffer == 0) {
-      Status = EFI_ABORTED;
-    } else {
-      *NewPacket = &Private->Dhcp4Offers[Private->SelectedOffer - 1].Packet.Offer;
-    }
-
-    break;
-
-  case Dhcp4RcvdAck:
-    //
-    // Cache Ack
-    //
-    ASSERT (Private->SelectedOffer != 0);
-
-    Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Packet);
-    if (EFI_ERROR (Status)) {
-      return EFI_ABORTED;
-    }
-    break;
-
-  default:
-    break;
-  }
-
-  return Status;
-}
-
-
-/**
-  Initialize the DHCP options and build the option list.
-
-  @param  Private          Pointer to PxeBc private data.
-  @param  OptList          Pointer to a DHCP option list.
-
-  @param  IsDhcpDiscover   Discover dhcp option or not.
-
-  @return The index item number of the option list.
-
-**/
-UINT32
-PxeBcBuildDhcpOptions (
-  IN PXEBC_PRIVATE_DATA            *Private,
-  IN EFI_DHCP4_PACKET_OPTION       **OptList,
-  IN BOOLEAN                       IsDhcpDiscover
-  )
-{
-  UINT32                    Index;
-  PXEBC_DHCP4_OPTION_ENTRY  OptEnt;
-  UINT16                    Value;
-
-  Index       = 0;
-  OptList[0]  = (EFI_DHCP4_PACKET_OPTION *) Private->OptionBuffer;
-
-  if (!IsDhcpDiscover) {
-    //
-    // Append message type.
-    //
-    OptList[Index]->OpCode  = DHCP4_TAG_MSG_TYPE;
-    OptList[Index]->Length  = 1;
-    OptEnt.Mesg             = (PXEBC_DHCP4_OPTION_MESG *) OptList[Index]->Data;
-    OptEnt.Mesg->Type       = PXEBC_DHCP4_MSG_TYPE_REQUEST;
-    Index++;
-    OptList[Index]          = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
-    //
-    // Append max message size.
-    //
-    OptList[Index]->OpCode  = DHCP4_TAG_MAXMSG;
-    OptList[Index]->Length  = (UINT8) sizeof (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE);
-    OptEnt.MaxMesgSize      = (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *) OptList[Index]->Data;
-    Value                   = NTOHS (PXEBC_DHCP4_MAX_PACKET_SIZE);
-    CopyMem (&OptEnt.MaxMesgSize->Size, &Value, sizeof (UINT16));
-    Index++;
-    OptList[Index]          = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-  }
-  //
-  // Parameter request list option.
-  //
-  OptList[Index]->OpCode    = DHCP4_TAG_PARA_LIST;
-  OptList[Index]->Length    = 35;
-  OptEnt.Para               = (PXEBC_DHCP4_OPTION_PARA *) OptList[Index]->Data;
-  OptEnt.Para->ParaList[0]  = DHCP4_TAG_NETMASK;
-  OptEnt.Para->ParaList[1]  = DHCP4_TAG_TIME_OFFSET;
-  OptEnt.Para->ParaList[2]  = DHCP4_TAG_ROUTER;
-  OptEnt.Para->ParaList[3]  = DHCP4_TAG_TIME_SERVER;
-  OptEnt.Para->ParaList[4]  = DHCP4_TAG_NAME_SERVER;
-  OptEnt.Para->ParaList[5]  = DHCP4_TAG_DNS_SERVER;
-  OptEnt.Para->ParaList[6]  = DHCP4_TAG_HOSTNAME;
-  OptEnt.Para->ParaList[7]  = DHCP4_TAG_BOOTFILE_LEN;
-  OptEnt.Para->ParaList[8]  = DHCP4_TAG_DOMAINNAME;
-  OptEnt.Para->ParaList[9]  = DHCP4_TAG_ROOTPATH;
-  OptEnt.Para->ParaList[10] = DHCP4_TAG_EXTEND_PATH;
-  OptEnt.Para->ParaList[11] = DHCP4_TAG_EMTU;
-  OptEnt.Para->ParaList[12] = DHCP4_TAG_TTL;
-  OptEnt.Para->ParaList[13] = DHCP4_TAG_BROADCAST;
-  OptEnt.Para->ParaList[14] = DHCP4_TAG_NIS_DOMAIN;
-  OptEnt.Para->ParaList[15] = DHCP4_TAG_NIS_SERVER;
-  OptEnt.Para->ParaList[16] = DHCP4_TAG_NTP_SERVER;
-  OptEnt.Para->ParaList[17] = DHCP4_TAG_VENDOR;
-  OptEnt.Para->ParaList[18] = DHCP4_TAG_REQUEST_IP;
-  OptEnt.Para->ParaList[19] = DHCP4_TAG_LEASE;
-  OptEnt.Para->ParaList[20] = DHCP4_TAG_SERVER_ID;
-  OptEnt.Para->ParaList[21] = DHCP4_TAG_T1;
-  OptEnt.Para->ParaList[22] = DHCP4_TAG_T2;
-  OptEnt.Para->ParaList[23] = DHCP4_TAG_VENDOR_CLASS_ID;
-  OptEnt.Para->ParaList[24] = DHCP4_TAG_TFTP;
-  OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE;
-  OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID;
-  OptEnt.Para->ParaList[27] = 0x80;
-  OptEnt.Para->ParaList[28] = 0x81;
-  OptEnt.Para->ParaList[29] = 0x82;
-  OptEnt.Para->ParaList[30] = 0x83;
-  OptEnt.Para->ParaList[31] = 0x84;
-  OptEnt.Para->ParaList[32] = 0x85;
-  OptEnt.Para->ParaList[33] = 0x86;
-  OptEnt.Para->ParaList[34] = 0x87;
-  Index++;
-  OptList[Index]            = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
-  //
-  // Append UUID/Guid-based client identifier option
-  //
-  OptList[Index]->OpCode  = DHCP4_TAG_UUID;
-  OptList[Index]->Length  = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UUID);
-  OptEnt.Uuid             = (PXEBC_DHCP4_OPTION_UUID *) OptList[Index]->Data;
-  OptEnt.Uuid->Type       = 0;
-  Index++;
-  OptList[Index]          = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
-  if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) {
-    //
-    // GUID not yet set - send all 0xff's to show programable (via SetVariable)
-    // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff);
-    // GUID not yet set - send all 0's to show not programable
-    //
-    DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n"));
-    ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID));
-  }
-
-  //
-  // Append client network device interface option
-  //
-  OptList[Index]->OpCode  = DHCP4_TAG_UNDI;
-  OptList[Index]->Length  = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UNDI);
-  OptEnt.Undi             = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]->Data;
-  if (Private->Nii != NULL) {
-    OptEnt.Undi->Type       = Private->Nii->Type;
-    OptEnt.Undi->MajorVer   = Private->Nii->MajorVer;
-    OptEnt.Undi->MinorVer   = Private->Nii->MinorVer;
-  } else {
-    OptEnt.Undi->Type       = DEFAULT_UNDI_TYPE;
-    OptEnt.Undi->MajorVer   = DEFAULT_UNDI_MAJOR;
-    OptEnt.Undi->MinorVer   = DEFAULT_UNDI_MINOR;
-  }
-
-  Index++;
-  OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
-  //
-  // Append client system architecture option
-  //
-  OptList[Index]->OpCode  = DHCP4_TAG_ARCH;
-  OptList[Index]->Length  = (UINT8) sizeof (PXEBC_DHCP4_OPTION_ARCH);
-  OptEnt.Arch             = (PXEBC_DHCP4_OPTION_ARCH *) OptList[Index]->Data;
-  Value                   = HTONS (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE);
-  CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));
-  Index++;
-  OptList[Index]          = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
-  //
-  // Append client system architecture option
-  //
-  OptList[Index]->OpCode  = DHCP4_TAG_VENDOR_CLASS_ID;
-  OptList[Index]->Length  = (UINT8) sizeof (PXEBC_DHCP4_OPTION_CLID);
-  OptEnt.Clid             = (PXEBC_DHCP4_OPTION_CLID *) OptList[Index]->Data;
-  CopyMem (OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof (PXEBC_DHCP4_OPTION_CLID));
-  CvtNum (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid->ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType));
-
-  if (Private->Nii != NULL) {
-    //
-    // If NII protocol exists, update DHCP option data
-    //
-    CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof (OptEnt.Clid->InterfaceName));
-    CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof (OptEnt.Clid->UndiMajor));
-    CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof (OptEnt.Clid->UndiMinor));
-  }
-
-  Index++;
-
-  return Index;
-}
-
-
-/**
-  Discover the boot of service and initialize the vendor option if exists.
-
-  @param  Private               Pointer to PxeBc private data.
-  @param  Type                  PxeBc option boot item type
-  @param  Layer                 PxeBc option boot item layer
-  @param  UseBis                Use BIS or not
-  @param  DestIp                Ip address for server
-  @param  IpCount               The total count of the server ip address
-  @param  SrvList               Server list
-  @param  IsDiscv               Discover the vendor or not
-  @param  Reply                 The dhcp4 packet of Pxe reply
-
-  @retval EFI_SUCCESS           Operation succeeds.
-  @retval EFI_OUT_OF_RESOURCES  Allocate memory pool failed.
-  @retval EFI_NOT_FOUND         There is no vendor option exists.
-  @retval EFI_TIMEOUT           Send Pxe Discover time out.
-
-**/
-EFI_STATUS
-PxeBcDiscvBootService (
-  IN PXEBC_PRIVATE_DATA                * Private,
-  IN UINT16                            Type,
-  IN UINT16                            *Layer,
-  IN BOOLEAN                           UseBis,
-  IN EFI_IP_ADDRESS                    * DestIp,
-  IN UINT16                            IpCount,
-  IN EFI_PXE_BASE_CODE_SRVLIST         * SrvList,
-  IN BOOLEAN                           IsDiscv,
-  OUT EFI_DHCP4_PACKET                 * Reply OPTIONAL
-  )
-{
-  EFI_PXE_BASE_CODE_UDP_PORT          Sport;
-  EFI_PXE_BASE_CODE_MODE              *Mode;
-  EFI_DHCP4_PROTOCOL                  *Dhcp4;
-  EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN    Token;
-  BOOLEAN                             IsBCast;
-  EFI_STATUS                          Status;
-  UINT16                              RepIndex;
-  UINT16                              SrvIndex;
-  UINT16                              TryIndex;
-  EFI_DHCP4_LISTEN_POINT              ListenPoint;
-  EFI_DHCP4_PACKET                    *Response;
-  EFI_DHCP4_PACKET_OPTION             *OptList[PXEBC_DHCP4_MAX_OPTION_NUM];
-  UINT32                              OptCount;
-  EFI_DHCP4_PACKET_OPTION             *PxeOpt;
-  PXEBC_OPTION_BOOT_ITEM              *PxeBootItem;
-  UINT8                               VendorOptLen;
-  EFI_DHCP4_HEADER                    *DhcpHeader;
-  UINT32                              Xid;
-
-  Mode      = Private->PxeBc.Mode;
-  Dhcp4     = Private->Dhcp4;
-  Status    = EFI_SUCCESS;
-
-  ZeroMem (&Token, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN));
-
-  if (DestIp == NULL) {
-    Sport   = PXEBC_DHCP4_S_PORT;
-    IsBCast = TRUE;
-  } else {
-    Sport   = PXEBC_BS_DISCOVER_PORT;
-    IsBCast = FALSE;
-  }
-
-  if (!UseBis && Layer != NULL) {
-    *Layer &= EFI_PXE_BASE_CODE_BOOT_LAYER_MASK;
-  }
-
-  OptCount = PxeBcBuildDhcpOptions (Private, OptList, FALSE);
-
-  if (IsDiscv) {
-    ASSERT (Layer != NULL);
-    //
-    // Add vendor option of PXE_BOOT_ITEM
-    //
-    VendorOptLen = (UINT8) ((sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 + sizeof (PXEBC_OPTION_BOOT_ITEM) + 1);
-    OptList[OptCount] = AllocatePool (VendorOptLen);
-    if (OptList[OptCount] == NULL) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    OptList[OptCount]->OpCode     = DHCP4_TAG_VENDOR;
-    OptList[OptCount]->Length     = (UINT8) (VendorOptLen - 2);
-    PxeOpt                        = (EFI_DHCP4_PACKET_OPTION *) OptList[OptCount]->Data;
-    PxeOpt->OpCode                = PXEBC_VENDOR_TAG_BOOT_ITEM;
-    PxeOpt->Length                = (UINT8) sizeof (PXEBC_OPTION_BOOT_ITEM);
-    PxeBootItem                   = (PXEBC_OPTION_BOOT_ITEM *) PxeOpt->Data;
-    PxeBootItem->Type             = HTONS (Type);
-    PxeBootItem->Layer            = HTONS (*Layer);
-    PxeOpt->Data[PxeOpt->Length]  = DHCP4_TAG_EOP;
-
-    OptCount++;
-  }
-
-  Status = Dhcp4->Build (Dhcp4, &Private->SeedPacket, 0, NULL, OptCount, OptList, &Token.Packet);
-
-  if (IsDiscv) {
-    FreePool (OptList[OptCount - 1]);
-  }
-
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  DhcpHeader = &Token.Packet->Dhcp4.Header;
-  if (Mode->SendGUID) {
-    if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) {
-      //
-      // GUID not yet set - send all 0's to show not programable
-      //
-      DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n"));
-      ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));
-    }
-
-    DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID);
-  }
-
-  Xid                                 = NET_RANDOM (NetRandomInitSeed ());
-  Token.Packet->Dhcp4.Header.Xid      = HTONL(Xid);
-  Token.Packet->Dhcp4.Header.Reserved = HTONS((UINT16) ((IsBCast) ? 0x8000 : 0));
-  CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));
-
-  Token.RemotePort = Sport;
-
-  if (IsBCast) {
-    SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff);
-  } else {
-    CopyMem (&Token.RemoteAddress, DestIp, sizeof (EFI_IPv4_ADDRESS));
-  }
-
-  CopyMem (&Token.GatewayAddress, &Private->GatewayIp, sizeof (EFI_IPv4_ADDRESS));
-
-  if (!IsBCast) {
-    Token.ListenPointCount            = 1;
-    Token.ListenPoints                = &ListenPoint;
-    Token.ListenPoints[0].ListenPort  = PXEBC_BS_DISCOVER_PORT;
-    CopyMem (&Token.ListenPoints[0].ListenAddress, &Private->StationIp, sizeof(EFI_IPv4_ADDRESS));
-    CopyMem (&Token.ListenPoints[0].SubnetMask, &Private->SubnetMask, sizeof(EFI_IPv4_ADDRESS));
-  }
-  //
-  // Send Pxe Discover
-  //
-  for (TryIndex = 1; TryIndex <= PXEBC_BOOT_REQUEST_RETRIES; TryIndex++) {
-
-    Token.TimeoutValue                  = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex);
-    Token.Packet->Dhcp4.Header.Seconds  = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * (TryIndex - 1));
-
-    Status              = Dhcp4->TransmitReceive (Dhcp4, &Token);
-
-    if (Token.Status != EFI_TIMEOUT) {
-      break;
-    }
-  }
-
-  if (TryIndex > PXEBC_BOOT_REQUEST_RETRIES) {
-    //
-    // No server response our PXE request
-    //
-    Status = EFI_TIMEOUT;
-  }
-
-  if (!EFI_ERROR (Status)) {
-    //
-    // Find Pxe Reply
-    //
-    RepIndex  = 0;
-    SrvIndex  = 0;
-    Response  = Token.ResponseList;
-
-    while (RepIndex < Token.ResponseCount) {
-      if (Response->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
-        SrvIndex = 0;
-        RepIndex++;
-        Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size);
-        continue;
-      }
-
-      while (SrvIndex < IpCount) {
-
-        if (SrvList[SrvIndex].AcceptAnyResponse) {
-          break;
-        }
-
-        if ((SrvList[SrvIndex].Type == Type) && EFI_IP4_EQUAL (&(Response->Dhcp4.Header.ServerAddr), &(Private->ServerIp))) {
-          break;
-        }
-
-        SrvIndex++;
-      }
-
-      if ((IpCount != SrvIndex) || (IpCount == 0)) {
-        break;
-      }
-
-      SrvIndex = 0;
-      RepIndex++;
-      Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size);
-    }
-
-    if (RepIndex < Token.ResponseCount) {
-
-      if (Reply != NULL) {
-        Status = PxeBcCopyEfiDhcp4Packet (Reply, Response);
-        if (EFI_ERROR(Status)) {
-          goto ON_EXIT;
-        }
-      }
-
-      if (IsDiscv) {
-        CopyMem (&(Mode->PxeDiscover), &(Token.Packet->Dhcp4), Token.Packet->Length);
-        Mode->PxeDiscoverValid = TRUE;
-
-        CopyMem (Mode->PxeReply.Raw, &Response->Dhcp4, Response->Length);
-        Mode->PxeReplyReceived = TRUE;
-      }
-    } else {
-      Status = EFI_NOT_FOUND;
-    }
-  }
-
-ON_EXIT:
-  //
-  // free the responselist
-  //
-  if (Token.ResponseList != NULL) {
-    FreePool (Token.ResponseList);
-  }
-  //
-  // Free the dhcp packet
-  //
-  if (Token.Packet != NULL) {
-    FreePool (Token.Packet);
-  }
-
-  return Status;
-}
-
-
-/**
-  Parse interested dhcp options.
-
-  @param  Buffer     Pointer to the dhcp options packet.
-  @param  Length     The length of the dhcp options.
-  @param  OptTag     The option OpCode.
-
-  @return NULL if the buffer length is 0 and OpCode is not
-          DHCP4_TAG_EOP, or the pointer to the buffer.
-
-**/
-EFI_DHCP4_PACKET_OPTION *
-PxeBcParseExtendOptions (
-  IN UINT8                         *Buffer,
-  IN UINT32                        Length,
-  IN UINT8                         OptTag
-  )
-{
-  EFI_DHCP4_PACKET_OPTION *Option;
-  UINT32                  Offset;
-
-  Option  = (EFI_DHCP4_PACKET_OPTION *) Buffer;
-  Offset  = 0;
-
-  while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) {
-
-    if (Option->OpCode == OptTag) {
-
-      return Option;
-    }
-
-    if (Option->OpCode == DHCP4_TAG_PAD) {
-      Offset++;
-    } else {
-      Offset += Option->Length + 2;
-    }
-
-    Option = (EFI_DHCP4_PACKET_OPTION *) (Buffer + Offset);
-  }
-
-  return NULL;
-}
-
-
-/**
-  This function is to parse and check vendor options.
-
-  @param  Dhcp4Option           Pointer to dhcp options
-  @param  VendorOption          Pointer to vendor options
-
-  @return TRUE if valid for vendor options, or FALSE.
-
-**/
-BOOLEAN
-PxeBcParseVendorOptions (
-  IN EFI_DHCP4_PACKET_OPTION       *Dhcp4Option,
-  IN PXEBC_VENDOR_OPTION           *VendorOption
-  )
-{
-  UINT32                  *BitMap;
-  UINT8                   VendorOptionLen;
-  EFI_DHCP4_PACKET_OPTION *PxeOption;
-  UINT8                   Offset;
-
-  BitMap          = VendorOption->BitMap;
-  VendorOptionLen = Dhcp4Option->Length;
-  PxeOption       = (EFI_DHCP4_PACKET_OPTION *) &Dhcp4Option->Data[0];
-  Offset          = 0;
-
-  while ((Offset < VendorOptionLen) && (PxeOption->OpCode != DHCP4_TAG_EOP)) {
-    //
-    // Parse every Vendor Option and set its BitMap
-    //
-    switch (PxeOption->OpCode) {
-
-    case PXEBC_VENDOR_TAG_MTFTP_IP:
-
-      CopyMem (&VendorOption->MtftpIp, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS));
-      break;
-
-    case PXEBC_VENDOR_TAG_MTFTP_CPORT:
-
-      CopyMem (&VendorOption->MtftpCPort, PxeOption->Data, sizeof (VendorOption->MtftpCPort));
-      break;
-
-    case PXEBC_VENDOR_TAG_MTFTP_SPORT:
-
-      CopyMem (&VendorOption->MtftpSPort, PxeOption->Data, sizeof (VendorOption->MtftpSPort));
-      break;
-
-    case PXEBC_VENDOR_TAG_MTFTP_TIMEOUT:
-
-      VendorOption->MtftpTimeout = *PxeOption->Data;
-      break;
-
-    case PXEBC_VENDOR_TAG_MTFTP_DELAY:
-
-      VendorOption->MtftpDelay = *PxeOption->Data;
-      break;
-
-    case PXEBC_VENDOR_TAG_DISCOVER_CTRL:
-
-      VendorOption->DiscoverCtrl = *PxeOption->Data;
-      break;
-
-    case PXEBC_VENDOR_TAG_DISCOVER_MCAST:
-
-      CopyMem (&VendorOption->DiscoverMcastIp, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS));
-      break;
-
-    case PXEBC_VENDOR_TAG_BOOT_SERVERS:
-
-      VendorOption->BootSvrLen  = PxeOption->Length;
-      VendorOption->BootSvr     = (PXEBC_BOOT_SVR_ENTRY *) PxeOption->Data;
-      break;
-
-    case PXEBC_VENDOR_TAG_BOOT_MENU:
-
-      VendorOption->BootMenuLen = PxeOption->Length;
-      VendorOption->BootMenu    = (PXEBC_BOOT_MENU_ENTRY *) PxeOption->Data;
-      break;
-
-    case PXEBC_VENDOR_TAG_MENU_PROMPT:
-
-      VendorOption->MenuPromptLen = PxeOption->Length;
-      VendorOption->MenuPrompt    = (PXEBC_MENU_PROMPT *) PxeOption->Data;
-      break;
-
-    case PXEBC_VENDOR_TAG_MCAST_ALLOC:
-
-      CopyMem (&VendorOption->McastIpBase, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS));
-      CopyMem (&VendorOption->McastIpBlock, PxeOption->Data + 4, sizeof (VendorOption->McastIpBlock));
-      CopyMem (&VendorOption->McastIpRange, PxeOption->Data + 6, sizeof (VendorOption->McastIpRange));
-      break;
-
-    case PXEBC_VENDOR_TAG_CREDENTIAL_TYPES:
-
-      VendorOption->CredTypeLen = PxeOption->Length;
-      VendorOption->CredType    = (UINT32 *) PxeOption->Data;
-      break;
-
-    case PXEBC_VENDOR_TAG_BOOT_ITEM:
-
-      CopyMem (&VendorOption->BootSrvType, PxeOption->Data, sizeof (VendorOption->BootSrvType));
-      CopyMem (&VendorOption->BootSrvLayer, PxeOption->Data + 2, sizeof (VendorOption->BootSrvLayer));
-      break;
-    }
-
-    SET_VENDOR_OPTION_BIT_MAP (BitMap, PxeOption->OpCode);
-
-    if (PxeOption->OpCode == DHCP4_TAG_PAD) {
-      Offset++;
-    } else {
-      Offset = (UINT8) (Offset + PxeOption->Length + 2);
-    }
-
-    PxeOption = (EFI_DHCP4_PACKET_OPTION *) (Dhcp4Option->Data + Offset);
-  }
-
-  //
-  // FixMe, return falas if invalid of any vendor option
-  //
-
-  return TRUE;
-}
-
-
-/**
-  This function display boot item detail.
-
-  If the length of the boot item string over 70 Char, just display 70 Char.
-
-  @param  Str     Pointer to a string (boot item string).
-  @param  Len     The length of string.
-
-**/
-VOID
-PxeBcDisplayBootItem (
-  IN UINT8                 *Str,
-  IN UINT8                 Len
-  )
-{
-  UINT8 Tmp;
-
-  Len       = (UINT8) MIN (70, Len);
-  Tmp       = Str[Len];
-  Str[Len]  = 0;
-  AsciiPrint ("%a \n", Str);
-  Str[Len] = Tmp;
-}
-
-
-/**
-  Choose the boot prompt.
-
-  @param  Private              Pointer to PxeBc private data.
-
-  @retval EFI_SUCCESS          Select boot prompt done.
-  @retval EFI_TIMEOUT          Select boot prompt time out.
-  @retval EFI_NOT_FOUND        The proxy offer is not Pxe10.
-  @retval EFI_ABORTED          User cancel the operation.
-  @retval EFI_NOT_READY        Read the input key from the keybroad has not finish.
-
-**/
-EFI_STATUS
-PxeBcSelectBootPrompt (
-  IN PXEBC_PRIVATE_DATA              *Private
-  )
-{
-  PXEBC_CACHED_DHCP4_PACKET  *Packet;
-  PXEBC_VENDOR_OPTION       *VendorOpt;
-  EFI_EVENT                  TimeoutEvent;
-  EFI_EVENT                  DescendEvent;
-  EFI_INPUT_KEY              InputKey;
-  EFI_STATUS                 Status;
-  UINT8                      Timeout;
-  UINT8                      *Prompt;
-  UINT8                      PromptLen;
-  INT32                      SecCol;
-  INT32                      SecRow;
-
-  TimeoutEvent  = NULL;
-  DescendEvent  = NULL;
-
-  if (Private->PxeBc.Mode->ProxyOfferReceived) {
-
-    Packet  = &Private->ProxyOffer;
-  } else {
-
-    Packet  = &Private->Dhcp4Ack;
-  }
-
-  if (Packet->OfferType != DHCP4_PACKET_TYPE_PXE10) {
-    return EFI_NOT_FOUND;
-  }
-
-  VendorOpt = &Packet->PxeVendorOption;
-  //
-  // According to the PXE specification 2.1, Table 2-1 PXE DHCP Options  (Full
-  // List), we must not consider a boot prompt or boot menu if all of the
-  // following hold:
-  // - the PXE_DISCOVERY_CONTROL PXE tag is present inside the Vendor Options
-  //   (=43) DHCP tag, and
-  // - the PXE_DISCOVERY_CONTROL PXE tag has bit 3 set, and
-  // - a boot file name has been presented with DHCP option 67.
-  //
-  if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) &&
-      Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {
-    return EFI_ABORTED;
-  }
-
-  if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) {
-    return EFI_SUCCESS;
-  }
-
-  Timeout   = VendorOpt->MenuPrompt->Timeout;
-  Prompt    = VendorOpt->MenuPrompt->Prompt;
-  PromptLen = (UINT8) (VendorOpt->MenuPromptLen - 1);
-
-  if (Timeout == 0) {
-    return EFI_SUCCESS;
-  }
-
-  if (Timeout == 255) {
-    return EFI_TIMEOUT;
-  }
-
-  Status = gBS->CreateEvent (
-                  EVT_TIMER,
-                  TPL_CALLBACK,
-                  NULL,
-                  NULL,
-                  &TimeoutEvent
-                  );
-
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = gBS->SetTimer (
-                  TimeoutEvent,
-                  TimerRelative,
-                  MultU64x32 (Timeout, TICKS_PER_SECOND)
-                  );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  Status = gBS->CreateEvent (
-                  EVT_TIMER,
-                  TPL_CALLBACK,
-                  NULL,
-                  NULL,
-                  &DescendEvent
-                  );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  Status = gBS->SetTimer (
-                  DescendEvent,
-                  TimerPeriodic,
-                  TICKS_PER_SECOND
-                  );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  SecCol = gST->ConOut->Mode->CursorColumn;
-  SecRow = gST->ConOut->Mode->CursorRow;
-
-  PxeBcDisplayBootItem (Prompt, PromptLen);
-
-  gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow);
-  AsciiPrint ("(%d) ", Timeout--);
-
-  while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {
-
-    if (!EFI_ERROR (gBS->CheckEvent (DescendEvent))) {
-      gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow);
-      AsciiPrint ("(%d) ", Timeout--);
-    }
-
-    if (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) {
-
-      gBS->Stall (10 * TICKS_PER_MS);
-      continue;
-    }
-
-    if (InputKey.ScanCode == 0) {
-
-      switch (InputKey.UnicodeChar) {
-      case CTRL ('c'):
-        Status = EFI_ABORTED;
-        break;
-
-      case CTRL ('m'):
-      case 'm':
-      case 'M':
-        Status = EFI_TIMEOUT;
-        break;
-
-      default:
-        continue;
-      }
-    } else {
-
-      switch (InputKey.ScanCode) {
-      case SCAN_F8:
-        Status = EFI_TIMEOUT;
-        break;
-
-      case SCAN_ESC:
-        Status = EFI_ABORTED;
-        break;
-
-      default:
-        continue;
-      }
-    }
-
-    break;
-  }
-
-  gST->ConOut->SetCursorPosition (gST->ConOut, 0 , SecRow + 1);
-
-ON_EXIT:
-
-  if (DescendEvent != NULL) {
-    gBS->CloseEvent (DescendEvent);
-  }
-
-  if (TimeoutEvent != NULL) {
-    gBS->CloseEvent (TimeoutEvent);
-  }
-
-  return Status;
-}
-
-
-/**
-  Select the boot menu.
-
-  @param  Private         Pointer to PxeBc private data.
-  @param  Type            The type of the menu.
-  @param  UseDefaultItem  Use default item or not.
-
-  @retval EFI_ABORTED     User cancel operation.
-  @retval EFI_SUCCESS     Select the boot menu success.
-  @retval EFI_NOT_READY   Read the input key from the keybroad has not finish.
-
-**/
-EFI_STATUS
-PxeBcSelectBootMenu (
-  IN  PXEBC_PRIVATE_DATA              *Private,
-  OUT UINT16                          *Type,
-  IN  BOOLEAN                         UseDefaultItem
-  )
-{
-  PXEBC_CACHED_DHCP4_PACKET  *Packet;
-  PXEBC_VENDOR_OPTION        *VendorOpt;
-  EFI_INPUT_KEY              InputKey;
-  UINT8                      MenuSize;
-  UINT8                      MenuNum;
-  INT32                      TopRow;
-  UINT16                     Select;
-  UINT16                     LastSelect;
-  UINT8                      Index;
-  BOOLEAN                    Finish;
-  CHAR8                      Blank[70];
-  PXEBC_BOOT_MENU_ENTRY      *MenuItem;
-  PXEBC_BOOT_MENU_ENTRY      *MenuArray[PXEBC_MAX_MENU_NUM];
-
-  Finish  = FALSE;
-  Select  = 0;
-  Index   = 0;
-  *Type   = 0;
-
-  if (Private->PxeBc.Mode->ProxyOfferReceived) {
-
-    Packet  = &Private->ProxyOffer;
-  } else {
-
-    Packet  = &Private->Dhcp4Ack;
-  }
-
-  ASSERT (Packet->OfferType == DHCP4_PACKET_TYPE_PXE10);
-
-  VendorOpt = &Packet->PxeVendorOption;
-
-  if (!IS_VALID_BOOT_MENU (VendorOpt->BitMap)) {
-    return EFI_SUCCESS;
-  }
-
-  SetMem (Blank, sizeof(Blank), ' ');
-
-  MenuSize  = VendorOpt->BootMenuLen;
-  MenuItem  = VendorOpt->BootMenu;
-
-  if (MenuSize == 0) {
-    return EFI_NOT_READY;
-  }
-
-  while (MenuSize > 0) {
-    MenuArray[Index++]  = MenuItem;
-    MenuSize          = (UINT8) (MenuSize - (MenuItem->DescLen + 3));
-    MenuItem          = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem + MenuItem->DescLen + 3);
-    if (Index >= PXEBC_MAX_MENU_NUM) {
-      break;
-    }
-  }
-
-  if (UseDefaultItem) {
-    *Type = MenuArray[0]->Type;
-    *Type = NTOHS (*Type);
-    return EFI_SUCCESS;
-  }
-
-  MenuNum = Index;
-
-  for (Index = 0; Index < MenuNum; Index++) {
-    PxeBcDisplayBootItem (MenuArray[Index]->DescStr, MenuArray[Index]->DescLen);
-  }
-
-  TopRow  = gST->ConOut->Mode->CursorRow - MenuNum;
-
-  do {
-    ASSERT (Select < PXEBC_MAX_MENU_NUM);
-    //
-    // highlight selected row
-    //
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));
-    gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + Select);
-    Blank[MenuArray[Select]->DescLen] = 0;
-    AsciiPrint ("%a\r", Blank);
-    PxeBcDisplayBootItem (MenuArray[Select]->DescStr, MenuArray[Select]->DescLen);
-    gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum);
-    LastSelect = Select;
-
-    while (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) {
-      gBS->Stall (10 * TICKS_PER_MS);
-    }
-
-    if (InputKey.ScanCode == 0) {
-      switch (InputKey.UnicodeChar) {
-      case CTRL ('c'):
-        InputKey.ScanCode = SCAN_ESC;
-        break;
-
-      case CTRL ('j'):  /* linefeed */
-      case CTRL ('m'):  /* return */
-        Finish = TRUE;
-        break;
-
-      case CTRL ('i'):  /* tab */
-      case ' ':
-      case 'd':
-      case 'D':
-        InputKey.ScanCode = SCAN_DOWN;
-        break;
-
-      case CTRL ('h'):  /* backspace */
-      case 'u':
-      case 'U':
-        InputKey.ScanCode = SCAN_UP;
-        break;
-
-      default:
-        InputKey.ScanCode = 0;
-      }
-    }
-
-    switch (InputKey.ScanCode) {
-    case SCAN_LEFT:
-    case SCAN_UP:
-      if (Select > 0) {
-        --Select;
-      }
-
-      break;
-
-    case SCAN_DOWN:
-    case SCAN_RIGHT:
-      if (++Select == MenuNum) {
-        --Select;
-      }
-
-      break;
-
-    case SCAN_PAGE_UP:
-    case SCAN_HOME:
-      Select = 0;
-      break;
-
-    case SCAN_PAGE_DOWN:
-    case SCAN_END:
-      Select = (UINT16) (MenuNum - 1);
-      break;
-
-    case SCAN_ESC:
-      return EFI_ABORTED;
-    }
-
-    /* unhighlight last selected row */
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
-    gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + LastSelect);
-    Blank[MenuArray[LastSelect]->DescLen] = 0;
-    AsciiPrint ("%a\r", Blank);
-    PxeBcDisplayBootItem (MenuArray[LastSelect]->DescStr, MenuArray[LastSelect]->DescLen);
-    gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum);
-  } while (!Finish);
-
-   ASSERT (Select < PXEBC_MAX_MENU_NUM);
-
-  //
-  // Swap the byte order
-  //
-  CopyMem (Type, &MenuArray[Select]->Type, sizeof (UINT16));
-  *Type = NTOHS (*Type);
-
-  return EFI_SUCCESS;
-}
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
deleted file mode 100644
index 76c140d8e3ff..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
+++ /dev/null
@@ -1,665 +0,0 @@
-/** @file
-  The driver binding for UEFI PXEBC protocol.
-
-Copyright (c) 2007 - 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 "PxeBcImpl.h"
-
-EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {
-  PxeBcDriverBindingSupported,
-  PxeBcDriverBindingStart,
-  PxeBcDriverBindingStop,
-  0xa,
-  NULL,
-  NULL
-};
-
-/**
-  This is the declaration of an EFI image entry point. This entry point is
-  the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
-  both device drivers and bus drivers.
-
-  @param  ImageHandle           The firmware allocated handle for the UEFI image.
-  @param  SystemTable           A pointer to the EFI System Table.
-
-  @retval EFI_SUCCESS           The operation completed successfully.
-  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverEntryPoint (
-  IN EFI_HANDLE             ImageHandle,
-  IN EFI_SYSTEM_TABLE       *SystemTable
-  )
-{
-  return EfiLibInstallDriverBindingComponentName2 (
-          ImageHandle,
-          SystemTable,
-          &gPxeBcDriverBinding,
-          ImageHandle,
-          &gPxeBcComponentName,
-          &gPxeBcComponentName2
-          );
-}
-
-
-/**
-  Test to see if this driver supports ControllerHandle. This service
-  is called by the EFI boot service ConnectController(). In
-  order to make drivers as small as possible, there are a few calling
-  restrictions for this service. ConnectController() must
-  follow these calling restrictions. If any other agent wishes to call
-  Supported() it must also follow these calling restrictions.
-  PxeBc requires DHCP4 and MTFTP4 protocols.
-
-  @param  This                Protocol instance pointer.
-  @param  ControllerHandle    Handle of device to test
-  @param  RemainingDevicePath Optional parameter use to pick a specific child
-                              device to start.
-
-  @retval EFI_SUCCESS         This driver supports this device
-  @retval EFI_ALREADY_STARTED This driver is already running on this device
-  @retval other               This driver does not support this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL  * This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL
-  )
-{
-  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;
-  EFI_STATUS                  Status;
-
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiPxeBaseCodeProtocolGuid,
-                  (VOID **) &PxeBc,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-
-  if (!EFI_ERROR (Status)) {
-    return EFI_ALREADY_STARTED;
-  }
-
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiDhcp4ServiceBindingProtocolGuid,
-                  NULL,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
-                  );
-
-  if (!EFI_ERROR (Status)) {
-
-    Status = gBS->OpenProtocol (
-                    ControllerHandle,
-                    &gEfiMtftp4ServiceBindingProtocolGuid,
-                    NULL,
-                    This->DriverBindingHandle,
-                    ControllerHandle,
-                    EFI_OPEN_PROTOCOL_TEST_PROTOCOL
-                    );
-
-  }
-
-  return Status;
-}
-
-
-/**
-  Start this driver on ControllerHandle. This service is called by the
-  EFI boot service ConnectController(). In order to make
-  drivers as small as possible, there are a few calling restrictions for
-  this service. ConnectController() must follow these
-  calling restrictions. If any other agent wishes to call Start() it
-  must also follow these calling restrictions.
-
-  @param  This                 Protocol instance pointer.
-  @param  ControllerHandle     Handle of device to bind driver to
-  @param  RemainingDevicePath  Optional parameter use to pick a specific child
-                               device to start.
-
-  @retval EFI_SUCCESS          This driver is added to ControllerHandle
-  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle
-  @retval other                This driver does not support this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL  * This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL
-  )
-{
-  PXEBC_PRIVATE_DATA  *Private;
-  UINTN               Index;
-  EFI_STATUS          Status;
-  EFI_IP4_MODE_DATA   Ip4ModeData;
-
-  Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));
-  if (Private == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Private->Signature                    = PXEBC_PRIVATE_DATA_SIGNATURE;
-  Private->Controller                   = ControllerHandle;
-  Private->Image                        = This->DriverBindingHandle;
-  CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc));
-  Private->PxeBc.Mode                   = &Private->Mode;
-  CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile));
-
-  Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
-  Private->Dhcp4Ack.Packet.Ack.Size     = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
-  Private->PxeReply.Packet.Ack.Size     = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
-
-  for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) {
-    Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
-  }
-
-  //
-  // Get the NII interface if it exists.
-  //
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiNetworkInterfaceIdentifierProtocolGuid_31,
-                  (VOID **) &Private->Nii,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    Private->Nii = NULL;
-  }
-
-  Status = NetLibCreateServiceChild (
-            ControllerHandle,
-            This->DriverBindingHandle,
-            &gEfiArpServiceBindingProtocolGuid,
-            &Private->ArpChild
-            );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->OpenProtocol (
-                  Private->ArpChild,
-                  &gEfiArpProtocolGuid,
-                  (VOID **) &Private->Arp,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = NetLibCreateServiceChild (
-            ControllerHandle,
-            This->DriverBindingHandle,
-            &gEfiDhcp4ServiceBindingProtocolGuid,
-            &Private->Dhcp4Child
-            );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->OpenProtocol (
-                  Private->Dhcp4Child,
-                  &gEfiDhcp4ProtocolGuid,
-                  (VOID **) &Private->Dhcp4,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = NetLibCreateServiceChild (
-             ControllerHandle,
-             This->DriverBindingHandle,
-             &gEfiIp4ServiceBindingProtocolGuid,
-             &Private->Ip4Child
-             );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->OpenProtocol (
-                  Private->Ip4Child,
-                  &gEfiIp4ProtocolGuid,
-                  (VOID **) &Private->Ip4,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  //
-  // Get max packet size from Ip4 to calculate block size for Tftp later.
-  //
-  Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL);
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize;
-
-  Status = NetLibCreateServiceChild (
-             ControllerHandle,
-             This->DriverBindingHandle,
-             &gEfiMtftp4ServiceBindingProtocolGuid,
-             &Private->Mtftp4Child
-             );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->OpenProtocol (
-                  Private->Mtftp4Child,
-                  &gEfiMtftp4ProtocolGuid,
-                  (VOID **) &Private->Mtftp4,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = NetLibCreateServiceChild (
-             ControllerHandle,
-             This->DriverBindingHandle,
-             &gEfiUdp4ServiceBindingProtocolGuid,
-             &Private->Udp4ReadChild
-             );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  //
-  // The UDP instance for EfiPxeBcUdpRead
-  //
-  Status = gBS->OpenProtocol (
-                  Private->Udp4ReadChild,
-                  &gEfiUdp4ProtocolGuid,
-                  (VOID **) &Private->Udp4Read,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  //
-  // The UDP instance for EfiPxeBcUdpWrite
-  //
-  Status = NetLibCreateServiceChild (
-             ControllerHandle,
-             This->DriverBindingHandle,
-             &gEfiUdp4ServiceBindingProtocolGuid,
-             &Private->Udp4WriteChild
-             );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = gBS->OpenProtocol (
-                  Private->Udp4WriteChild,
-                  &gEfiUdp4ProtocolGuid,
-                  (VOID **) &Private->Udp4Write,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-  ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));
-  Private->Udp4CfgData.AcceptBroadcast    = FALSE;
-  Private->Udp4CfgData.AcceptPromiscuous  = FALSE;
-  Private->Udp4CfgData.AcceptAnyPort      = TRUE;
-  Private->Udp4CfgData.AllowDuplicatePort = TRUE;
-  Private->Udp4CfgData.TypeOfService      = DEFAULT_ToS;
-  Private->Udp4CfgData.TimeToLive         = DEFAULT_TTL;
-  Private->Udp4CfgData.DoNotFragment      = FALSE;
-  Private->Udp4CfgData.ReceiveTimeout     = PXEBC_DEFAULT_LIFETIME;
-  Private->Udp4CfgData.UseDefaultAddress  = FALSE;
-
-  PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read);
-  Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen;
-  CopyMem (&Private->Mac, &Private->SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen);
-
-
-  ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA));
-  Private->Ip4ConfigData.DefaultProtocol   = EFI_IP_PROTO_ICMP;
-  Private->Ip4ConfigData.AcceptIcmpErrors  = TRUE;
-  Private->Ip4ConfigData.TypeOfService     = DEFAULT_ToS;
-  Private->Ip4ConfigData.TimeToLive        = DEFAULT_TTL;
-  Private->Ip4ConfigData.DoNotFragment     = FALSE;
-  Private->Ip4ConfigData.RawData           = FALSE;
-
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &ControllerHandle,
-                  &gEfiPxeBaseCodeProtocolGuid,
-                  &Private->PxeBc,
-                  &gEfiLoadFileProtocolGuid,
-                  &Private->LoadFile,
-                  NULL
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-  //
-  // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy.
-  //
-  Status = gBS->HandleProtocol (
-                  ControllerHandle,
-                  &gEfiIp4Config2ProtocolGuid,
-                  (VOID **) &Private->Ip4Config2
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  return EFI_SUCCESS;
-
-ON_ERROR:
-
-  if (Private->Udp4WriteChild != NULL) {
-    gBS->CloseProtocol (
-           Private->Udp4WriteChild,
-           &gEfiUdp4ProtocolGuid,
-           This->DriverBindingHandle,
-           ControllerHandle
-           );
-    NetLibDestroyServiceChild (
-      ControllerHandle,
-      This->DriverBindingHandle,
-      &gEfiUdp4ServiceBindingProtocolGuid,
-      Private->Udp4WriteChild
-      );
-  }
-
-  if (Private->Udp4ReadChild != NULL) {
-    gBS->CloseProtocol (
-          Private->Udp4ReadChild,
-          &gEfiUdp4ProtocolGuid,
-          This->DriverBindingHandle,
-          ControllerHandle
-          );
-    NetLibDestroyServiceChild (
-      ControllerHandle,
-      This->DriverBindingHandle,
-      &gEfiUdp4ServiceBindingProtocolGuid,
-      Private->Udp4ReadChild
-      );
-  }
-
-  if (Private->Mtftp4Child != NULL) {
-    gBS->CloseProtocol (
-          Private->Mtftp4Child,
-          &gEfiMtftp4ProtocolGuid,
-          This->DriverBindingHandle,
-          ControllerHandle
-          );
-
-    NetLibDestroyServiceChild (
-      ControllerHandle,
-      This->DriverBindingHandle,
-      &gEfiMtftp4ServiceBindingProtocolGuid,
-      Private->Mtftp4Child
-      );
-  }
-
-  if (Private->Ip4Child != NULL) {
-    gBS->CloseProtocol (
-          Private->Ip4Child,
-          &gEfiIp4ProtocolGuid,
-          This->DriverBindingHandle,
-          ControllerHandle
-          );
-
-    NetLibDestroyServiceChild (
-      ControllerHandle,
-      This->DriverBindingHandle,
-      &gEfiIp4ServiceBindingProtocolGuid,
-      Private->Ip4Child
-      );
-  }
-
-  if (Private->Dhcp4Child != NULL) {
-    gBS->CloseProtocol (
-          Private->Dhcp4Child,
-          &gEfiDhcp4ProtocolGuid,
-          This->DriverBindingHandle,
-          ControllerHandle
-          );
-
-    NetLibDestroyServiceChild (
-      ControllerHandle,
-      This->DriverBindingHandle,
-      &gEfiDhcp4ServiceBindingProtocolGuid,
-      Private->Dhcp4Child
-      );
-  }
-
-  if (Private->ArpChild != NULL) {
-    gBS->CloseProtocol (
-          Private->ArpChild,
-          &gEfiArpProtocolGuid,
-          This->DriverBindingHandle,
-          ControllerHandle
-          );
-
-    NetLibDestroyServiceChild (
-      ControllerHandle,
-      This->DriverBindingHandle,
-      &gEfiArpServiceBindingProtocolGuid,
-      Private->ArpChild
-      );
-  }
-
-  FreePool (Private);
-
-  return Status;
-}
-
-
-/**
-  Stop this driver on ControllerHandle. This service is called by the
-  EFI boot service DisconnectController(). In order to
-  make drivers as small as possible, there are a few calling
-  restrictions for this service. DisconnectController()
-  must follow these calling restrictions. If any other agent wishes
-  to call Stop() it must also follow these calling restrictions.
-
-  @param  This              Protocol instance pointer.
-  @param  ControllerHandle  Handle of device to stop driver on
-  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
-                            children is zero stop the entire bus driver.
-  @param  ChildHandleBuffer List of Child Handles to Stop.
-
-  @retval EFI_SUCCESS       This driver is removed ControllerHandle
-  @retval other             This driver was not removed from this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingStop (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN UINTN                        NumberOfChildren,
-  IN EFI_HANDLE                   *ChildHandleBuffer
-  )
-{
-  PXEBC_PRIVATE_DATA          *Private;
-  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;
-  EFI_HANDLE                  NicHandle;
-  EFI_STATUS                  Status;
-
-  NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);
-  if (NicHandle == NULL) {
-    NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);
-
-    if (NicHandle == NULL) {
-      NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);
-
-      if (NicHandle == NULL) {
-        NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);
-
-        if (NicHandle == NULL) {
-          NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);
-
-          if (NicHandle == NULL) {
-            return EFI_SUCCESS;
-          }
-        }
-      }
-    }
-  }
-
-  Status = gBS->OpenProtocol (
-                  NicHandle,
-                  &gEfiPxeBaseCodeProtocolGuid,
-                  (VOID **) &PxeBc,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Stop functionality of PXE Base Code protocol
-  //
-  Status = PxeBc->Stop (PxeBc);
-  if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {
-    return Status;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);
-
-  Status = gBS->UninstallMultipleProtocolInterfaces (
-                  NicHandle,
-                  &gEfiPxeBaseCodeProtocolGuid,
-                  &Private->PxeBc,
-                  &gEfiLoadFileProtocolGuid,
-                  &Private->LoadFile,
-                  NULL
-                  );
-
-  if (!EFI_ERROR (Status)) {
-
-    gBS->CloseProtocol (
-           Private->Udp4WriteChild,
-           &gEfiUdp4ProtocolGuid,
-           This->DriverBindingHandle,
-           NicHandle
-           );
-    NetLibDestroyServiceChild (
-      ControllerHandle,
-      This->DriverBindingHandle,
-      &gEfiUdp4ServiceBindingProtocolGuid,
-      Private->Udp4WriteChild
-      );
-
-    gBS->CloseProtocol (
-          Private->Udp4ReadChild,
-          &gEfiUdp4ProtocolGuid,
-          This->DriverBindingHandle,
-          NicHandle
-          );
-    NetLibDestroyServiceChild (
-      NicHandle,
-      This->DriverBindingHandle,
-      &gEfiUdp4ServiceBindingProtocolGuid,
-      Private->Udp4ReadChild
-      );
-
-    gBS->CloseProtocol (
-          Private->Dhcp4Child,
-          &gEfiDhcp4ProtocolGuid,
-          This->DriverBindingHandle,
-          NicHandle
-          );
-    NetLibDestroyServiceChild (
-      NicHandle,
-      This->DriverBindingHandle,
-      &gEfiDhcp4ServiceBindingProtocolGuid,
-      Private->Dhcp4Child
-      );
-
-    gBS->CloseProtocol (
-          Private->Mtftp4Child,
-          &gEfiMtftp4ProtocolGuid,
-          This->DriverBindingHandle,
-          NicHandle
-          );
-    NetLibDestroyServiceChild (
-      NicHandle,
-      This->DriverBindingHandle,
-      &gEfiMtftp4ServiceBindingProtocolGuid,
-      Private->Mtftp4Child
-      );
-
-    gBS->CloseProtocol (
-          Private->Ip4Child,
-          &gEfiIp4ProtocolGuid,
-          This->DriverBindingHandle,
-          NicHandle
-          );
-    NetLibDestroyServiceChild (
-      NicHandle,
-      This->DriverBindingHandle,
-      &gEfiIp4ServiceBindingProtocolGuid,
-      Private->Ip4Child
-      );
-
-    gBS->CloseProtocol (
-          Private->ArpChild,
-          &gEfiArpProtocolGuid,
-          This->DriverBindingHandle,
-          NicHandle
-          );
-    NetLibDestroyServiceChild (
-      NicHandle,
-      This->DriverBindingHandle,
-      &gEfiArpServiceBindingProtocolGuid,
-      Private->ArpChild
-      );
-
-    FreePool (Private);
-  }
-
-  return Status;
-}
-
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
deleted file mode 100644
index 3fa3be99c178..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
+++ /dev/null
@@ -1,2989 +0,0 @@
-/** @file
-  Interface routines for PxeBc.
-
-Copyright (c) 2007 - 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 "PxeBcImpl.h"
-
-UINT32  mPxeDhcpTimeout[4] = { 4, 8, 16, 32 };
-
-/**
-  Get and record the arp cache.
-
-  @param  This                    Pointer to EFI_PXE_BC_PROTOCOL
-
-  @retval EFI_SUCCESS             Arp cache updated successfully
-  @retval others                  If error occurs when getting arp cache
-
-**/
-EFI_STATUS
-UpdateArpCache (
-  IN EFI_PXE_BASE_CODE_PROTOCOL     * This
-  )
-{
-  PXEBC_PRIVATE_DATA      *Private;
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-  EFI_STATUS              Status;
-  UINT32                  EntryLength;
-  UINT32                  EntryCount;
-  EFI_ARP_FIND_DATA       *Entries;
-  UINT32                  Index;
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = Private->PxeBc.Mode;
-
-  Status = Private->Arp->Find (
-                     Private->Arp,
-                     TRUE,
-                     NULL,
-                     &EntryLength,
-                     &EntryCount,
-                     &Entries,
-                     TRUE
-                     );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Mode->ArpCacheEntries = MIN (
-                           EntryCount,
-                           EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES
-                           );
-  for (Index = 0; Index < Mode->ArpCacheEntries; Index ++) {
-    CopyMem (
-      &Mode->ArpCache[Index].IpAddr,
-      Entries + 1,
-      Entries->SwAddressLength
-      );
-    CopyMem (
-      &Mode->ArpCache[Index].MacAddr,
-      (UINT8 *) (Entries + 1) + Entries->SwAddressLength,
-      Entries->HwAddressLength
-      );
-    //
-    // Slip to the next FindData.
-    //
-    Entries = (EFI_ARP_FIND_DATA *) ((UINT8 *) Entries + EntryLength);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Timeout routine to update arp cache.
-
-  @param  Event              Pointer to EFI_PXE_BC_PROTOCOL
-  @param  Context            Context of the timer event
-
-**/
-VOID
-EFIAPI
-ArpCacheUpdateTimeout (
-  IN EFI_EVENT    Event,
-  IN VOID         *Context
-  )
-{
-  UpdateArpCache ((EFI_PXE_BASE_CODE_PROTOCOL *) Context);
-}
-
-/**
-  Do arp resolution from arp cache in PxeBcMode.
-
-  @param  PxeBcMode      The PXE BC mode to look into.
-  @param  Ip4Addr        The Ip4 address for resolution.
-  @param  MacAddress     The resoluted MAC address if the resolution is successful.
-                         The value is undefined if resolution fails.
-
-  @retval TRUE           The resolution is successful.
-  @retval FALSE          Otherwise.
-
-**/
-BOOLEAN
-FindInArpCache (
-  IN  EFI_PXE_BASE_CODE_MODE    *PxeBcMode,
-  IN  EFI_IPv4_ADDRESS          *Ip4Addr,
-  OUT EFI_MAC_ADDRESS           *MacAddress
-  )
-{
-  UINT32                  Index;
-
-  for (Index = 0; Index < PxeBcMode->ArpCacheEntries; Index ++) {
-    if (EFI_IP4_EQUAL (&PxeBcMode->ArpCache[Index].IpAddr.v4, Ip4Addr)) {
-      CopyMem (
-        MacAddress,
-        &PxeBcMode->ArpCache[Index].MacAddr,
-        sizeof (EFI_MAC_ADDRESS)
-        );
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
-
-/**
-  Notify function for the ICMP receive token, used to process
-  the received ICMP packets.
-
-  @param  Context               The PXEBC private data.
-
-**/
-VOID
-EFIAPI
-IcmpErrorListenHandlerDpc (
-  IN VOID      *Context
-  )
-{
-  EFI_STATUS              Status;
-  EFI_IP4_RECEIVE_DATA    *RxData;
-  EFI_IP4_PROTOCOL        *Ip4;
-  PXEBC_PRIVATE_DATA      *Private;
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-  UINTN                   Index;
-  UINT32                  CopiedLen;
-  UINT8                   *CopiedPointer;
-
-  Private = (PXEBC_PRIVATE_DATA *) Context;
-  Mode    = &Private->Mode;
-  Status  = Private->IcmpErrorRcvToken.Status;
-  RxData  = Private->IcmpErrorRcvToken.Packet.RxData;
-  Ip4     = Private->Ip4;
-
-  if (Status == EFI_ABORTED) {
-    //
-    // The reception is actively aborted by the consumer, directly return.
-    //
-    return;
-  }
-
-  if (RxData == NULL) {
-    goto Resume;
-  }
-
-  if (Status != EFI_ICMP_ERROR) {
-    //
-    // The return status should be recognized as EFI_ICMP_ERROR.
-    //
-    goto CleanUp;
-  }
-
-  if (EFI_IP4 (RxData->Header->SourceAddress) != 0 &&
-      (NTOHL (Mode->SubnetMask.Addr[0]) != 0) &&
-      IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) &&
-      !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0]))) {
-    //
-    // The source address is not zero and it's not a unicast IP address, discard it.
-    //
-    goto CleanUp;
-  }
-
-  if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v4)) {
-    //
-    // The dest address is not equal to Station Ip address, discard it.
-    //
-    goto CleanUp;
-  }
-
-  //
-  // Constructor ICMP error packet
-  //
-  CopiedLen = 0;
-  CopiedPointer = (UINT8 *) &Mode->IcmpError;
-
-  for (Index = 0; Index < RxData->FragmentCount; Index ++) {
-    CopiedLen += RxData->FragmentTable[Index].FragmentLength;
-    if (CopiedLen <= sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) {
-      CopyMem (
-        CopiedPointer,
-        RxData->FragmentTable[Index].FragmentBuffer,
-        RxData->FragmentTable[Index].FragmentLength
-        );
-    } else {
-      CopyMem (
-        CopiedPointer,
-        RxData->FragmentTable[Index].FragmentBuffer,
-        CopiedLen - sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)
-        );
-    }
-    CopiedPointer += CopiedLen;
-  }
-
-CleanUp:
-  gBS->SignalEvent (RxData->RecycleSignal);
-
-Resume:
-  Ip4->Receive (Ip4, &(Private->IcmpErrorRcvToken));
-}
-
-/**
-  Request IcmpErrorListenHandlerDpc as a DPC at TPL_CALLBACK
-
-  @param  Event                 The event signaled.
-  @param  Context               The context passed in by the event notifier.
-
-**/
-VOID
-EFIAPI
-IcmpErrorListenHandler (
-  IN EFI_EVENT Event,
-  IN VOID      *Context
-  )
-{
-  //
-  // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK
-  //
-  QueueDpc (TPL_CALLBACK, IcmpErrorListenHandlerDpc, Context);
-}
-
-/**
-  Enables the use of the PXE Base Code Protocol functions.
-
-  This function enables the use of the PXE Base Code Protocol functions. If the
-  Started field of the EFI_PXE_BASE_CODE_MODE structure is already TRUE, then
-  EFI_ALREADY_STARTED will be returned. If UseIpv6 is TRUE, then IPv6 formatted
-  addresses will be used in this session. If UseIpv6 is FALSE, then IPv4 formatted
-  addresses will be used in this session. If UseIpv6 is TRUE, and the Ipv6Supported
-  field of the EFI_PXE_BASE_CODE_MODE structure is FALSE, then EFI_UNSUPPORTED will
-  be returned. If there is not enough memory or other resources to start the PXE
-  Base Code Protocol, then EFI_OUT_OF_RESOURCES will be returned. Otherwise, the
-  PXE Base Code Protocol will be started, and all of the fields of the EFI_PXE_BASE_CODE_MODE
-  structure will be initialized as follows:
-    StartedSet to TRUE.
-    Ipv6SupportedUnchanged.
-    Ipv6AvailableUnchanged.
-    UsingIpv6Set to UseIpv6.
-    BisSupportedUnchanged.
-    BisDetectedUnchanged.
-    AutoArpSet to TRUE.
-    SendGUIDSet to FALSE.
-    TTLSet to DEFAULT_TTL.
-    ToSSet to DEFAULT_ToS.
-    DhcpCompletedSet to FALSE.
-    ProxyOfferReceivedSet to FALSE.
-    StationIpSet to an address of all zeros.
-    SubnetMaskSet to a subnet mask of all zeros.
-    DhcpDiscoverZero-filled.
-    DhcpAckZero-filled.
-    ProxyOfferZero-filled.
-    PxeDiscoverValidSet to FALSE.
-    PxeDiscoverZero-filled.
-    PxeReplyValidSet to FALSE.
-    PxeReplyZero-filled.
-    PxeBisReplyValidSet to FALSE.
-    PxeBisReplyZero-filled.
-    IpFilterSet the Filters field to 0 and the IpCnt field to 0.
-    ArpCacheEntriesSet to 0.
-    ArpCacheZero-filled.
-    RouteTableEntriesSet to 0.
-    RouteTableZero-filled.
-    IcmpErrorReceivedSet to FALSE.
-    IcmpErrorZero-filled.
-    TftpErroReceivedSet to FALSE.
-    TftpErrorZero-filled.
-    MakeCallbacksSet to TRUE if the PXE Base Code Callback Protocol is available.
-    Set to FALSE if the PXE Base Code Callback Protocol is not available.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  UseIpv6               Specifies the type of IP addresses that are to be used during the session
-                                that is being started. Set to TRUE for IPv6 addresses, and FALSE for
-                                IPv4 addresses.
-
-  @retval EFI_SUCCESS           The PXE Base Code Protocol was started.
-  @retval EFI_DEVICE_ERROR      The network device encountered an error during this oper
-  @retval EFI_UNSUPPORTED       UseIpv6 is TRUE, but the Ipv6Supported field of the
-                                EFI_PXE_BASE_CODE_MODE structure is FALSE.
-  @retval EFI_ALREADY_STARTED   The PXE Base Code Protocol is already in the started state.
-  @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
-                                EFI_PXE_BASE_CODE_PROTOCOL structure.
-  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough memory or other resources to start the
-                                PXE Base Code Protocol.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcStart (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,
-  IN BOOLEAN                          UseIpv6
-  )
-{
-  PXEBC_PRIVATE_DATA      *Private;
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-  EFI_STATUS              Status;
-
-  if (This == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = Private->PxeBc.Mode;
-
-  if (Mode->Started) {
-    return EFI_ALREADY_STARTED;
-  }
-
-  if (UseIpv6) {
-    //
-    // IPv6 is not supported now.
-    //
-    return EFI_UNSUPPORTED;
-  }
-
-  AsciiPrint ("\n>>Start PXE over IPv4");
-
-  //
-  // Configure the udp4 instance to let it receive data
-  //
-  Status = Private->Udp4Read->Configure (
-                               Private->Udp4Read,
-                               &Private->Udp4CfgData
-                               );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-
-  //
-  // Configure block size for TFTP as a default value to handle all link layers.
-  //
-  Private->BlockSize   = MIN (Private->Ip4MaxPacketSize, PXEBC_DEFAULT_PACKET_SIZE) -
-                           PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE;
-  //
-  // If PcdTftpBlockSize is set to non-zero, override the default value.
-  //
-  if (PcdGet64 (PcdTftpBlockSize) != 0) {
-    Private->BlockSize   = (UINTN) PcdGet64 (PcdTftpBlockSize);
-  }
-
-  Private->AddressIsOk = FALSE;
-
-  ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE));
-
-  Mode->Started = TRUE;
-  Mode->TTL     = DEFAULT_TTL;
-  Mode->ToS     = DEFAULT_ToS;
-  Mode->AutoArp = TRUE;
-
-  //
-  // Create the event for Arp Cache checking.
-  //
-  Status = gBS->CreateEvent (
-                  EVT_TIMER | EVT_NOTIFY_SIGNAL,
-                  TPL_CALLBACK,
-                  ArpCacheUpdateTimeout,
-                  This,
-                  &Private->GetArpCacheEvent
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  //
-  // Start the timeout timer event.
-  //
-  Status = gBS->SetTimer (
-                  Private->GetArpCacheEvent,
-                  TimerPeriodic,
-                  TICKS_PER_SECOND
-                  );
-
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  //
-  // Create ICMP error receiving event
-  //
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  IcmpErrorListenHandler,
-                  Private,
-                  &(Private->IcmpErrorRcvToken.Event)
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  //
-  //DHCP4 service allows only one of its children to be configured in
-  //the active state, If the DHCP4 D.O.R.A started by IP4 auto
-  //configuration and has not been completed, the Dhcp4 state machine
-  //will not be in the right state for the PXE to start a new round D.O.R.A.
-  //so we need to switch it's policy to static.
-  //
-  Status = PxeBcSetIp4Policy (Private);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  //
-  // start to listen incoming packet
-  //
-  Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken);
-  if (!EFI_ERROR (Status)) {
-    return Status;
-  }
-
-ON_EXIT:
-  Private->Ip4->Configure (Private->Ip4, NULL);
-
-  if (Private->IcmpErrorRcvToken.Event != NULL) {
-    gBS->CloseEvent (Private->IcmpErrorRcvToken.Event);
-  }
-
-  if (Private->GetArpCacheEvent != NULL) {
-    gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0);
-    gBS->CloseEvent (Private->GetArpCacheEvent);
-  }
-
-  Mode->Started = FALSE;
-  Mode->TTL     = 0;
-  Mode->ToS     = 0;
-  Mode->AutoArp = FALSE;
-
-  return Status;
-}
-
-
-/**
-  Disables the use of the PXE Base Code Protocol functions.
-
-  This function stops all activity on the network device. All the resources allocated
-  in Start() are released, the Started field of the EFI_PXE_BASE_CODE_MODE structure is
-  set to FALSE and EFI_SUCCESS is returned. If the Started field of the EFI_PXE_BASE_CODE_MODE
-  structure is already FALSE, then EFI_NOT_STARTED will be returned.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-
-  @retval EFI_SUCCESS           The PXE Base Code Protocol was stopped.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is already in the stopped state.
-  @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
-                                EFI_PXE_BASE_CODE_PROTOCOL structure.
-  @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcStop (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This
-  )
-{
-  PXEBC_PRIVATE_DATA      *Private;
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-
-  if (This == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = Private->PxeBc.Mode;
-
-  if (!Mode->Started) {
-    return EFI_NOT_STARTED;
-  }
-
-  Private->Ip4->Cancel (Private->Ip4, NULL);
-  //
-  // Dispatch the DPCs queued by the NotifyFunction of the canceled rx token's
-  // events.
-  //
-  DispatchDpc ();
-
-  Private->Ip4->Configure (Private->Ip4, NULL);
-
-  //
-  // Close the ICMP error receiving event.
-  //
-  gBS->CloseEvent (Private->IcmpErrorRcvToken.Event);
-
-  //
-  // Cancel the TimeoutEvent timer.
-  //
-  gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0);
-
-  //
-  // Close the TimeoutEvent event.
-  //
-  gBS->CloseEvent (Private->GetArpCacheEvent);
-
-  Mode->Started = FALSE;
-
-  Private->CurrentUdpSrcPort = 0;
-  Private->Udp4Write->Configure (Private->Udp4Write, NULL);
-  Private->Udp4Read->Groups (Private->Udp4Read, FALSE, NULL);
-  Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
-  Private->Dhcp4->Stop (Private->Dhcp4);
-  Private->Dhcp4->Configure (Private->Dhcp4, NULL);
-
-  Private->FileSize = 0;
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request / acknowledge) or DHCPv6
-  S.A.R.R (solicit / advertise / request / reply) sequence.
-
-  This function attempts to complete the DHCP sequence. If this sequence is completed,
-  then EFI_SUCCESS is returned, and the DhcpCompleted, ProxyOfferReceived, StationIp,
-  SubnetMask, DhcpDiscover, DhcpAck, and ProxyOffer fields of the EFI_PXE_BASE_CODE_MODE
-  structure are filled in.
-  If SortOffers is TRUE, then the cached DHCP offer packets will be sorted before
-  they are tried. If SortOffers is FALSE, then the cached DHCP offer packets will
-  be tried in the order in which they are received. Please see the Preboot Execution
-  Environment (PXE) Specification for additional details on the implementation of DHCP.
-  This function can take at least 31 seconds to timeout and return control to the
-  caller. If the DHCP sequence does not complete, then EFI_TIMEOUT will be returned.
-  If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
-  then the DHCP sequence will be stopped and EFI_ABORTED will be returned.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  SortOffers            TRUE if the offers received should be sorted. Set to FALSE to try the
-                                offers in the order that they are received.
-
-  @retval EFI_SUCCESS           Valid DHCP has completed.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
-                                EFI_PXE_BASE_CODE_PROTOCOL structure.
-  @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
-  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough memory to complete the DHCP Protocol.
-  @retval EFI_ABORTED           The callback function aborted the DHCP Protocol.
-  @retval EFI_TIMEOUT           The DHCP Protocol timed out.
-  @retval EFI_ICMP_ERROR        An ICMP error packet was received during the DHCP session.
-  @retval EFI_NO_RESPONSE       Valid PXE offer was not received.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcDhcp (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,
-  IN BOOLEAN                          SortOffers
-  )
-{
-  PXEBC_PRIVATE_DATA           *Private;
-  EFI_PXE_BASE_CODE_MODE       *Mode;
-  EFI_DHCP4_PROTOCOL           *Dhcp4;
-  EFI_DHCP4_CONFIG_DATA        Dhcp4CfgData;
-  EFI_DHCP4_MODE_DATA          Dhcp4Mode;
-  EFI_DHCP4_PACKET_OPTION      *OptList[PXEBC_DHCP4_MAX_OPTION_NUM];
-  UINT32                       OptCount;
-  EFI_STATUS                   Status;
-  EFI_ARP_CONFIG_DATA          ArpConfigData;
-  EFI_PXE_BASE_CODE_IP_FILTER  IpFilter;
-
-  if (This == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status              = EFI_SUCCESS;
-  Private             = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode                = Private->PxeBc.Mode;
-  Dhcp4               = Private->Dhcp4;
-  Private->Function   = EFI_PXE_BASE_CODE_FUNCTION_DHCP;
-  Private->SortOffers = SortOffers;
-
-  if (!Mode->Started) {
-    return EFI_NOT_STARTED;
-  }
-
-  Mode->IcmpErrorReceived = FALSE;
-
-  //
-  // Stop Udp4Read instance
-  //
-  Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
-  //
-  // Initialize the DHCP options and build the option list
-  //
-  OptCount = PxeBcBuildDhcpOptions (Private, OptList, TRUE);
-
-  //
-  // Set the DHCP4 config data.
-  // The four discovery timeouts are 4, 8, 16, 32 seconds respectively.
-  //
-  ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA));
-  Dhcp4CfgData.OptionCount      = OptCount;
-  Dhcp4CfgData.OptionList       = OptList;
-  Dhcp4CfgData.Dhcp4Callback    = PxeBcDhcpCallBack;
-  Dhcp4CfgData.CallbackContext  = Private;
-  Dhcp4CfgData.DiscoverTryCount = 4;
-  Dhcp4CfgData.DiscoverTimeout  = mPxeDhcpTimeout;
-
-  Status          = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  //
-  // Zero those arrays to record the varies numbers of DHCP OFFERS.
-  //
-  Private->GotProxyOffer = FALSE;
-  Private->NumOffers     = 0;
-  Private->BootpIndex    = 0;
-  ZeroMem (Private->ServerCount, sizeof (Private->ServerCount));
-  ZeroMem (Private->ProxyIndex, sizeof (Private->ProxyIndex));
-
-  Status = Dhcp4->Start (Dhcp4, NULL);
-  if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
-    if (Status == EFI_ICMP_ERROR) {
-      Mode->IcmpErrorReceived = TRUE;
-    }
-    goto ON_EXIT;
-  }
-
-  Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode);
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  ASSERT (Dhcp4Mode.State == Dhcp4Bound);
-
-  CopyMem (&Private->StationIp, &Dhcp4Mode.ClientAddress, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&Private->SubnetMask, &Dhcp4Mode.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&Private->GatewayIp, &Dhcp4Mode.RouterAddress, sizeof (EFI_IPv4_ADDRESS));
-
-  CopyMem (&Mode->StationIp, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));
-  CopyMem (&Mode->SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-
-  //
-  // Check the selected offer to see whether BINL is required, if no or BINL is
-  // finished, set the various Mode members.
-  //
-  Status = PxeBcCheckSelectedOffer (Private);
-
-  AsciiPrint ("\n  Station IP address is ");
-
-  PxeBcShowIp4Addr (&Private->StationIp.v4);
-  AsciiPrint ("\n");
-
-ON_EXIT:
-  if (EFI_ERROR (Status)) {
-    Dhcp4->Stop (Dhcp4);
-    Dhcp4->Configure (Dhcp4, NULL);
-  } else {
-    //
-    // Remove the previously configured option list and callback function
-    //
-    ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA));
-    Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);
-
-    Private->AddressIsOk = TRUE;
-
-    if (!Mode->UsingIpv6) {
-      //
-      // If in IPv4 mode, configure the corresponding ARP with this new
-      // station IP address.
-      //
-      ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
-
-      ArpConfigData.SwAddressType   = 0x0800;
-      ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
-      ArpConfigData.StationAddress  = &Private->StationIp.v4;
-
-      Private->Arp->Configure (Private->Arp, NULL);
-      Private->Arp->Configure (Private->Arp, &ArpConfigData);
-
-      //
-      // Updated the route table. Fill the first entry.
-      //
-      Mode->RouteTableEntries                = 1;
-      Mode->RouteTable[0].IpAddr.Addr[0]     = Private->StationIp.Addr[0] & Private->SubnetMask.Addr[0];
-      Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0];
-      Mode->RouteTable[0].GwAddr.Addr[0]     = 0;
-
-      //
-      // Create the default route entry if there is a default router.
-      //
-      if (Private->GatewayIp.Addr[0] != 0) {
-        Mode->RouteTableEntries                = 2;
-        Mode->RouteTable[1].IpAddr.Addr[0]     = 0;
-        Mode->RouteTable[1].SubnetMask.Addr[0] = 0;
-        Mode->RouteTable[1].GwAddr.Addr[0]     = Private->GatewayIp.Addr[0];
-      }
-
-      //
-      // Flush new station IP address into Udp4CfgData and Ip4ConfigData
-      //
-      CopyMem (&Private->Udp4CfgData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));
-      CopyMem (&Private->Udp4CfgData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-      CopyMem (&Private->Ip4ConfigData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));
-      CopyMem (&Private->Ip4ConfigData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-
-      //
-      // Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address.
-      //
-      Private->Ip4->Cancel (Private->Ip4, &Private->IcmpErrorRcvToken);
-      Private->Ip4->Configure (Private->Ip4, NULL);
-
-      Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData);
-      if (EFI_ERROR (Status)) {
-        goto ON_EXIT;
-      }
-
-      Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken);
-      if (EFI_ERROR (Status)) {
-        goto ON_EXIT;
-      }
-    }
-  }
-
-  Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
-
-  //
-  // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
-  // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
-  //
-  ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
-  IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
-  This->SetIpFilter (This, &IpFilter);
-
-  return Status;
-}
-
-
-/**
-  Attempts to complete the PXE Boot Server and/or boot image discovery sequence.
-
-  This function attempts to complete the PXE Boot Server and/or boot image discovery
-  sequence. If this sequence is completed, then EFI_SUCCESS is returned, and the
-  PxeDiscoverValid, PxeDiscover, PxeReplyReceived, and PxeReply fields of the
-  EFI_PXE_BASE_CODE_MODE structure are filled in. If UseBis is TRUE, then the
-  PxeBisReplyReceived and PxeBisReply fields of the EFI_PXE_BASE_CODE_MODE structure
-  will also be filled in. If UseBis is FALSE, then PxeBisReplyValid will be set to FALSE.
-  In the structure referenced by parameter Info, the PXE Boot Server list, SrvList[],
-  has two uses: It is the Boot Server IP address list used for unicast discovery
-  (if the UseUCast field is TRUE), and it is the list used for Boot Server verification
-  (if the MustUseList field is TRUE). Also, if the MustUseList field in that structure
-  is TRUE and the AcceptAnyResponse field in the SrvList[] array is TRUE, any Boot
-  Server reply of that type will be accepted. If the AcceptAnyResponse field is
-  FALSE, only responses from Boot Servers with matching IP addresses will be accepted.
-  This function can take at least 10 seconds to timeout and return control to the
-  caller. If the Discovery sequence does not complete, then EFI_TIMEOUT will be
-  returned. Please see the Preboot Execution Environment (PXE) Specification for
-  additional details on the implementation of the Discovery sequence.
-  If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
-  then the Discovery sequence is stopped and EFI_ABORTED will be returned.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  Type                  The type of bootstrap to perform.
-  @param  Layer                 Pointer to the boot server layer number to discover, which must be
-                                PXE_BOOT_LAYER_INITIAL when a new server type is being
-                                discovered.
-  @param  UseBis                TRUE if Boot Integrity Services are to be used. FALSE otherwise.
-  @param  Info                  Pointer to a data structure that contains additional information on the
-                                type of discovery operation that is to be performed.
-
-  @retval EFI_SUCCESS           The Discovery sequence has been completed.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-  @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
-  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough memory to complete Discovery.
-  @retval EFI_ABORTED           The callback function aborted the Discovery sequence.
-  @retval EFI_TIMEOUT           The Discovery sequence timed out.
-  @retval EFI_ICMP_ERROR        An ICMP error packet was received during the PXE discovery
-                                session.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcDiscover (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,
-  IN UINT16                           Type,
-  IN UINT16                           *Layer,
-  IN BOOLEAN                          UseBis,
-  IN EFI_PXE_BASE_CODE_DISCOVER_INFO  *Info   OPTIONAL
-  )
-{
-  PXEBC_PRIVATE_DATA              *Private;
-  EFI_PXE_BASE_CODE_MODE          *Mode;
-  EFI_PXE_BASE_CODE_DISCOVER_INFO DefaultInfo;
-  EFI_PXE_BASE_CODE_DISCOVER_INFO *CreatedInfo;
-  EFI_PXE_BASE_CODE_SRVLIST       *SrvList;
-  EFI_PXE_BASE_CODE_SRVLIST       DefaultSrvList;
-  PXEBC_CACHED_DHCP4_PACKET       *Packet;
-  PXEBC_VENDOR_OPTION             *VendorOpt;
-  UINT16                          Index;
-  EFI_STATUS                      Status;
-  PXEBC_BOOT_SVR_ENTRY            *BootSvrEntry;
-  EFI_PXE_BASE_CODE_IP_FILTER     IpFilter;
-
-  if (This == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private           = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode              = Private->PxeBc.Mode;
-  BootSvrEntry      = NULL;
-  SrvList           = NULL;
-  CreatedInfo       = NULL;
-  Status            = EFI_DEVICE_ERROR;
-  Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DISCOVER;
-
-  if (!Private->AddressIsOk) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (!Mode->Started) {
-    return EFI_NOT_STARTED;
-  }
-
-  //
-  // Stop Udp4Read instance
-  //
-  Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
-  Mode->IcmpErrorReceived = FALSE;
-
-  //
-  // If layer isn't EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL,
-  //   use the previous setting;
-  // If info isn't offered,
-  //   use the cached DhcpAck and ProxyOffer packets.
-  //
-  ZeroMem (&DefaultInfo, sizeof (EFI_PXE_BASE_CODE_DISCOVER_INFO));
-  if (*Layer != EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL) {
-
-    if (!Mode->PxeDiscoverValid || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) {
-
-      Status = EFI_INVALID_PARAMETER;
-      goto ON_EXIT;
-    }
-
-    DefaultInfo.IpCnt                 = 1;
-    DefaultInfo.UseUCast              = TRUE;
-
-    DefaultSrvList.Type               = Type;
-    DefaultSrvList.AcceptAnyResponse  = FALSE;
-    DefaultSrvList.IpAddr.Addr[0]     = Private->ServerIp.Addr[0];
-
-    SrvList = &DefaultSrvList;
-    Info = &DefaultInfo;
-  } else if (Info == NULL) {
-    //
-    // Create info by the cached packet before
-    //
-    Packet    = (Mode->ProxyOfferReceived) ? &Private->ProxyOffer : &Private->Dhcp4Ack;
-    VendorOpt = &Packet->PxeVendorOption;
-
-    if (!Mode->DhcpAckReceived || !IS_VALID_DISCOVER_VENDOR_OPTION (VendorOpt->BitMap)) {
-      //
-      // Address is not acquired or no discovery options.
-      //
-      Status = EFI_INVALID_PARAMETER;
-      goto ON_EXIT;
-    }
-
-    DefaultInfo.UseMCast    = (BOOLEAN)!IS_DISABLE_MCAST_DISCOVER (VendorOpt->DiscoverCtrl);
-    DefaultInfo.UseBCast    = (BOOLEAN)!IS_DISABLE_BCAST_DISCOVER (VendorOpt->DiscoverCtrl);
-    DefaultInfo.MustUseList = (BOOLEAN) IS_ENABLE_USE_SERVER_LIST (VendorOpt->DiscoverCtrl);
-    DefaultInfo.UseUCast    = DefaultInfo.MustUseList;
-
-    if (DefaultInfo.UseMCast) {
-      //
-      // Get the multicast discover ip address from vendor option.
-      //
-      CopyMem (
-        &DefaultInfo.ServerMCastIp.Addr,
-        &VendorOpt->DiscoverMcastIp,
-        sizeof (EFI_IPv4_ADDRESS)
-        );
-    }
-
-    DefaultInfo.IpCnt = 0;
-    Info    = &DefaultInfo;
-    SrvList = Info->SrvList;
-
-    if (DefaultInfo.MustUseList) {
-      BootSvrEntry  = VendorOpt->BootSvr;
-      Status        = EFI_INVALID_PARAMETER;
-
-      while (((UINT8) (BootSvrEntry - VendorOpt->BootSvr)) < VendorOpt->BootSvrLen) {
-
-        if (BootSvrEntry->Type == HTONS (Type)) {
-          Status = EFI_SUCCESS;
-          break;
-        }
-
-        BootSvrEntry = GET_NEXT_BOOT_SVR_ENTRY (BootSvrEntry);
-      }
-
-      if (EFI_ERROR (Status)) {
-        goto ON_EXIT;
-      }
-
-      DefaultInfo.IpCnt = BootSvrEntry->IpCnt;
-
-      if (DefaultInfo.IpCnt >= 1) {
-        CreatedInfo = AllocatePool (sizeof (DefaultInfo) + (DefaultInfo.IpCnt - 1) * sizeof (*SrvList));
-        if (CreatedInfo == NULL) {
-          Status = EFI_OUT_OF_RESOURCES;
-          goto ON_EXIT;
-
-        }
-
-        CopyMem (CreatedInfo, &DefaultInfo, sizeof (DefaultInfo));
-        Info    = CreatedInfo;
-        SrvList = Info->SrvList;
-      }
-
-      for (Index = 0; Index < DefaultInfo.IpCnt; Index++) {
-        CopyMem (&SrvList[Index].IpAddr, &BootSvrEntry->IpAddr[Index], sizeof (EFI_IPv4_ADDRESS));
-        SrvList[Index].AcceptAnyResponse   = FALSE;
-        SrvList[Index].Type                = BootSvrEntry->Type;
-      }
-    }
-
-  } else {
-
-    SrvList = Info->SrvList;
-
-    if (!SrvList[0].AcceptAnyResponse) {
-
-      for (Index = 1; Index < Info->IpCnt; Index++) {
-        if (SrvList[Index].AcceptAnyResponse) {
-          break;
-        }
-      }
-
-      if (Index != Info->IpCnt) {
-        Status = EFI_INVALID_PARAMETER;
-        goto ON_EXIT;
-      }
-    }
-  }
-
-  if ((!Info->UseUCast && !Info->UseBCast && !Info->UseMCast) || (Info->MustUseList && Info->IpCnt == 0)) {
-
-    Status = EFI_INVALID_PARAMETER;
-    goto ON_EXIT;
-  }
-  //
-  // Execute discover by UniCast/BroadCast/MultiCast
-  //
-  if (Info->UseUCast) {
-
-    for (Index = 0; Index < Info->IpCnt; Index++) {
-
-      if (BootSvrEntry == NULL) {
-        Private->ServerIp.Addr[0] = SrvList[Index].IpAddr.Addr[0];
-      } else {
-        CopyMem (
-          &Private->ServerIp,
-          &BootSvrEntry->IpAddr[Index],
-          sizeof (EFI_IPv4_ADDRESS)
-          );
-      }
-
-      Status = PxeBcDiscvBootService (
-                Private,
-                Type,
-                Layer,
-                UseBis,
-                &SrvList[Index].IpAddr,
-                0,
-                NULL,
-                TRUE,
-                &Private->PxeReply.Packet.Ack
-                );
-      if (!EFI_ERROR (Status)) {
-        break;
-      }
-    }
-
-  } else if (Info->UseMCast) {
-
-    Status = PxeBcDiscvBootService (
-              Private,
-              Type,
-              Layer,
-              UseBis,
-              &Info->ServerMCastIp,
-              0,
-              NULL,
-              TRUE,
-              &Private->PxeReply.Packet.Ack
-              );
-
-  } else if (Info->UseBCast) {
-
-    Status = PxeBcDiscvBootService (
-              Private,
-              Type,
-              Layer,
-              UseBis,
-              NULL,
-              Info->IpCnt,
-              SrvList,
-              TRUE,
-              &Private->PxeReply.Packet.Ack
-              );
-  }
-
-  if (EFI_ERROR (Status) || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) {
-    if (Status == EFI_ICMP_ERROR) {
-      Mode->IcmpErrorReceived = TRUE;
-    } else {
-      Status = EFI_DEVICE_ERROR;
-    }
-    goto ON_EXIT;
-  } else {
-    PxeBcParseCachedDhcpPacket (&Private->PxeReply);
-  }
-
-  if (Mode->PxeBisReplyReceived) {
-    CopyMem (
-      &Private->ServerIp,
-      &Mode->PxeReply.Dhcpv4.BootpSiAddr,
-      sizeof (EFI_IPv4_ADDRESS)
-      );
-  }
-
-  if (CreatedInfo != NULL) {
-    FreePool (CreatedInfo);
-  }
-
-ON_EXIT:
-
-  Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
-
-  //
-  // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
-  // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
-  //
-  ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
-  IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
-  This->SetIpFilter (This, &IpFilter);
-
-  return Status;
-}
-
-
-/**
-  Used to perform TFTP and MTFTP services.
-
-  This function is used to perform TFTP and MTFTP services. This includes the
-  TFTP operations to get the size of a file, read a directory, read a file, and
-  write a file. It also includes the MTFTP operations to get the size of a file,
-  read a directory, and read a file. The type of operation is specified by Operation.
-  If the callback function that is invoked during the TFTP/MTFTP operation does
-  not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will
-  be returned.
-  For read operations, the return data will be placed in the buffer specified by
-  BufferPtr. If BufferSize is too small to contain the entire downloaded file,
-  then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set to zero
-  or the size of the requested file (the size of the requested file is only returned
-  if the TFTP server supports TFTP options). If BufferSize is large enough for the
-  read operation, then BufferSize will be set to the size of the downloaded file,
-  and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp() services
-  should use the get-file-size operations to determine the size of the downloaded
-  file prior to using the read-file operations-especially when downloading large
-  (greater than 64 MB) files-instead of making two calls to the read-file operation.
-  Following this recommendation will save time if the file is larger than expected
-  and the TFTP server does not support TFTP option extensions. Without TFTP option
-  extension support, the client has to download the entire file, counting and discarding
-  the received packets, to determine the file size.
-  For write operations, the data to be sent is in the buffer specified by BufferPtr.
-  BufferSize specifies the number of bytes to send. If the write operation completes
-  successfully, then EFI_SUCCESS will be returned.
-  For TFTP "get file size" operations, the size of the requested file or directory
-  is returned in BufferSize, and EFI_SUCCESS will be returned. If the TFTP server
-  does not support options, the file will be downloaded into a bit bucket and the
-  length of the downloaded file will be returned. For MTFTP "get file size" operations,
-  if the MTFTP server does not support the "get file size" option, EFI_UNSUPPORTED
-  will be returned.
-  This function can take up to 10 seconds to timeout and return control to the caller.
-  If the TFTP sequence does not complete, EFI_TIMEOUT will be returned.
-  If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
-  then the TFTP sequence is stopped and EFI_ABORTED will be returned.
-  The format of the data returned from a TFTP read directory operation is a null-terminated
-  filename followed by a null-terminated information string, of the form
-  "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f - note that
-  the seconds field can be a decimal number), where the date and time are UTC. For
-  an MTFTP read directory command, there is additionally a null-terminated multicast
-  IP address preceding the filename of the form %d.%d.%d.%d for IP v4. The final
-  entry is itself null-terminated, so that the final information string is terminated
-  with two null octets.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  Operation             The type of operation to perform.
-  @param  BufferPtr             A pointer to the data buffer.
-  @param  Overwrite             Only used on write file operations. TRUE if a file on a remote server can
-                                be overwritten.
-  @param  BufferSize            For get-file-size operations, *BufferSize returns the size of the
-                                requested file.
-  @param  BlockSize             The requested block size to be used during a TFTP transfer.
-  @param  ServerIp              The TFTP / MTFTP server IP address.
-  @param  Filename              A Null-terminated ASCII string that specifies a directory name or a file
-                                name.
-  @param  Info                  Pointer to the MTFTP information.
-  @param  DontUseBuffer         Set to FALSE for normal TFTP and MTFTP read file operation.
-
-  @retval EFI_SUCCESS           The TFTP/MTFTP operation was completed.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-  @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
-  @retval EFI_BUFFER_TOO_SMALL  The buffer is not large enough to complete the read operation.
-  @retval EFI_ABORTED           The callback function aborted the TFTP/MTFTP operation.
-  @retval EFI_TIMEOUT           The TFTP/MTFTP operation timed out.
-  @retval EFI_ICMP_ERROR        An ICMP error packet was received during the MTFTP session.
-  @retval EFI_TFTP_ERROR        A TFTP error packet was received during the MTFTP session.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcMtftp (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,
-  IN EFI_PXE_BASE_CODE_TFTP_OPCODE    Operation,
-  IN OUT VOID                         *BufferPtr,
-  IN BOOLEAN                          Overwrite,
-  IN OUT UINT64                       *BufferSize,
-  IN UINTN                            *BlockSize    OPTIONAL,
-  IN EFI_IP_ADDRESS                   *ServerIp,
-  IN UINT8                            *Filename,
-  IN EFI_PXE_BASE_CODE_MTFTP_INFO     *Info         OPTIONAL,
-  IN BOOLEAN                          DontUseBuffer
-  )
-{
-  PXEBC_PRIVATE_DATA           *Private;
-  EFI_MTFTP4_CONFIG_DATA       Mtftp4Config;
-  EFI_STATUS                   Status;
-  EFI_PXE_BASE_CODE_MODE       *Mode;
-  EFI_MAC_ADDRESS              TempMacAddr;
-  EFI_PXE_BASE_CODE_IP_FILTER  IpFilter;
-
-  if ((This == NULL)                                                          ||
-      (Filename == NULL)                                                      ||
-      (BufferSize == NULL)                                                    ||
-      ((ServerIp == NULL) ||
-       (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) ||
-        IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0]))))                  ||
-      ((BufferPtr == NULL) && DontUseBuffer)                                  ||
-      ((BlockSize != NULL) && (*BlockSize < 512))) {
-
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status  = EFI_DEVICE_ERROR;
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = &Private->Mode;
-
-  if (!Mode->AutoArp) {
-    //
-    // If AutoArp is set false, check arp cache
-    //
-    UpdateArpCache (This);
-    if (!FindInArpCache (Mode, &ServerIp->v4, &TempMacAddr)) {
-      return EFI_DEVICE_ERROR;
-    }
-  }
-
-  //
-  // Stop Udp4Read instance
-  //
-  Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
-  Mode->TftpErrorReceived = FALSE;
-  Mode->IcmpErrorReceived = FALSE;
-
-  Mtftp4Config.UseDefaultSetting = FALSE;
-  Mtftp4Config.TimeoutValue      = PXEBC_MTFTP_TIMEOUT;
-  Mtftp4Config.TryCount          = PXEBC_MTFTP_RETRIES;
-
-  CopyMem (
-    &Mtftp4Config.StationIp,
-    &Private->StationIp,
-    sizeof (EFI_IPv4_ADDRESS)
-    );
-  CopyMem (
-    &Mtftp4Config.SubnetMask,
-    &Private->SubnetMask,
-    sizeof (EFI_IPv4_ADDRESS)
-    );
-  CopyMem (
-    &Mtftp4Config.GatewayIp,
-    &Private->GatewayIp,
-    sizeof (EFI_IPv4_ADDRESS)
-    );
-  CopyMem (
-    &Mtftp4Config.ServerIp,
-    ServerIp,
-    sizeof (EFI_IPv4_ADDRESS)
-    );
-
-  switch (Operation) {
-
-  case EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE:
-
-    Status = PxeBcTftpGetFileSize (
-              Private,
-              &Mtftp4Config,
-              Filename,
-              BlockSize,
-              BufferSize
-              );
-
-    break;
-
-  case EFI_PXE_BASE_CODE_TFTP_READ_FILE:
-
-    Status = PxeBcTftpReadFile (
-              Private,
-              &Mtftp4Config,
-              Filename,
-              BlockSize,
-              BufferPtr,
-              BufferSize,
-              DontUseBuffer
-              );
-
-    break;
-
-  case EFI_PXE_BASE_CODE_TFTP_WRITE_FILE:
-
-    Status = PxeBcTftpWriteFile (
-              Private,
-              &Mtftp4Config,
-              Filename,
-              Overwrite,
-              BlockSize,
-              BufferPtr,
-              BufferSize
-              );
-
-    break;
-
-  case EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY:
-
-    Status = PxeBcTftpReadDirectory (
-              Private,
-              &Mtftp4Config,
-              Filename,
-              BlockSize,
-              BufferPtr,
-              BufferSize,
-              DontUseBuffer
-              );
-
-    break;
-
-  case EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE:
-  case EFI_PXE_BASE_CODE_MTFTP_READ_FILE:
-  case EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY:
-    Status = EFI_UNSUPPORTED;
-    break;
-
-  default:
-
-    Status = EFI_INVALID_PARAMETER;
-    break;
-  }
-
-  if (Status == EFI_ICMP_ERROR) {
-    Mode->IcmpErrorReceived = TRUE;
-  }
-
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-ON_EXIT:
-  Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
-  //
-  // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
-  // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
-  //
-  ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
-  IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
-  This->SetIpFilter (This, &IpFilter);
-
-  return Status;
-}
-
-
-/**
-  Writes a UDP packet to the network interface.
-
-  This function writes a UDP packet specified by the (optional HeaderPtr and)
-  BufferPtr parameters to the network interface. The UDP header is automatically
-  built by this routine. It uses the parameters OpFlags, DestIp, DestPort, GatewayIp,
-  SrcIp, and SrcPort to build this header. If the packet is successfully built and
-  transmitted through the network interface, then EFI_SUCCESS will be returned.
-  If a timeout occurs during the transmission of the packet, then EFI_TIMEOUT will
-  be returned. If an ICMP error occurs during the transmission of the packet, then
-  the IcmpErrorReceived field is set to TRUE, the IcmpError field is filled in and
-  EFI_ICMP_ERROR will be returned. If the Callback Protocol does not return
-  EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will be returned.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  OpFlags               The UDP operation flags.
-  @param  DestIp                The destination IP address.
-  @param  DestPort              The destination UDP port number.
-  @param  GatewayIp             The gateway IP address.
-  @param  SrcIp                 The source IP address.
-  @param  SrcPort               The source UDP port number.
-  @param  HeaderSize            An optional field which may be set to the length of a header at
-                                HeaderPtr to be prefixed to the data at BufferPtr.
-  @param  HeaderPtr             If HeaderSize is not NULL, a pointer to a header to be prefixed to the
-                                data at BufferPtr.
-  @param  BufferSize            A pointer to the size of the data at BufferPtr.
-  @param  BufferPtr             A pointer to the data to be written.
-
-  @retval EFI_SUCCESS           The UDP Write operation was completed.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-  @retval EFI_BAD_BUFFER_SIZE   The buffer is too long to be transmitted.
-  @retval EFI_ABORTED           The callback function aborted the UDP Write operation.
-  @retval EFI_TIMEOUT           The UDP Write operation timed out.
-  @retval EFI_ICMP_ERROR        An ICMP error packet was received during the UDP write session.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcUdpWrite (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,
-  IN UINT16                           OpFlags,
-  IN EFI_IP_ADDRESS                   *DestIp,
-  IN EFI_PXE_BASE_CODE_UDP_PORT       *DestPort,
-  IN EFI_IP_ADDRESS                   *GatewayIp  OPTIONAL,
-  IN EFI_IP_ADDRESS                   *SrcIp      OPTIONAL,
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort    OPTIONAL,
-  IN UINTN                            *HeaderSize OPTIONAL,
-  IN VOID                             *HeaderPtr  OPTIONAL,
-  IN UINTN                            *BufferSize,
-  IN VOID                             *BufferPtr
-  )
-{
-  PXEBC_PRIVATE_DATA        *Private;
-  EFI_UDP4_PROTOCOL         *Udp4;
-  EFI_UDP4_COMPLETION_TOKEN Token;
-  EFI_UDP4_TRANSMIT_DATA    *Udp4TxData;
-  UINT32                    FragCount;
-  UINT32                    DataLength;
-  EFI_UDP4_SESSION_DATA     Udp4Session;
-  EFI_STATUS                Status;
-  BOOLEAN                   IsDone;
-  EFI_PXE_BASE_CODE_MODE    *Mode;
-  EFI_MAC_ADDRESS           TempMacAddr;
-
-  IsDone = FALSE;
-
-  if ((This == NULL) || (DestIp == NULL) || (DestPort == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((GatewayIp != NULL) && (IP4_IS_UNSPECIFIED (NTOHL (GatewayIp->Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (GatewayIp->Addr[0])))) {
-    //
-    // Gateway is provided but it's not a unicast IP address.
-    //
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((HeaderSize != NULL) && ((*HeaderSize == 0) || (HeaderPtr == NULL))) {
-    //
-    // The HeaderSize ptr isn't NULL and: 1. the value is zero; or 2. the HeaderPtr
-    // is NULL.
-    //
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((BufferSize == NULL) || ((*BufferSize != 0) && (BufferPtr == NULL))) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Udp4    = Private->Udp4Write;
-  Mode    = &Private->Mode;
-  if (!Mode->Started) {
-    return EFI_NOT_STARTED;
-  }
-
-  if (!Private->AddressIsOk && (SrcIp == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (!Mode->AutoArp) {
-    //
-    // If AutoArp is set false, check arp cache
-    //
-    UpdateArpCache (This);
-    if (!FindInArpCache (Mode, &DestIp->v4, &TempMacAddr)) {
-      return EFI_DEVICE_ERROR;
-    }
-  }
-
-  Mode->IcmpErrorReceived = FALSE;
-
-  if ((Private->CurrentUdpSrcPort == 0) ||
-      ((SrcPort != NULL) && (*SrcPort != Private->CurrentUdpSrcPort))) {
-    //
-    // Port is changed, (re)configure the Udp4Write instance
-    //
-    if (SrcPort != NULL) {
-      Private->CurrentUdpSrcPort = *SrcPort;
-    }
-  }
-
-  Status = PxeBcConfigureUdpWriteInstance (
-             Udp4,
-             &Private->StationIp.v4,
-             &Private->SubnetMask.v4,
-             &Private->GatewayIp.v4,
-             &Private->CurrentUdpSrcPort,
-             Private->Mode.TTL,
-             Private->Mode.ToS
-             );
-  if (EFI_ERROR (Status)) {
-    Private->CurrentUdpSrcPort = 0;
-    return EFI_INVALID_PARAMETER;
-  }
-
-  ZeroMem (&Token, sizeof (EFI_UDP4_COMPLETION_TOKEN));
-  ZeroMem (&Udp4Session, sizeof (EFI_UDP4_SESSION_DATA));
-
-  CopyMem (&Udp4Session.DestinationAddress, DestIp, sizeof (EFI_IPv4_ADDRESS));
-  Udp4Session.DestinationPort = *DestPort;
-  if (SrcIp != NULL) {
-    CopyMem (&Udp4Session.SourceAddress, SrcIp, sizeof (EFI_IPv4_ADDRESS));
-  }
-  if (SrcPort != NULL) {
-    Udp4Session.SourcePort = *SrcPort;
-  }
-
-  FragCount = (HeaderSize != NULL) ? 2 : 1;
-  Udp4TxData = (EFI_UDP4_TRANSMIT_DATA *) AllocateZeroPool (sizeof (EFI_UDP4_TRANSMIT_DATA) + (FragCount - 1) * sizeof (EFI_UDP4_FRAGMENT_DATA));
-  if (Udp4TxData == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Udp4TxData->FragmentCount = FragCount;
-  Udp4TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32) *BufferSize;
-  Udp4TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr;
-  DataLength = (UINT32) *BufferSize;
-
-  if (FragCount == 2) {
-
-    Udp4TxData->FragmentTable[0].FragmentLength = (UINT32) *HeaderSize;
-    Udp4TxData->FragmentTable[0].FragmentBuffer = HeaderPtr;
-    DataLength += (UINT32) *HeaderSize;
-  }
-
-  if (GatewayIp != NULL) {
-    Udp4TxData->GatewayAddress  = (EFI_IPv4_ADDRESS *) GatewayIp;
-  }
-  Udp4TxData->UdpSessionData  = &Udp4Session;
-  Udp4TxData->DataLength      = DataLength;
-  Token.Packet.TxData         = Udp4TxData;
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  PxeBcCommonNotify,
-                  &IsDone,
-                  &Token.Event
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-
-  Status = Udp4->Transmit (Udp4, &Token);
-  if (EFI_ERROR (Status)) {
-    if (Status == EFI_ICMP_ERROR) {
-      Mode->IcmpErrorReceived = TRUE;
-    }
-    goto ON_EXIT;
-  }
-
-  while (!IsDone) {
-
-    Udp4->Poll (Udp4);
-  }
-
-  Status = Token.Status;
-
-ON_EXIT:
-
-  if (Token.Event != NULL) {
-    gBS->CloseEvent (Token.Event);
-  }
-
-  FreePool (Udp4TxData);
-
-  //
-  // Reset the instance.
-  //
-  Udp4->Configure (Udp4, NULL);
-  return Status;
-}
-
-/**
-  Decide whether the incoming UDP packet is acceptable per IP filter settings
-  in provided PxeBcMode.
-
-  @param  PxeBcMode          Pointer to EFI_PXE_BASE_CODE_MODE.
-  @param  Session            Received UDP session.
-
-  @retval TRUE               The UDP package matches IP filters.
-  @retval FALSE              The UDP package doesn't matches IP filters.
-
-**/
-BOOLEAN
-CheckIpByFilter (
-  IN EFI_PXE_BASE_CODE_MODE    *PxeBcMode,
-  IN EFI_UDP4_SESSION_DATA     *Session
-  )
-{
-  UINTN                   Index;
-  EFI_IPv4_ADDRESS        Ip4Address;
-  EFI_IPv4_ADDRESS        DestIp4Address;
-
-  if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) {
-    return TRUE;
-  }
-
-  CopyMem (&DestIp4Address, &Session->DestinationAddress, sizeof (DestIp4Address));
-  if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) &&
-      IP4_IS_MULTICAST (EFI_NTOHL (DestIp4Address))
-      ) {
-    return TRUE;
-  }
-
-  if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) &&
-      IP4_IS_LOCAL_BROADCAST (EFI_NTOHL (DestIp4Address))
-      ) {
-    return TRUE;
-  }
-
-  CopyMem (&Ip4Address, &PxeBcMode->StationIp.v4, sizeof (Ip4Address));
-  if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) &&
-      EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)
-      ) {
-    return TRUE;
-  }
-
-  ASSERT (PxeBcMode->IpFilter.IpCnt < EFI_PXE_BASE_CODE_MAX_IPCNT);
-
-  for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; Index++) {
-    CopyMem (
-      &Ip4Address,
-      &PxeBcMode->IpFilter.IpList[Index].v4,
-      sizeof (Ip4Address)
-      );
-    if (EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)) {
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
-
-/**
-  Reads a UDP packet from the network interface.
-
-  This function reads a UDP packet from a network interface. The data contents
-  are returned in (the optional HeaderPtr and) BufferPtr, and the size of the
-  buffer received is returned in BufferSize . If the input BufferSize is smaller
-  than the UDP packet received (less optional HeaderSize), it will be set to the
-  required size, and EFI_BUFFER_TOO_SMALL will be returned. In this case, the
-  contents of BufferPtr are undefined, and the packet is lost. If a UDP packet is
-  successfully received, then EFI_SUCCESS will be returned, and the information
-  from the UDP header will be returned in DestIp, DestPort, SrcIp, and SrcPort if
-  they are not NULL. Depending on the values of OpFlags and the DestIp, DestPort,
-  SrcIp, and SrcPort input values, different types of UDP packet receive filtering
-  will be performed. The following tables summarize these receive filter operations.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  OpFlags               The UDP operation flags.
-  @param  DestIp                The destination IP address.
-  @param  DestPort              The destination UDP port number.
-  @param  SrcIp                 The source IP address.
-  @param  SrcPort               The source UDP port number.
-  @param  HeaderSize            An optional field which may be set to the length of a header at
-                                HeaderPtr to be prefixed to the data at BufferPtr.
-  @param  HeaderPtr             If HeaderSize is not NULL, a pointer to a header to be prefixed to the
-                                data at BufferPtr.
-  @param  BufferSize            A pointer to the size of the data at BufferPtr.
-  @param  BufferPtr             A pointer to the data to be read.
-
-  @retval EFI_SUCCESS           The UDP Read operation was completed.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-  @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
-  @retval EFI_BUFFER_TOO_SMALL  The packet is larger than Buffer can hold.
-  @retval EFI_ABORTED           The callback function aborted the UDP Read operation.
-  @retval EFI_TIMEOUT           The UDP Read operation timed out.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcUdpRead (
-  IN EFI_PXE_BASE_CODE_PROTOCOL                *This,
-  IN UINT16                                    OpFlags,
-  IN OUT EFI_IP_ADDRESS                        *DestIp     OPTIONAL,
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT            *DestPort   OPTIONAL,
-  IN OUT EFI_IP_ADDRESS                        *SrcIp      OPTIONAL,
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT            *SrcPort    OPTIONAL,
-  IN UINTN                                     *HeaderSize OPTIONAL,
-  IN VOID                                      *HeaderPtr  OPTIONAL,
-  IN OUT UINTN                                 *BufferSize,
-  IN VOID                                      *BufferPtr
-  )
-{
-  PXEBC_PRIVATE_DATA        *Private;
-  EFI_PXE_BASE_CODE_MODE    *Mode;
-  EFI_UDP4_PROTOCOL         *Udp4;
-  EFI_UDP4_COMPLETION_TOKEN Token;
-  EFI_UDP4_RECEIVE_DATA     *RxData;
-  EFI_UDP4_SESSION_DATA     *Session;
-  EFI_STATUS                Status;
-  BOOLEAN                   IsDone;
-  BOOLEAN                   Matched;
-  UINTN                     CopiedLen;
-  UINTN                     HeaderLen;
-  UINTN                     HeaderCopiedLen;
-  UINTN                     BufferCopiedLen;
-  UINT32                    FragmentLength;
-  UINTN                     FragmentIndex;
-  UINT8                     *FragmentBuffer;
-
-  if (This == NULL || DestIp == NULL || DestPort == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0 && (DestPort == NULL)) ||
-      ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0 && (SrcIp == NULL)) ||
-      ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) == 0 && (SrcPort == NULL))) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (((HeaderSize != NULL) && (*HeaderSize == 0)) || ((HeaderSize != NULL) && (HeaderPtr == NULL))) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if ((BufferSize == NULL) || (BufferPtr == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = Private->PxeBc.Mode;
-  Udp4    = Private->Udp4Read;
-
-  if (!Mode->Started) {
-    return EFI_NOT_STARTED;
-  }
-
-  Mode->IcmpErrorReceived = FALSE;
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  PxeBcCommonNotify,
-                  &IsDone,
-                  &Token.Event
-                  );
-  if (EFI_ERROR (Status)) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-TRY_AGAIN:
-
-  IsDone = FALSE;
-  Status = Udp4->Receive (Udp4, &Token);
-  if (EFI_ERROR (Status)) {
-    if (Status == EFI_ICMP_ERROR) {
-      Mode->IcmpErrorReceived = TRUE;
-    }
-    goto ON_EXIT;
-  }
-
-  Udp4->Poll (Udp4);
-
-  if (!IsDone) {
-    Status = EFI_TIMEOUT;
-  } else {
-
-    //
-    // check whether this packet matches the filters
-    //
-    if (EFI_ERROR (Token.Status)){
-      goto ON_EXIT;
-    }
-
-    RxData  = Token.Packet.RxData;
-    Session = &RxData->UdpSession;
-
-    Matched = TRUE;
-
-    if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) != 0) {
-      Matched = FALSE;
-      //
-      // Check UDP package by IP filter settings
-      //
-      if (CheckIpByFilter (Mode, Session)) {
-        Matched = TRUE;
-      }
-    }
-
-    if (Matched) {
-      Matched = FALSE;
-
-      //
-      // Match the destination ip of the received udp dgram
-      //
-      if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) != 0) {
-        Matched = TRUE;
-
-        if (DestIp != NULL) {
-          CopyMem (DestIp, &Session->DestinationAddress, sizeof (EFI_IPv4_ADDRESS));
-        }
-      } else {
-        if (DestIp != NULL) {
-          if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) {
-            Matched = TRUE;
-          }
-        } else {
-          if (EFI_IP4_EQUAL (&Private->StationIp, &Session->DestinationAddress)) {
-            Matched = TRUE;
-          }
-        }
-      }
-    }
-
-    if (Matched) {
-      //
-      // Match the destination port of the received udp dgram
-      //
-      if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) != 0) {
-
-        if (DestPort != NULL) {
-          *DestPort = Session->DestinationPort;
-        }
-      } else {
-
-        if (*DestPort != Session->DestinationPort) {
-          Matched = FALSE;
-        }
-      }
-    }
-
-    if (Matched) {
-      //
-      // Match the source ip of the received udp dgram
-      //
-      if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) != 0) {
-
-        if (SrcIp != NULL) {
-          CopyMem (SrcIp, &Session->SourceAddress, sizeof (EFI_IPv4_ADDRESS));
-        }
-      } else {
-
-        if (!EFI_IP4_EQUAL (SrcIp, &Session->SourceAddress)) {
-          Matched = FALSE;
-        }
-      }
-    }
-
-    if (Matched) {
-      //
-      // Match the source port of the received udp dgram
-      //
-      if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) != 0) {
-
-        if (SrcPort != NULL) {
-          *SrcPort = Session->SourcePort;
-        }
-      } else {
-
-        if (*SrcPort != Session->SourcePort) {
-          Matched = FALSE;
-        }
-      }
-    }
-
-    if (Matched) {
-      ASSERT (RxData != NULL);
-
-      HeaderLen = 0;
-      if (HeaderSize != NULL) {
-        HeaderLen = MIN (*HeaderSize, RxData->DataLength);
-      }
-
-      if (RxData->DataLength - HeaderLen > *BufferSize) {
-        Status = EFI_BUFFER_TOO_SMALL;
-      } else {
-        *HeaderSize = HeaderLen;
-        *BufferSize = RxData->DataLength - HeaderLen;
-
-        HeaderCopiedLen = 0;
-        BufferCopiedLen = 0;
-        for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount; FragmentIndex++) {
-          FragmentLength = RxData->FragmentTable[FragmentIndex].FragmentLength;
-          FragmentBuffer = RxData->FragmentTable[FragmentIndex].FragmentBuffer;
-          if (HeaderCopiedLen + FragmentLength < HeaderLen) {
-            //
-            // Copy the header part of received data.
-            //
-            CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, FragmentLength);
-            HeaderCopiedLen += FragmentLength;
-          } else if (HeaderCopiedLen < HeaderLen) {
-            //
-            // Copy the header part of received data.
-            //
-            CopiedLen = HeaderLen - HeaderCopiedLen;
-            CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, CopiedLen);
-            HeaderCopiedLen += CopiedLen;
-
-            //
-            // Copy the other part of received data.
-            //
-            CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer + CopiedLen, FragmentLength - CopiedLen);
-            BufferCopiedLen += (FragmentLength - CopiedLen);
-          } else {
-            //
-            // Copy the other part of received data.
-            //
-            CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer, FragmentLength);
-            BufferCopiedLen += FragmentLength;
-          }
-        }
-      }
-    } else {
-
-      Status = EFI_TIMEOUT;
-    }
-
-    //
-    // Recycle the RxData
-    //
-    gBS->SignalEvent (RxData->RecycleSignal);
-
-    if (!Matched) {
-      goto TRY_AGAIN;
-    }
-  }
-
-ON_EXIT:
-
-  Udp4->Cancel (Udp4, &Token);
-
-  gBS->CloseEvent (Token.Event);
-
-  return Status;
-}
-
-/**
-  Updates the IP receive filters of a network device and enables software filtering.
-
-  The NewFilter field is used to modify the network device's current IP receive
-  filter settings and to enable a software filter. This function updates the IpFilter
-  field of the EFI_PXE_BASE_CODE_MODE structure with the contents of NewIpFilter.
-  The software filter is used when the USE_FILTER in OpFlags is set to UdpRead().
-  The current hardware filter remains in effect no matter what the settings of OpFlags
-  are, so that the meaning of ANY_DEST_IP set in OpFlags to UdpRead() is from those
-  packets whose reception is enabled in hardware-physical NIC address (unicast),
-  broadcast address, logical address or addresses (multicast), or all (promiscuous).
-  UdpRead() does not modify the IP filter settings.
-  Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP receive
-  filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
-  If an application or driver wishes to preserve the IP receive filter settings,
-  it will have to preserve the IP receive filter settings before these calls, and
-  use SetIpFilter() to restore them after the calls. If incompatible filtering is
-  requested (for example, PROMISCUOUS with anything else) or if the device does not
-  support a requested filter setting and it cannot be accommodated in software
-  (for example, PROMISCUOUS not supported), EFI_INVALID_PARAMETER will be returned.
-  The IPlist field is used to enable IPs other than the StationIP. They may be
-  multicast or unicast. If IPcnt is set as well as EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP,
-  then both the StationIP and the IPs from the IPlist will be used.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  NewFilter             Pointer to the new set of IP receive filters.
-
-  @retval EFI_SUCCESS           The IP receive filter settings were updated.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcSetIpFilter (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,
-  IN EFI_PXE_BASE_CODE_IP_FILTER      *NewFilter
-  )
-{
-  EFI_STATUS                Status;
-  PXEBC_PRIVATE_DATA        *Private;
-  EFI_PXE_BASE_CODE_MODE    *Mode;
-  UINTN                     Index;
-  EFI_UDP4_CONFIG_DATA      *Udp4Cfg;
-  BOOLEAN                   PromiscuousNeed;
-  BOOLEAN                   AcceptPromiscuous;
-  BOOLEAN                   AcceptBroadcast;
-  BOOLEAN                   MultiCastUpdate;
-
-  if (This == NULL) {
-    DEBUG ((EFI_D_ERROR, "This == NULL.\n"));
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode = Private->PxeBc.Mode;
-
-  if (NewFilter == NULL) {
-    DEBUG ((EFI_D_ERROR, "NewFilter == NULL.\n"));
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (NewFilter->IpCnt > EFI_PXE_BASE_CODE_MAX_IPCNT) {
-    DEBUG ((EFI_D_ERROR, "NewFilter->IpCnt > %d.\n", EFI_PXE_BASE_CODE_MAX_IPCNT));
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (!Mode->Started) {
-    DEBUG ((EFI_D_ERROR, "BC was not started.\n"));
-    return EFI_NOT_STARTED;
-  }
-
-  if (Mode->UsingIpv6) {
-    DEBUG ((EFI_D_ERROR, "This driver is PXE for IPv4 Only.\n"));
-    return EFI_INVALID_PARAMETER;
-  }
-
-  PromiscuousNeed = FALSE;
-
-  for (Index = 0; Index < NewFilter->IpCnt; ++Index) {
-    if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (NewFilter->IpList[Index].v4))) {
-      //
-      // The IP is a broadcast address.
-      //
-      DEBUG ((EFI_D_ERROR, "There is broadcast address in NewFilter.\n"));
-      return EFI_INVALID_PARAMETER;
-    }
-    if ((EFI_NTOHL(Mode->StationIp) != 0) &&
-        (EFI_NTOHL(Mode->SubnetMask) != 0) &&
-        IP4_NET_EQUAL(EFI_NTOHL(Mode->StationIp), EFI_NTOHL(NewFilter->IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) &&
-        NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) &&
-        ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0)) {
-      //
-      // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address is in IpList,
-      // promiscuous mode is needed.
-      //
-      PromiscuousNeed = TRUE;
-    }
-  }
-
-  AcceptPromiscuous = FALSE;
-  AcceptBroadcast   = FALSE;
-  MultiCastUpdate   = FALSE;
-
-  if (PromiscuousNeed ||
-      ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) ||
-      ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0)
-     ) {
-    //
-    // Configure the udp4 filter to receive all packages.
-    //
-    AcceptPromiscuous  = TRUE;
-  } else if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) {
-    //
-    // Configure the udp4 filter to receive all broadcast packages.
-    //
-    AcceptBroadcast   = TRUE;
-  }
-
-  //
-  // In multicast condition when Promiscuous FALSE and IpCnt no-zero.
-  // Here check if there is any update of the multicast ip address. If yes,
-  // we need leave the old multicast group (by Config UDP instance to NULL),
-  // and join the new multicast group.
-  //
-  if (!AcceptPromiscuous) {
-    if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) {
-      if (Mode->IpFilter.IpCnt != NewFilter->IpCnt) {
-        MultiCastUpdate = TRUE;
-      } else if (CompareMem (Mode->IpFilter.IpList, NewFilter->IpList, NewFilter->IpCnt * sizeof (EFI_IP_ADDRESS)) != 0 ) {
-        MultiCastUpdate = TRUE;
-      }
-    }
-  }
-
-  //
-  // Check whether we need reconfigure the UDP instance.
-  //
-  Udp4Cfg = &Private->Udp4CfgData;
-  if ((AcceptPromiscuous != Udp4Cfg->AcceptPromiscuous) ||
-      (AcceptBroadcast != Udp4Cfg->AcceptBroadcast)     || MultiCastUpdate) {
-    //
-    // Clear the UDP instance configuration, all joined groups will be left
-    // during the operation.
-    //
-    Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
-    //
-    // Configure the UDP instance with the new configuration.
-    //
-    Udp4Cfg->AcceptPromiscuous = AcceptPromiscuous;
-    Udp4Cfg->AcceptBroadcast   = AcceptBroadcast;
-    Status = Private->Udp4Read->Configure (Private->Udp4Read, Udp4Cfg);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-
-    //
-    // In not Promiscuous mode, need to join the new multicast group.
-    //
-    if (!AcceptPromiscuous) {
-      for (Index = 0; Index < NewFilter->IpCnt; ++Index) {
-        if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) {
-          //
-          // Join the mutilcast group.
-          //
-          Status = Private->Udp4Read->Groups (Private->Udp4Read, TRUE, &NewFilter->IpList[Index].v4);
-          if (EFI_ERROR (Status)) {
-            return Status;
-          }
-        }
-      }
-    }
-  }
-
-
-  //
-  // Save the new filter.
-  //
-  CopyMem (&Mode->IpFilter, NewFilter, sizeof (Mode->IpFilter));
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Uses the ARP protocol to resolve a MAC address.
-
-  This function uses the ARP protocol to resolve a MAC address. The UsingIpv6 field
-  of the EFI_PXE_BASE_CODE_MODE structure is used to determine if IPv4 or IPv6
-  addresses are being used. The IP address specified by IpAddr is used to resolve
-  a MAC address. If the ARP protocol succeeds in resolving the specified address,
-  then the ArpCacheEntries and ArpCache fields of the EFI_PXE_BASE_CODE_MODE structure
-  are updated, and EFI_SUCCESS is returned. If MacAddr is not NULL, the resolved
-  MAC address is placed there as well.  If the PXE Base Code protocol is in the
-  stopped state, then EFI_NOT_STARTED is returned. If the ARP protocol encounters
-  a timeout condition while attempting to resolve an address, then EFI_TIMEOUT is
-  returned. If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
-  then EFI_ABORTED is returned.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  IpAddr                Pointer to the IP address that is used to resolve a MAC address.
-  @param  MacAddr               If not NULL, a pointer to the MAC address that was resolved with the
-                                ARP protocol.
-
-  @retval EFI_SUCCESS           The IP or MAC address was resolved.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-  @retval EFI_DEVICE_ERROR      The network device encountered an error during this operation.
-  @retval EFI_ICMP_ERROR        Something error occur with the ICMP packet message.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcArp (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,
-  IN EFI_IP_ADDRESS                   * IpAddr,
-  IN EFI_MAC_ADDRESS                  * MacAddr OPTIONAL
-  )
-{
-  PXEBC_PRIVATE_DATA      *Private;
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-  EFI_STATUS              Status;
-  EFI_MAC_ADDRESS         TempMacAddr;
-
-  if (This == NULL || IpAddr == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = Private->PxeBc.Mode;
-
-  if (!Mode->Started) {
-    return EFI_NOT_STARTED;
-  }
-
-  if (!Private->AddressIsOk || Mode->UsingIpv6) {
-    //
-    // We can't resolve the IP address if we don't have a local address now.
-    // Don't have ARP for IPv6.
-    //
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Mode->IcmpErrorReceived = FALSE;
-
-  if (!Mode->AutoArp) {
-    //
-    // If AutoArp is set false, check arp cache
-    //
-    UpdateArpCache (This);
-    if (!FindInArpCache (Mode, &IpAddr->v4, &TempMacAddr)) {
-      return EFI_DEVICE_ERROR;
-    }
-  } else {
-    Status = Private->Arp->Request (Private->Arp, &IpAddr->v4, NULL, &TempMacAddr);
-    if (EFI_ERROR (Status)) {
-      if (Status == EFI_ICMP_ERROR) {
-        Mode->IcmpErrorReceived = TRUE;
-      }
-      return Status;
-    }
-  }
-
-  if (MacAddr != NULL) {
-    CopyMem (MacAddr, &TempMacAddr, sizeof (EFI_MAC_ADDRESS));
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Updates the parameters that affect the operation of the PXE Base Code Protocol.
-
-  This function sets parameters that affect the operation of the PXE Base Code Protocol.
-  The parameter specified by NewAutoArp is used to control the generation of ARP
-  protocol packets. If NewAutoArp is TRUE, then ARP Protocol packets will be generated
-  as required by the PXE Base Code Protocol. If NewAutoArp is FALSE, then no ARP
-  Protocol packets will be generated. In this case, the only mappings that are
-  available are those stored in the ArpCache of the EFI_PXE_BASE_CODE_MODE structure.
-  If there are not enough mappings in the ArpCache to perform a PXE Base Code Protocol
-  service, then the service will fail. This function updates the AutoArp field of
-  the EFI_PXE_BASE_CODE_MODE structure to NewAutoArp.
-  The SetParameters() call must be invoked after a Callback Protocol is installed
-  to enable the use of callbacks.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  NewAutoArp            If not NULL, a pointer to a value that specifies whether to replace the
-                                current value of AutoARP.
-  @param  NewSendGUID           If not NULL, a pointer to a value that specifies whether to replace the
-                                current value of SendGUID.
-  @param  NewTTL                If not NULL, a pointer to be used in place of the current value of TTL,
-                                the "time to live" field of the IP header.
-  @param  NewToS                If not NULL, a pointer to be used in place of the current value of ToS,
-                                the "type of service" field of the IP header.
-  @param  NewMakeCallback       If not NULL, a pointer to a value that specifies whether to replace the
-                                current value of the MakeCallback field of the Mode structure.
-
-  @retval EFI_SUCCESS           The new parameters values were updated.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcSetParameters (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,
-  IN BOOLEAN                          *NewAutoArp OPTIONAL,
-  IN BOOLEAN                          *NewSendGUID OPTIONAL,
-  IN UINT8                            *NewTTL OPTIONAL,
-  IN UINT8                            *NewToS OPTIONAL,
-  IN BOOLEAN                          *NewMakeCallback  // OPTIONAL
-  )
-{
-  PXEBC_PRIVATE_DATA      *Private;
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-  EFI_STATUS              Status;
-
-  Status = EFI_SUCCESS;
-
-  if (This == NULL) {
-    Status = EFI_INVALID_PARAMETER;
-    goto ON_EXIT;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = Private->PxeBc.Mode;
-
-  if (NewSendGUID != NULL && *NewSendGUID) {
-    //
-    // FixMe, cann't locate SendGuid
-    //
-  }
-
-  if (NewMakeCallback != NULL && *NewMakeCallback) {
-
-    Status = gBS->HandleProtocol (
-                    Private->Controller,
-                    &gEfiPxeBaseCodeCallbackProtocolGuid,
-                    (VOID **) &Private->PxeBcCallback
-                    );
-    if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) {
-
-      Status = EFI_INVALID_PARAMETER;
-      goto ON_EXIT;
-    }
-  }
-
-  if (!Mode->Started) {
-    Status = EFI_NOT_STARTED;
-    goto ON_EXIT;
-  }
-
-  if (NewMakeCallback != NULL) {
-
-    if (*NewMakeCallback) {
-      //
-      // Update the Callback protocol.
-      //
-      Status = gBS->HandleProtocol (
-                      Private->Controller,
-                      &gEfiPxeBaseCodeCallbackProtocolGuid,
-                      (VOID **) &Private->PxeBcCallback
-                      );
-
-      if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) {
-        Status = EFI_INVALID_PARAMETER;
-        goto ON_EXIT;
-      }
-    } else {
-      Private->PxeBcCallback = NULL;
-    }
-
-    Mode->MakeCallbacks = *NewMakeCallback;
-  }
-
-  if (NewAutoArp != NULL) {
-    Mode->AutoArp = *NewAutoArp;
-  }
-
-  if (NewSendGUID != NULL) {
-    Mode->SendGUID = *NewSendGUID;
-  }
-
-  if (NewTTL != NULL) {
-    Mode->TTL = *NewTTL;
-  }
-
-  if (NewToS != NULL) {
-    Mode->ToS = *NewToS;
-  }
-
-ON_EXIT:
-  return Status;
-}
-
-/**
-  Updates the station IP address and/or subnet mask values of a network device.
-
-  This function updates the station IP address and/or subnet mask values of a network
-  device. The NewStationIp field is used to modify the network device's current IP address.
-  If NewStationIP is NULL, then the current IP address will not be modified. Otherwise,
-  this function updates the StationIp field of the EFI_PXE_BASE_CODE_MODE structure
-  with NewStationIp. The NewSubnetMask field is used to modify the network device's current subnet
-  mask. If NewSubnetMask is NULL, then the current subnet mask will not be modified.
-  Otherwise, this function updates the SubnetMask field of the EFI_PXE_BASE_CODE_MODE
-  structure with NewSubnetMask.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  NewStationIp          Pointer to the new IP address to be used by the network device.
-  @param  NewSubnetMask         Pointer to the new subnet mask to be used by the network device.
-
-  @retval EFI_SUCCESS           The new station IP address and/or subnet mask were updated.
-  @retval EFI_NOT_STARTED       The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcSetStationIP (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,
-  IN EFI_IP_ADDRESS                   * NewStationIp  OPTIONAL,
-  IN EFI_IP_ADDRESS                   * NewSubnetMask OPTIONAL
-  )
-{
-  PXEBC_PRIVATE_DATA      *Private;
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-  EFI_ARP_CONFIG_DATA     ArpConfigData;
-
-  if (This == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL (NewSubnetMask->Addr[0]))) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (NewStationIp != NULL) {
-    if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) ||
-        IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) ||
-        (NewSubnetMask != NULL && NewSubnetMask->Addr[0] != 0 && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0])))) {
-      return EFI_INVALID_PARAMETER;
-    }
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = Private->PxeBc.Mode;
-
-  if (!Mode->Started) {
-    return EFI_NOT_STARTED;
-  }
-
-  if (NewStationIp != NULL) {
-    CopyMem (&Mode->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS));
-    CopyMem (&Private->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS));
-  }
-
-  if (NewSubnetMask != NULL) {
-    CopyMem (&Mode->SubnetMask, NewSubnetMask, sizeof (EFI_IP_ADDRESS));
-    CopyMem (&Private->SubnetMask ,NewSubnetMask, sizeof (EFI_IP_ADDRESS));
-  }
-
-  Private->AddressIsOk = TRUE;
-
-  if (!Mode->UsingIpv6) {
-    //
-    // If in IPv4 mode, configure the corresponding ARP with this new
-    // station IP address.
-    //
-    ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
-
-    ArpConfigData.SwAddressType   = 0x0800;
-    ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
-    ArpConfigData.StationAddress  = &Private->StationIp.v4;
-
-    Private->Arp->Configure (Private->Arp, NULL);
-    Private->Arp->Configure (Private->Arp, &ArpConfigData);
-
-    //
-    // Update the route table.
-    //
-    Mode->RouteTableEntries                = 1;
-    Mode->RouteTable[0].IpAddr.Addr[0]     = Private->StationIp.Addr[0] & Private->SubnetMask.Addr[0];
-    Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0];
-    Mode->RouteTable[0].GwAddr.Addr[0]     = 0;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Updates the contents of the cached DHCP and Discover packets.
-
-  The pointers to the new packets are used to update the contents of the cached
-  packets in the EFI_PXE_BASE_CODE_MODE structure.
-
-  @param  This                   Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-  @param  NewDhcpDiscoverValid   Pointer to a value that will replace the current
-                                 DhcpDiscoverValid field.
-  @param  NewDhcpAckReceived     Pointer to a value that will replace the current
-                                 DhcpAckReceived field.
-  @param  NewProxyOfferReceived  Pointer to a value that will replace the current
-                                 ProxyOfferReceived field.
-  @param  NewPxeDiscoverValid    Pointer to a value that will replace the current
-                                 ProxyOfferReceived field.
-  @param  NewPxeReplyReceived    Pointer to a value that will replace the current
-                                 PxeReplyReceived field.
-  @param  NewPxeBisReplyReceived Pointer to a value that will replace the current
-                                 PxeBisReplyReceived field.
-  @param  NewDhcpDiscover        Pointer to the new cached DHCP Discover packet contents.
-  @param  NewDhcpAck             Pointer to the new cached DHCP Ack packet contents.
-  @param  NewProxyOffer          Pointer to the new cached Proxy Offer packet contents.
-  @param  NewPxeDiscover         Pointer to the new cached PXE Discover packet contents.
-  @param  NewPxeReply            Pointer to the new cached PXE Reply packet contents.
-  @param  NewPxeBisReply         Pointer to the new cached PXE BIS Reply packet contents.
-
-  @retval EFI_SUCCESS            The cached packet contents were updated.
-  @retval EFI_NOT_STARTED        The PXE Base Code Protocol is in the stopped state.
-  @retval EFI_INVALID_PARAMETER  This is NULL or not point to a valid EFI_PXE_BASE_CODE_PROTOCOL structure.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcSetPackets (
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,
-  IN BOOLEAN                          * NewDhcpDiscoverValid OPTIONAL,
-  IN BOOLEAN                          * NewDhcpAckReceived OPTIONAL,
-  IN BOOLEAN                          * NewProxyOfferReceived OPTIONAL,
-  IN BOOLEAN                          * NewPxeDiscoverValid OPTIONAL,
-  IN BOOLEAN                          * NewPxeReplyReceived OPTIONAL,
-  IN BOOLEAN                          * NewPxeBisReplyReceived OPTIONAL,
-  IN EFI_PXE_BASE_CODE_PACKET         * NewDhcpDiscover OPTIONAL,
-  IN EFI_PXE_BASE_CODE_PACKET         * NewDhcpAck OPTIONAL,
-  IN EFI_PXE_BASE_CODE_PACKET         * NewProxyOffer OPTIONAL,
-  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeDiscover OPTIONAL,
-  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeReply OPTIONAL,
-  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeBisReply OPTIONAL
-  )
-{
-  PXEBC_PRIVATE_DATA      *Private;
-  EFI_PXE_BASE_CODE_MODE  *Mode;
-
-  if (This == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
-  Mode    = Private->PxeBc.Mode;
-
-  if (!Mode->Started) {
-    return EFI_NOT_STARTED;
-  }
-
-  if (NewDhcpDiscoverValid != NULL) {
-    Mode->DhcpDiscoverValid = *NewDhcpDiscoverValid;
-  }
-
-  if (NewDhcpAckReceived != NULL) {
-    Mode->DhcpAckReceived = *NewDhcpAckReceived;
-  }
-
-  if (NewProxyOfferReceived != NULL) {
-    Mode->ProxyOfferReceived = *NewProxyOfferReceived;
-  }
-
-  if (NewPxeDiscoverValid != NULL) {
-    Mode->PxeDiscoverValid = *NewPxeDiscoverValid;
-  }
-
-  if (NewPxeReplyReceived != NULL) {
-    Mode->PxeReplyReceived = *NewPxeReplyReceived;
-  }
-
-  if (NewPxeBisReplyReceived != NULL) {
-    Mode->PxeBisReplyReceived = *NewPxeBisReplyReceived;
-  }
-
-  if (NewDhcpDiscover != NULL) {
-    CopyMem (&Mode->DhcpDiscover, NewDhcpDiscover, sizeof (EFI_PXE_BASE_CODE_PACKET));
-  }
-
-  if (NewDhcpAck != NULL) {
-    CopyMem (&Mode->DhcpAck, NewDhcpAck, sizeof (EFI_PXE_BASE_CODE_PACKET));
-  }
-
-  if (NewProxyOffer != NULL) {
-    CopyMem (&Mode->ProxyOffer, NewProxyOffer, sizeof (EFI_PXE_BASE_CODE_PACKET));
-  }
-
-  if (NewPxeDiscover != NULL) {
-    CopyMem (&Mode->PxeDiscover, NewPxeDiscover, sizeof (EFI_PXE_BASE_CODE_PACKET));
-  }
-
-  if (NewPxeReply != NULL) {
-    CopyMem (&Mode->PxeReply, NewPxeReply, sizeof (EFI_PXE_BASE_CODE_PACKET));
-  }
-
-  if (NewPxeBisReply != NULL) {
-    CopyMem (&Mode->PxeBisReply, NewPxeBisReply, sizeof (EFI_PXE_BASE_CODE_PACKET));
-  }
-
-  return EFI_SUCCESS;
-}
-
-EFI_PXE_BASE_CODE_PROTOCOL  mPxeBcProtocolTemplate = {
-  EFI_PXE_BASE_CODE_PROTOCOL_REVISION,
-  EfiPxeBcStart,
-  EfiPxeBcStop,
-  EfiPxeBcDhcp,
-  EfiPxeBcDiscover,
-  EfiPxeBcMtftp,
-  EfiPxeBcUdpWrite,
-  EfiPxeBcUdpRead,
-  EfiPxeBcSetIpFilter,
-  EfiPxeBcArp,
-  EfiPxeBcSetParameters,
-  EfiPxeBcSetStationIP,
-  EfiPxeBcSetPackets,
-  NULL
-};
-
-/**
-  Callback function that is invoked when the PXE Base Code Protocol is about to transmit, has
-  received, or is waiting to receive a packet.
-
-  This function is invoked when the PXE Base Code Protocol is about to transmit, has received,
-  or is waiting to receive a packet. Parameters Function and Received specify the type of event.
-  Parameters PacketLen and Packet specify the packet that generated the event. If these fields
-  are zero and NULL respectively, then this is a status update callback. If the operation specified
-  by Function is to continue, then CALLBACK_STATUS_CONTINUE should be returned. If the operation
-  specified by Function should be aborted, then CALLBACK_STATUS_ABORT should be returned. Due to
-  the polling nature of UEFI device drivers, a callback function should not execute for more than 5 ms.
-  The SetParameters() function must be called after a Callback Protocol is installed to enable the
-  use of callbacks.
-
-  @param  This                  Pointer to the EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL instance.
-  @param  Function              The PXE Base Code Protocol function that is waiting for an event.
-  @param  Received              TRUE if the callback is being invoked due to a receive event. FALSE if
-                                the callback is being invoked due to a transmit event.
-  @param  PacketLength          The length, in bytes, of Packet. This field will have a value of zero if
-                                this is a wait for receive event.
-  @param  PacketPtr             If Received is TRUE, a pointer to the packet that was just received;
-                                otherwise a pointer to the packet that is about to be transmitted.
-
-  @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE if Function specifies a continue operation
-  @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT    if Function specifies an abort operation
-
-**/
-EFI_PXE_BASE_CODE_CALLBACK_STATUS
-EFIAPI
-EfiPxeLoadFileCallback (
-  IN EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL  * This,
-  IN EFI_PXE_BASE_CODE_FUNCTION           Function,
-  IN BOOLEAN                              Received,
-  IN UINT32                               PacketLength,
-  IN EFI_PXE_BASE_CODE_PACKET             * PacketPtr OPTIONAL
-  )
-{
-  EFI_INPUT_KEY Key;
-  EFI_STATUS    Status;
-
-  //
-  // Catch Ctrl-C or ESC to abort.
-  //
-  Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
-
-  if (!EFI_ERROR (Status)) {
-
-    if (Key.ScanCode == SCAN_ESC || Key.UnicodeChar == (0x1F & 'c')) {
-
-      return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT;
-    }
-  }
-  //
-  // No print if receive packet
-  //
-  if (Received) {
-    return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
-  }
-  //
-  // Print only for three functions
-  //
-  switch (Function) {
-
-  case EFI_PXE_BASE_CODE_FUNCTION_MTFTP:
-    //
-    // Print only for open MTFTP packets, not every MTFTP packets
-    //
-    if (PacketLength != 0 && PacketPtr != NULL) {
-      if (PacketPtr->Raw[0x1C] != 0x00 || PacketPtr->Raw[0x1D] != 0x01) {
-        return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
-      }
-    }
-    break;
-
-  case EFI_PXE_BASE_CODE_FUNCTION_DHCP:
-  case EFI_PXE_BASE_CODE_FUNCTION_DISCOVER:
-    break;
-
-  default:
-    return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
-  }
-
-  if (PacketLength != 0 && PacketPtr != NULL) {
-    //
-    // Print '.' when transmit a packet
-    //
-    AsciiPrint (".");
-
-  }
-
-  return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
-}
-
-EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL mPxeBcCallBackTemplate = {
-  EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION,
-  EfiPxeLoadFileCallback
-};
-
-
-/**
-  Find the boot file.
-
-  @param  Private      Pointer to PxeBc private data.
-  @param  BufferSize   Pointer to buffer size.
-  @param  Buffer       Pointer to buffer.
-
-  @retval EFI_SUCCESS          Discover the boot file successfully.
-  @retval EFI_TIMEOUT          The TFTP/MTFTP operation timed out.
-  @retval EFI_ABORTED          PXE bootstrap server, so local boot need abort.
-  @retval EFI_BUFFER_TOO_SMALL The buffer is too small to load the boot file.
-
-**/
-EFI_STATUS
-DiscoverBootFile (
-  IN     PXEBC_PRIVATE_DATA  *Private,
-  IN OUT UINT64              *BufferSize,
-  IN     VOID                *Buffer
-  )
-{
-  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;
-  EFI_PXE_BASE_CODE_MODE      *Mode;
-  EFI_STATUS                  Status;
-  UINT16                      Type;
-  UINT16                      Layer;
-  BOOLEAN                     UseBis;
-  PXEBC_CACHED_DHCP4_PACKET   *Packet;
-  UINT16                      Value;
-
-  PxeBc = &Private->PxeBc;
-  Mode  = PxeBc->Mode;
-  Type  = EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP;
-  Layer = EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL;
-
-  //
-  // do DHCP.
-  //
-  Status = PxeBc->Dhcp (PxeBc, TRUE);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  //
-  // Select a boot server
-  //
-  Status = PxeBcSelectBootPrompt (Private);
-
-  if (Status == EFI_SUCCESS) {
-    Status = PxeBcSelectBootMenu (Private, &Type, TRUE);
-  } else if (Status == EFI_TIMEOUT) {
-    Status = PxeBcSelectBootMenu (Private, &Type, FALSE);
-  }
-
-  if (!EFI_ERROR (Status)) {
-
-    if (Type == EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP) {
-      //
-      // Local boot(PXE bootstrap server) need abort
-      //
-      return EFI_ABORTED;
-    }
-
-    UseBis  = (BOOLEAN) (Mode->BisSupported && Mode->BisDetected);
-    Status  = PxeBc->Discover (PxeBc, Type, &Layer, UseBis, NULL);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-
-  *BufferSize = 0;
-
-  //
-  // Get bootfile name and (m)tftp server ip addresss
-  //
-  if (Mode->PxeReplyReceived) {
-    Packet = &Private->PxeReply;
-  } else if (Mode->ProxyOfferReceived) {
-    Packet = &Private->ProxyOffer;
-  } else {
-    Packet = &Private->Dhcp4Ack;
-  }
-
-  //
-  // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier)
-  // in DHCPOFFER packet.
-  // (It does not comply with PXE Spec, Ver2.1)
-  //
-  if (EFI_IP4_EQUAL (&Packet->Packet.Offer.Dhcp4.Header.ServerAddr, &mZeroIp4Addr)) {
-    CopyMem (
-      &Private->ServerIp,
-      Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,
-      sizeof (EFI_IPv4_ADDRESS)
-      );
-  } else {
-    CopyMem (
-      &Private->ServerIp,
-      &Packet->Packet.Offer.Dhcp4.Header.ServerAddr,
-      sizeof (EFI_IPv4_ADDRESS)
-      );
-  }
-  if (Private->ServerIp.Addr[0] == 0) {
-    return EFI_DEVICE_ERROR;
-  }
-
-  ASSERT (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);
-
-  //
-  // bootlfile name
-  //
-  Private->BootFileName = (CHAR8 *) (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data);
-
-  if (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != NULL) {
-    //
-    // Already have the bootfile length option, compute the file size
-    //
-    CopyMem (&Value, Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof (Value));
-    Value       = NTOHS (Value);
-    *BufferSize = 512 * Value;
-    Status      = EFI_BUFFER_TOO_SMALL;
-  } else {
-    //
-    // Get the bootfile size from tftp
-    //
-    Status = PxeBc->Mtftp (
-                      PxeBc,
-                      EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
-                      Buffer,
-                      FALSE,
-                      BufferSize,
-                      &Private->BlockSize,
-                      &Private->ServerIp,
-                      (UINT8 *) Private->BootFileName,
-                      NULL,
-                      FALSE
-                      );
-  }
-
-  Private->FileSize = (UINTN) *BufferSize;
-
-  //
-  // Display all the information: boot server address, boot file name and boot file size.
-  //
-  AsciiPrint ("\n  Server IP address is ");
-  PxeBcShowIp4Addr (&Private->ServerIp.v4);
-  AsciiPrint ("\n  NBP filename is %a", Private->BootFileName);
-  AsciiPrint ("\n  NBP filesize is %d Bytes", Private->FileSize);
-
-  return Status;
-}
-
-/**
-  Causes the driver to load a specified file.
-
-  @param  This                  Protocol instance pointer.
-  @param  FilePath              The device specific path of the file to load.
-  @param  BootPolicy            If TRUE, indicates that the request originates from the
-                                boot manager is attempting to load FilePath as a boot
-                                selection. If FALSE, then FilePath must match as exact file
-                                to be loaded.
-  @param  BufferSize            On input the size of Buffer in bytes. On output with a return
-                                code of EFI_SUCCESS, the amount of data transferred to
-                                Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL,
-                                the size of Buffer required to retrieve the requested file.
-  @param  Buffer                The memory buffer to transfer the file to. IF Buffer is NULL,
-                                then no the size of the requested file is returned in
-                                BufferSize.
-
-  @retval EFI_SUCCESS                 The file was loaded.
-  @retval EFI_UNSUPPORTED             The device does not support the provided BootPolicy
-  @retval EFI_INVALID_PARAMETER       FilePath is not a valid device path, or
-                                      BufferSize is NULL.
-  @retval EFI_NO_MEDIA                No medium was present to load the file.
-  @retval EFI_DEVICE_ERROR            The file was not loaded due to a device error.
-  @retval EFI_NO_RESPONSE             The remote system did not respond.
-  @retval EFI_NOT_FOUND               The file was not found.
-  @retval EFI_ABORTED                 The file load process was manually cancelled.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeLoadFile (
-  IN EFI_LOAD_FILE_PROTOCOL           * This,
-  IN EFI_DEVICE_PATH_PROTOCOL         * FilePath,
-  IN BOOLEAN                          BootPolicy,
-  IN OUT UINTN                        *BufferSize,
-  IN VOID                             *Buffer OPTIONAL
-  )
-{
-  PXEBC_PRIVATE_DATA          *Private;
-  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;
-  BOOLEAN                     NewMakeCallback;
-  EFI_STATUS                  Status;
-  UINT64                      TmpBufSize;
-  EFI_STATUS                  MediaStatus;
-
-  if (FilePath == NULL || !IsDevicePathEnd (FilePath)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private         = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This);
-  PxeBc           = &Private->PxeBc;
-  NewMakeCallback = FALSE;
-  Status          = EFI_DEVICE_ERROR;
-
-  if (This == NULL || BufferSize == NULL) {
-
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Only support BootPolicy
-  //
-  if (!BootPolicy) {
-    return EFI_UNSUPPORTED;
-  }
-
-  //
-  // Check media status before PXE start
-  //
-  MediaStatus = EFI_SUCCESS;
-  NetLibDetectMediaWaitTimeout (Private->Controller, PXEBC_CHECK_MEDIA_WAITING_TIME, &MediaStatus);
-  if (MediaStatus != EFI_SUCCESS) {
-    return EFI_NO_MEDIA;
-  }
-
-  Status = PxeBc->Start (PxeBc, FALSE);
-  if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
-    return Status;
-  }
-
-  Status = gBS->HandleProtocol (
-                  Private->Controller,
-                  &gEfiPxeBaseCodeCallbackProtocolGuid,
-                  (VOID **) &Private->PxeBcCallback
-                  );
-  if (Status == EFI_UNSUPPORTED) {
-
-    CopyMem (&Private->LoadFileCallback, &mPxeBcCallBackTemplate, sizeof (Private->LoadFileCallback));
-
-    Status = gBS->InstallProtocolInterface (
-                    &Private->Controller,
-                    &gEfiPxeBaseCodeCallbackProtocolGuid,
-                    EFI_NATIVE_INTERFACE,
-                    &Private->LoadFileCallback
-                    );
-
-    NewMakeCallback = (BOOLEAN) (Status == EFI_SUCCESS);
-
-    Status          = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback);
-    if (EFI_ERROR (Status)) {
-      PxeBc->Stop (PxeBc);
-      return Status;
-    }
-  }
-
-  if (Private->FileSize == 0) {
-    TmpBufSize  = 0;
-    Status      = DiscoverBootFile (Private, &TmpBufSize, Buffer);
-
-    if (sizeof (UINTN) < sizeof (UINT64) && (TmpBufSize > 0xFFFFFFFF)) {
-      Status = EFI_DEVICE_ERROR;
-    } else if (TmpBufSize > 0 && *BufferSize >= (UINTN) TmpBufSize && Buffer != NULL) {
-      AsciiPrint ("\n Downloading NBP file...\n");
-      *BufferSize = (UINTN) TmpBufSize;
-      Status = PxeBc->Mtftp (
-                        PxeBc,
-                        EFI_PXE_BASE_CODE_TFTP_READ_FILE,
-                        Buffer,
-                        FALSE,
-                        &TmpBufSize,
-                        &Private->BlockSize,
-                        &Private->ServerIp,
-                        (UINT8 *) Private->BootFileName,
-                        NULL,
-                        FALSE
-                        );
-    } else if (TmpBufSize > 0) {
-      *BufferSize = (UINTN) TmpBufSize;
-      Status      = EFI_BUFFER_TOO_SMALL;
-    }
-  } else if (Buffer == NULL || Private->FileSize > *BufferSize) {
-    *BufferSize = Private->FileSize;
-    Status      = EFI_BUFFER_TOO_SMALL;
-  } else {
-    //
-    // Download the file.
-    //
-    AsciiPrint ("\n Downloading NBP file...\n");
-    TmpBufSize = (UINT64) (*BufferSize);
-    Status = PxeBc->Mtftp (
-                      PxeBc,
-                      EFI_PXE_BASE_CODE_TFTP_READ_FILE,
-                      Buffer,
-                      FALSE,
-                      &TmpBufSize,
-                      &Private->BlockSize,
-                      &Private->ServerIp,
-                      (UINT8 *) Private->BootFileName,
-                      NULL,
-                      FALSE
-                      );
-  }
-  //
-  // If we added a callback protocol, now is the time to remove it.
-  //
-  if (NewMakeCallback) {
-
-    NewMakeCallback = FALSE;
-
-    PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback);
-
-    gBS->UninstallProtocolInterface (
-          Private->Controller,
-          &gEfiPxeBaseCodeCallbackProtocolGuid,
-          &Private->LoadFileCallback
-          );
-  }
-
-  //
-  // Check download status
-  //
-  if (Status == EFI_SUCCESS) {
-    AsciiPrint ("\n  NBP file downloaded successfully.\n");
-    //
-    // The DHCP4 can have only one configured child instance so we need to stop
-    // reset the DHCP4 child before we return. Otherwise the other programs which
-    // also need to use DHCP4 will be impacted.
-    // The functionality of PXE Base Code protocol will not be stopped,
-    // when downloading is successfully.
-    //
-    Private->Dhcp4->Stop (Private->Dhcp4);
-    Private->Dhcp4->Configure (Private->Dhcp4, NULL);
-    return EFI_SUCCESS;
-
-  } else if (Status == EFI_BUFFER_TOO_SMALL) {
-    if (Buffer != NULL) {
-      AsciiPrint ("PXE-E05: Download buffer is smaller than requested file.\n");
-    } else {
-      //
-      // The functionality of PXE Base Code protocol will not be stopped.
-      //
-      return Status;
-    }
-
-  } else if (Status == EFI_DEVICE_ERROR) {
-    AsciiPrint ("PXE-E07: Network device error.\n");
-
-  } else if (Status == EFI_OUT_OF_RESOURCES) {
-    AsciiPrint ("PXE-E09: Could not allocate I/O buffers.\n");
-
-  } else if (Status == EFI_NO_MEDIA) {
-    AsciiPrint ("PXE-E12: Could not detect network connection.\n");
-
-  } else if (Status == EFI_NO_RESPONSE) {
-    AsciiPrint ("PXE-E16: No offer received.\n");
-
-  } else if (Status == EFI_TIMEOUT) {
-    AsciiPrint ("PXE-E18: Server response timeout.\n");
-
-  } else if (Status == EFI_ABORTED) {
-    AsciiPrint ("PXE-E21: Remote boot cancelled.\n");
-
-  } else if (Status == EFI_ICMP_ERROR) {
-    AsciiPrint ("PXE-E22: Client received ICMP error from server.\n");
-
-  } else if (Status == EFI_TFTP_ERROR) {
-    AsciiPrint ("PXE-E23: Client received TFTP error from server.\n");
-
-  } else {
-    AsciiPrint ("PXE-E99: Unexpected network error.\n");
-  }
-
-  PxeBc->Stop (PxeBc);
-
-  return Status;
-}
-
-EFI_LOAD_FILE_PROTOCOL  mLoadFileProtocolTemplate = { EfiPxeLoadFile };
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
deleted file mode 100644
index 88767c8394ab..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/** @file
-  PxeBc MTFTP functions.
-
-Copyright (c) 2007 - 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 "PxeBcImpl.h"
-
-CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {
-  "blksize",
-  "timeout",
-  "tsize",
-  "multicast"
-};
-
-
-/**
-  This is a callback function when packets received/transmitted in Mtftp driver.
-
-  A callback function that is provided by the caller to intercept
-  the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
-  EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
-  EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
-  EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
-
-  @param  This           Pointer to Mtftp protocol instance
-  @param  Token          Pointer to Mtftp token
-  @param  PacketLen      Length of Mtftp packet
-  @param  Packet         Pointer to Mtftp packet
-
-  @retval EFI_SUCCESS    Operation sucess
-  @retval EFI_ABORTED    Abort transfer process
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcCheckPacket (
-  IN EFI_MTFTP4_PROTOCOL        *This,
-  IN EFI_MTFTP4_TOKEN           *Token,
-  IN UINT16                     PacketLen,
-  IN EFI_MTFTP4_PACKET          *Packet
-  )
-{
-  PXEBC_PRIVATE_DATA                  *Private;
-  EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;
-  EFI_STATUS                          Status;
-
-  Private   = (PXEBC_PRIVATE_DATA *) Token->Context;
-  Callback  = Private->PxeBcCallback;
-  Status    = EFI_SUCCESS;
-
-  if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {
-    Private->Mode.TftpErrorReceived = TRUE;
-    Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;
-    AsciiStrnCpyS (Private->Mode.TftpError.ErrorString, PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet->Error.ErrorMessage, PXE_MTFTP_ERROR_STRING_LENGTH - 1);
-    Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';
-  }
-
-  if (Callback != NULL) {
-
-    Status = Callback->Callback (
-                        Callback,
-                        Private->Function,
-                        TRUE,
-                        PacketLen,
-                        (EFI_PXE_BASE_CODE_PACKET *) Packet
-                        );
-    if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {
-
-      Status = EFI_ABORTED;
-    } else {
-
-      Status = EFI_SUCCESS;
-    }
-  }
-
-  return Status;
-}
-
-
-/**
-  This function is to get size of a file by Tftp.
-
-  @param  Private        Pointer to PxeBc private data
-  @param  Config         Pointer to Mtftp configuration data
-  @param  Filename       Pointer to file name
-  @param  BlockSize      Pointer to block size
-  @param  BufferSize     Pointer to buffer size
-
-  @retval EFI_SUCCESS        Get the size of file success
-  @retval EFI_NOT_FOUND      Parse the tftp ptions failed.
-  @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.
-  @retval Other              Has not get the size of the file.
-
-**/
-EFI_STATUS
-PxeBcTftpGetFileSize (
-  IN PXEBC_PRIVATE_DATA         *Private,
-  IN EFI_MTFTP4_CONFIG_DATA     *Config,
-  IN UINT8                      *Filename,
-  IN UINTN                      *BlockSize,
-  IN OUT UINT64                 *BufferSize
-  )
-{
-  EFI_MTFTP4_PROTOCOL *Mtftp4;
-  EFI_MTFTP4_OPTION   ReqOpt[2];
-  EFI_MTFTP4_PACKET   *Packet;
-  EFI_MTFTP4_OPTION   *Option;
-  UINT32              PktLen;
-  UINT8               OptBuf[128];
-  UINT32              OptCnt;
-  EFI_STATUS          Status;
-
-  *BufferSize               = 0;
-  Status                    = EFI_DEVICE_ERROR;
-  Mtftp4                    = Private->Mtftp4;
-  Packet                    = NULL;
-  Option                    = NULL;
-  PktLen                    = 0;
-  OptCnt                    = 1;
-  Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
-
-  Status = Mtftp4->Configure (Mtftp4, Config);
-  if (EFI_ERROR (Status)) {
-
-    return Status;
-  }
-
-  ReqOpt[0].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];
-  UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
-  ReqOpt[0].ValueStr = OptBuf;
-
-  if (BlockSize != NULL) {
-    ReqOpt[1].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
-    ReqOpt[1].ValueStr  = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1;
-    UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1));
-    OptCnt++;
-  }
-
-  Status = Mtftp4->GetInfo (
-                    Mtftp4,
-                    NULL,
-                    Filename,
-                    NULL,
-                    (UINT8) OptCnt,
-                    ReqOpt,
-                    &PktLen,
-                    &Packet
-                    );
-
-  if (EFI_ERROR (Status)) {
-    if (Status == EFI_TFTP_ERROR) {
-      Private->Mode.TftpErrorReceived = TRUE;
-      Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;
-      AsciiStrnCpyS (
-        Private->Mode.TftpError.ErrorString,
-        PXE_MTFTP_ERROR_STRING_LENGTH,
-        (CHAR8 *) Packet->Error.ErrorMessage,
-        PXE_MTFTP_ERROR_STRING_LENGTH - 1
-        );
-      Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';
-    }
-    goto ON_ERROR;
-  }
-
-  OptCnt = 0;
-
-  Status = Mtftp4->ParseOptions (
-                    Mtftp4,
-                    PktLen,
-                    Packet,
-                    (UINT32 *) &OptCnt,
-                    &Option
-                    );
-
-  if (EFI_ERROR (Status)) {
-
-    goto ON_ERROR;
-  }
-
-  Status = EFI_NOT_FOUND;
-
-  while (OptCnt != 0) {
-
-    if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {
-
-      *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr);
-      Status      = EFI_SUCCESS;
-    }
-
-    OptCnt--;
-  }
-
-  FreePool (Option);
-
-ON_ERROR:
-
-  if (Packet != NULL) {
-    FreePool (Packet);
-  }
-
-  Mtftp4->Configure (Mtftp4, NULL);
-
-  return Status;
-}
-
-
-/**
-  This function is to get data of a file by Tftp.
-
-  @param  Private        Pointer to PxeBc private data
-  @param  Config         Pointer to Mtftp configuration data
-  @param  Filename       Pointer to file name
-  @param  BlockSize      Pointer to block size
-  @param  BufferPtr      Pointer to buffer
-  @param  BufferSize     Pointer to buffer size
-  @param  DontUseBuffer  Indicate whether with a receive buffer
-
-  @retval EFI_SUCCESS        Read the data success from the special file.
-  @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.
-  @retval other              Read data from file failed.
-
-**/
-EFI_STATUS
-PxeBcTftpReadFile (
-  IN PXEBC_PRIVATE_DATA         *Private,
-  IN EFI_MTFTP4_CONFIG_DATA     *Config,
-  IN UINT8                      *Filename,
-  IN UINTN                      *BlockSize,
-  IN UINT8                      *BufferPtr,
-  IN OUT UINT64                 *BufferSize,
-  IN BOOLEAN                    DontUseBuffer
-  )
-{
-  EFI_MTFTP4_PROTOCOL *Mtftp4;
-  EFI_MTFTP4_TOKEN    Token;
-  EFI_MTFTP4_OPTION   ReqOpt[1];
-  UINT32              OptCnt;
-  UINT8               OptBuf[128];
-  EFI_STATUS          Status;
-
-  Status                    = EFI_DEVICE_ERROR;
-  Mtftp4                    = Private->Mtftp4;
-  OptCnt                    = 0;
-  Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
-
-  Status = Mtftp4->Configure (Mtftp4, Config);
-  if (EFI_ERROR (Status)) {
-
-    return Status;
-  }
-
-  if (BlockSize != NULL) {
-
-    ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
-    ReqOpt[0].ValueStr  = OptBuf;
-    UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
-    OptCnt++;
-  }
-
-  Token.Event         = NULL;
-  Token.OverrideData  = NULL;
-  Token.Filename      = Filename;
-  Token.ModeStr       = NULL;
-  Token.OptionCount   = OptCnt;
-  Token.OptionList    = ReqOpt;
-  Token.Context       = Private;
-
-  if (DontUseBuffer) {
-    Token.BufferSize  = 0;
-    Token.Buffer      = NULL;
-  } else {
-    Token.BufferSize  = *BufferSize;
-    Token.Buffer      = BufferPtr;
-  }
-
-  Token.CheckPacket     = PxeBcCheckPacket;
-  Token.TimeoutCallback = NULL;
-  Token.PacketNeeded    = NULL;
-
-  Status = Mtftp4->ReadFile (Mtftp4, &Token);
-
-  *BufferSize = Token.BufferSize;
-
-  Mtftp4->Configure (Mtftp4, NULL);
-
-  return Status;
-}
-
-
-/**
-  This function is put data of a file by Tftp.
-
-  @param  Private        Pointer to PxeBc private data
-  @param  Config         Pointer to Mtftp configuration data
-  @param  Filename       Pointer to file name
-  @param  Overwrite      Indicate whether with overwrite attribute
-  @param  BlockSize      Pointer to block size
-  @param  BufferPtr      Pointer to buffer
-  @param  BufferSize     Pointer to buffer size
-
-  @retval EFI_SUCCESS        Write the data success into the special file.
-  @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.
-  @retval other              Write data into file failed.
-
-**/
-EFI_STATUS
-PxeBcTftpWriteFile (
-  IN PXEBC_PRIVATE_DATA         *Private,
-  IN EFI_MTFTP4_CONFIG_DATA     *Config,
-  IN UINT8                      *Filename,
-  IN BOOLEAN                    Overwrite,
-  IN UINTN                      *BlockSize,
-  IN UINT8                      *BufferPtr,
-  IN OUT UINT64                 *BufferSize
-  )
-{
-  EFI_MTFTP4_PROTOCOL *Mtftp4;
-  EFI_MTFTP4_TOKEN    Token;
-  EFI_MTFTP4_OPTION   ReqOpt[1];
-  UINT32              OptCnt;
-  UINT8               OptBuf[128];
-  EFI_STATUS          Status;
-
-  Status                    = EFI_DEVICE_ERROR;
-  Mtftp4                    = Private->Mtftp4;
-  OptCnt                    = 0;
-  Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
-
-  Status  = Mtftp4->Configure (Mtftp4, Config);
-  if (EFI_ERROR (Status)) {
-
-    return Status;
-  }
-
-  if (BlockSize != NULL) {
-
-    ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
-    ReqOpt[0].ValueStr  = OptBuf;
-    UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
-    OptCnt++;
-  }
-
-  Token.Event           = NULL;
-  Token.OverrideData    = NULL;
-  Token.Filename        = Filename;
-  Token.ModeStr         = NULL;
-  Token.OptionCount     = OptCnt;
-  Token.OptionList      = ReqOpt;
-  Token.BufferSize      = *BufferSize;
-  Token.Buffer          = BufferPtr;
-  Token.CheckPacket     = PxeBcCheckPacket;
-  Token.TimeoutCallback = NULL;
-  Token.PacketNeeded    = NULL;
-
-  Status      = Mtftp4->WriteFile (Mtftp4, &Token);
-  *BufferSize = Token.BufferSize;
-
-  Mtftp4->Configure (Mtftp4, NULL);
-
-  return Status;
-}
-
-
-/**
-  This function is to get data(file) from a directory(may be a server) by Tftp.
-
-  @param  Private        Pointer to PxeBc private data.
-  @param  Config         Pointer to Mtftp configuration data.
-  @param  Filename       Pointer to file name.
-  @param  BlockSize      Pointer to block size.
-  @param  BufferPtr      Pointer to buffer.
-  @param  BufferSize     Pointer to buffer size.
-  @param  DontUseBuffer  Indicate whether with a receive buffer.
-
-  @retval EFI_SUCCES         Get the data from the file included in directory success.
-  @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.
-  @retval other              Operation failed.
-
-**/
-EFI_STATUS
-PxeBcTftpReadDirectory (
-  IN PXEBC_PRIVATE_DATA            *Private,
-  IN EFI_MTFTP4_CONFIG_DATA        *Config,
-  IN UINT8                         *Filename,
-  IN UINTN                         *BlockSize,
-  IN UINT8                         *BufferPtr,
-  IN OUT UINT64                    *BufferSize,
-  IN BOOLEAN                       DontUseBuffer
-  )
-{
-  EFI_MTFTP4_PROTOCOL *Mtftp4;
-  EFI_MTFTP4_TOKEN    Token;
-  EFI_MTFTP4_OPTION   ReqOpt[1];
-  UINT32              OptCnt;
-  UINT8               OptBuf[128];
-  EFI_STATUS          Status;
-
-  Status                    = EFI_DEVICE_ERROR;
-  Mtftp4                    = Private->Mtftp4;
-  OptCnt                    = 0;
-  Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
-
-  Status = Mtftp4->Configure (Mtftp4, Config);
-  if (EFI_ERROR (Status)) {
-
-    return Status;
-  }
-
-  if (BlockSize != NULL) {
-
-    ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
-    ReqOpt[0].ValueStr  = OptBuf;
-    UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
-    OptCnt++;
-  }
-
-  Token.Event         = NULL;
-  Token.OverrideData  = NULL;
-  Token.Filename      = Filename;
-  Token.ModeStr       = NULL;
-  Token.OptionCount   = OptCnt;
-  Token.OptionList    = ReqOpt;
-  Token.Context       = Private;
-
-  if (DontUseBuffer) {
-    Token.BufferSize  = 0;
-    Token.Buffer      = NULL;
-  } else {
-    Token.BufferSize  = *BufferSize;
-    Token.Buffer      = BufferPtr;
-  }
-
-  Token.CheckPacket     = PxeBcCheckPacket;
-  Token.TimeoutCallback = NULL;
-  Token.PacketNeeded    = NULL;
-
-  Status = Mtftp4->ReadDirectory (Mtftp4, &Token);
-
-  *BufferSize = Token.BufferSize;
-
-  Mtftp4->Configure (Mtftp4, NULL);
-
-  return Status;
-}
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c
deleted file mode 100644
index 1401ca5ec2fd..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/** @file
-  Support routines for PxeBc.
-
-Copyright (c) 2007 - 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 "PxeBcImpl.h"
-
-
-/**
-  The common notify function associated with various PxeBc events.
-
-  @param  Event     The event signaled.
-  @param  Context   The context.
-
-**/
-VOID
-EFIAPI
-PxeBcCommonNotify (
-  IN EFI_EVENT           Event,
-  IN VOID                *Context
-  )
-{
-  *((BOOLEAN *) Context) = TRUE;
-}
-
-
-/**
-  This function initialize(or configure) the Udp4Write instance.
-
-  @param  Udp4       Pointer to the EFI_UDP4_PROTOCOL instance.
-  @param  StationIp  Pointer to the station ip address.
-  @param  SubnetMask Pointer to the subnetmask of the station ip address.
-  @param  Gateway    Pointer to the gateway ip address.
-  @param  SrcPort    Pointer to the srouce port of the station.
-  @param  Ttl        The time to live field of the IP header.
-  @param  ToS        The type of service field of the IP header.
-
-  @retval EFI_SUCCESS           The configuration settings were set, changed, or reset successfully.
-  @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP,
-                                RARP, etc.) is not finished yet.
-  @retval EFI_INVALID_PARAMETER One or more following conditions are TRUE:
-  @retval EFI_ALREADY_STARTED   The EFI UDPv4 Protocol instance is already started/configured
-                                and must be stopped/reset before it can be reconfigured.
-  @retval EFI_ACCESS_DENIED     UdpConfigData. AllowDuplicatePort is FALSE
-                                and UdpConfigData.StationPort is already used by
-                                other instance.
-  @retval EFI_OUT_OF_RESOURCES  The EFI UDPv4 Protocol driver cannot allocate memory for this
-                                EFI UDPv4 Protocol instance.
-  @retval EFI_DEVICE_ERROR      An unexpected network or system error occurred and this instance
-                                was not opened.
-  @retval Others                Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns.
-
-**/
-EFI_STATUS
-PxeBcConfigureUdpWriteInstance (
-  IN EFI_UDP4_PROTOCOL  *Udp4,
-  IN EFI_IPv4_ADDRESS   *StationIp,
-  IN EFI_IPv4_ADDRESS   *SubnetMask,
-  IN EFI_IPv4_ADDRESS   *Gateway,
-  IN OUT UINT16         *SrcPort,
-  IN     UINT8          Ttl,
-  IN     UINT8          ToS
-  )
-{
-  EFI_UDP4_CONFIG_DATA  Udp4CfgData;
-  EFI_STATUS            Status;
-
-  ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData));
-
-  Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;
-  Udp4CfgData.TypeOfService  = ToS;
-  Udp4CfgData.TimeToLive     = Ttl;
-  Udp4CfgData.AllowDuplicatePort = TRUE;
-
-  CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp));
-  CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof (*SubnetMask));
-
-  Udp4CfgData.StationPort    = *SrcPort;
-
-  //
-  // Reset the instance.
-  //
-  Udp4->Configure (Udp4, NULL);
-
-  Status = Udp4->Configure (Udp4, &Udp4CfgData);
-  if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) {
-    //
-    // basic configuration OK, need to add the default route entry
-    //
-    Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway);
-    if (EFI_ERROR (Status)) {
-      //
-      // roll back
-      //
-      Udp4->Configure (Udp4, NULL);
-    }
-  }
-
-  if (!EFI_ERROR (Status) && (*SrcPort == 0)) {
-    Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL);
-    *SrcPort = Udp4CfgData.StationPort;
-  }
-
-  return Status;
-}
-
-/**
-  This function is to display the IPv4 address.
-
-  @param[in]  Ip        The pointer to the IPv4 address.
-
-**/
-VOID
-PxeBcShowIp4Addr (
-  IN EFI_IPv4_ADDRESS   *Ip
-  )
-{
-  UINTN                 Index;
-
-  for (Index = 0; Index < 4; Index++) {
-    AsciiPrint ("%d", Ip->Addr[Index]);
-    if (Index < 3) {
-      AsciiPrint (".");
-    }
-  }
-}
-
-/**
-  Convert number to ASCII value.
-
-  @param  Number              Numeric value to convert to decimal ASCII value.
-  @param  Buffer              Buffer to place ASCII version of the Number.
-  @param  Length              Length of Buffer.
-
-**/
-VOID
-CvtNum (
-  IN UINTN  Number,
-  IN UINT8  *Buffer,
-  IN UINTN   Length
-  )
-{
-  UINTN Remainder;
-
-  for (; Length > 0; Length--) {
-    Remainder = Number % 10;
-    Number /= 10;
-    Buffer[Length - 1] = (UINT8) ('0' + Remainder);
-  }
-}
-
-
-/**
-  Convert unsigned int number to decimal number.
-
-  @param      Number         The unsigned int number will be converted.
-  @param      Buffer         Pointer to the buffer to store the decimal number after transform.
-  @param[in]  BufferSize     The maxsize of the buffer.
-
-  @return the length of the number after transform.
-
-**/
-UINTN
-UtoA10 (
-  IN UINTN Number,
-  IN CHAR8 *Buffer,
-  IN UINTN BufferSize
-  )
-{
-  UINTN Index;
-  CHAR8 TempStr[64];
-
-  Index           = 63;
-  TempStr[Index]  = 0;
-
-  do {
-    Index--;
-    TempStr[Index]  = (CHAR8) ('0' + (Number % 10));
-    Number          = Number / 10;
-  } while (Number != 0);
-
-  AsciiStrCpyS (Buffer, BufferSize, &TempStr[Index]);
-
-  return AsciiStrLen (Buffer);
-}
-
-
-/**
-  Convert ASCII numeric string to a UINTN value.
-
-  @param  Buffer  Pointer to the 8-byte unsigned int value.
-
-  @return UINTN value of the ASCII string.
-
-**/
-UINT64
-AtoU64 (
-  IN UINT8 *Buffer
-  )
-{
-  UINT64  Value;
-  UINT8   Character;
-
-  Value = 0;
-  while ((Character = *Buffer++) != '\0') {
-    Value = MultU64x32 (Value, 10) + (Character - '0');
-  }
-
-  return Value;
-}
-
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 2465d39fd744..5d042be3a862 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -354,12 +354,10 @@ [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
   MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
-  MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
   MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
 
   MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/PcatSingleSegmentPciCfg2Pei.inf
@@ -422,7 +420,6 @@ [Components]
   MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
 
 [Components.IA32, Components.X64, Components.AARCH64]
-  MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
   MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf
   MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
   MdeModulePkg/Universal/EbcDxe/EbcDebugger.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
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h
deleted file mode 100644
index bea7479eb222..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/** @file
-  Socket implementation header file.
-
-Copyright (c) 2005 - 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<BR>
-
-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 _SOCK_IMPL_H_
-#define _SOCK_IMPL_H_
-
-#include "Socket.h"
-#include "Tcp4Main.h"
-
-/**
-  Signal a event with the given status.
-
-  @param Token        The token's event is to be signaled.
-  @param TokenStatus  The status to be sent with the event.
-
-**/
-#define SIGNAL_TOKEN(Token, TokenStatus) \
-  do { \
-    (Token)->Status = (TokenStatus); \
-    gBS->SignalEvent ((Token)->Event); \
-  } while (0)
-
-
-/**
-  Supporting function for both SockImpl and SockInterface.
-
-  @param Event  The Event this notify function registered to, ignored.
-
-**/
-VOID
-EFIAPI
-SockFreeFoo (
-  IN EFI_EVENT Event
-  );
-
-/**
-  Process the TCP send data, buffer the tcp txdata and append
-  the buffer to socket send buffer,then try to send it.
-
-  @param  Sock                  Pointer to the socket.
-  @param  TcpTxData             Pointer to the tcp txdata.
-
-  @retval EFI_SUCCESS           The operation is completed successfully.
-  @retval EFI_OUT_OF_RESOURCES  Failed due to resource limit.
-
-**/
-EFI_STATUS
-SockProcessTcpSndData (
-  IN SOCKET   *Sock,
-  IN VOID     *TcpTxData
-  );
-
-/**
-  Copy data from socket buffer to application provided receive buffer.
-
-  @param  Sock                  Pointer to the socket.
-  @param  TcpRxData             Pointer to the application provided receive buffer.
-  @param  RcvdBytes             The maximum length of the data can be copied.
-  @param  IsOOB                 If TRUE the data is OOB, else the data is normal.
-
-**/
-VOID
-SockSetTcpRxData (
-  IN SOCKET     *Sock,
-  IN VOID       *TcpRxData,
-  IN UINT32     RcvdBytes,
-  IN BOOLEAN    IsOOB
-  );
-
-/**
-  Get received data from the socket layer to the receive token.
-
-  @param  Sock                  Pointer to the socket.
-  @param  RcvToken              Pointer to the application provided receive token.
-
-  @return The length of data received in this token.
-
-**/
-UINT32
-SockProcessRcvToken (
-  IN     SOCKET        *Sock,
-  IN OUT SOCK_IO_TOKEN *RcvToken
-  );
-
-/**
-  Flush the socket.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockConnFlush (
-  IN OUT SOCKET *Sock
-  );
-
-/**
-  Create a socket with initial data SockInitData.
-
-  @param  SockInitData          Pointer to the initial data of the socket.
-
-  @return Pointer to the newly created socket.
-
-**/
-SOCKET *
-SockCreate (
-  IN SOCK_INIT_DATA *SockInitData
-  );
-
-/**
-  Destroy a socket.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockDestroy (
-  IN OUT SOCKET *Sock
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
deleted file mode 100644
index 650a7dd8651f..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
+++ /dev/null
@@ -1,954 +0,0 @@
-/** @file
-  Socket header file.
-
-Copyright (c) 2005 - 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<BR>
-
-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 _SOCKET_H_
-#define _SOCKET_H_
-
-#include <Uefi.h>
-
-#include <Protocol/Ip4.h>
-#include <Protocol/Tcp4.h>
-#include <Protocol/Udp4.h>
-
-#include <Library/NetLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiLib.h>
-#include <Library/DpcLib.h>
-#include <Library/PrintLib.h>
-
-#define SOCK_SND_BUF        0
-#define SOCK_RCV_BUF        1
-
-#define SOCK_BUFF_LOW_WATER (2 * 1024)
-#define SOCK_RCV_BUFF_SIZE  (8 * 1024)
-#define SOCK_SND_BUFF_SIZE  (8 * 1024)
-#define SOCK_BACKLOG        5
-
-#define PROTO_RESERVED_LEN  20
-
-#define SO_NO_MORE_DATA     0x0001
-
-//
-//
-//
-// When a socket is created it enters into SO_UNCONFIGURED,
-// no actions can be taken on this socket, only after calling
-// SockConfigure. The state transition diagram of socket is
-// as following:
-//
-// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING
-//  ^      |                                    |
-//  |      --->  SO_LISTENING                   |
-//  |                                           |
-//  |------------------SO_DISCONNECTING<-- SO_CONNECTED
-//
-// A passive socket can only go into SO_LISTENING and
-// SO_UNCONFIGURED state. SO_XXXING state is a middle state
-// when a socket is undergoing a protocol procedure such
-// as requesting a TCP connection.
-//
-//
-//
-
-///
-/// Socket state
-///
-#define SO_CLOSED        0
-#define SO_LISTENING     1
-#define SO_CONNECTING    2
-#define SO_CONNECTED     3
-#define SO_DISCONNECTING 4
-
-///
-/// Socket configure state
-///
-#define SO_UNCONFIGURED        0
-#define SO_CONFIGURED_ACTIVE   1
-#define SO_CONFIGURED_PASSIVE  2
-#define SO_NO_MAPPING          3
-
-/**
-  Set socket SO_NO_MORE_DATA flag.
-
-  @param Sock               Pointer to the socket
-
-**/
-#define SOCK_NO_MORE_DATA(Sock)     ((Sock)->Flag |= SO_NO_MORE_DATA)
-
-/**
-  Check whether the socket is unconfigured.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is unconfigued
-  @retval False              The socket is not unconfigued
-
-**/
-#define SOCK_IS_UNCONFIGURED(Sock)  ((Sock)->ConfigureState == SO_UNCONFIGURED)
-
-/**
-  Check whether the socket is configured.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is configued
-  @retval False              The socket is not configued
-
-**/
-#define SOCK_IS_CONFIGURED(Sock) \
-    (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \
-    ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE))
-
-/**
-  Check whether the socket is configured to active mode.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is configued to active mode
-  @retval False              The socket is not configued to active mode
-
-**/
-#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \
-  ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE)
-
-/**
-  Check whether the socket is configured to passive mode.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is configued to passive mode
-  @retval False              The socket is not configued to passive mode
-
-**/
-#define SOCK_IS_CONNECTED_PASSIVE(Sock) \
-  ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)
-
-/**
-  Check whether the socket is mapped.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is no mapping
-  @retval False              The socket is mapped
-
-**/
-#define SOCK_IS_NO_MAPPING(Sock) \
-  ((Sock)->ConfigureState == SO_NO_MAPPING)
-
-/**
-  Check whether the socket is closed.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is closed
-  @retval False              The socket is not closed
-
-**/
-#define SOCK_IS_CLOSED(Sock)          ((Sock)->State == SO_CLOSED)
-
-/**
-  Check whether the socket is listening.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is listening
-  @retval False              The socket is not listening
-
-**/
-#define SOCK_IS_LISTENING(Sock)       ((Sock)->State == SO_LISTENING)
-
-/**
-  Check whether the socket is connecting.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is connecting
-  @retval False              The socket is not connecting
-
-**/
-#define SOCK_IS_CONNECTING(Sock)      ((Sock)->State == SO_CONNECTING)
-
-/**
-  Check whether the socket has connected.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket has connected
-  @retval False              The socket has not connected
-
-**/
-#define SOCK_IS_CONNECTED(Sock)       ((Sock)->State == SO_CONNECTED)
-
-/**
-  Check whether the socket is disconnecting.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is disconnecting
-  @retval False              The socket is not disconnecting
-
-**/
-#define SOCK_IS_DISCONNECTING(Sock)   ((Sock)->State == SO_DISCONNECTING)
-
-/**
-  Check whether the socket is no more data.
-
-  @param  Sock               Pointer to the socket
-
-  @retval True               The socket is no more data
-  @retval False              The socket still has data
-
-**/
-#define SOCK_IS_NO_MORE_DATA(Sock)    (0 != ((Sock)->Flag & SO_NO_MORE_DATA))
-
-/**
-  Set the size of the receive buffer.
-
-  @param  Sock               Pointer to the socket
-  @param  Size               The size to set
-
-**/
-#define SET_RCV_BUFFSIZE(Sock, Size)  ((Sock)->RcvBuffer.HighWater = (Size))
-
-/**
-  Get the size of the receive buffer.
-
-  @param  Sock               Pointer to the socket
-
-  @return The receive buffer size
-
-**/
-#define GET_RCV_BUFFSIZE(Sock)        ((Sock)->RcvBuffer.HighWater)
-
-/**
-  Get the size of the receive data.
-
-  @param  Sock               Pointer to the socket
-
-  @return The received data size
-
-**/
-#define GET_RCV_DATASIZE(Sock)        (((Sock)->RcvBuffer.DataQueue)->BufSize)
-
-/**
-  Set the size of the send buffer.
-
-  @param  Sock               Pointer to the socket
-  @param  Size               The size to set
-
-**/
-#define SET_SND_BUFFSIZE(Sock, Size)  ((Sock)->SndBuffer.HighWater = (Size))
-
-/**
-  Get the size of the send buffer.
-
-  @param  Sock               Pointer to the socket
-
-  @return The send buffer size
-
-**/
-#define GET_SND_BUFFSIZE(Sock)        ((Sock)->SndBuffer.HighWater)
-
-/**
-  Get the size of the send data.
-
-  @param  Sock               Pointer to the socket
-
-  @return The send data size
-
-**/
-#define GET_SND_DATASIZE(Sock)        (((Sock)->SndBuffer.DataQueue)->BufSize)
-
-/**
-  Set the backlog value of the socket.
-
-  @param  Sock               Pointer to the socket
-  @param  Value              The value to set
-
-**/
-#define SET_BACKLOG(Sock, Value)      ((Sock)->BackLog = (Value))
-
-/**
-  Get the backlog value of the socket.
-
-  @param  Sock               Pointer to the socket
-
-  @return The backlog value
-
-**/
-#define GET_BACKLOG(Sock)             ((Sock)->BackLog)
-
-/**
-  Set the socket with error state.
-
-  @param  Sock               Pointer to the socket
-  @param  Error              The error state
-
-**/
-#define SOCK_ERROR(Sock, Error)       ((Sock)->SockError = (Error))
-
-#define SND_BUF_HDR_LEN(Sock) \
-  ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize)
-
-#define RCV_BUF_HDR_LEN(Sock) \
-  ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize)
-
-#define SOCK_SIGNATURE                SIGNATURE_32 ('S', 'O', 'C', 'K')
-
-#define SOCK_FROM_THIS(a)             CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE)
-
-#define SOCK_FROM_TOKEN(Token)        (((SOCK_TOKEN *) (Token))->Sock)
-
-#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \
-  ((Type *) (((SOCK_TOKEN *) (SockToken))->Token))
-
-typedef struct _SOCKET SOCKET;
-
-///
-/// Socket completion token
-///
-typedef struct _SOCK_COMPLETION_TOKEN {
-  EFI_EVENT   Event;            ///< The event to be issued
-  EFI_STATUS  Status;           ///< The status to be issued
-} SOCK_COMPLETION_TOKEN;
-
-typedef union {
-  VOID  *RxData;
-  VOID  *TxData;
-} SOCK_IO_DATA;
-
-///
-/// The application token with data packet
-///
-typedef struct _SOCK_IO_TOKEN {
-  SOCK_COMPLETION_TOKEN Token;
-  SOCK_IO_DATA          Packet;
-} SOCK_IO_TOKEN;
-
-///
-///  The request issued from socket layer to protocol layer.
-///
-#define SOCK_ATTACH     0    ///< Attach current socket to a new PCB
-#define SOCK_DETACH     1    ///< Detach current socket from the PCB
-#define SOCK_CONFIGURE  2    ///< Configure attached PCB
-#define SOCK_FLUSH      3    ///< Flush attached PCB
-#define SOCK_SND        4    ///< Need protocol to send something
-#define SOCK_SNDPUSH    5    ///< Need protocol to send pushed data
-#define SOCK_SNDURG     6    ///< Need protocol to send urgent data
-#define SOCK_CONSUMED   7    ///< Application has retrieved data from socket
-#define SOCK_CONNECT    8    ///< Need to connect to a peer
-#define SOCK_CLOSE      9    ///< Need to close the protocol process
-#define SOCK_ABORT      10   ///< Need to reset the protocol process
-#define SOCK_POLL       11   ///< Need to poll to the protocol layer
-#define SOCK_ROUTE      12   ///< Need to add a route information
-#define SOCK_MODE       13   ///< Need to get the mode data of the protocol
-#define SOCK_GROUP      14   ///< Need to join a mcast group
-
-///
-///  The socket type.
-///
-typedef enum {
-  SockDgram, ///< This socket providing datagram service
-  SockStream ///< This socket providing stream service
-} SOCK_TYPE;
-
-///
-///  The buffer structure of rcvd data and send data used by socket.
-///
-typedef struct _SOCK_BUFFER {
-  UINT32        HighWater;  ///< The buffersize upper limit of sock_buffer
-  UINT32        LowWater;   ///< The low water mark of sock_buffer
-  NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data
-} SOCK_BUFFER;
-
-/**
-  The handler of protocol for request from socket.
-
-  @param Socket              The socket issuing the request to protocol
-  @param Request             The request issued by socket
-  @param RequestData         The request related data
-
-  @retval EFI_SUCCESS        The socket request is completed successfully.
-  @retval other              The error status returned by the corresponding TCP
-                             layer function.
-
-**/
-typedef
-EFI_STATUS
-(*SOCK_PROTO_HANDLER) (
-  IN SOCKET       *Socket,
-  IN UINT8        Request,
-  IN VOID         *RequestData
-  );
-
-
-//
-// Socket provided oprerations for low layer protocol
-//
-
-//
-// Socket provided operations for user interface
-//
-
-/**
-  Set the state of the socket.
-
-  @param  Sock                  Pointer to the socket.
-  @param  State                 The new socket state to be set.
-
-**/
-VOID
-SockSetState (
-  IN OUT SOCKET     *Sock,
-  IN     UINT8      State
-  );
-
-/**
-  Called by the low layer protocol to indicate the socket a connection is
-  established.
-
-  This function just changes the socket's state to SO_CONNECTED
-  and signals the token used for connection establishment.
-
-  @param  Sock                  Pointer to the socket associated with the
-                                established connection.
-
-**/
-VOID
-SockConnEstablished (
-  IN SOCKET *Sock
-  );
-
-/**
-  Called by the low layer protocol to indicate the connection is closed.
-
-  This function flushes the socket, sets the state to SO_CLOSED and signals
-  the close token.
-
-  @param  Sock                  Pointer to the socket associated with the closed
-                                connection.
-
-**/
-VOID
-SockConnClosed (
-  IN OUT SOCKET *Sock
-  );
-
-/**
-  Called by low layer protocol to indicate that some data is sent or processed.
-
-  This function trims the sent data in the socket send buffer, signals the data
-  token if proper.
-
-  @param  Sock                  Pointer to the socket.
-  @param  Count                 The length of the data processed or sent, in bytes.
-
-**/
-VOID
-SockDataSent (
-  IN SOCKET     *Sock,
-  IN UINT32     Count
-  );
-
-/**
-  Called by the low layer protocol to copy some data in socket send
-  buffer starting from the specific offset to a buffer provided by
-  the caller.
-
-  @param  Sock                  Pointer to the socket.
-  @param  Offset                The start point of the data to be copied.
-  @param  Len                   The length of the data to be copied.
-  @param  Dest                  Pointer to the destination to copy the data.
-
-  @return The data size copied.
-
-**/
-UINT32
-SockGetDataToSend (
-  IN SOCKET      *Sock,
-  IN UINT32      Offset,
-  IN UINT32      Len,
-  IN UINT8       *Dest
-  );
-
-/**
-  Called by the low layer protocol to indicate that there
-  will be no more data from the communication peer.
-
-  This function set the socket's state to SO_NO_MORE_DATA and
-  signal all queued IO tokens with the error status EFI_CONNECTION_FIN.
-
-  @param  Sock                  Pointer to the socket.
-
-**/
-VOID
-SockNoMoreData (
-  IN OUT SOCKET *Sock
-  );
-
-/**
-  Called by the low layer protocol to deliver received data to socket layer.
-
-  This function will append the data to the socket receive buffer, set ther
-  urgent data length and then check if any receive token can be signaled.
-
-  @param  Sock                  Pointer to the socket.
-  @param  NetBuffer             Pointer to the buffer that contains the received
-                                data.
-  @param  UrgLen                The length of the urgent data in the received data.
-
-**/
-VOID
-SockDataRcvd (
-  IN     SOCKET    *Sock,
-  IN OUT NET_BUF   *NetBuffer,
-  IN     UINT32    UrgLen
-  );
-
-/**
-  Get the length of the free space of the specific socket buffer.
-
-  @param  Sock                  Pointer to the socket.
-  @param  Which                 Flag to indicate which socket buffer to check,
-                                either send buffer or receive buffer.
-
-  @return The length of the free space, in bytes.
-
-**/
-UINT32
-SockGetFreeSpace (
-  IN SOCKET  *Sock,
-  IN UINT32  Which
-  );
-
-/**
-  Clone a new socket including its associated protocol control block.
-
-  @param  Sock                  Pointer to the socket to be cloned.
-
-  @return Pointer to the newly cloned socket. If NULL, error condition occurred.
-
-**/
-SOCKET *
-SockClone (
-  IN SOCKET *Sock
-  );
-
-
-///
-/// Proto type of the create callback
-///
-typedef
-EFI_STATUS
-(*SOCK_CREATE_CALLBACK) (
-  IN SOCKET  *This,
-  IN VOID    *Context
-  );
-
-///
-/// Proto type of the destroy callback
-///
-typedef
-VOID
-(*SOCK_DESTROY_CALLBACK) (
-  IN SOCKET  *This,
-  IN VOID    *Context
-  );
-
-///
-///  The initialize data for create a new socket.
-///
-typedef struct _SOCK_INIT_DATA {
-  SOCK_TYPE   Type;
-  UINT8       State;
-
-  SOCKET      *Parent;        ///< The parent of this socket
-  UINT32      BackLog;        ///< The connection limit for listening socket
-  UINT32      SndBufferSize;  ///< The high water mark of send buffer
-  UINT32      RcvBufferSize;  ///< The high water mark of receive buffer
-  VOID        *Protocol;      ///< The pointer to protocol function template
-                              ///< wanted to install on socket
-
-  //
-  // Callbacks after socket is created and before socket is to be destroyed.
-  //
-  SOCK_CREATE_CALLBACK   CreateCallback;  ///< Callback after created
-  SOCK_DESTROY_CALLBACK  DestroyCallback; ///< Callback before destroied
-  VOID                   *Context;        ///< The context of the callback
-
-  //
-  // Opaque protocol data.
-  //
-  VOID                   *ProtoData;
-  UINT32                 DataSize;
-
-  SOCK_PROTO_HANDLER     ProtoHandler;  ///< The handler of protocol for socket request
-
-  EFI_HANDLE   DriverBinding;           ///< The driver binding handle
-} SOCK_INIT_DATA;
-
-///
-///  The union type of TCP and UDP protocol.
-///
-typedef union _NET_PROTOCOL {
-  EFI_TCP4_PROTOCOL TcpProtocol;   ///< Tcp protocol
-  EFI_UDP4_PROTOCOL UdpProtocol;   ///< Udp protocol
-} NET_PROTOCOL;
-
-///
-/// The socket structure representing a network service access point
-///
-struct _SOCKET {
-
-  //
-  // Socket description information
-  //
-  UINT32                Signature;      ///< Signature of the socket
-  EFI_HANDLE            SockHandle;     ///< The virtual handle of the socket
-  EFI_HANDLE            DriverBinding;  ///< Socket's driver binding protocol
-  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  LIST_ENTRY                Link;
-  UINT8                 ConfigureState;
-  SOCK_TYPE             Type;
-  UINT8                 State;
-  UINT16                Flag;
-  EFI_LOCK              Lock;       ///< The lock of socket
-  SOCK_BUFFER           SndBuffer;  ///< Send buffer of application's data
-  SOCK_BUFFER           RcvBuffer;  ///< Receive buffer of received data
-  EFI_STATUS            SockError;  ///< The error returned by low layer protocol
-  BOOLEAN               InDestroy;
-
-  //
-  // Fields used to manage the connection request
-  //
-  UINT32          BackLog;        ///< the limit of connection to this socket
-  UINT32          ConnCnt;        ///< the current count of connections to it
-  SOCKET          *Parent;        ///< listening parent that accept the connection
-  LIST_ENTRY      ConnectionList; ///< the connections maintained by this socket
-
-  //
-  // The queue to buffer application's asynchronous token
-  //
-  LIST_ENTRY      ListenTokenList;
-  LIST_ENTRY      RcvTokenList;
-  LIST_ENTRY      SndTokenList;
-  LIST_ENTRY      ProcessingSndTokenList;
-
-  SOCK_COMPLETION_TOKEN *ConnectionToken; ///< app's token to signal if connected
-  SOCK_COMPLETION_TOKEN *CloseToken;      ///< app's token to signal if closed
-
-  //
-  // Interface for low level protocol
-  //
-  SOCK_PROTO_HANDLER    ProtoHandler;       ///< The request handler of protocol
-  UINT8 ProtoReserved[PROTO_RESERVED_LEN];  ///< Data fields reserved for protocol
-  NET_PROTOCOL          NetProtocol;        ///< TCP or UDP protocol socket used
-
-  //
-  // Callbacks after socket is created and before socket is to be destroyed.
-  //
-  SOCK_CREATE_CALLBACK   CreateCallback;    ///< Callback after created
-  SOCK_DESTROY_CALLBACK  DestroyCallback;   ///< Callback before destroied
-  VOID                   *Context;          ///< The context of the callback
-};
-
-///
-///  The token structure buffered in socket layer.
-///
-typedef struct _SOCK_TOKEN {
-  LIST_ENTRY            TokenList;      ///< The entry to add in the token list
-  SOCK_COMPLETION_TOKEN *Token;         ///< The application's token
-  UINT32                RemainDataLen;  ///< Unprocessed data length
-  SOCKET                *Sock;          ///< The poninter to the socket this token
-                                        ///< belongs to
-} SOCK_TOKEN;
-
-///
-/// Reserved data to access the NET_BUF delivered by UDP driver.
-///
-typedef struct _UDP_RSV_DATA {
-  EFI_TIME              TimeStamp;
-  EFI_UDP4_SESSION_DATA Session;
-} UDP_RSV_DATA;
-
-///
-/// Reserved data to access the NET_BUF delivered by TCP driver.
-///
-typedef struct _TCP_RSV_DATA {
-  UINT32 UrgLen;
-} TCP_RSV_DATA;
-
-/**
-  Create a socket and its associated protocol control block
-  with the intial data SockInitData and protocol specific
-  data ProtoData.
-
-  @param  SockInitData         Inital data to setting the socket.
-
-  @return Pointer to the newly created socket. If NULL, error condition occured.
-
-**/
-SOCKET *
-SockCreateChild (
-  IN SOCK_INIT_DATA *SockInitData
-  );
-
-/**
-  Destroy the socket Sock and its associated protocol control block.
-
-  @param  Sock                 The socket to be destroyed.
-
-  @retval EFI_SUCCESS          The socket Sock is destroyed successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
-
-**/
-EFI_STATUS
-SockDestroyChild (
-  IN   SOCKET *Sock
-  );
-
-/**
-  Configure the specific socket Sock using configuration data ConfigData.
-
-  @param  Sock                 Pointer to the socket to be configured.
-  @param  ConfigData           Pointer to the configuration data.
-
-  @retval EFI_SUCCESS          The socket is configured successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket or the
-                               socket is already configured.
-
-**/
-EFI_STATUS
-SockConfigure (
-  IN SOCKET *Sock,
-  IN VOID   *ConfigData
-  );
-
-/**
-  Initiate a connection establishment process.
-
-  @param  Sock                 Pointer to the socket to initiate the initate the
-                               connection.
-  @param  Token                Pointer to the token used for the connection
-                               operation.
-
-  @retval EFI_SUCCESS          The connection is initialized successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not configured to
-                               be an active one, or the token is already in one of
-                               this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-
-**/
-EFI_STATUS
-SockConnect (
-  IN SOCKET *Sock,
-  IN VOID   *Token
-  );
-
-/**
-  Issue a listen token to get an existed connected network instance
-  or wait for a connection if there is none.
-
-  @param  Sock                 Pointer to the socket to accept connections.
-  @param  Token                The token to accept a connection.
-
-  @retval EFI_SUCCESS          Either a connection is accpeted or the Token is
-                               buffered for further acception.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not configured to
-                               be a passive one, or the token is already in one of
-                               this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-  @retval EFI_OUT_OF_RESOURCE  Failed to buffer the Token due to memory limit.
-
-**/
-EFI_STATUS
-SockAccept (
-  IN SOCKET *Sock,
-  IN VOID   *Token
-  );
-
-/**
-  Issue a token with data to the socket to send out.
-
-  @param  Sock                 Pointer to the socket to process the token with
-                               data.
-  @param  Token                The token with data that needs to send out.
-
-  @retval EFI_SUCCESS          The token is processed successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not in a
-                               synchronized state , or the token is already in one
-                               of this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-  @retval EFI_OUT_OF_RESOURCE  Failed to buffer the token due to memory limit.
-
-**/
-EFI_STATUS
-SockSend (
-  IN SOCKET *Sock,
-  IN VOID   *Token
-  );
-
-/**
-  Issue a token to get data from the socket.
-
-  @param  Sock                 Pointer to the socket to get data from.
-  @param  Token                The token to store the received data from the
-                               socket.
-
-  @retval EFI_SUCCESS          The token is processed successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not in a
-                               synchronized state , or the token is already in one
-                               of this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-  @retval EFI_CONNECTION_FIN   The connection is closed and there is no more data.
-  @retval EFI_OUT_OF_RESOURCE  Failed to buffer the token due to memory limit.
-
-**/
-EFI_STATUS
-SockRcv (
-  IN SOCKET *Sock,
-  IN VOID   *Token
-  );
-
-/**
-  Reset the socket and its associated protocol control block.
-
-  @param  Sock                 Pointer to the socket to be flushed.
-
-  @retval EFI_SUCCESS          The socket is flushed successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
-
-**/
-EFI_STATUS
-SockFlush (
-  IN SOCKET *Sock
-  );
-
-/**
-  Close or abort the socket associated connection.
-
-  @param  Sock                 Pointer to the socket of the connection to close or
-                               abort.
-  @param  Token                The token for close operation.
-  @param  OnAbort              TRUE for aborting the connection, FALSE to close it.
-
-  @retval EFI_SUCCESS          The close or abort operation is initialized
-                               successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
-                               socket is closed, or the socket is not in a
-                               synchronized state , or the token is already in one
-                               of this socket's lists.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-
-**/
-EFI_STATUS
-SockClose (
-  IN SOCKET  *Sock,
-  IN VOID    *Token,
-  IN BOOLEAN OnAbort
-  );
-
-/**
-  Get the mode data of the low layer protocol.
-
-  @param  Sock                 Pointer to the socket to get mode data from.
-  @param  Mode                 Pointer to the data to store the low layer mode
-                               information.
-
-  @retval EFI_SUCCESS          The mode data is got successfully.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-
-**/
-EFI_STATUS
-SockGetMode (
-  IN     SOCKET *Sock,
-  IN OUT VOID   *Mode
-  );
-
-/**
-  Add or remove route information in IP route table associated
-  with this socket.
-
-  @param  Sock                 Pointer to the socket associated with the IP route
-                               table to operate on.
-  @param  RouteInfo            Pointer to the route information to be processed.
-
-  @retval EFI_SUCCESS          The route table is updated successfully.
-  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
-  @retval EFI_NO_MAPPING       The IP address configuration operation is  not
-                               finished.
-  @retval EFI_NOT_STARTED      The socket is not configured.
-
-**/
-EFI_STATUS
-SockRoute (
-  IN SOCKET    *Sock,
-  IN VOID      *RouteInfo
-  );
-
-//
-// Supporting function to operate on socket buffer
-//
-
-/**
-  Get the first buffer block in the specific socket buffer.
-
-  @param  Sockbuf               Pointer to the socket buffer.
-
-  @return Pointer to the first buffer in the queue. NULL if the queue is empty.
-
-**/
-NET_BUF *
-SockBufFirst (
-  IN SOCK_BUFFER *Sockbuf
-  );
-
-/**
-  Get the next buffer block in the specific socket buffer.
-
-  @param  Sockbuf               Pointer to the socket buffer.
-  @param  SockEntry             Pointer to the buffer block prior to the required
-                                one.
-
-  @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is
-          the tail or head entry.
-
-**/
-NET_BUF *
-SockBufNext (
-  IN SOCK_BUFFER *Sockbuf,
-  IN NET_BUF     *SockEntry
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h
deleted file mode 100644
index 368f49c4ddb1..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h
+++ /dev/null
@@ -1,342 +0,0 @@
-/** @file
-  Tcp driver function header.
-
-Copyright (c) 2005 - 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<BR>
-
-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 _TCP4_DRIVER_H_
-#define _TCP4_DRIVER_H_
-
-#include <Protocol/ServiceBinding.h>
-#include <Library/IpIoLib.h>
-
-#define TCP4_DRIVER_SIGNATURE   SIGNATURE_32 ('T', 'C', 'P', '4')
-
-#define TCP4_PORT_KNOWN         1024
-#define TCP4_PORT_USER_RESERVED 65535
-
-#define TCP4_FROM_THIS(a) \
-  CR ( \
-  (a), \
-  TCP4_SERVICE_DATA, \
-  Tcp4ServiceBinding, \
-  TCP4_DRIVER_SIGNATURE \
-  )
-
-///
-/// TCP heartbeat tick timer.
-///
-typedef struct _TCP4_HEARTBEAT_TIMER {
-  EFI_EVENT  TimerEvent;         ///< The event assoiated with the timer
-  INTN       RefCnt;             ///< Number of reference
-} TCP4_HEARTBEAT_TIMER;
-
-///
-/// TCP service data
-///
-typedef struct _TCP4_SERVICE_DATA {
-  UINT32                        Signature;
-  EFI_HANDLE                    ControllerHandle;
-  IP_IO                         *IpIo;  // IP Io consumed by TCP4
-  EFI_SERVICE_BINDING_PROTOCOL  Tcp4ServiceBinding;
-  EFI_HANDLE                    DriverBindingHandle;
-  LIST_ENTRY                    SocketList;
-} TCP4_SERVICE_DATA;
-
-///
-/// TCP protocol data
-///
-typedef struct _TCP4_PROTO_DATA {
-  TCP4_SERVICE_DATA *TcpService;
-  TCP_CB            *TcpPcb;
-} TCP4_PROTO_DATA;
-
-
-/**
-  Packet receive callback function provided to IP_IO, used to call
-  the proper function to handle the packet received by IP.
-
-  @param  Status      Status of the received packet.
-  @param  IcmpErr     ICMP error number.
-  @param  NetSession  Pointer to the net session of this packet.
-  @param  Pkt         Pointer to the recieved packet.
-  @param  Context     Pointer to the context configured in IpIoOpen(), not used
-                      now.
-
-  @return None
-
-**/
-VOID
-EFIAPI
-Tcp4RxCallback (
-  IN EFI_STATUS                       Status,
-  IN UINT8                            IcmpErr,
-  IN EFI_NET_SESSION_DATA             *NetSession,
-  IN NET_BUF                          *Pkt,
-  IN VOID                             *Context    OPTIONAL
-  );
-
-/**
-  Send the segment to IP via IpIo function.
-
-  @param  Tcb         Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf        Pointer to the TCP segment to be sent.
-  @param  Src         Source address of the TCP segment.
-  @param  Dest        Destination address of the TCP segment.
-
-  @retval 0           The segment was sent out successfully.
-  @retval -1          The segment was failed to send.
-
-**/
-INTN
-TcpSendIpPacket (
-  IN TCP_CB    *Tcb,
-  IN NET_BUF   *Nbuf,
-  IN UINT32    Src,
-  IN UINT32    Dest
-  );
-
-/**
-  The procotol handler provided to the socket layer, used to
-  dispatch the socket level requests by calling the corresponding
-  TCP layer functions.
-
-  @param  Sock                   Pointer to the socket of this TCP instance.
-  @param  Request                The code of this operation request.
-  @param  Data                   Pointer to the operation specific data passed in
-                                 together with the operation request.
-
-  @retval EFI_SUCCESS            The socket request is completed successfully.
-  @retval other                  The error status returned by the corresponding TCP
-                                 layer function.
-
-**/
-EFI_STATUS
-Tcp4Dispatcher (
-  IN SOCKET                  *Sock,
-  IN UINT8                   Request,
-  IN VOID                    *Data    OPTIONAL
-  );
-
-
-/**
-  The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle.
-
-  @param  ImageHandle   The firmware allocated handle for this
-                        driver image.
-  @param  SystemTable   Pointer to the EFI system table.
-
-  @retval EFI_SUCCESS   Driver loaded.
-  @retval other         Driver not loaded.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverEntryPoint (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  );
-
-
-/**
-  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  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param  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  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 access.
-  @retval EFI_UNSUPPORTED      The device specified by ControllerHandle and
-                               RemainingDevicePath is not supported by the driver
-                               specified by This.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingSupported (
-  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  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param  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  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_ALREADY_STARTED  The device could not be started due to a device error.
-  @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack
-                               of resources.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  );
-
-/**
-  Stop this driver on ControllerHandle.
-
-  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  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
-  @param  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  NumberOfChildren  The number of child device handles in ChildHandleBuffer.
-  @param  ChildHandleBuffer An array of child handles to be freed. May be NULL if
-                            NumberOfChildren is 0.
-
-  @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
-Tcp4DriverBindingStop (
-  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN  EFI_HANDLE                   ControllerHandle,
-  IN  UINTN                        NumberOfChildren,
-  IN  EFI_HANDLE                   *ChildHandleBuffer
-  );
-
-/**
-  Open Ip4 and device path protocols for a created socket, and insert it in
-  socket list.
-
-  @param  This                Pointer to the socket just created
-  @param  Context             Context of the socket
-
-  @retval EFI_SUCCESS         This protocol is installed successfully.
-  @retval other               Some error occured.
-
-**/
-EFI_STATUS
-Tcp4CreateSocketCallback (
-  IN SOCKET  *This,
-  IN VOID    *Context
-  );
-
-/**
-  Close Ip4 and device path protocols for a socket, and remove it from socket list.
-
-  @param  This                Pointer to the socket to be removed
-  @param  Context             Context of the socket
-
-**/
-VOID
-Tcp4DestroySocketCallback (
-  IN SOCKET  *This,
-  IN VOID    *Context
-  );
-
-/**
-  Creates a child handle and installs a protocol.
-
-  The CreateChild() function installs a protocol on ChildHandle. If ChildHandle
-  is a pointer to NULL, then a new handle is created and returned in ChildHandle.
-  If ChildHandle is not a pointer to NULL, then the protocol installs on the existing
-  ChildHandle.
-
-  @param  This        Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
-  @param  ChildHandle Pointer to the handle of the child to create. If it is NULL, then
-                      a new handle is created. If it is a pointer to an existing UEFI
-                      handle, then the protocol is added to the existing UEFI handle.
-
-  @retval EFI_SUCCES            The protocol was added to ChildHandle.
-  @retval EFI_INVALID_PARAMETER ChildHandle is NULL.
-  @retval EFI_OUT_OF_RESOURCES  There are not enough resources available to create
-                                the child.
-  @retval other                 The child handle was not created.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4ServiceBindingCreateChild (
-  IN     EFI_SERVICE_BINDING_PROTOCOL  *This,
-  IN OUT EFI_HANDLE                    *ChildHandle
-  );
-
-/**
-  Destroys a child handle with a protocol installed on it.
-
-  The DestroyChild() function does the opposite of CreateChild(). It removes a protocol
-  that was installed by CreateChild() from ChildHandle. If the removed protocol is the
-  last protocol on ChildHandle, then ChildHandle is destroyed.
-
-  @param  This         Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
-  @param  ChildHandle  Handle of the child to destroy
-
-  @retval EFI_SUCCES            The protocol was removed from ChildHandle.
-  @retval EFI_UNSUPPORTED       ChildHandle does not support the protocol that is
-                                being removed.
-  @retval EFI_INVALID_PARAMETER Child handle is NULL.
-  @retval EFI_ACCESS_DENIED     The protocol could not be removed from the ChildHandle
-                                because its services are being used.
-  @retval other                 The child handle was not destroyed.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4ServiceBindingDestroyChild (
-  IN EFI_SERVICE_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                    ChildHandle
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
deleted file mode 100644
index 7c0504770b48..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
+++ /dev/null
@@ -1,94 +0,0 @@
-## @file
-#  This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol.
-#
-#  This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol
-#  upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. This driver only
-#  supports IPv4 network stack.
-#
-#  Notes:
-#  1) This driver can't co-work with the TcpDxe driver in NetworkPkg.
-#  2) This driver might have some issues that have been fixed in the TcpDxe driver
-#     in NetworkPkg.
-#  3) This driver supports fewer features than the TcpDxe driver in NetworkPkg (e.g. IPv6,
-#     TCP Cancel function).
-#  4) TcpDxe driver in NetworkPkg is recommended for use instead of this one even though
-#     both of them can be used.
-#
-#  Copyright (c) 2006 - 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                      = Tcp4Dxe
-  MODULE_UNI_FILE                = Tcp4Dxe.uni
-  FILE_GUID                      = 6d6963ab-906d-4a65-a7ca-bd40e5d6af4d
-  MODULE_TYPE                    = UEFI_DRIVER
-  VERSION_STRING                 = 1.0
-  ENTRY_POINT                    = Tcp4DriverEntryPoint
-  UNLOAD_IMAGE                   = NetLibDefaultUnload
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
-#
-#  DRIVER_BINDING                =  mTcp4DriverBinding
-#  COMPONENT_NAME                =  gTcp4ComponentName
-#  COMPONENT_NAME2               =  gTcp4ComponentName2
-#
-
-[Sources]
-  SockImpl.c
-  SockInterface.c
-  Tcp4Proto.h
-  Tcp4Main.h
-  SockImpl.h
-  Tcp4Output.c
-  Tcp4Timer.c
-  Tcp4Option.h
-  Tcp4Dispatcher.c
-  Tcp4Input.c
-  Tcp4Misc.c
-  Tcp4Main.c
-  Socket.h
-  ComponentName.c
-  Tcp4Driver.h
-  Tcp4Io.c
-  Tcp4Driver.c
-  Tcp4Func.h
-  Tcp4Option.c
-
-
-[Packages]
-  MdePkg/MdePkg.dec
-  MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
-  UefiLib
-  UefiBootServicesTableLib
-  UefiDriverEntryPoint
-  UefiRuntimeServicesTableLib
-  BaseMemoryLib
-  MemoryAllocationLib
-  DebugLib
-  NetLib
-  IpIoLib
-  DevicePathLib
-  DpcLib
-
-[Protocols]
-  gEfiTcp4ServiceBindingProtocolGuid            ## BY_START
-  gEfiIp4ServiceBindingProtocolGuid             ## TO_START
-  gEfiTcp4ProtocolGuid                          ## BY_START
-  gEfiIp4ProtocolGuid                           ## TO_START
-
-[UserExtensions.TianoCore."ExtraFiles"]
-  Tcp4DxeExtra.uni
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni
deleted file mode 100644
index 1514a3917766..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni
+++ /dev/null
@@ -1,23 +0,0 @@
-// /** @file
-// This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol.
-//
-// This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol
-// upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services.
-//
-// Copyright (c) 2006 - 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 TCPv4 Protocol and EFI TCPv4 Service Binding Protocol"
-
-#string STR_MODULE_DESCRIPTION          #language en-US "This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol upon EFI IPv4 Protocol to provide basic TCPv4 I/O services."
-
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni
deleted file mode 100644
index 0e6d2f2896f3..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni
+++ /dev/null
@@ -1,20 +0,0 @@
-// /** @file
-// Tcp4Dxe 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
-"TCP v4 DXE Driver"
-
-
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h
deleted file mode 100644
index 53b7aac8ae98..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h
+++ /dev/null
@@ -1,781 +0,0 @@
-/** @file
-  Tcp function header file.
-
-Copyright (c) 2005 - 2014, 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<BR>
-
-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 _TCP4_FUNC_H_
-#define _TCP4_FUNC_H_
-
-//
-// Declaration of all the functions in TCP
-// protocol. It is intended to keep tcp.h
-// clear.
-//
-
-//
-// Functions in tcp.c
-//
-
-/**
-  Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>.
-
-  @param  Addr                  Pointer to the IP address needs to match.
-  @param  Port                  The port number needs to match.
-
-  @return  The Tcb which matches the <Addr Port> paire exists or not.
-
-**/
-BOOLEAN
-TcpFindTcbByPeer (
-  IN EFI_IPv4_ADDRESS  *Addr,
-  IN TCP_PORTNO        Port
-  );
-
-/**
-  Locate the TCP_CB related to the socket pair.
-
-  @param  LocalPort             The local port number.
-  @param  LocalIp               The local IP address.
-  @param  RemotePort            The remote port number.
-  @param  RemoteIp              The remote IP address.
-  @param  Syn                   Whether to search the listen sockets, if TRUE, the
-                                listen sockets are searched.
-
-  @return  Pointer to the related TCP_CB, if NULL no match is found.
-
-**/
-TCP_CB *
-TcpLocateTcb (
-  IN TCP_PORTNO  LocalPort,
-  IN UINT32      LocalIp,
-  IN TCP_PORTNO  RemotePort,
-  IN UINT32      RemoteIp,
-  IN BOOLEAN     Syn
-  );
-
-/**
-  Insert a Tcb into the proper queue.
-
-  @param  Tcb                   Pointer to the TCP_CB to be inserted.
-
-  @retval 0                     The Tcb is inserted successfully.
-  @retval -1                    Error condition occurred.
-
-**/
-INTN
-TcpInsertTcb (
-  IN TCP_CB *Tcb
-  );
-
-/**
-  Clone a TCP_CB from Tcb.
-
-  @param  Tcb                   Pointer to the TCP_CB to be cloned.
-
-  @return  Pointer to the new cloned TCP_CB, if NULL error condition occurred.
-
-**/
-TCP_CB *
-TcpCloneTcb (
-  IN TCP_CB *Tcb
-  );
-
-/**
-  Compute an ISS to be used by a new connection.
-
-  @return  The result ISS.
-
-**/
-TCP_SEQNO
-TcpGetIss (
-  VOID
-  );
-
-/**
-  Initialize the Tcb local related members.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpInitTcbLocal (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Initialize the peer related members.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-  @param  Seg                   Pointer to the segment that contains the peer's
-                                intial info.
-  @param  Opt                   Pointer to the options announced by the peer.
-
-**/
-VOID
-TcpInitTcbPeer (
-  IN OUT TCP_CB     *Tcb,
-  IN     TCP_SEG    *Seg,
-  IN     TCP_OPTION *Opt
-  );
-
-/**
-  Get the local mss.
-
-  @param  Sock        Pointer to the socket to get mss
-
-  @return  The mss size.
-
-**/
-UINT16
-TcpGetRcvMss (
-  IN SOCKET  *Sock
-  );
-
-/**
-  Set the Tcb's state.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-  @param  State                 The state to be set.
-
-**/
-VOID
-TcpSetState (
-  IN OUT TCP_CB    *Tcb,
-  IN     UINT8     State
-  );
-
-//
-// Functions in Tcp4Output.c
-//
-/**
-  Send the segment to IP via IpIo function.
-
-  @param  Tcb         Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf        Pointer to the TCP segment to be sent.
-  @param  Src         Source address of the TCP segment.
-  @param  Dest        Destination address of the TCP segment.
-
-  @retval 0           The segment was sent out successfully.
-  @retval -1          The segment was failed to send.
-
-**/
-INTN
-TcpSendIpPacket (
-  IN TCP_CB    *Tcb,
-  IN NET_BUF   *Nbuf,
-  IN UINT32    Src,
-  IN UINT32    Dest
-  );
-
-/**
-  Check whether to send data/SYN/FIN and piggy back an ACK.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Force   Whether to ignore the sender's SWS avoidance algorithm and send
-                  out data by force.
-
-  @return The number of bytes sent.
-
-**/
-INTN
-TcpToSendData (
-  IN OUT TCP_CB *Tcb,
-  IN     INTN Force
-  );
-
-/**
-  Check whether to send an ACK or delayed ACK.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpToSendAck (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Send an ACK immediately.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSendAck (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Send a zero probe segment. It can be used by keepalive and zero window probe.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @retval 0       The zero probe segment was sent out successfully.
-  @retval other   Error condition occurred.
-
-**/
-INTN
-TcpSendZeroProbe (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Process the data and FIN flag, check whether to deliver
-  data to the socket layer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-  @retval 0        No error occurred to deliver data.
-  @retval -1       Error condition occurred. Proper response is to reset the
-                   connection.
-
-**/
-INTN
-TcpDeliverData (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Send a RESET segment in response to the segment received.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance, may be NULL.
-  @param  Head    TCP header of the segment that triggers the reset.
-  @param  Len     Length of the segment that triggers the reset.
-  @param  Local   Local IP address.
-  @param  Remote  Remote peer's IP address.
-
-  @retval 0       A reset is sent or no need to send it.
-  @retval -1      No reset is sent.
-
-**/
-INTN
-TcpSendReset (
-  IN TCP_CB    *Tcb,
-  IN TCP_HEAD  *Head,
-  IN INT32     Len,
-  IN UINT32    Local,
-  IN UINT32    Remote
-  );
-
-/**
-  Compute the sequence space left in the old receive window.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @return The sequence space left in the old receive window.
-
-**/
-UINT32
-TcpRcvWinOld (
-  IN TCP_CB *Tcb
-  );
-
-/**
-  Compute the current receive window.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @return The size of the current receive window, in bytes.
-
-**/
-UINT32
-TcpRcvWinNow (
-  IN TCP_CB *Tcb
-  );
-
-/**
-  Retransmit the segment from sequence Seq.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Seq     The sequence number of the segment to be retransmitted.
-
-  @retval 0       Retransmission succeeded.
-  @retval -1      Error condition occurred.
-
-**/
-INTN
-TcpRetransmit (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Seq
-  );
-
-/**
-  Compute how much data to send.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Force   Whether to ignore the sender's SWS avoidance algorithm and send
-                  out data by force.
-
-  @return The length of the data can be sent, if 0, no data can be sent.
-
-**/
-UINT32
-TcpDataToSend (
-  IN TCP_CB *Tcb,
-  IN INTN   Force
-  );
-
-/**
-  Verify that the segment is in good shape.
-
-  @param  Nbuf    Buffer that contains the segment to be checked.
-
-  @retval 0       The segment is broken.
-  @retval 1       The segment is in good shape.
-
-**/
-INTN
-TcpVerifySegment (
-  IN NET_BUF *Nbuf
-  );
-
-/**
-  Verify that all the segments in SndQue are in good shape.
-
-  @param  Head    Pointer to the head node of the SndQue.
-
-  @retval 0       At least one segment is broken.
-  @retval 1       All segments in the specific queue are in good shape.
-
-**/
-INTN
-TcpCheckSndQue (
-  IN LIST_ENTRY     *Head
-  );
-
-/**
-  Get a segment from the Tcb's SndQue.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Seq     The sequence number of the segment.
-  @param  Len     The maximum length of the segment.
-
-  @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegmentSndQue (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Seq,
-  IN UINT32    Len
-  );
-
-/**
-  Get a segment from the Tcb's socket buffer.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Seq     The sequence number of the segment.
-  @param  Len     The maximum length of the segment.
-
-  @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegmentSock (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Seq,
-  IN UINT32    Len
-  );
-
-/**
-  Get a segment starting from sequence Seq of a maximum
-  length of Len.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Seq     The sequence number of the segment.
-  @param  Len     The maximum length of the segment.
-
-  @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegment (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Seq,
-  IN UINT32    Len
-  );
-
-/**
-  Get the maximum SndNxt.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @return The sequence number of the maximum SndNxt.
-
-**/
-TCP_SEQNO
-TcpGetMaxSndNxt (
-  IN TCP_CB *Tcb
-  );
-
-//
-// Functions from Tcp4Input.c
-//
-/**
-  Process the received ICMP error messages for TCP.
-
-  @param  Nbuf     Buffer that contains part of the TCP segment without IP header
-                   truncated from the ICMP error packet.
-  @param  IcmpErr  The ICMP error code interpreted from ICMP error packet.
-  @param  Src      Source address of the ICMP error message.
-  @param  Dst      Destination address of the ICMP error message.
-
-**/
-VOID
-TcpIcmpInput (
-  IN NET_BUF     *Nbuf,
-  IN UINT8       IcmpErr,
-  IN UINT32      Src,
-  IN UINT32      Dst
-  );
-
-/**
-  Process the received TCP segments.
-
-  @param  Nbuf     Buffer that contains received TCP segment without IP header.
-  @param  Src      Source address of the segment, or the peer's IP address.
-  @param  Dst      Destination address of the segment, or the local end's IP
-                   address.
-
-  @retval 0        Segment is processed successfully. It is either accepted or
-                   discarded. But no connection is reset by the segment.
-  @retval -1       A connection is reset by the segment.
-
-**/
-INTN
-TcpInput (
-  IN NET_BUF *Nbuf,
-  IN UINT32  Src,
-  IN UINT32  Dst
-  );
-
-/**
-  Check whether the sequence number of the incoming segment is acceptable.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Seg      Pointer to the incoming segment.
-
-  @retval 1       The sequence number is acceptable.
-  @retval 0       The sequence number is not acceptable.
-
-**/
-INTN
-TcpSeqAcceptable (
-  IN TCP_CB  *Tcb,
-  IN TCP_SEG *Seg
-  );
-
-/**
-  NewReno fast recovery, RFC3782.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Seg      Segment that triggers the fast recovery.
-
-**/
-VOID
-TcpFastRecover (
-  IN OUT TCP_CB  *Tcb,
-  IN     TCP_SEG *Seg
-  );
-
-/**
-  NewReno fast loss recovery, RFC3792.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Seg      Segment that triggers the fast loss recovery.
-
-**/
-VOID
-TcpFastLossRecover (
-  IN OUT TCP_CB  *Tcb,
-  IN     TCP_SEG *Seg
-  );
-
-/**
-  Compute the RTT as specified in RFC2988.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Measure  Currently measured RTT in heart beats.
-
-**/
-VOID
-TcpComputeRtt (
-  IN OUT TCP_CB *Tcb,
-  IN     UINT32 Measure
-  );
-
-/**
-  Trim off the data outside the tcb's receive window.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf     Pointer to the NET_BUF containing the received tcp segment.
-
-**/
-VOID
-TcpTrimInWnd (
-  IN TCP_CB  *Tcb,
-  IN NET_BUF *Nbuf
-  );
-
-/**
-  Store the data into the reassemble queue.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf     Pointer to the buffer containing the data to be queued.
-
-**/
-VOID
-TcpQueueData (
-  IN OUT TCP_CB  *Tcb,
-  IN     NET_BUF *Nbuf
-  );
-
-/**
-  Ajust the send queue or the retransmit queue.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Ack      The acknowledge seuqence number of the received segment.
-
-**/
-VOID
-TcpAdjustSndQue (
-  IN TCP_CB    *Tcb,
-  IN TCP_SEQNO Ack
-  );
-
-//
-// Functions from Tcp4Misc.c
-//
-/**
-  Compute the TCP segment's checksum.
-
-  @param  Nbuf                  Pointer to the buffer that contains the TCP
-                                segment.
-  @param  HeadSum               The checksum value of the fixed part of pseudo
-                                header.
-
-  @return  The checksum value.
-
-**/
-UINT16
-TcpChecksum (
-  IN NET_BUF *Nbuf,
-  IN UINT16  HeadSum
-  );
-
-/**
-  Translate the information from the head of the received TCP
-  segment Nbuf contains and fill it into a TCP_SEG structure.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf                  Pointer to the buffer contains the TCP segment.
-
-  @return  Pointer to the TCP_SEG that contains the translated TCP head information.
-
-**/
-TCP_SEG *
-TcpFormatNetbuf (
-  IN     TCP_CB  *Tcb,
-  IN OUT NET_BUF *Nbuf
-  );
-
-/**
-  Initialize an active connection.
-
-  @param  Tcb                   Pointer to the TCP_CB that wants to initiate a
-                                connection.
-
-**/
-VOID
-TcpOnAppConnect (
-  IN OUT TCP_CB  *Tcb
-  );
-
-/**
-  Application has consumed some data, check whether
-  to send a window updata ack or a delayed ack.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpOnAppConsume (
-  IN TCP_CB *Tcb
-  );
-
-/**
-  Initiate the connection close procedure, called when
-  applications want to close the connection.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpOnAppClose (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Check whether the application's newly delivered data can be sent out.
-
-  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.
-
-  @retval 0                     Whether the data is sent out or is buffered for
-                                further sending.
-  @retval -1                    The Tcb is not in a state that data is permitted to
-                                be sent out.
-
-**/
-INTN
-TcpOnAppSend (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Abort the connection by sending a reset segment, called
-  when the application wants to abort the connection.
-
-  @param  Tcb                   Pointer to the TCP_CB of the TCP instance.
-
-**/
-VOID
-TcpOnAppAbort (
-  IN TCP_CB *Tcb
-  );
-
-/**
-  Reset the connection related with Tcb.
-
-  @param  Tcb                   Pointer to the TCP_CB of the connection to be
-                                reset.
-
-**/
-VOID
-TcpResetConnection (
-  IN TCP_CB *Tcb
-  );
-
-//
-// Functions in Tcp4Timer.c
-//
-/**
-  Close the TCP connection.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpClose (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Heart beat timer handler, queues the DPC at TPL_CALLBACK.
-
-  @param  Event    Timer event signaled, ignored.
-  @param  Context  Context of the timer event, ignored.
-
-**/
-VOID
-EFIAPI
-TcpTicking (
-  IN EFI_EVENT Event,
-  IN VOID      *Context
-  );
-
-/**
-  Enable a TCP timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Timer    The index of the timer to be enabled.
-  @param  TimeOut  The timeout value of this timer.
-
-**/
-VOID
-TcpSetTimer (
-  IN OUT TCP_CB *Tcb,
-  IN     UINT16 Timer,
-  IN     UINT32 TimeOut
-  );
-
-/**
-  Clear one TCP timer.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-  @param  Timer    The index of the timer to be cleared.
-
-**/
-VOID
-TcpClearTimer (
-  IN OUT TCP_CB *Tcb,
-  IN     UINT16 Timer
-  );
-
-/**
-  Clear all TCP timers.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpClearAllTimer (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Enable the window prober timer and set the timeout value.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSetProbeTimer (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Enable the keepalive timer and set the timeout value.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSetKeepaliveTimer (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Backoff the RTO.
-
-  @param  Tcb      Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpBackoffRto (
-  IN OUT TCP_CB *Tcb
-  );
-
-/**
-  Install the device path protocol on the TCP instance.
-
-  @param  Sock             Pointer to the socket representing the TCP instance.
-
-  @retval  EFI_SUCCESS     The device path protocol is installed.
-  @retval  other           Failed to install the device path protocol.
-
-**/
-EFI_STATUS
-TcpInstallDevicePath (
-  IN SOCKET *Sock
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h
deleted file mode 100644
index c898a7ee2dd0..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h
+++ /dev/null
@@ -1,494 +0,0 @@
-/** @file
-  TCP4 protocol services header file.
-
-Copyright (c) 2005 - 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<BR>
-
-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 _TCP4_MAIN_H_
-#define _TCP4_MAIN_H_
-
-#include "Socket.h"
-
-#include "Tcp4Proto.h"
-#include "Tcp4Func.h"
-#include "Tcp4Driver.h"
-
-
-extern UINT16  mTcp4RandomPort;
-extern CHAR16  *mTcpStateName[];
-
-//
-// Driver Produced Protocol Prototypes
-//
-
-//
-// Function prototype for the Tcp4 socket request handler
-//
-/**
-  The procotol handler provided to the socket layer, used to
-  dispatch the socket level requests by calling the corresponding
-  TCP layer functions.
-
-  @param  Sock                   Pointer to the socket of this TCP instance.
-  @param  Request                The code of this operation request.
-  @param  Data                   Pointer to the operation specific data passed in
-                                 together with the operation request.
-
-  @retval EFI_SUCCESS            The socket request is completed successfully.
-  @retval other                  The error status returned by the corresponding TCP
-                                 layer function.
-
-**/
-EFI_STATUS
-Tcp4Dispatcher (
-  IN SOCKET                  *Sock,
-  IN UINT8                   Request,
-  IN VOID                    *Data    OPTIONAL
-  );
-
-///
-/// TCP mode data
-///
-typedef struct _TCP4_MODE_DATA {
-  EFI_TCP4_CONNECTION_STATE       *Tcp4State;
-  EFI_TCP4_CONFIG_DATA            *Tcp4ConfigData;
-  EFI_IP4_MODE_DATA               *Ip4ModeData;
-  EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData;
-  EFI_SIMPLE_NETWORK_MODE         *SnpModeData;
-} TCP4_MODE_DATA;
-
-///
-/// TCP route infomation data
-///
-typedef struct _TCP4_ROUTE_INFO {
-  BOOLEAN           DeleteRoute;
-  EFI_IPv4_ADDRESS  *SubnetAddress;
-  EFI_IPv4_ADDRESS  *SubnetMask;
-  EFI_IPv4_ADDRESS  *GatewayAddress;
-} TCP4_ROUTE_INFO;
-
-typedef struct {
-  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;
-  UINTN                         NumberOfChildren;
-  EFI_HANDLE                    *ChildHandleBuffer;
-} TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
-
-/**
-  Get the current operational status of a TCP instance.
-
-  The GetModeData() function copies the current operational settings of this
-  EFI TCPv4 Protocol instance into user-supplied buffers. This function can
-  also be used to retrieve the operational setting of underlying drivers
-  such as IPv4, MNP, or SNP.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  Tcp4State                Pointer to the buffer to receive the current TCP
-                                   state.
-  @param  Tcp4ConfigData           Pointer to the buffer to receive the current TCP
-                                   configuration.
-  @param  Ip4ModeData              Pointer to the buffer to receive the current IPv4
-                                   configuration data used by the TCPv4 instance.
-  @param  MnpConfigData            Pointer to the buffer to receive the current MNP
-                                   configuration data indirectly used by the TCPv4
-                                   Instance.
-  @param  SnpModeData              Pointer to the buffer to receive the current SNP
-                                   configuration data indirectly used by the TCPv4
-                                   Instance.
-
-  @retval EFI_SUCCESS              The mode data was read.
-  @retval EFI_NOT_STARTED          No configuration data is available because this
-                                   instance hasn't been started.
-  @retval EFI_INVALID_PARAMETER    This is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4GetModeData (
-  IN      EFI_TCP4_PROTOCOL                  *This,
-     OUT  EFI_TCP4_CONNECTION_STATE          *Tcp4State       OPTIONAL,
-     OUT  EFI_TCP4_CONFIG_DATA               *Tcp4ConfigData  OPTIONAL,
-     OUT  EFI_IP4_MODE_DATA                  *Ip4ModeData     OPTIONAL,
-     OUT  EFI_MANAGED_NETWORK_CONFIG_DATA    *MnpConfigData   OPTIONAL,
-     OUT  EFI_SIMPLE_NETWORK_MODE            *SnpModeData     OPTIONAL
-  );
-
-
-/**
-  Initialize or brutally reset the operational parameters for
-  this EFI TCPv4 instance.
-
-  The Configure() function does the following:
-  * Initialize this EFI TCPv4 instance, i.e., initialize the communication end
-  setting, specify active open or passive open for an instance.
-  * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous
-  tokens, flush transmission and receiving buffer directly without informing
-  the communication peer.
-  No other TCPv4 Protocol operation can be executed by this instance
-  until it is configured properly. For an active TCP4 instance, after a proper
-  configuration it may call Connect() to initiates the three-way handshake.
-  For a passive TCP4 instance, its state will transit to Tcp4StateListen after
-  configuration, and Accept() may be called to listen the incoming TCP connection
-  request. If TcpConfigData is set to NULL, the instance is reset. Resetting
-  process will be done brutally, the state machine will be set to Tcp4StateClosed
-  directly, the receive queue and transmit queue will be flushed, and no traffic is
-  allowed through this instance.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  TcpConfigData            Pointer to the configure data to configure the
-                                   instance.
-
-  @retval EFI_SUCCESS              The operational settings are set, changed, or
-                                   reset successfully.
-  @retval EFI_NO_MAPPING           When using a default address, configuration
-                                   (through DHCP, BOOTP, RARP, etc.) is not
-                                   finished.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_ACCESS_DENIED        Configuring TCP instance when it is already
-                                   configured.
-  @retval EFI_DEVICE_ERROR         An unexpected network or system error occurred.
-  @retval EFI_UNSUPPORTED          One or more of the control options are not
-                                   supported in the implementation.
-  @retval EFI_OUT_OF_RESOURCES     Could not allocate enough system resources.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Configure (
-  IN EFI_TCP4_PROTOCOL        *This,
-  IN EFI_TCP4_CONFIG_DATA     *TcpConfigData     OPTIONAL
-  );
-
-/**
-  Add or delete routing entries.
-
-  The Routes() function adds or deletes a route from the instance's routing table.
-  The most specific route is selected by comparing the SubnetAddress with the
-  destination IP address's arithmetical AND to the SubnetMask.
-  The default route is added with both SubnetAddress and SubnetMask set to 0.0.0.0.
-  The default route matches all destination IP addresses if there is no more specific route.
-  Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent to
-  the destination host if its address can be found in the Address Resolution Protocol (ARP)
-  cache or it is on the local subnet. If the instance is configured to use default
-  address, a direct route to the local network will be added automatically.
-  Each TCP instance has its own independent routing table. Instance that uses the
-  default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's routing table.
-  The copy will be updated automatically whenever the IP driver reconfigures its
-  instance. As a result, the previous modification to the instance's local copy
-  will be lost. The priority of checking the route table is specific with IP
-  implementation and every IP implementation must comply with RFC 1122.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  DeleteRoute              If TRUE, delete the specified route from routing
-                                   table; if FALSE, add the specified route to
-                                   routing table.
-                                   DestinationAddress and SubnetMask are used as
-                                   the keywords to search route entry.
-  @param  SubnetAddress            The destination network.
-  @param  SubnetMask               The subnet mask for the destination network.
-  @param  GatewayAddress           The gateway address for this route.
-                                   It must be on the same subnet with the station
-                                   address unless a direct route is specified.
-
-  @retval EFI_SUCCESS              The operation completed successfully.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance has not been
-                                   configured.
-  @retval EFI_NO_MAPPING           When using a default address, configuration
-                                   (through DHCP, BOOTP, RARP, etc.) is not
-                                   finished.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     Could not allocate enough resources to add the
-                                   entry to the routing table.
-  @retval EFI_NOT_FOUND            This route is not in the routing table.
-  @retval EFI_ACCESS_DENIED        This route is already in the routing table.
-  @retval EFI_UNSUPPORTED          The TCP driver does not support this operation.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Routes (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN BOOLEAN                     DeleteRoute,
-  IN EFI_IPv4_ADDRESS            *SubnetAddress,
-  IN EFI_IPv4_ADDRESS            *SubnetMask,
-  IN EFI_IPv4_ADDRESS            *GatewayAddress
-  );
-
-/**
-  Initiate a nonblocking TCP connection request for an active TCP instance.
-
-  The Connect() function will initiate an active open to the remote peer configured
-  in current TCP instance if it is configured active. If the connection succeeds
-  or fails due to any error, the ConnectionToken->CompletionToken.Event will be
-  signaled and ConnectionToken->CompletionToken.Status will be updated accordingly.
-  This function can only be called for the TCP instance in Tcp4StateClosed state.
-  The instance will transfer into Tcp4StateSynSent if the function returns EFI_SUCCESS.
-  If TCP three way handshake succeeds, its state will become Tcp4StateEstablished,
-  otherwise, the state will return to Tcp4StateClosed.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance
-  @param  ConnectionToken          Pointer to the connection token to return when
-                                   the TCP three way handshake finishes.
-
-  @retval EFI_SUCCESS              The connection request is successfully initiated
-                                   and the state of this TCPv4 instance has
-                                   been changed to Tcp4StateSynSent.
-  @retval EFI_NOT_STARTED          This EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_ACCESS_DENIED        The instance is not configured as an active one
-                                   or it is not in Tcp4StateClosed state.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     The driver can't allocate enough resource to
-                                   initiate the active open.
-  @retval EFI_DEVICE_ERROR         An unexpected system or network error occurred.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Connect (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN EFI_TCP4_CONNECTION_TOKEN   *ConnectionToken
-  );
-
-/**
-  Listen on the passive instance to accept an incoming connection request.
-
-  The Accept() function initiates an asynchronous accept request to wait for an
-  incoming connection on the passive TCP instance. If a remote peer successfully
-  establishes a connection with this instance, a new TCP instance will be created
-  and its handle will be returned in ListenToken->NewChildHandle. The newly created
-  instance is configured by inheriting the passive instance's configuration and is
-  ready for use upon return. The instance is in the Tcp4StateEstablished state.
-  The ListenToken->CompletionToken.Event will be signaled when a new connection
-  is accepted, user aborts the listen or connection is reset. This function only
-  can be called when current TCP instance is in Tcp4StateListen state.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance
-  @param  ListenToken              Pointer to the listen token to return when
-                                   operation finishes.
-
-  @retval EFI_SUCCESS              The listen token has been queued successfully.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_ACCESS_DENIED        The instatnce is not a passive one or it is not
-                                   in Tcp4StateListen state or a same listen token
-                                   has already existed in the listen token queue of
-                                   this TCP instance.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     Could not allocate enough resources to finish
-                                   the operation.
-  @retval EFI_DEVICE_ERROR         Any unexpected and not belonged to above category error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Accept (
-  IN EFI_TCP4_PROTOCOL             *This,
-  IN EFI_TCP4_LISTEN_TOKEN         *ListenToken
-  );
-
-/**
-  Queues outgoing data into the transmit queue.
-
-  The Transmit() function queues a sending request to this TCPv4 instance along
-  with the user data. The status of the token is updated and the event in the token
-  will be signaled once the data is sent out or some error occurs.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance
-  @param  Token                    Pointer to the completion token to queue to the
-                                   transmit queue
-
-  @retval EFI_SUCCESS              The data has been queued for transmission.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_NO_MAPPING           When using a default address, configuration
-                                   (DHCP, BOOTP, RARP, etc.) is not finished yet.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_ACCESS_DENIED        One or more of the following conditions is TRUE:
-                                   * A transmit completion token with the same
-                                     Token-> CompletionToken.Event was already in the
-                                     transmission queue.
-                                   * The current instance is in Tcp4StateClosed state
-                                   * The current instance is a passive one and
-                                     it is in Tcp4StateListen state.
-                                   * User has called Close() to disconnect this
-                                     connection.
-  @retval EFI_NOT_READY            The completion token could not be queued because
-                                   the transmit queue is full.
-  @retval EFI_OUT_OF_RESOURCES     Could not queue the transmit data because of
-                                   resource shortage.
-  @retval EFI_NETWORK_UNREACHABLE  There is no route to the destination network or
-                                   address.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Transmit (
-  IN EFI_TCP4_PROTOCOL            *This,
-  IN EFI_TCP4_IO_TOKEN            *Token
-  );
-
-/**
-  Place an asynchronous receive request into the receiving queue.
-
-  The Receive() function places a completion token into the receive packet queue.
-  This function is always asynchronous. The caller must allocate the
-  Token->CompletionToken.Event and the FragmentBuffer used to receive data. He also
-  must fill the DataLength which represents the whole length of all FragmentBuffer.
-  When the receive operation completes, the EFI TCPv4 Protocol driver updates the
-  Token->CompletionToken.Status and Token->Packet.RxData fields and the
-  Token->CompletionToken.Event is signaled. If got data the data and its length
-  will be copy into the FragmentTable, in the same time the full length of received
-  data will be recorded in the DataLength fields. Providing a proper notification
-  function and context for the event will enable the user to receive the notification
-  and receiving status. That notification function is guaranteed to not be re-entered.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  Token                    Pointer to a token that is associated with the
-                                   receive data descriptor.
-
-  @retval EFI_SUCCESS              The receive completion token was cached.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_NO_MAPPING           When using a default address, configuration
-                                   (DHCP, BOOTP, RARP, etc.) is not finished yet.
-  @retval EFI_INVALID_PARAMETER    One or more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     The receive completion token could not be queued
-                                   due to a lack of system resources.
-  @retval EFI_DEVICE_ERROR         An unexpected system or network error occurred.
-                                   The EFI TCPv4 Protocol instance has been reset
-                                   to startup defaults.
-  @retval EFI_ACCESS_DENIED        One or more of the following conditions is TRUE:
-                                   * A receive completion token with the same
-                                     Token->CompletionToken.Event was already in
-                                     the receive queue.
-                                   * The current instance is in Tcp4StateClosed state.
-                                   * The current instance is a passive one and it
-                                     is in Tcp4StateListen state.
-                                   * User has called Close() to disconnect this
-                                     connection.
-  @retval EFI_CONNECTION_FIN       The communication peer has closed the connection
-                                   and there is no any buffered data in the receive
-                                   buffer of this instance.
-  @retval EFI_NOT_READY            The receive request could not be queued because
-                                   the receive queue is full.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Receive (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN EFI_TCP4_IO_TOKEN           *Token
-  );
-
-/**
-  Disconnecting a TCP connection gracefully or reset a TCP connection.
-
-  Initiate an asynchronous close token to TCP driver. After Close() is called,
-  any buffered transmission data will be sent by TCP driver and the current
-  instance will have a graceful close working flow described as RFC 793 if
-  AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP
-  driver to fast disconnect this connection. When the close operation completes
-  successfully the TCP instance is in Tcp4StateClosed state, all pending
-  asynchronous operation is signaled and any buffers used for TCP network traffic
-  is flushed.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  CloseToken               Pointer to the close token to return when
-                                   operation finishes.
-
-  @retval EFI_SUCCESS              The operation completed successfully.
-  @retval EFI_NOT_STARTED          The EFI_TCP4_PROTOCOL instance hasn't been
-                                   configured.
-  @retval EFI_ACCESS_DENIED        One or more of the following are TRUE:
-                                   * Configure() has been called with TcpConfigData
-                                     set to NULL and this function has not returned.
-                                   * Previous Close() call on this instance has not
-                                     finished.
-  @retval EFI_INVALID_PARAMETER    One ore more parameters are invalid.
-  @retval EFI_OUT_OF_RESOURCES     Could not allocate enough resource to finish the
-                                   operation.
-  @retval EFI_DEVICE_ERROR         Any unexpected and not belonged to above
-                                   category error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Close (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN EFI_TCP4_CLOSE_TOKEN        *CloseToken
-  );
-
-/**
-  Abort an asynchronous connection, listen, transmission or receive request.
-
-  The Cancel() function aborts a pending connection, listen, transmit or receive
-  request. If Token is not NULL and the token is in the connection, listen,
-  transmission or receive queue when it is being cancelled, its Token->Status
-  will be set to EFI_ABORTED and then Token->Event will be signaled. If the token
-  is not in one of the queues, which usually means that the asynchronous operation
-  has completed, EFI_NOT_FOUND is returned. If Token is NULL all asynchronous token
-  issued by Connect(), Accept(), Transmit() and Receive()will be aborted.
-  NOTE: It has not been implemented currently.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-  @param  Token                    Pointer to a token that has been issued by
-                                   Connect(), Accept(), Transmit() or Receive(). If
-                                   NULL, all pending tokens issued by above four
-                                   functions will be aborted.
-
-  @retval  EFI_SUCCESS             The asynchronous I/O request is aborted and Token->Event
-                                   is signaled.
-  @retval  EFI_INVALID_PARAMETER   This is NULL.
-  @retval  EFI_NOT_STARTED         This instance hasn's been configured.
-  @retval  EFI_NO_MAPPING          When using the default address, configuration
-                                   (DHCP, BOOTP,RARP, etc.) hasn's finished yet.
-  @retval  EFI_NOT_FOUND           The asynchronous I/O request isn's found in the
-                                   transmission or receive queue. It has either
-                                   completed or wasn's issued by Transmit() and Receive().
-  @retval  EFI_UNSUPPORTED         The operation is not supported in current
-                                   implementation.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Cancel (
-  IN EFI_TCP4_PROTOCOL           *This,
-  IN EFI_TCP4_COMPLETION_TOKEN   *Token    OPTIONAL
-  );
-
-/**
-  Poll to receive incoming data and transmit outgoing segments.
-
-  The Poll() function increases the rate that data is moved between the network
-  and application and can be called when the TCP instance is created successfully.
-  Its use is optional. In some implementations, the periodical timer in the MNP
-  driver may not poll the underlying communications device fast enough to avoid
-  drop packets. Drivers and applications that are experiencing packet loss should
-  try calling the Poll() function in a high frequency.
-
-  @param  This                     Pointer to the EFI_TCP4_PROTOCOL instance.
-
-  @retval EFI_SUCCESS              Incoming or outgoing data was processed.
-  @retval EFI_INVALID_PARAMETER    This is NULL.
-  @retval EFI_DEVICE_ERROR         An unexpected system or network error occurred.
-  @retval EFI_NOT_READY            No incoming or outgoing data was processed.
-  @retval EFI_TIMEOUT              Data was dropped out of the transmission or
-                                   receive queue. Consider increasing the polling
-                                   rate.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Poll (
-  IN EFI_TCP4_PROTOCOL        *This
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h
deleted file mode 100644
index f9782cb59801..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/** @file
-  Tcp option's routine header file.
-
-Copyright (c) 2005 - 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<BR>
-
-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 _TCP4_OPTION_H_
-#define _TCP4_OPTION_H_
-
-///
-/// The structure to store the parse option value.
-/// ParseOption only parse the options, don't process them.
-///
-typedef struct _TCP_OPTION {
-  UINT8   Flag;     ///< Flag such as TCP_OPTION_RCVD_MSS
-  UINT8   WndScale; ///< The WndScale received
-  UINT16  Mss;      ///< The Mss received
-  UINT32  TSVal;    ///< The TSVal field in a timestamp option
-  UINT32  TSEcr;    ///< The TSEcr field in a timestamp option
-} TCP_OPTION;
-
-//
-// supported TCP option type and their length
-//
-#define TCP_OPTION_EOP             0  ///< End Of oPtion
-#define TCP_OPTION_NOP             1  ///< No-Option.
-#define TCP_OPTION_MSS             2  ///< Maximum Segment Size
-#define TCP_OPTION_WS              3  ///< Window scale
-#define TCP_OPTION_TS              8  ///< Timestamp
-#define TCP_OPTION_MSS_LEN         4  ///< Length of MSS option
-#define TCP_OPTION_WS_LEN          3  ///< Length of window scale option
-#define TCP_OPTION_TS_LEN          10 ///< Length of timestamp option
-#define TCP_OPTION_WS_ALIGNED_LEN  4  ///< Length of window scale option, aligned
-#define TCP_OPTION_TS_ALIGNED_LEN  12 ///< Length of timestamp option, aligned
-
-//
-// recommend format of timestamp window scale
-// option for fast process.
-//
-#define TCP_OPTION_TS_FAST ((TCP_OPTION_NOP << 24) | \
-                            (TCP_OPTION_NOP << 16) | \
-                            (TCP_OPTION_TS << 8)   | \
-                            (TCP_OPTION_TS_LEN))
-
-#define TCP_OPTION_WS_FAST   ((TCP_OPTION_NOP << 24) | \
-                              (TCP_OPTION_WS << 16)  | \
-                              (TCP_OPTION_WS_LEN << 8))
-
-#define TCP_OPTION_MSS_FAST  ((TCP_OPTION_MSS << 24) | (TCP_OPTION_MSS_LEN << 16))
-
-//
-// Other misc definations
-//
-#define TCP_OPTION_RCVD_MSS        0x01
-#define TCP_OPTION_RCVD_WS         0x02
-#define TCP_OPTION_RCVD_TS         0x04
-#define TCP_OPTION_MAX_WS          14      ///< Maxium window scale value
-#define TCP_OPTION_MAX_WIN         0xffff  ///< Max window size in TCP header
-
-
-/**
-  Compute the window scale value according to the given buffer size.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-
-  @return  The scale value.
-
-**/
-UINT8
-TcpComputeScale (
-  IN TCP_CB *Tcb
-  );
-
-/**
-  Build the TCP option in three-way handshake.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf    Pointer to the buffer to store the options.
-
-  @return  The total length of the TCP option field.
-
-**/
-UINT16
-TcpSynBuildOption (
-  IN TCP_CB  *Tcb,
-  IN NET_BUF *Nbuf
-  );
-
-/**
-  Build the TCP option in synchronized states.
-
-  @param  Tcb     Pointer to the TCP_CB of this TCP instance.
-  @param  Nbuf    Pointer to the buffer to store the options.
-
-  @return  The total length of the TCP option field.
-
-**/
-UINT16
-TcpBuildOption (
-  IN TCP_CB  *Tcb,
-  IN NET_BUF *Nbuf
-  );
-
-/**
-  Parse the supported options.
-
-  @param  Tcp     Pointer to the TCP_CB of this TCP instance.
-  @param  Option  Pointer to the TCP_OPTION used to store the successfully pasrsed
-                  options.
-
-  @retval 0       The options are successfully pasrsed.
-  @retval -1      Ilegal option was found.
-
-**/
-INTN
-TcpParseOption (
-  IN     TCP_HEAD   *Tcp,
-  IN OUT TCP_OPTION *Option
-  );
-
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h
deleted file mode 100644
index 37191fe65112..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/** @file
-  Tcp Protocol header file.
-
-Copyright (c) 2005 - 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<BR>
-
-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 _TCP4_PROTO_H_
-#define _TCP4_PROTO_H_
-
-typedef struct _TCP_CB  TCP_CB;
-
-#include "Tcp4Driver.h"
-#include "Socket.h"
-#include "Tcp4Option.h"
-
-
-
-///
-/// Tcp states, Don't change their order, it is used as
-/// index to mTcpOutFlag and other macros
-///
-#define TCP_CLOSED       0
-#define TCP_LISTEN       1
-#define TCP_SYN_SENT     2
-#define TCP_SYN_RCVD     3
-#define TCP_ESTABLISHED  4
-#define TCP_FIN_WAIT_1   5
-#define TCP_FIN_WAIT_2   6
-#define TCP_CLOSING      7
-#define TCP_TIME_WAIT    8
-#define TCP_CLOSE_WAIT   9
-#define TCP_LAST_ACK     10
-
-
-///
-/// Flags in the TCP header
-///
-#define TCP_FLG_FIN      0x01
-#define TCP_FLG_SYN      0x02
-#define TCP_FLG_RST      0x04
-#define TCP_FLG_PSH      0x08
-#define TCP_FLG_ACK      0x10
-#define TCP_FLG_URG      0x20
-
- //
- // mask for all the flags
- //
-#define TCP_FLG_FLAG     0x3F
-
-
-#define TCP_CONNECT_REFUSED      (-1) ///< TCP error status
-#define TCP_CONNECT_RESET        (-2) ///< TCP error status
-#define TCP_CONNECT_CLOSED       (-3) ///< TCP error status
-
-//
-// Current congestion status as suggested by RFC3782.
-//
-#define TCP_CONGEST_RECOVER      1  ///< During the NewReno fast recovery
-#define TCP_CONGEST_LOSS         2  ///< Retxmit because of retxmit time out
-#define TCP_CONGEST_OPEN         3  ///< TCP is opening its congestion window
-
-//
-// TCP control flags
-//
-#define TCP_CTRL_NO_NAGLE        0x0001 ///< Disable Nagle algorithm
-#define TCP_CTRL_NO_KEEPALIVE    0x0002 ///< Disable keepalive timer
-#define TCP_CTRL_NO_WS           0x0004 ///< Disable window scale option
-#define TCP_CTRL_RCVD_WS         0x0008 ///< Received a wnd scale option in syn
-#define TCP_CTRL_NO_TS           0x0010 ///< Disable Timestamp option
-#define TCP_CTRL_RCVD_TS         0x0020 ///< Received a Timestamp option in syn
-#define TCP_CTRL_SND_TS          0x0040 ///< Send Timestamp option to remote
-#define TCP_CTRL_SND_URG         0x0080 ///< In urgent send mode
-#define TCP_CTRL_RCVD_URG        0x0100 ///< In urgent receive mode
-#define TCP_CTRL_SND_PSH         0x0200 ///< In PUSH send mode
-#define TCP_CTRL_FIN_SENT        0x0400 ///< FIN is sent
-#define TCP_CTRL_FIN_ACKED       0x0800 ///< FIN is ACKed.
-#define TCP_CTRL_TIMER_ON        0x1000 ///< At least one of the timer is on
-#define TCP_CTRL_RTT_ON          0x2000 ///< The RTT measurement is on
-#define TCP_CTRL_ACK_NOW         0x4000 ///< Send the ACK now, don't delay
-
-//
-// Timer related values
-//
-#define TCP_TIMER_CONNECT        0                  ///< Connection establishment timer
-#define TCP_TIMER_REXMIT         1                  ///< Retransmit timer
-#define TCP_TIMER_PROBE          2                  ///< Window probe timer
-#define TCP_TIMER_KEEPALIVE      3                  ///< Keepalive timer
-#define TCP_TIMER_FINWAIT2       4                  ///< FIN_WAIT_2 timer
-#define TCP_TIMER_2MSL           5                  ///< TIME_WAIT tiemr
-#define TCP_TIMER_NUMBER         6                  ///< The total number of TCP timer.
-#define TCP_TICK                 200                ///< Every TCP tick is 200ms
-#define TCP_TICK_HZ              5                  ///< The frequence of TCP tick
-#define TCP_RTT_SHIFT            3                  ///< SRTT & RTTVAR scaled by 8
-#define TCP_RTO_MIN              TCP_TICK_HZ        ///< The minium value of RTO
-#define TCP_RTO_MAX              (TCP_TICK_HZ * 60) ///< The maxium value of RTO
-#define TCP_FOLD_RTT             4                  ///< Timeout threshod to fold RTT
-
-//
-// Default values for some timers
-//
-#define TCP_MAX_LOSS             12                          ///< Default max times to retxmit
-#define TCP_KEEPALIVE_IDLE_MIN   (TCP_TICK_HZ * 60 * 60 * 2) ///< First keep alive
-#define TCP_KEEPALIVE_PERIOD     (TCP_TICK_HZ * 60)
-#define TCP_MAX_KEEPALIVE        8
-#define TCP_FIN_WAIT2_TIME       (2 * TCP_TICK_HZ)
-#define TCP_TIME_WAIT_TIME       (2 * TCP_TICK_HZ)
-#define TCP_PAWS_24DAY           (24 * 24 * 60 * 60 * TCP_TICK_HZ)
-#define TCP_CONNECT_TIME         (75 * TCP_TICK_HZ)
-
-//
-// The header space to be reserved before TCP data to accomodate :
-// 60byte IP head + 60byte TCP head + link layer head
-//
-#define TCP_MAX_HEAD             192
-
-//
-// Value ranges for some control option
-//
-#define TCP_RCV_BUF_SIZE         (2 * 1024 * 1024)
-#define TCP_RCV_BUF_SIZE_MIN     (8 * 1024)
-#define TCP_SND_BUF_SIZE         (2 * 1024 * 1024)
-#define TCP_SND_BUF_SIZE_MIN     (8 * 1024)
-#define TCP_BACKLOG              10
-#define TCP_BACKLOG_MIN          5
-#define TCP_MAX_LOSS_MIN         6
-#define TCP_CONNECT_TIME_MIN     (60 * TCP_TICK_HZ)
-#define TCP_MAX_KEEPALIVE_MIN    4
-#define TCP_KEEPALIVE_IDLE_MAX   (TCP_TICK_HZ * 60 * 60 * 4)
-#define TCP_KEEPALIVE_PERIOD_MIN (TCP_TICK_HZ * 30)
-#define TCP_FIN_WAIT2_TIME_MAX   (4 * TCP_TICK_HZ)
-#define TCP_TIME_WAIT_TIME_MAX   (60 * TCP_TICK_HZ)
-
-///
-/// TCP segmentation data
-///
-typedef struct _TCP_SEG {
-  TCP_SEQNO Seq;  ///< Starting sequence number
-  TCP_SEQNO End;  ///< The sequence of the last byte + 1, include SYN/FIN. End-Seq = SEG.LEN
-  TCP_SEQNO Ack;  ///< ACK field in the segment
-  UINT8     Flag; ///< TCP header flags
-  UINT16    Urg;  ///< Valid if URG flag is set.
-  UINT32    Wnd;  ///< TCP window size field
-} TCP_SEG;
-
-///
-/// Network endpoint, IP+Port structure
-///
-typedef struct _TCP_PEER {
-  UINT32      Ip;   ///< IP address, network byte order
-  TCP_PORTNO  Port; ///< Port number, network byte order
-} TCP_PEER;
-
-///
-/// TCP control block, it includes various states
-///
-struct _TCP_CB {
-  LIST_ENTRY        List;     ///< Back and forward link entry
-  TCP_CB            *Parent;  ///< The parent TCP_CB structure
-
-  SOCKET            *Sk;      ///< The socket it controled.
-  TCP_PEER          LocalEnd; ///< Local endpoint
-  TCP_PEER          RemoteEnd;///< Remote endpoint
-
-  LIST_ENTRY        SndQue;   ///< Retxmission queue
-  LIST_ENTRY        RcvQue;   ///< Reassemble queue
-  UINT32            CtrlFlag; ///< Control flags, such as NO_NAGLE
-  INT32             Error;    ///< Soft error status, such as TCP_CONNECT_RESET
-
-  //
-  // RFC793 and RFC1122 defined variables
-  //
-  UINT8             State;      ///< TCP state, such as SYN_SENT, LISTEN
-  UINT8             DelayedAck; ///< Number of delayed ACKs
-  UINT16            HeadSum;    ///< Checksum of the fixed parts of pesudo
-                                ///< header: Src IP, Dst IP, 0, Protocol,
-                                ///< not include the TCP length.
-
-  TCP_SEQNO         Iss;        ///< Initial Sending Sequence
-  TCP_SEQNO         SndUna;     ///< First unacknowledged data
-  TCP_SEQNO         SndNxt;     ///< Next data sequence to send.
-  TCP_SEQNO         SndPsh;     ///< Send PUSH point
-  TCP_SEQNO         SndUp;      ///< Send urgent point
-  UINT32            SndWnd;     ///< Window advertised by the remote peer
-  UINT32            SndWndMax;  ///< Max send window advertised by the peer
-  TCP_SEQNO         SndWl1;     ///< Seq number used for last window update
-  TCP_SEQNO         SndWl2;     ///< Ack no of last window update
-  UINT16            SndMss;     ///< Max send segment size
-  TCP_SEQNO         RcvNxt;     ///< Next sequence no to receive
-  UINT32            RcvWnd;     ///< Window advertised by the local peer
-  TCP_SEQNO         RcvWl2;     ///< The RcvNxt (or ACK) of last window update.
-                                ///< It is necessary because of delayed ACK
-
-  TCP_SEQNO         RcvUp;                   ///< Urgent point;
-  TCP_SEQNO         Irs;                     ///< Initial Receiving Sequence
-  UINT16            RcvMss;                  ///< Max receive segment size
-  UINT16            EnabledTimer;            ///< Which timer is currently enabled
-  UINT32            Timer[TCP_TIMER_NUMBER]; ///< When the timer will expire
-  INT32             NextExpire;  ///< Count down offset for the nearest timer
-  UINT32            Idle;        ///< How long the connection is in idle
-  UINT32            ProbeTime;   ///< The time out value for current window prober
-  BOOLEAN           ProbeTimerOn;///< If TRUE, the probe time is on.
-
-  //
-  // RFC1323 defined variables, about window scale,
-  // timestamp and PAWS
-  //
-  UINT8             SndWndScale;  ///< Wndscale received from the peer
-  UINT8             RcvWndScale;  ///< Wndscale used to scale local buffer
-  UINT32            TsRecent;     ///< TsRecent to echo to the remote peer
-  UINT32            TsRecentAge;  ///< When this TsRecent is updated
-
-  //
-  // RFC2988 defined variables. about RTT measurement
-  //
-  TCP_SEQNO         RttSeq;     ///< The seq of measured segment now
-  UINT32            RttMeasure; ///< Currently measured RTT in heart beats
-  UINT32            SRtt;       ///< Smoothed RTT, scaled by 8
-  UINT32            RttVar;     ///< RTT variance, scaled by 8
-  UINT32            Rto;        ///< Current RTO, not scaled
-
-  //
-  // RFC2581, and 3782 variables.
-  // Congestion control + NewReno fast recovery.
-  //
-  UINT32            CWnd;         ///< Sender's congestion window
-  UINT32            Ssthresh;     ///< Slow start threshold.
-  TCP_SEQNO         Recover;      ///< Recover point for NewReno
-  UINT16            DupAck;       ///< Number of duplicate ACKs
-  UINT8             CongestState; ///< The current congestion state(RFC3782)
-  UINT8             LossTimes;    ///< Number of retxmit timeouts in a row
-  TCP_SEQNO         LossRecover;  ///< Recover point for retxmit
-
-  //
-  // configuration parameters, for EFI_TCP4_PROTOCOL specification
-  //
-  UINT32            KeepAliveIdle;   ///< Idle time before sending first probe
-  UINT32            KeepAlivePeriod; ///< Interval for subsequent keep alive probe
-  UINT8             MaxKeepAlive;    ///< Maxium keep alive probe times.
-  UINT8             KeepAliveProbes; ///< The number of keep alive probe.
-  UINT16            MaxRexmit;       ///< The maxium number of retxmit before abort
-  UINT32            FinWait2Timeout; ///< The FIN_WAIT_2 time out
-  UINT32            TimeWaitTimeout; ///< The TIME_WAIT time out
-  UINT32            ConnectTimeout;  ///< The connect establishment time out
-
-  //
-  // RFC7323
-  // Addressing Window Retraction for TCP Window Scale Option.
-  //
-  TCP_SEQNO         RetxmitSeqMax;       ///< Max Seq number in previous retransmission.
-
-  //
-  // configuration for tcp provided by user
-  //
-  BOOLEAN           UseDefaultAddr;
-  UINT8             Tos;
-  UINT8             Ttl;
-  EFI_IPv4_ADDRESS  SubnetMask;
-
-  IP_IO_IP_INFO     *IpInfo;        ///<pointer reference to Ip used to send pkt
-};
-
-extern LIST_ENTRY     mTcpRunQue;
-extern LIST_ENTRY     mTcpListenQue;
-extern TCP_SEQNO      mTcpGlobalIss;
-extern UINT32         mTcpTick;
-
-///
-/// TCP_CONNECTED: both ends have synchronized their ISN.
-///
-#define TCP_CONNECTED(state)  ((state) > TCP_SYN_RCVD)
-
-#define TCP_FIN_RCVD(State) \
-    (((State) == TCP_CLOSE_WAIT) || \
-    ((State) == TCP_LAST_ACK) || \
-    ((State) == TCP_CLOSING) || \
-    ((State) == TCP_TIME_WAIT))
-
-#define TCP_LOCAL_CLOSED(State) \
-      (((State) == TCP_FIN_WAIT_1) || \
-      ((State) == TCP_FIN_WAIT_2) || \
-      ((State) == TCP_CLOSING) || \
-      ((State) == TCP_TIME_WAIT) || \
-      ((State) == TCP_LAST_ACK))
-
-//
-// Get the TCP_SEG point from a net buffer's ProtoData
-//
-#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData))
-
-//
-// macros to compare sequence no
-//
-#define TCP_SEQ_LT(SeqA, SeqB)  ((INT32) ((SeqA) - (SeqB)) < 0)
-#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0)
-#define TCP_SEQ_GT(SeqA, SeqB)  ((INT32) ((SeqB) - (SeqA)) < 0)
-#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0)
-
-//
-// TCP_SEQ_BETWEEN return whether b <= m <= e
-//
-#define TCP_SEQ_BETWEEN(b, m, e)  ((e) - (b) >= (m) - (b))
-
-//
-// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2
-//
-#define TCP_SUB_SEQ(Seq1, Seq2)     ((UINT32) ((Seq1) - (Seq2)))
-
-//
-// Check whether Flag is on
-//
-#define TCP_FLG_ON(Value, Flag)     ((BOOLEAN) (((Value) & (Flag)) != 0))
-
-//
-// Set and Clear operation on a Flag
-//
-#define TCP_SET_FLG(Value, Flag)    ((Value) |= (Flag))
-#define TCP_CLEAR_FLG(Value, Flag)  ((Value) &= ~(Flag))
-
-//
-// Test whether two peers are equal
-//
-#define TCP_PEER_EQUAL(Pa, Pb) \
-  (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port))
-
-//
-// Test whether Pa matches Pb, or Pa is more specific
-// than pb. Zero means wildcard.
-//
-#define TCP_PEER_MATCH(Pa, Pb) \
-    ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \
-    (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port)))
-
-#define TCP_TIMER_ON(Flag, Timer)     ((Flag) & (1 << (Timer)))
-#define TCP_SET_TIMER(Flag, Timer)    ((Flag) = (UINT16) ((Flag) | (1 << (Timer))))
-#define TCP_CLEAR_TIMER(Flag, Timer)  ((Flag) = (UINT16) ((Flag) & (~(1 << (Timer)))))
-
-#define TCP_TIME_LT(Ta, Tb)           ((INT32) ((Ta) - (Tb)) < 0)
-#define TCP_TIME_LEQ(Ta, Tb)          ((INT32) ((Ta) - (Tb)) <= 0)
-#define TCP_SUB_TIME(Ta, Tb)          ((UINT32) ((Ta) - (Tb)))
-
-#define TCP_MAX_WIN                   0xFFFFU
-
-typedef
-VOID
-(*TCP_TIMER_HANDLER) (
-  IN OUT TCP_CB *Tcb
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
deleted file mode 100644
index d8336c5e82e9..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
+++ /dev/null
@@ -1,502 +0,0 @@
-/** @file
-  Dhcp and Discover routines for PxeBc.
-
-Copyright (c) 2013, Red Hat, Inc.
-Copyright (c) 2007 - 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 __EFI_PXEBC_DHCP_H__
-#define __EFI_PXEBC_DHCP_H__
-
-#define PXEBC_DHCP4_MAX_OPTION_NUM         16
-#define PXEBC_DHCP4_MAX_OPTION_SIZE        312
-#define PXEBC_DHCP4_MAX_PACKET_SIZE        (sizeof (EFI_PXE_BASE_CODE_PACKET))
-
-#define PXEBC_DHCP4_S_PORT                 67
-#define PXEBC_DHCP4_C_PORT                 68
-#define PXEBC_BS_DOWNLOAD_PORT             69
-#define PXEBC_BS_DISCOVER_PORT             4011
-
-#define PXEBC_DHCP4_OPCODE_REQUEST         1
-#define PXEBC_DHCP4_OPCODE_REPLY           2
-#define PXEBC_DHCP4_MSG_TYPE_REQUEST       3
-#define PXEBC_DHCP4_MAGIC                  0x63538263 // network byte order
-
-//
-// Sub-Options in Dhcp Vendor Option
-//
-#define PXEBC_VENDOR_TAG_MTFTP_IP          1
-#define PXEBC_VENDOR_TAG_MTFTP_CPORT       2
-#define PXEBC_VENDOR_TAG_MTFTP_SPORT       3
-#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT     4
-#define PXEBC_VENDOR_TAG_MTFTP_DELAY       5
-#define PXEBC_VENDOR_TAG_DISCOVER_CTRL     6
-#define PXEBC_VENDOR_TAG_DISCOVER_MCAST    7
-#define PXEBC_VENDOR_TAG_BOOT_SERVERS      8
-#define PXEBC_VENDOR_TAG_BOOT_MENU         9
-#define PXEBC_VENDOR_TAG_MENU_PROMPT       10
-#define PXEBC_VENDOR_TAG_MCAST_ALLOC       11
-#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES  12
-#define PXEBC_VENDOR_TAG_BOOT_ITEM         71
-
-#define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT  4
-#define PXEBC_DHCP4_DISCOVER_RETRIES       4
-
-#define PXEBC_MAX_MENU_NUM                 24
-#define PXEBC_MAX_OFFER_NUM                16
-
-#define PXEBC_BOOT_REQUEST_TIMEOUT         1
-#define PXEBC_BOOT_REQUEST_RETRIES         4
-
-#define PXEBC_DHCP4_OVERLOAD_FILE          1
-#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME   2
-
-//
-// The array index of the DHCP4 option tag interested
-//
-#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
-#define PXEBC_DHCP4_TAG_INDEX_VENDOR       1
-#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD     2
-#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE     3
-#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID    4
-#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID     5
-#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE     6
-#define PXEBC_DHCP4_TAG_INDEX_MAX          7
-
-//
-// The type of DHCP OFFER, arranged by priority, PXE10 has the highest priority.
-//
-#define DHCP4_PACKET_TYPE_PXE10            0
-#define DHCP4_PACKET_TYPE_WFM11A           1
-#define DHCP4_PACKET_TYPE_BINL             2
-#define DHCP4_PACKET_TYPE_DHCP_ONLY        3
-#define DHCP4_PACKET_TYPE_BOOTP            4
-#define DHCP4_PACKET_TYPE_MAX              5
-
-#define BIT(x)  (1 << x)
-#define CTRL(x) (0x1F & (x))
-
-//
-// WfM11a options
-//
-#define MTFTP_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_MTFTP_IP) | \
-                                     BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \
-                                     BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \
-                                     BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \
-                                     BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY))
-//
-// Discoverty options
-//
-#define DISCOVER_VENDOR_OPTION_BIT_MAP  (BIT (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \
-                                         BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \
-                                         BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \
-                                         BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \
-                                         BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
-
-#define IS_VALID_BOOT_PROMPT(x) \
-  ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
-
-#define IS_VALID_BOOT_MENU(x) \
-  ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT (PXEBC_VENDOR_TAG_BOOT_MENU))
-
-#define IS_VALID_MTFTP_VENDOR_OPTION(x) \
-    (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == MTFTP_VENDOR_OPTION_BIT_MAP)
-
-#define IS_VALID_DISCOVER_VENDOR_OPTION(x)  (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)
-
-#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \
-    (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))
-
-#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \
-    (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \
-      == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32))
-
-#define IS_DISABLE_BCAST_DISCOVER(x)    (((x) & BIT (0)) == BIT (0))
-#define IS_DISABLE_MCAST_DISCOVER(x)    (((x) & BIT (1)) == BIT (1))
-#define IS_ENABLE_USE_SERVER_LIST(x)    (((x) & BIT (2)) == BIT (2))
-#define IS_DISABLE_PROMPT_MENU(x)       (((x) & BIT (3)) == BIT (3))
-
-#define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) ((x)[(y) / 32]) | BIT ((y) % 32))
-
-#pragma pack(1)
-typedef struct {
-  UINT8 ParaList[135];
-} PXEBC_DHCP4_OPTION_PARA;
-
-typedef struct {
-  UINT16  Size;
-} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE;
-
-typedef struct {
-  UINT8 Type;
-  UINT8 MajorVer;
-  UINT8 MinorVer;
-} PXEBC_DHCP4_OPTION_UNDI;
-
-typedef struct {
-  UINT8 Type;
-} PXEBC_DHCP4_OPTION_MESG;
-
-typedef struct {
-  UINT16  Type;
-} PXEBC_DHCP4_OPTION_ARCH;
-
-#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000"
-#define DEFAULT_UNDI_TYPE     1
-#define DEFAULT_UNDI_MAJOR    3
-#define DEFAULT_UNDI_MINOR    0
-
-typedef struct {
-  UINT8 ClassIdentifier[10];
-  UINT8 ArchitecturePrefix[5];
-  UINT8 ArchitectureType[5];
-  UINT8 Lit3[1];
-  UINT8 InterfaceName[4];
-  UINT8 Lit4[1];
-  UINT8 UndiMajor[3];
-  UINT8 UndiMinor[3];
-} PXEBC_DHCP4_OPTION_CLID;
-
-typedef struct {
-  UINT8 Type;
-  UINT8 Guid[16];
-} PXEBC_DHCP4_OPTION_UUID;
-
-typedef struct {
-  UINT16  Type;
-  UINT16  Layer;
-} PXEBC_OPTION_BOOT_ITEM;
-
-#pragma pack()
-
-typedef union {
-  PXEBC_DHCP4_OPTION_PARA           *Para;
-  PXEBC_DHCP4_OPTION_UNDI           *Undi;
-  PXEBC_DHCP4_OPTION_ARCH           *Arch;
-  PXEBC_DHCP4_OPTION_CLID           *Clid;
-  PXEBC_DHCP4_OPTION_UUID           *Uuid;
-  PXEBC_DHCP4_OPTION_MESG           *Mesg;
-  PXEBC_DHCP4_OPTION_MAX_MESG_SIZE  *MaxMesgSize;
-} PXEBC_DHCP4_OPTION_ENTRY;
-
-typedef struct {
-  UINT16            Type;
-  UINT8             IpCnt;
-  EFI_IPv4_ADDRESS  IpAddr[1];
-} PXEBC_BOOT_SVR_ENTRY;
-
-typedef struct {
-  UINT16  Type;
-  UINT8   DescLen;
-  UINT8   DescStr[1];
-} PXEBC_BOOT_MENU_ENTRY;
-
-typedef struct {
-  UINT8 Timeout;
-  UINT8 Prompt[1];
-} PXEBC_MENU_PROMPT;
-
-typedef struct {
-  UINT32                BitMap[8];
-  EFI_IPv4_ADDRESS      MtftpIp;
-  UINT16                MtftpCPort;
-  UINT16                MtftpSPort;
-  UINT8                 MtftpTimeout;
-  UINT8                 MtftpDelay;
-  UINT8                 DiscoverCtrl;
-  EFI_IPv4_ADDRESS      DiscoverMcastIp;
-  EFI_IPv4_ADDRESS      McastIpBase;
-  UINT16                McastIpBlock;
-  UINT16                McastIpRange;
-  UINT16                BootSrvType;
-  UINT16                BootSrvLayer;
-  PXEBC_BOOT_SVR_ENTRY  *BootSvr;
-  UINT8                 BootSvrLen;
-  PXEBC_BOOT_MENU_ENTRY *BootMenu;
-  UINT8                 BootMenuLen;
-  PXEBC_MENU_PROMPT     *MenuPrompt;
-  UINT8                 MenuPromptLen;
-  UINT32                *CredType;
-  UINT8                 CredTypeLen;
-} PXEBC_VENDOR_OPTION;
-
-#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE  (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE)
-
-typedef union {
-  EFI_DHCP4_PACKET  Offer;
-  EFI_DHCP4_PACKET  Ack;
-  UINT8             Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE];
-} PXEBC_DHCP4_PACKET;
-
-typedef struct {
-  PXEBC_DHCP4_PACKET      Packet;
-  BOOLEAN                 IsPxeOffer;
-  UINT8                   OfferType;
-  EFI_DHCP4_PACKET_OPTION *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX];
-  PXEBC_VENDOR_OPTION    PxeVendorOption;
-} PXEBC_CACHED_DHCP4_PACKET;
-
-#define GET_NEXT_DHCP_OPTION(Opt) \
-  (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
-
-#define GET_OPTION_BUFFER_LEN(Pkt)  ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
-#define IS_PROXY_DHCP_OFFER(Offer)  EFI_IP4_EQUAL (&((Offer)->Dhcp4.Header.YourAddr), &mZeroIp4Addr)
-
-#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \
-  (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS))
-
-
-/**
-  This function initialize the DHCP4 message instance.
-
-  This function will pad each item of dhcp4 message packet.
-
-  @param  Seed    Pointer to the message instance of the DHCP4 packet.
-  @param  Udp4    Pointer to the EFI_UDP4_PROTOCOL instance.
-
-**/
-VOID
-PxeBcInitSeedPacket (
-  IN EFI_DHCP4_PACKET  *Seed,
-  IN EFI_UDP4_PROTOCOL *Udp4
-  );
-
-
-/**
-  Parse the cached dhcp packet.
-
-  @param  CachedPacket  Pointer to cached dhcp packet.
-
-  @retval TRUE          Succeed to parse and validation.
-  @retval FALSE         Fail to parse or validation.
-
-**/
-BOOLEAN
-PxeBcParseCachedDhcpPacket (
-  IN PXEBC_CACHED_DHCP4_PACKET  *CachedPacket
-  );
-
-/**
-  This function is to check the selected proxy offer (include BINL dhcp offer and
-  DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code
-  mode structure.
-
-  @param  Private          Pointer to PxeBc private data.
-
-  @retval EFI_SUCCESS                Operational successful.
-  @retval EFI_NO_RESPONSE            Offer dhcp service failed.
-  @retval EFI_BUFFER_TOO_SMALL       Failed to copy the packet to Pxe base code mode.
-
-**/
-EFI_STATUS
-PxeBcCheckSelectedOffer (
-  IN PXEBC_PRIVATE_DATA  *Private
-  );
-
-
-/**
-  Callback routine.
-
-  EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver
-  to intercept events that occurred in the configuration process. This structure
-  provides advanced control of each state transition of the DHCP process. The
-  returned status code determines the behavior of the EFI DHCPv4 Protocol driver.
-  There are three possible returned values, which are described in the following
-  table.
-
-  @param  This                  Pointer to the EFI DHCPv4 Protocol instance that is used to
-                                configure this callback function.
-  @param  Context               Pointer to the context that is initialized by
-                                EFI_DHCP4_PROTOCOL.Configure().
-  @param  CurrentState          The current operational state of the EFI DHCPv4 Protocol
-                                driver.
-  @param  Dhcp4Event            The event that occurs in the current state, which usually means a
-                                state transition.
-  @param  Packet                The DHCP packet that is going to be sent or already received.
-  @param  NewPacket             The packet that is used to replace the above Packet.
-
-  @retval EFI_SUCCESS           Tells the EFI DHCPv4 Protocol driver to continue the DHCP process.
-  @retval EFI_NOT_READY         Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol
-                                driver will continue to wait for more DHCPOFFER packets until the retry
-                                timeout expires.
-  @retval EFI_ABORTED           Tells the EFI DHCPv4 Protocol driver to abort the current process and
-                                return to the Dhcp4Init or Dhcp4InitReboot state.
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDhcpCallBack (
-  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
-  );
-
-/**
-  Switch the Ip4 policy to static.
-
-  @param[in]  Private             The pointer to PXEBC_PRIVATE_DATA.
-
-  @retval     EFI_SUCCESS         The policy is already configured to static.
-  @retval     Others              Other error as indicated..
-
-**/
-EFI_STATUS
-PxeBcSetIp4Policy (
-  IN PXEBC_PRIVATE_DATA            *Private
-  );
-
-/**
-  Discover the boot of service and initialize the vendor option if exists.
-
-  @param  Private               Pointer to PxeBc private data.
-  @param  Type                  PxeBc option boot item type
-  @param  Layer                 PxeBc option boot item layer
-  @param  UseBis                Use BIS or not
-  @param  DestIp                Ip address for server
-  @param  IpCount               The total count of the server ip address
-  @param  SrvList               Server list
-  @param  IsDiscv               Discover the vendor or not
-  @param  Reply                 The dhcp4 packet of Pxe reply
-
-  @retval EFI_SUCCESS           Operation succeeds.
-  @retval EFI_OUT_OF_RESOURCES  Allocate memory pool failed.
-  @retval EFI_NOT_FOUND         There is no vendor option exists.
-  @retval EFI_TIMEOUT           Send Pxe Discover time out.
-
-**/
-EFI_STATUS
-PxeBcDiscvBootService (
-  IN PXEBC_PRIVATE_DATA                * Private,
-  IN UINT16                            Type,
-  IN UINT16                            *Layer,
-  IN BOOLEAN                           UseBis,
-  IN EFI_IP_ADDRESS                    * DestIp,
-  IN UINT16                            IpCount,
-  IN EFI_PXE_BASE_CODE_SRVLIST         * SrvList,
-  IN BOOLEAN                           IsDiscv,
-  OUT EFI_DHCP4_PACKET                 * Reply OPTIONAL
-  );
-
-
-/**
-  Initialize the DHCP options and build the option list.
-
-  @param  Private          Pointer to PxeBc private data.
-  @param  OptList          Pointer to a DHCP option list.
-
-  @param  IsDhcpDiscover   Discover dhcp option or not.
-
-  @return The index item number of the option list.
-
-**/
-UINT32
-PxeBcBuildDhcpOptions (
-  IN PXEBC_PRIVATE_DATA            *Private,
-  IN EFI_DHCP4_PACKET_OPTION       **OptList,
-  IN BOOLEAN                       IsDhcpDiscover
-  );
-
-
-/**
-  Create the boot options.
-
-  @param  OptList    Pointer to the list of the options
-  @param  Type       the type of option
-  @param  Layer      the layer of the boot options
-  @param  OptLen     length of opotion
-
-**/
-VOID
-PxeBcCreateBootOptions (
-  IN  EFI_DHCP4_PACKET_OPTION          *OptList,
-  IN  UINT16                           Type,
-  IN  UINT16                           *Layer,
-  OUT UINT32                           *OptLen
-  );
-
-
-/**
-  Parse interested dhcp options.
-
-  @param  Buffer     Pointer to the dhcp options packet.
-  @param  Length     The length of the dhcp options.
-  @param  OptTag     The option OpCode.
-
-  @return NULL if the buffer length is 0 and OpCode is not
-          DHCP4_TAG_EOP, or the pointer to the buffer.
-
-**/
-EFI_DHCP4_PACKET_OPTION *
-PxeBcParseExtendOptions (
-  IN UINT8                         *Buffer,
-  IN UINT32                        Length,
-  IN UINT8                         OptTag
-  );
-
-
-/**
-  This function is to parse and check vendor options.
-
-  @param  Dhcp4Option           Pointer to dhcp options
-  @param  VendorOption          Pointer to vendor options
-
-  @return TRUE if valid for vendor options, or FALSE.
-
-**/
-BOOLEAN
-PxeBcParseVendorOptions (
-  IN EFI_DHCP4_PACKET_OPTION       *Dhcp4Option,
-  IN PXEBC_VENDOR_OPTION           *VendorOption
-  );
-
-
-/**
-  Choose the boot prompt.
-
-  @param  Private              Pointer to PxeBc private data.
-
-  @retval EFI_SUCCESS          Select boot prompt done.
-  @retval EFI_TIMEOUT          Select boot prompt time out.
-  @retval EFI_NOT_FOUND        The proxy offer is not Pxe10.
-  @retval EFI_ABORTED          User cancel the operation.
-  @retval EFI_NOT_READY        Read the input key from the keybroad has not finish.
-
-**/
-EFI_STATUS
-PxeBcSelectBootPrompt (
-  IN PXEBC_PRIVATE_DATA              *Private
-  );
-
-
-/**
-  Select the boot menu.
-
-  @param  Private         Pointer to PxeBc private data.
-  @param  Type            The type of the menu.
-  @param  UseDefaultItem  Use default item or not.
-
-  @retval EFI_ABORTED     User cancel operation.
-  @retval EFI_SUCCESS     Select the boot menu success.
-  @retval EFI_NOT_READY   Read the input key from the keybroad has not finish.
-
-**/
-EFI_STATUS
-PxeBcSelectBootMenu (
-  IN  PXEBC_PRIVATE_DATA              *Private,
-  OUT UINT16                          *Type,
-  IN  BOOLEAN                         UseDefaultItem
-  );
-
-#endif
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h
deleted file mode 100644
index b7bf069dd637..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/** @file
-
-Copyright (c) 2007 - 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 __EFI_PXEBC_DRIVER_H__
-#define __EFI_PXEBC_DRIVER_H__
-
-/**
-  Test to see if this driver supports ControllerHandle. This service
-  is called by the EFI boot service ConnectController(). In
-  order to make drivers as small as possible, there are a few calling
-  restrictions for this service. ConnectController() must
-  follow these calling restrictions. If any other agent wishes to call
-  Supported() it must also follow these calling restrictions.
-  PxeBc requires DHCP4 and MTFTP4 protocols.
-
-  @param  This                Protocol instance pointer.
-  @param  ControllerHandle    Handle of device to test
-  @param  RemainingDevicePath Optional parameter use to pick a specific child
-                              device to start.
-
-  @retval EFI_SUCCESS         This driver supports this device
-  @retval EFI_ALREADY_STARTED This driver is already running on this device
-  @retval other               This driver does not support this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL  * This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL
-  );
-
-/**
-  Start this driver on ControllerHandle. This service is called by the
-  EFI boot service ConnectController(). In order to make
-  drivers as small as possible, there are a few calling restrictions for
-  this service. ConnectController() must follow these
-  calling restrictions. If any other agent wishes to call Start() it
-  must also follow these calling restrictions.
-
-  @param  This                 Protocol instance pointer.
-  @param  ControllerHandle     Handle of device to bind driver to
-  @param  RemainingDevicePath  Optional parameter use to pick a specific child
-                               device to start.
-
-  @retval EFI_SUCCESS          This driver is added to ControllerHandle
-  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle
-  @retval other                This driver does not support this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL  * This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL
-  );
-
-/**
-  Stop this driver on ControllerHandle. This service is called by the
-  EFI boot service DisconnectController(). In order to
-  make drivers as small as possible, there are a few calling
-  restrictions for this service. DisconnectController()
-  must follow these calling restrictions. If any other agent wishes
-  to call Stop() it must also follow these calling restrictions.
-
-  @param  This              Protocol instance pointer.
-  @param  ControllerHandle  Handle of device to stop driver on
-  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
-                            children is zero stop the entire bus driver.
-  @param  ChildHandleBuffer List of Child Handles to Stop.
-
-  @retval EFI_SUCCESS       This driver is removed ControllerHandle
-  @retval other             This driver was not removed from this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingStop (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN UINTN                        NumberOfChildren,
-  IN EFI_HANDLE                   *ChildHandleBuffer
-  );
-
-extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2;
-extern EFI_COMPONENT_NAME_PROTOCOL  gPxeBcComponentName;
-extern EFI_DRIVER_BINDING_PROTOCOL  gPxeBcDriverBinding;
-
-#endif
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
deleted file mode 100644
index e96b6f2c5d14..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/** @file
-
-Copyright (c) 2007 - 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 __EFI_PXEBC_IMPL_H__
-#define __EFI_PXEBC_IMPL_H__
-
-
-typedef struct _PXEBC_PRIVATE_DATA  PXEBC_PRIVATE_DATA;
-
-#include <Uefi.h>
-
-#include <Guid/SmBios.h>
-#include <IndustryStandard/SmBios.h>
-#include <IndustryStandard/Dhcp.h>
-#include <Protocol/Dhcp4.h>
-#include <Protocol/PxeBaseCode.h>
-#include <Protocol/Mtftp4.h>
-#include <Protocol/Udp4.h>
-#include <Protocol/LoadFile.h>
-#include <Protocol/NetworkInterfaceIdentifier.h>
-#include <Protocol/PxeBaseCodeCallBack.h>
-#include <Protocol/Arp.h>
-#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config2.h>
-
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/BaseLib.h>
-#include <Library/NetLib.h>
-#include <Library/DpcLib.h>
-#include <Library/PcdLib.h>
-
-#include "PxeBcDriver.h"
-#include "PxeBcDhcp.h"
-#include "PxeBcMtftp.h"
-#include "PxeBcSupport.h"
-
-#define PXEBC_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('P', 'X', 'E', 'P')
-#define PXEBC_MTFTP_TIMEOUT                4
-#define PXEBC_MTFTP_RETRIES                6
-#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE    8
-#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE   4
-#define PXEBC_DEFAULT_PACKET_SIZE          1480
-#define PXEBC_DEFAULT_LIFETIME             50000  // 50ms, unit is microsecond
-#define PXEBC_CHECK_MEDIA_WAITING_TIME     EFI_TIMER_PERIOD_SECONDS(20)
-
-struct _PXEBC_PRIVATE_DATA {
-  UINT32                                    Signature;
-  EFI_HANDLE                                Controller;
-  EFI_HANDLE                                Image;
-  EFI_HANDLE                                ArpChild;
-  EFI_HANDLE                                Dhcp4Child;
-  EFI_HANDLE                                Ip4Child;
-  EFI_HANDLE                                Mtftp4Child;
-  EFI_HANDLE                                Udp4ReadChild;
-  EFI_HANDLE                                Udp4WriteChild;
-
-  EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii;
-
-  EFI_PXE_BASE_CODE_PROTOCOL                PxeBc;
-  EFI_LOAD_FILE_PROTOCOL                    LoadFile;
-  EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL       LoadFileCallback;
-  EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL       *PxeBcCallback;
-  EFI_ARP_PROTOCOL                          *Arp;
-  EFI_DHCP4_PROTOCOL                        *Dhcp4;
-  EFI_IP4_PROTOCOL                          *Ip4;
-  EFI_IP4_CONFIG2_PROTOCOL                  *Ip4Config2;
-  EFI_IP4_CONFIG_DATA                       Ip4ConfigData;
-  EFI_MTFTP4_PROTOCOL                       *Mtftp4;
-  EFI_UDP4_PROTOCOL                         *Udp4Read;
-  EFI_UDP4_PROTOCOL                         *Udp4Write;
-  UINT16                                    CurrentUdpSrcPort;
-  EFI_UDP4_CONFIG_DATA                      Udp4CfgData;
-
-
-  EFI_PXE_BASE_CODE_MODE                    Mode;
-  EFI_PXE_BASE_CODE_FUNCTION                Function;
-
-  CHAR8                                     *BootFileName;
-
-  EFI_IP_ADDRESS                            StationIp;
-  EFI_IP_ADDRESS                            SubnetMask;
-  EFI_IP_ADDRESS                            GatewayIp;
-  EFI_IP_ADDRESS                            ServerIp;
-  BOOLEAN                                   AddressIsOk;
-  UINT32                                    Ip4MaxPacketSize;
-  UINTN                                     BlockSize;
-  UINTN                                     FileSize;
-
-  UINT8                                     OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE];
-  EFI_DHCP4_PACKET                          SeedPacket;
-  EFI_MAC_ADDRESS                           Mac;
-  UINT8                                     MacLen;
-
-  BOOLEAN                                   SortOffers;
-  BOOLEAN                                   GotProxyOffer;
-  UINT32                                    NumOffers;
-  UINT32                                    SelectedOffer;
-  UINT32                                    ProxyOfferType;
-
-  //
-  // Cached packets as complements of pxe mode data
-  //
-  PXEBC_CACHED_DHCP4_PACKET                 ProxyOffer;
-  PXEBC_CACHED_DHCP4_PACKET                 Dhcp4Ack;
-  PXEBC_CACHED_DHCP4_PACKET                 PxeReply;
-  PXEBC_CACHED_DHCP4_PACKET                 Dhcp4Offers[PXEBC_MAX_OFFER_NUM];
-
-  //
-  // Arrays for different types of offers:
-  //   ServerCount records the count of the servers we got the offers,
-  //   OfferIndex records the index of the offer sent by the server indexed by ServerCount.
-  //
-  UINT32                                    ServerCount[DHCP4_PACKET_TYPE_MAX];
-  UINT32                                    OfferIndex[DHCP4_PACKET_TYPE_MAX][PXEBC_MAX_OFFER_NUM];
-  UINT32                                    BootpIndex;
-  UINT32                                    ProxyIndex[DHCP4_PACKET_TYPE_MAX];
-  UINT32                                    BinlIndex[PXEBC_MAX_OFFER_NUM];
-
-  EFI_EVENT                                 GetArpCacheEvent;
-  //
-  // token and event used to get ICMP error data from IP
-  //
-  EFI_IP4_COMPLETION_TOKEN                  IcmpErrorRcvToken;
-};
-
-#define PXEBC_PRIVATE_DATA_FROM_PXEBC(a)          CR (a, PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE)
-
-#define PXEBC_PRIVATE_DATA_FROM_LOADFILE(a)       CR (a, PXEBC_PRIVATE_DATA, LoadFile, PXEBC_PRIVATE_DATA_SIGNATURE)
-
-#define PXEBC_PRIVATE_DATA_FROM_PXEBCCALLBACK(a)  CR (a, PXEBC_PRIVATE_DATA, PxeBcCallback, PXEBC_PRIVATE_DATA_SIGNATURE)
-
-extern EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate;
-extern EFI_LOAD_FILE_PROTOCOL     mLoadFileProtocolTemplate;
-
-/**
-  Causes the driver to load a specified file.
-
-  @param  This                  Protocol instance pointer.
-  @param  FilePath              The device specific path of the file to load.
-  @param  BootPolicy            If TRUE, indicates that the request originates from the
-                                boot manager is attempting to load FilePath as a boot
-                                selection. If FALSE, then FilePath must match as exact file
-                                to be loaded.
-  @param  BufferSize            On input the size of Buffer in bytes. On output with a return
-                                code of EFI_SUCCESS, the amount of data transferred to
-                                Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL,
-                                the size of Buffer required to retrieve the requested file.
-  @param  Buffer                The memory buffer to transfer the file to. IF Buffer is NULL,
-                                then no the size of the requested file is returned in
-                                BufferSize.
-
-  @retval EFI_SUCCESS                 The file was loaded.
-  @retval EFI_UNSUPPORTED             The device does not support the provided BootPolicy
-  @retval EFI_INVALID_PARAMETER       FilePath is not a valid device path, or
-                                      BufferSize is NULL.
-  @retval EFI_NO_MEDIA                No medium was present to load the file.
-  @retval EFI_DEVICE_ERROR            The file was not loaded due to a device error.
-  @retval EFI_NO_RESPONSE             The remote system did not respond.
-  @retval EFI_NOT_FOUND               The file was not found.
-  @retval EFI_ABORTED                 The file load process was manually cancelled.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeLoadFile (
-  IN EFI_LOAD_FILE_PROTOCOL           * This,
-  IN EFI_DEVICE_PATH_PROTOCOL         * FilePath,
-  IN BOOLEAN                          BootPolicy,
-  IN OUT UINTN                        *BufferSize,
-  IN VOID                             *Buffer OPTIONAL
-  );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h
deleted file mode 100644
index 903dd4fbb69a..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/** @file
-  Mtftp routines for PxeBc.
-
-Copyright (c) 2007 - 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 __EFI_PXEBC_MTFTP_H__
-#define __EFI_PXEBC_MTFTP_H__
-
-#define PXE_MTFTP_OPTION_BLKSIZE_INDEX   0
-#define PXE_MTFTP_OPTION_TIMEOUT_INDEX   1
-#define PXE_MTFTP_OPTION_TSIZE_INDEX     2
-#define PXE_MTFTP_OPTION_MULTICAST_INDEX 3
-#define PXE_MTFTP_OPTION_MAXIMUM_INDEX   4
-
-#define PXE_MTFTP_ERROR_STRING_LENGTH    127
-#define PXE_MTFTP_OPTBUF_MAXNUM_INDEX    128
-
-
-/**
-  This function is to get size of a file by Tftp.
-
-  @param  Private        Pointer to PxeBc private data
-  @param  Config         Pointer to Mtftp configuration data
-  @param  Filename       Pointer to file name
-  @param  BlockSize      Pointer to block size
-  @param  BufferSize     Pointer to buffer size
-
-  @retval EFI_SUCCESS        Get the size of file success
-  @retval EFI_NOT_FOUND      Parse the tftp ptions failed.
-  @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.
-  @retval Other              Has not get the size of the file.
-
-**/
-EFI_STATUS
-PxeBcTftpGetFileSize (
-  IN PXEBC_PRIVATE_DATA         *Private,
-  IN EFI_MTFTP4_CONFIG_DATA     *Config,
-  IN UINT8                      *Filename,
-  IN UINTN                      *BlockSize,
-  IN OUT UINT64                 *BufferSize
-  );
-
-
-/**
-  This function is to get data of a file by Tftp.
-
-  @param  Private        Pointer to PxeBc private data
-  @param  Config         Pointer to Mtftp configuration data
-  @param  Filename       Pointer to file name
-  @param  BlockSize      Pointer to block size
-  @param  BufferPtr      Pointer to buffer
-  @param  BufferSize     Pointer to buffer size
-  @param  DontUseBuffer  Indicate whether with a receive buffer
-
-  @retval EFI_SUCCESS        Read the data success from the special file.
-  @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.
-  @retval other              Read data from file failed.
-
-**/
-EFI_STATUS
-PxeBcTftpReadFile (
-  IN PXEBC_PRIVATE_DATA         *Private,
-  IN EFI_MTFTP4_CONFIG_DATA     *Config,
-  IN UINT8                      *Filename,
-  IN UINTN                      *BlockSize,
-  IN UINT8                      *BufferPtr,
-  IN OUT UINT64                 *BufferSize,
-  IN BOOLEAN                    DontUseBuffer
-  );
-
-
-/**
-  This function is put data of a file by Tftp.
-
-  @param  Private        Pointer to PxeBc private data
-  @param  Config         Pointer to Mtftp configuration data
-