ource code to consume Ip4Config2 protocol.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: jiaxinwu <jiaxin...@intel.com>
---
 .../UefiShellNetwork1CommandsLib/Ifconfig.c        | 2395 ++++++++------------
 .../Library/UefiShellNetwork1CommandsLib/Ping.c    |   28 +-
 .../UefiShellNetwork1CommandsLib.c                 |    4 +-
 .../UefiShellNetwork1CommandsLib.h                 |    8 +-
 .../UefiShellNetwork1CommandsLib.inf               |    8 +-
 .../UefiShellNetwork1CommandsLib.uni               |  Bin 20112 -> 21014 bytes
 6 files changed, 973 insertions(+), 1470 deletions(-)

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index 7c3f809..164b67c 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -1,1625 +1,1130 @@
 /** @file
-  The implementation for ifcommand shell command.
+  The implementation for Shell application IfConfig based on IP4Config2 
protocol.
 
-  (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
-  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 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 "UefiShellNetwork1CommandsLib.h"
 
-#define NIC_ITEM_CONFIG_SIZE   (sizeof (NIC_IP4_CONFIG_INFO) + sizeof 
(EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE)
-#define EFI_IP4_TO_U32(EfiIpAddr)   (*(IP4_ADDR*)((EfiIpAddr).Addr))
-
-BOOLEAN                                 mIp4ConfigExist    = FALSE;
-STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL  *mHiiConfigRouting = NULL;
-
-STATIC CONST UINTN SecondsToNanoSeconds = 10000000;
-STATIC CONST CHAR16 DhcpString[5]       = L"DHCP";
-STATIC CONST CHAR16 StaticString[7]     = L"STATIC";
-STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";
-
-typedef struct {
-  LIST_ENTRY                  Link;
-  EFI_HANDLE                  Handle;
-  NIC_ADDR                    NicAddress;
-  CHAR16                      Name[IP4_NIC_NAME_LENGTH];
-  BOOLEAN                     MediaPresentSupported;
-  BOOLEAN                     MediaPresent;
-  EFI_IP4_CONFIG_PROTOCOL     *Ip4Config;
-  NIC_IP4_CONFIG_INFO         *ConfigInfo;
-} NIC_INFO;
-
-typedef struct {
-  EFI_IP_ADDRESS              DestIp;
-  EFI_MAC_ADDRESS             DestMac;
-  EFI_IP_ADDRESS              LocalIp;
-  EFI_MAC_ADDRESS             LocalMac;
-  UINT8                       MacLen;
-  EFI_EVENT                   OnResolved;
-  BOOLEAN                     Duplicate;
-} ARP_REQUEST;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
-  {L"-c",     TypeValue},
-  {L"-l",     TypeValue},
-  {L"-s",     TypeMaxValue},
-  {NULL,      TypeMax}
-  };
-
-STATIC LIST_ENTRY                  NicInfoList;
-STATIC BOOLEAN                     ArpResolved;
-STATIC BOOLEAN                     mTimeout;
+enum {
+  IfConfigOpList     = 1,
+  IfConfigOpSet      = 2,
+  IfConfigOpClear    = 3
+};
+
+typedef enum {
+  VarCheckReserved      = -1,
+  VarCheckOk            = 0,
+  VarCheckDuplicate,
+  VarCheckConflict,
+  VarCheckUnknown,
+  VarCheckLackValue,
+  VarCheckOutOfMem
+} VAR_CHECK_CODE;
+
+typedef enum {
+  FlagTypeSingle         = 0,
+  FlagTypeNeedVar,
+  FlagTypeNeedSet,
+  FlagTypeSkipUnknown
+} VAR_CHECK_FLAG_TYPE;
+
+#define MACADDRMAXSIZE    32
+
+typedef struct _IFCONFIG_INTERFACE_CB {
+  EFI_HANDLE                                  NicHandle;
+  LIST_ENTRY                                  Link;
+  EFI_IP4_CONFIG2_PROTOCOL                    *IfCfg;
+  EFI_IP4_CONFIG2_INTERFACE_INFO              *IfInfo; 
+  EFI_IP4_CONFIG2_POLICY                      Policy;
+  UINT32                                      DnsCnt;
+  EFI_IPv4_ADDRESS                            DnsAddr[1];
+} IFCONFIG_INTERFACE_CB;
+
+typedef struct _ARG_LIST ARG_LIST;
+
+struct _ARG_LIST {
+  ARG_LIST    *Next;
+  CHAR16      *Arg;
+};
+
+typedef struct _IFCONFIG4_PRIVATE_DATA {
+  EFI_HANDLE  ImageHandle;
+  LIST_ENTRY  IfList;
+
+  UINT32      OpCode;
+  CHAR16      *IfName;
+  ARG_LIST    *VarArg;
+} IFCONFIG_PRIVATE_DATA;
+
+typedef struct _VAR_CHECK_ITEM{
+  CHAR16                 *FlagStr;
+  UINT32                 FlagID;
+  UINT32                 ConflictMask;
+  VAR_CHECK_FLAG_TYPE    FlagType;
+} VAR_CHECK_ITEM;
+
+SHELL_PARAM_ITEM    mIfConfigCheckList[] = {
+  {
+    L"-b",
+    TypeFlag
+  },
+  {
+    L"-s",
+    TypeMaxValue
+  },
+  {
+    L"-l",
+    TypeValue
+  },
+  {
+    L"-h",
+    TypeFlag
+  },
+  {
+    NULL,
+    TypeMax
+  },
+};
+
+VAR_CHECK_ITEM  mSetCheckList[] = {
+  {
+   L"static",
+    0x00000001,
+    0x00000001,
+    FlagTypeSingle
+  },
+  {
+    L"dhcp",
+    0x00000002,
+    0x00000001,
+    FlagTypeSingle
+  },
+  {
+    L"dns",
+    0x00000008,
+    0x00000004,
+    FlagTypeSingle
+  },
+  {
+    NULL,
+    0x0,
+    0x0,
+    FlagTypeSkipUnknown
+  },
+};
 
 /**
-  Count the space delimited items in a string.
-
-  @param[in] String     A pointer to the string to count.
-
-  @return The number of space-delimited items.
-  @retval 0xFF an error occured.
-**/
-UINT8
-EFIAPI
-CountSubItems (
-  IN CONST CHAR16 *String
-  )
-{
-  CONST CHAR16  *Walker;
-  UINT8         Count;
-
-  if (String == NULL || *String == CHAR_NULL) {
-    return (0xFF);
-  }
+  Split a string with specified separator and save the substring to a list.
 
-  for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; 
Walker = (StrStr(Walker, L" ")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);
-  return (Count);
-}
+  @param[in]    String       The pointer of the input string.
+  @param[in]    Separator    The specified separator.
 
-/**
-  Find the NIC_INFO by the specified nic name.
+  @return The pointer of headnode of ARG_LIST.
 
-  @param[in] Name     The pointer to the string containing the NIC name.
-  
-  @return The pointer to the NIC_INFO if there is a NIC_INFO named by Name.
-  @retval NULL  No NIC_INFO was found for Name.
 **/
-NIC_INFO*
-EFIAPI
-IfconfigFindNicByName (
-  IN CONST CHAR16           *Name
+ARG_LIST *
+SplitStrToList (
+  IN CONST CHAR16    *String,
+  IN CHAR16          Separator
   )
 {
-  LIST_ENTRY                *Entry;
-  LIST_ENTRY                *NextEntry;
-  NIC_INFO                  *Info;
-  CHAR16                    *TempString;
-
-  NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
-    Info = BASE_CR (Entry, NIC_INFO, Link);
-    TempString = (CHAR16*)Info->Name;
+  CHAR16      *Str;
+  CHAR16      *ArgStr;
+  ARG_LIST    *ArgList;
+  ARG_LIST    *ArgNode;
 
-    if (StringNoCaseCompare (&Name, &TempString) == 0) {
-      return Info;
-    }
+  if (*String == L'\0') {
+    return NULL;
   }
 
-  return NULL;
-}
-
-/**
-  Tests whether a child handle is a child device of the controller.
-
-  @param[in] ControllerHandle   A handle for a (parent) controller to test.
-  @param[in] ChildHandle        A child handle to test.
-  @param[in] ProtocolGuid       Supplies the protocol that the child controller
-                                opens on its parent controller.
-
-  @retval EFI_SUCCESS         ChildHandle is a child of the ControllerHandle.
-  @retval EFI_UNSUPPORTED     ChildHandle is not a child of the 
ControllerHandle.
-**/
-EFI_STATUS
-EFIAPI
-TestChildHandle (
-  IN CONST EFI_HANDLE       ControllerHandle,
-  IN CONST EFI_HANDLE       ChildHandle,
-  IN CONST EFI_GUID         *ProtocolGuid
-  )
-{
-  EFI_STATUS                            Status;
-  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY   *OpenInfoBuffer;
-  UINTN                                 EntryCount;
-  UINTN                                 Index;
-
-  ASSERT (ProtocolGuid != NULL);
-
   //
-  // Retrieve the list of agents that are consuming the specific protocol
-  // on ControllerHandle.
+  // Copy the CONST string to a local copy.
   //
-  Status = gBS->OpenProtocolInformation (
-                 ControllerHandle,
-                 (EFI_GUID *) ProtocolGuid,
-                 &OpenInfoBuffer,
-                 &EntryCount
-                 );
-  if (EFI_ERROR (Status)) {
-    return EFI_UNSUPPORTED;
-  }
+  Str     = (CHAR16 *) AllocateZeroPool (StrSize (String));
+  ASSERT (Str != NULL);
+  Str     = StrCpy (Str, String);
+  ArgStr  = Str;
 
   //
-  // Inspect if ChildHandle is one of the agents.
+  // init a node for the list head.
   //
-  Status = EFI_UNSUPPORTED;
-  for (Index = 0; Index < EntryCount; Index++) {
-    if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&
-        (OpenInfoBuffer[Index].Attributes & 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
-      Status = EFI_SUCCESS;
-      break;
-    }
-  }
-
-  FreePool (OpenInfoBuffer);
-  return Status;
-}
-
-/**
-  Get the child handle of the NIC handle.
-
-  @param[in] Controller     Routing information: GUID.
-  @param[out] ChildHandle   Returned child handle.
-
-  @retval EFI_SUCCESS         Successfully to get child handle.
-**/
-EFI_STATUS 
-GetChildHandle (
-  IN EFI_HANDLE         Controller,
-  OUT EFI_HANDLE        *ChildHandle
-  )
-{
-  EFI_STATUS                 Status;
-  EFI_HANDLE                 *Handles;
-  UINTN                      HandleCount;
-  UINTN                      Index;
-  EFI_DEVICE_PATH_PROTOCOL   *ChildDeviceDevicePath;
-  VENDOR_DEVICE_PATH         *VendorDeviceNode;
+  ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+  ASSERT (ArgNode != NULL);
+  ArgList = ArgNode;
 
   //
-  // Locate all EFI Hii Config Access protocols
+  // Split the local copy and save in the list node.
   //
-  Status = gBS->LocateHandleBuffer (
-                 ByProtocol,
-                 &gEfiHiiConfigAccessProtocolGuid,
-                 NULL,
-                 &HandleCount,
-                 &Handles
-                 );
-  if (EFI_ERROR (Status) || (HandleCount == 0)) {
-    return Status;
-  }
-
-  Status = EFI_NOT_FOUND;
-
-  for (Index = 0; Index < HandleCount; Index++) {
-  
-    Status = TestChildHandle (Controller, Handles[Index], 
&gEfiManagedNetworkServiceBindingProtocolGuid);
-    if (!EFI_ERROR (Status)) {
-      //
-      // Get device path on the child handle
-      //
-      Status = gBS->HandleProtocol (
-                     Handles[Index],
-                     &gEfiDevicePathProtocolGuid,
-                     (VOID **) &ChildDeviceDevicePath
-                     );
-      
-      if (!EFI_ERROR (Status)) {
-        while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
-          ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
-          //
-          // Parse one instance
-          //
-          if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH && 
-              ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
-            VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
-            if (CompareMem (&VendorDeviceNode->Guid, 
&gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
-              //
-              // Found item matched gEfiNicIp4ConfigVariableGuid
-              //
-              *ChildHandle = Handles[Index];
-              FreePool (Handles);
-              return EFI_SUCCESS;
-            }
-          }
-        }
-      }      
+  while (*Str != L'\0') {
+    if (*Str == Separator) {
+      *Str          = L'\0';
+      ArgNode->Arg  = ArgStr;
+      ArgStr        = Str + 1;
+      ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+      ASSERT (ArgNode->Next != NULL);
+      ArgNode = ArgNode->Next;
     }
+
+    Str++;
   }
 
-  FreePool (Handles);
-  return Status;  
+  ArgNode->Arg  = ArgStr;
+  ArgNode->Next = NULL;
+
+  return ArgList;
 }
 
 /**
-  Append OFFSET/WIDTH/VALUE items at the beginning of string.
-
-  @param[in, out]  String      The pointer to the string to append onto.
-  @param[in]       Offset      Offset value.
-  @param[in]       Width       Width value.
-  @param[in]       Block       Point to data buffer.
-
-  @return The count of unicode character that were appended.
-**/
-UINTN
-EFIAPI
-AppendOffsetWidthValue (
-  IN OUT CHAR16               *String,
-  IN UINTN                    Offset,
-  IN UINTN                    Width,
-  IN CONST UINT8              *Block
-  )
-
-{
-  CHAR16                      *OriString;
-
-  OriString = String;
-
-  StrnCpy (String, L"&OFFSET=", 9);
-  String += StrLen (L"&OFFSET=");
-  String += UnicodeSPrint (String, 20, L"%x", Offset);
-
-  StrnCpy (String,L"&WIDTH=", 8);
-  String += StrLen (L"&WIDTH=");
-  String += UnicodeSPrint (String, 20, L"%x", Width);
+  Check the correctness of input Args with '-s' option.
 
-  if (Block != NULL) {
-    StrnCpy (String,L"&VALUE=", 8);
-    String += StrLen (L"&VALUE=");
-    while ((Width--) != 0) {
-      String += UnicodeSPrint (String, 20, L"%x", Block[Width]);
-    }
-  }
-  
-  return String - OriString;
-}
+  @param[in]    CheckList    The pointer of VAR_CHECK_ITEM array.
+  @param[in]    Name         The pointer of input arg.
+  @param[in]    Init         The switch to execute the check.
 
-/**
-  Converts the unicode character of the string from uppercase to lowercase.
-  This is a internal function.
+  @return The value of VAR_CHECK_CODE.
 
-  @param ConfigString  String to be converted
 **/
-CHAR16* 
-EFIAPI
-HiiToLower (
-  IN CHAR16   *ConfigString
-  )
+VAR_CHECK_CODE
+IfConfigRetriveCheckListByName(
+  IN VAR_CHECK_ITEM    *CheckList,
+  IN CHAR16            *Name,
+  IN BOOLEAN           Init
+)
 {
-  CHAR16      *String;
-  BOOLEAN     Lower;
-
-  //
-  // Convert all hex digits in range [A-F] in the configuration header to [a-f]
-  //
-  for (String = ConfigString, Lower = FALSE; String != NULL && *String != 
L'\0'; String++) {
-    if (*String == L'=') {
-      Lower = TRUE;
-    } else if (*String == L'&') {
-      Lower = FALSE;
-    } else if (Lower && *String >= L'A' && *String <= L'F') {
-      *String = (CHAR16) (*String - L'A' + L'a');
-    }
+  STATIC UINT32     CheckDuplicate;
+  STATIC UINT32     CheckConflict;
+  VAR_CHECK_CODE    RtCode;
+  UINT32            Index;
+  VAR_CHECK_ITEM    Arg;
+
+  if (Init) {
+    CheckDuplicate = 0;
+    CheckConflict  = 0;
+    return VarCheckOk;
   }
 
-  return (ConfigString);
-}
-
-
-/**
-  Construct <ConfigHdr> using routing information GUID/NAME/PATH.
-
-  @param[in] Guid         Routing information: GUID.
-  @param[in] Name         Routing information: NAME.
-  @param[in] DriverHandle Driver handle which contains the routing 
information: PATH.
-
-  @retval NULL            An error occured.
-  @return                 The pointer to configHdr string.
-**/
-CHAR16 *
-EFIAPI
-ConstructConfigHdr (
-  IN CONST EFI_GUID          *Guid,
-  IN CONST CHAR16            *Name,
-  IN EFI_HANDLE              DriverHandle
-  )
-{
-  EFI_STATUS                 Status;
-  CHAR16                     *ConfigHdr;
-  EFI_DEVICE_PATH_PROTOCOL   *DevicePath;
-  CHAR16                     *String;
-  UINTN                      Index;
-  UINT8                      *Buffer;
-  UINTN                      DevicePathLength;
-  UINTN                      NameLength;
+  RtCode  = VarCheckOk;
+  Index   = 0;
+  Arg     = CheckList[Index];
 
   //
-  // Get the device path from handle installed EFI HII Config Access protocol
+  // Check the Duplicated/Conflicted/Unknown input Args.
   //
-  Status = gBS->HandleProtocol (
-                 DriverHandle,
-                 &gEfiDevicePathProtocolGuid,
-                 (VOID **) &DevicePath
-                 );
-  if (EFI_ERROR (Status)) {
-    return NULL;
-  }
+  while (Arg.FlagStr != NULL) {
+    if (StrCmp (Arg.FlagStr, Name) == 0) {
 
-  DevicePathLength = GetDevicePathSize (DevicePath);
-  NameLength = StrLen (Name);
-  ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 
4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));
-  if (ConfigHdr == NULL) {
-    return NULL;
-  } 
+      if (CheckDuplicate & Arg.FlagID) {
+        RtCode = VarCheckDuplicate;
+        break;
+      }
 
-  String = ConfigHdr;
-  StrnCpy (String, L"GUID=", 6);
-  String += StrLen (L"GUID=");
+      if (CheckConflict & Arg.ConflictMask) {
+        RtCode = VarCheckConflict;
+        break;
+      }
 
-  //
-  // Append Guid converted to <HexCh>32
-  //
-  for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
-    String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
-  }
+      CheckDuplicate |= Arg.FlagID;
+      CheckConflict  |= Arg.ConflictMask;
+      break;
+    }
 
-  //
-  // Append L"&NAME="
-  //
-  StrnCpy (String, L"&NAME=", 7);
-  String += StrLen (L"&NAME=");
-  for (Index = 0; Index < NameLength ; Index++) {
-    String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);
+    Arg = CheckList[++Index];
   }
-  
-  //
-  // Append L"&PATH="
-  //
-  StrnCpy (String, L"&PATH=", 7);
-  String += StrLen (L"&PATH=");
-  for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; 
Index++) {
-    String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
+
+  if (Arg.FlagStr == NULL) {
+    RtCode = VarCheckUnknown;
   }
 
-  return (HiiToLower(ConfigHdr));
+  return RtCode;
 }
 
 /**
-  Get network physical device NIC information.
+  The notify function of create event when performing a manual config.
 
-  @param[in] Handle         The network physical device handle.
-  @param[out] NicAddr       NIC information.
+  @param[in]    Event        The event this notify function registered to.
+  @param[in]    Context      Pointer to the context data registered to the 
event.
 
-  @retval EFI_SUCCESS         Get NIC information successfully.
-**/                  
-EFI_STATUS
+**/
+VOID
 EFIAPI
-IfConfigGetNicMacInfo (
-  IN  EFI_HANDLE                    Handle,
-  OUT NIC_ADDR                      *NicAddr
-  )    
+IfConfigManualAddressNotify (
+  IN EFI_EVENT    Event,
+  IN VOID         *Context
+  )
 {
-  EFI_STATUS                    Status;
-  EFI_HANDLE                    MnpHandle;
-  EFI_SIMPLE_NETWORK_MODE       SnpMode;
-  EFI_MANAGED_NETWORK_PROTOCOL  *Mnp;
-
-  MnpHandle = NULL;
-  Mnp       = NULL;
-
-  Status = NetLibCreateServiceChild (
-             Handle,
-             gImageHandle, 
-             &gEfiManagedNetworkServiceBindingProtocolGuid,
-             &MnpHandle
-             );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  Status = gBS->HandleProtocol (
-                  MnpHandle,
-                  &gEfiManagedNetworkProtocolGuid,
-                  (VOID **) &Mnp
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
-
-  Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
-    goto ON_ERROR;
-  }
- 
-  NicAddr->Type    = (UINT16) SnpMode.IfType;
-  NicAddr->Len     = (UINT8) SnpMode.HwAddressSize;
-  CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);
-
-ON_ERROR:
-
-  NetLibDestroyServiceChild (
-    Handle,
-    gImageHandle, 
-    &gEfiManagedNetworkServiceBindingProtocolGuid,
-    MnpHandle
-    );
-
-  return Status;
-
+  *((BOOLEAN *) Context) = TRUE;
 }
 
+
 /**
-  Get network physical device NIC information.
+  Print MAC address.
 
-  @param[in] Handle         The network physical device handle.
-  @param[out] MediaPresentSupported
-                            Upon successful return, TRUE is media present 
-                            is supported.  FALSE otherwise.
-  @param[out] MediaPresent  Upon successful return, TRUE is media present 
-                            is enabled.  FALSE otherwise.
+  @param[in]    Node    The pointer of MAC address buffer.
+  @param[in]    Size    The size of MAC address buffer.
 
-  @retval EFI_SUCCESS       The operation was successful.
 **/
-EFI_STATUS
-EFIAPI
-IfConfigGetNicMediaStatus (
-  IN  EFI_HANDLE                    Handle,
-  OUT BOOLEAN                       *MediaPresentSupported,
-  OUT BOOLEAN                       *MediaPresent
-  )    
-                  
+VOID
+IfConfigPrintMacAddr (
+  IN UINT8     *Node,
+  IN UINT32    Size
+  )
 {
-  EFI_STATUS                    Status;
-  EFI_HANDLE                    MnpHandle;
-  EFI_SIMPLE_NETWORK_MODE       SnpMode;
-  EFI_MANAGED_NETWORK_PROTOCOL  *Mnp;
-
-  MnpHandle = NULL;
-  Mnp       = NULL;
-
-  Status = NetLibCreateServiceChild (
-             Handle,
-             gImageHandle, 
-             &gEfiManagedNetworkServiceBindingProtocolGuid,
-             &MnpHandle
-             );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
+  UINTN    Index;
 
-  Status = gBS->HandleProtocol (
-                  MnpHandle,
-                  &gEfiManagedNetworkProtocolGuid,
-                  (VOID **) &Mnp
-                  );
-  if (EFI_ERROR (Status)) {
-    goto ON_ERROR;
-  }
+  ASSERT (Size <= MACADDRMAXSIZE);
 
-  Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
-    goto ON_ERROR;
+  for (Index = 0; Index < Size; Index++) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);
+    if (Index + 1 < Size) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), 
gShellNetwork1HiiHandle);
+    }
   }
- 
-  *MediaPresentSupported = SnpMode.MediaPresentSupported;
-  *MediaPresent = SnpMode.MediaPresent;
 
-ON_ERROR:
+  ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), 
gShellNetwork1HiiHandle);
+}
 
-  NetLibDestroyServiceChild (
-    Handle,
-    gImageHandle, 
-    &gEfiManagedNetworkServiceBindingProtocolGuid,
-    MnpHandle
-    );
 
-  return Status;
+/**
+  The get current status of all handles.
 
-}
+  @param[in]   ImageHandle    The handle of  ImageHandle.
+  @param[in]   IfName         The pointer of  IfName(interface name).
+  @param[in]   IfList         The pointer of  IfList(interface list).
 
-/**
-  Get all Nic's information through HII service.
+  @retval EFI_SUCCESS    The get status processed successfully.
+  @retval others         The get status process failed.
 
-  @retval EFI_SUCCESS         All the nic information is collected.
 **/
 EFI_STATUS
-EFIAPI
-IfconfigGetAllNicInfoByHii (
-  VOID
+IfConfigGetInterfaceInfo (
+  IN EFI_HANDLE    ImageHandle,
+  IN CHAR16        *IfName,
+  IN LIST_ENTRY    *IfList
   )
 {
-  EFI_STATUS                    Status;
-  EFI_HANDLE                    *Handles;
-  UINTN                         HandleCount;
-  CHAR16                        *ConfigResp;
-  CHAR16                        *ConfigHdr;
-  UINTN                         Index;
-  CHAR16                        *AccessProgress;
-  CHAR16                        *AccessResults;
-  UINTN                         BufferSize;
-  NIC_INFO                      *NicInfo;
-  NIC_IP4_CONFIG_INFO           *NicConfigRequest;
-  NIC_IP4_CONFIG_INFO           *NicConfig;
-  CHAR16                        *String;
-  UINTN                         Length;
-  UINTN                         Offset;
-  EFI_HANDLE                    ChildHandle;
-
-  AccessResults    = NULL;
-  ConfigHdr        = NULL;
-  ConfigResp       = NULL;
-  NicConfigRequest = NULL;
-  NicInfo          = NULL;
-
-  InitializeListHead (&NicInfoList);
+  EFI_STATUS                       Status;
+  UINTN                            HandleIndex;
+  UINTN                            HandleNum;
+  EFI_HANDLE                       *HandleBuffer;
+  EFI_IP4_CONFIG2_PROTOCOL         *Ip4Cfg2;
+  EFI_IP4_CONFIG2_INTERFACE_INFO   *IfInfo;
+  IFCONFIG_INTERFACE_CB            *IfCb;
+  UINTN                            DataSize;
 
-  //
-  // Check if HII Config Routing protocol available.
-  //
-  Status = gBS->LocateProtocol (
-                &gEfiHiiConfigRoutingProtocolGuid,
-                NULL,
-                (VOID**)&mHiiConfigRouting
-                );
-  if (EFI_ERROR (Status)) {
-    return EFI_NOT_FOUND;
-  }
+  HandleBuffer = NULL;
+  HandleNum    = 0;
+
+  IfInfo       = NULL;
+  IfCb         = NULL;
 
   //
-  // Locate all network device handles
+  // Locate all the handles with ip4 service binding protocol.
   //
   Status = gBS->LocateHandleBuffer (
-                 ByProtocol,
-                 &gEfiManagedNetworkServiceBindingProtocolGuid,
-                 NULL,
-                 &HandleCount,
-                 &Handles
+                  ByProtocol,
+                  &gEfiIp4ServiceBindingProtocolGuid,
+                  NULL,
+                  &HandleNum,
+                  &HandleBuffer
                  );
-  if (EFI_ERROR (Status) || (HandleCount == 0)) {
-    return EFI_NOT_FOUND;
+  if (EFI_ERROR (Status) || (HandleNum == 0)) {
+    return EFI_ABORTED;
   }
 
-  for (Index = 0; Index < HandleCount; Index++) {
-    Status = GetChildHandle (Handles[Index], &ChildHandle);
+  //
+  // Enumerate all handles that installed with ip4 service binding protocol.
+  //
+  for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
+    IfCb      = NULL;
+    IfInfo    = NULL;
+    DataSize  = 0;
+
+    //
+    // Ip4config protocol and ip4 service binding protocol are installed
+    // on the same handle.
+    //
+    ASSERT (HandleBuffer != NULL);
+    Status = gBS->HandleProtocol (
+                    HandleBuffer[HandleIndex],
+                    &gEfiIp4Config2ProtocolGuid,
+                    (VOID **) &Ip4Cfg2
+                    );
+
     if (EFI_ERROR (Status)) {
-      //
-      // If failed to get Child handle, try NIC controller handle for 
back-compatibility.
-      //
-      ChildHandle = Handles[Index];
+      goto ON_ERROR;
     }
     //
-    // Construct configuration request string header
+    // Get the interface information size.
     //
-    ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, 
EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
-    if (ConfigHdr != NULL) {
-      Length = StrLen (ConfigHdr);
-    } else {
-      Length = 0;
+    Status = Ip4Cfg2->GetData (
+                       Ip4Cfg2,
+                       Ip4Config2DataTypeInterfaceInfo,
+                       &DataSize,
+                       NULL
+                       );
+
+    if (Status != EFI_BUFFER_TOO_SMALL) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+      goto ON_ERROR;
     }
-    ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * 
sizeof (CHAR16));
-    if (ConfigResp == NULL) {
+
+    IfInfo = AllocateZeroPool (DataSize);
+
+    if (IfInfo == NULL) {
       Status = EFI_OUT_OF_RESOURCES;
       goto ON_ERROR;
     }
-    if (ConfigHdr != NULL) {
-      StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 
- 1);
-    }
- 
     //
-    // Append OFFSET/WIDTH pair
+    // Get the interface info.
     //
-    String = ConfigResp + Length;
-    Offset = 0;
-    AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+    Status = Ip4Cfg2->GetData (
+                       Ip4Cfg2,
+                       Ip4Config2DataTypeInterfaceInfo,
+                       &DataSize,
+                       IfInfo
+                       );
 
-    NicInfo = AllocateZeroPool (sizeof (NIC_INFO));
-    if (NicInfo == NULL) {
-      Status = EFI_OUT_OF_RESOURCES;
+    if (EFI_ERROR (Status)) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
       goto ON_ERROR;
     }
-    NicInfo->Handle       = Handles[Index];
-
     //
-    // Get network physical devcie MAC information
+    // Check the interface name if required.
     //
-    IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);
-    if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {
-      UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);
-    } else {
-      UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);
+    if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
+      FreePool (IfInfo);
+      continue;
     }
 
+    DataSize = 0;
     //
-    // Get media status
+    // Get the size of dns server list.
     //
-    IfConfigGetNicMediaStatus (Handles[Index], 
&NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);
+    Status = Ip4Cfg2->GetData (
+                       Ip4Cfg2,
+                       Ip4Config2DataTypeDnsServer,
+                       &DataSize,
+                       NULL
+                       );
+
+    if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+      goto ON_ERROR;
+    }
 
-    NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
-    if (NicConfigRequest == NULL) {
+    IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);
+
+    if (IfCb == NULL) {
       Status = EFI_OUT_OF_RESOURCES;
       goto ON_ERROR;
     }
 
+    IfCb->NicHandle = HandleBuffer[HandleIndex];
+    IfCb->IfInfo    = IfInfo;
+    IfCb->IfCfg     = Ip4Cfg2;
+    IfCb->DnsCnt    = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));
+
     //
-    // Get network parameters by HII service
+    // Get the dns server list if has.
     //
-    Status = mHiiConfigRouting->ExtractConfig (
-                                  mHiiConfigRouting,
-                                  ConfigResp,
-                                  &AccessProgress,
-                                  &AccessResults
-                                  );
-    if (!EFI_ERROR (Status)) {
-      BufferSize = NIC_ITEM_CONFIG_SIZE;
-      Status = mHiiConfigRouting->ConfigToBlock (
-                                    mHiiConfigRouting,
-                                    AccessResults,
-                                    (UINT8 *) NicConfigRequest,
-                                    &BufferSize,
-                                    &AccessProgress
-                                    );
-      if (!EFI_ERROR (Status)) {
-        BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof 
(EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;
-        NicConfig = AllocateZeroPool (BufferSize);
-        if (NicConfig == NULL) {
-          Status = EFI_OUT_OF_RESOURCES;
-          goto ON_ERROR;
-        }
-        CopyMem (NicConfig, NicConfigRequest, BufferSize);
-
-        //
-        // If succeeds to get NIC configuration, fix up routetable pointer.
-        //
-        NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) 
(&NicConfig->Ip4Info + 1);
-        NicInfo->ConfigInfo   = NicConfig;
-
-      } else {
-        NicInfo->ConfigInfo   = NULL;
+    if (DataSize > 0) {
+
+      Status = Ip4Cfg2->GetData (
+                         Ip4Cfg2,
+                         Ip4Config2DataTypeDnsServer,
+                         &DataSize,
+                         IfCb->DnsAddr
+                         );
+
+      if (EFI_ERROR (Status)) {
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+        goto ON_ERROR;
       }
-
-      FreePool (AccessResults);
-
-    } else {
-      NicInfo->ConfigInfo   = NULL;
     }
 
     //
-    // Add the Nic's info to the global NicInfoList.
+    // Get the config policy.
     //
-    InsertTailList (&NicInfoList, &NicInfo->Link);
+    DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+    Status   = Ip4Cfg2->GetData (
+                         Ip4Cfg2,
+                         Ip4Config2DataTypePolicy,
+                         &DataSize,
+                         &IfCb->Policy
+                         );
+
+    if (EFI_ERROR (Status)) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+      goto ON_ERROR;
+    }
 
-    FreePool (NicConfigRequest);
-    FreePool (ConfigResp);
-    FreePool (ConfigHdr);
+
+    InsertTailList (IfList, &IfCb->Link);
+
+    if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
+      //
+      // Only need the appointed interface, keep the allocated buffer.
+      //
+      IfCb   = NULL;
+      IfInfo = NULL;
+      break;
+    }
   }
 
-  FreePool (Handles);
+  if (HandleBuffer != NULL) {
+    FreePool (HandleBuffer);
+  }
 
   return EFI_SUCCESS;
- 
+
 ON_ERROR:
-  if (AccessResults != NULL) {
-    FreePool (AccessResults);
-  }
-  if (NicConfigRequest != NULL) {
-    FreePool (NicConfigRequest);
-  }
-  if (NicInfo != NULL) {
-    FreePool (NicInfo);
-  }
-  if (ConfigResp != NULL) {
-    FreePool (ConfigResp);
-  }
-  if (ConfigHdr != NULL) {
-    FreePool (ConfigHdr);
+
+  if (IfInfo != NULL) {
+    FreePool (IfInfo);
   }
 
-  FreePool (Handles);
+  if (IfCb != NULL) {
+    FreePool (IfCb);
+  }
 
   return Status;
 }
 
 /**
-  Set the address for the specified nic by HII service.
+  The list process of the IfConfig6 application.
 
-  @param[in] NicInfo    A pointer to the NIC_INFO of the Nic to be configured.
-  @param[in] Config     The command line arguments for the set operation.
+  @param[in]   IfList    The pointer of IfList(interface list).
+
+  @retval EFI_SUCCESS    The IfConfig6 list processed successfully.
+  @retval others         The IfConfig6 list process failed.
 
-  @retval EFI_SUCCESS         The address set operation is done.
 **/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddrByHii (
-  IN CONST NIC_INFO                 *NicInfo,
-  IN CONST NIC_IP4_CONFIG_INFO      *Config
+EFI_STATUS
+IfConfigShowInterfaceInfo (
+  IN LIST_ENTRY    *IfList
   )
 {
-  EFI_STATUS                    Status;
-  SHELL_STATUS                  ShellStatus;
-  NIC_IP4_CONFIG_INFO           *NicConfig;
-  CHAR16                        *ConfigResp;
-  CHAR16                        *ConfigHdr;
-  CHAR16                        *AccessProgress;
-  CHAR16                        *AccessResults;
-  CHAR16                        *String;
-  UINTN                         Length;
-  UINTN                         Offset;
-  EFI_HANDLE                    ChildHandle;
-
-  AccessResults  = NULL;
-  ConfigHdr      = NULL;
-  ConfigResp     = NULL;
-  NicConfig      = NULL;
-  ShellStatus    = SHELL_SUCCESS;
-
-  Status = GetChildHandle (NicInfo->Handle, &ChildHandle);
-  if (EFI_ERROR (Status)) {
-    //
-    // If failed to get Child handle, try NIC controller handle for 
back-compatibility
-    //
-    ChildHandle = NicInfo->Handle;
-  }
-  //
-  // Construct config request string header
-  //
-  ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, 
EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
-  if (ConfigHdr != NULL) {
-    Length = StrLen (ConfigHdr);
-  } else {
-    ShellStatus = SHELL_OUT_OF_RESOURCES;
-    goto ON_EXIT;
-  }
-  ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * 
sizeof (CHAR16));
-  if (ConfigResp == NULL) {
-    ShellStatus = SHELL_OUT_OF_RESOURCES;
-    goto ON_EXIT;
-  }
-  if (ConfigHdr != NULL) {
-    StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 
1);
-  }
+  EFI_STATUS                Status;
+  LIST_ENTRY                *Entry;
+  IFCONFIG_INTERFACE_CB     *IfCb;
+  EFI_IPv4_ADDRESS          Gateway;
+  UINT32                    Index;
 
-  NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
-  if (NicConfig == NULL) {
-    ShellStatus = SHELL_OUT_OF_RESOURCES;
-    goto ON_EXIT;
-  }
+  Entry  = IfList->ForwardLink;
+  Status = EFI_SUCCESS;
 
-  if (Config != NULL) {
-    CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof 
(EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);
+
+  if (IsListEmpty (IfList)) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
   }
 
   //
-  // Append OFFSET/WIDTH pair
+  // Go through the interface list.
   //
-  String = ConfigResp + Length;
-  Offset = 0;
-  AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+  while (Entry != IfList) {
+    IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
 
-  //
-  // Call HII helper function to generate configuration string
-  //
-  Status = mHiiConfigRouting->BlockToConfig (
-                                mHiiConfigRouting,
-                                ConfigResp,
-                                (UINT8 *) NicConfig,
-                                NIC_ITEM_CONFIG_SIZE,
-                                &AccessResults,
-                                &AccessProgress
-                                );
-  if (EFI_ERROR (Status)) {
-    ShellStatus = SHELL_NOT_FOUND;
-    goto ON_EXIT;
-  }
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), 
gShellNetwork1HiiHandle);
 
-  //
-  // Set IP setting by HII servie
-  //
-  Status = mHiiConfigRouting->RouteConfig (
-                                mHiiConfigRouting,
-                                AccessResults,
-                                &AccessProgress
-                                );
-  if (EFI_ERROR(Status)) {
-    ShellStatus = SHELL_ACCESS_DENIED;
-  }
+    //
+    // Print interface name.
+    //
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), 
gShellNetwork1HiiHandle, IfCb->IfInfo->Name);
 
-ON_EXIT:
-  SHELL_FREE_NON_NULL(AccessResults);
-  SHELL_FREE_NON_NULL(NicConfig);
-  SHELL_FREE_NON_NULL(ConfigResp);
-  SHELL_FREE_NON_NULL(ConfigHdr);
+    //
+    // Print interface config policy.
+    //
+    if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INFO_POLICY_AUTO), gShellNetwork1HiiHandle);
+    } else {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);
+    }
 
-  return ShellStatus;
-}
+    //
+    // Print mac address of the interface.
+    //
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);
 
-/**
-  The callback function for the Arp address resolved event.
+    IfConfigPrintMacAddr (
+      IfCb->IfInfo->HwAddress.Addr,
+      IfCb->IfInfo->HwAddressSize
+      );
 
-  @param[in] Event    The event this function is registered to.
-  @param[in] Context  The context registered to the event.
-**/
-VOID
-EFIAPI
-IfconfigOnArpResolved (
-  IN EFI_EVENT                  Event,
-  IN VOID                       *Context
-  )
-{
-  ARP_REQUEST                   *Request;
-  UINT8                         Index;
+    //
+    // Print IPv4 address list of the interface.
+    //
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);
 
-  Request = (ARP_REQUEST *) Context;
-  ASSERT (Request != NULL);
 
-  Request->Duplicate = FALSE;
-  
-  if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, 
Request->MacLen)) {
     ShellPrintHiiEx(
       -1, 
       -1, 
       NULL,
-      STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
-      gShellNetwork1HiiHandle, 
-      L"Already Configured",
-      (UINTN)Request->DestIp.v4.Addr[0],
-      (UINTN)Request->DestIp.v4.Addr[1],
-      (UINTN)Request->DestIp.v4.Addr[2],
-      (UINTN)Request->DestIp.v4.Addr[3]
+      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), 
+      gShellNetwork1HiiHandle,
+      (UINTN)IfCb->IfInfo->StationAddress.Addr[0],
+      (UINTN)IfCb->IfInfo->StationAddress.Addr[1],
+      (UINTN)IfCb->IfInfo->StationAddress.Addr[2],
+      (UINTN)IfCb->IfInfo->StationAddress.Addr[3]
       );
-    ArpResolved = TRUE;
-    return;
-  }
-  
-  for (Index = 0; Index < Request->MacLen; Index++) {
-    if (Request->DestMac.Addr[Index] != 0) {
-      Request->Duplicate = TRUE;
-    }
-  }
 
-  if (Request->Duplicate) {
+    //
+    // Print subnet mask list of the interface.
+    //
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
+
+
     ShellPrintHiiEx(
-    -1,
-    -1,
-    NULL,
-    STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR), 
-    gShellNetwork1HiiHandle, 
-    (UINTN)Request->DestMac.Addr[0], 
-    (UINTN)Request->DestMac.Addr[1], 
-    (UINTN)Request->DestMac.Addr[2],
-    (UINTN)Request->DestMac.Addr[3], 
-    (UINTN)Request->DestMac.Addr[4], 
-    (UINTN)Request->DestMac.Addr[5]
-    );    
-  }
+      -1, 
+      -1, 
+      NULL,
+      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), 
+      gShellNetwork1HiiHandle,
+      (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
+      (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
+      (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],
+      (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]
+      );
 
-  ArpResolved = TRUE;
-  return ;
-}
+    //
+    // Print default gateway of the interface.
+    //
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);
 
-/**
-  Check whether the address to be configured conflicts with other hosts.
+    ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
+    
+    for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+      if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, 
&mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
+          (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask   , 
&mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
+        CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, 
sizeof (EFI_IPv4_ADDRESS));
+      }
+    }    
 
-  @param[in] NicInfo    The pointer to the NIC_INFO of the Nic to be 
configured.
-  @param[in] IpAddr     The IPv4 address to be configured to the Nic.
+    ShellPrintHiiEx(
+      -1, 
+      -1, 
+      NULL,
+      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), 
+      gShellNetwork1HiiHandle,
+      (UINTN)Gateway.Addr[0],
+      (UINTN)Gateway.Addr[1],
+      (UINTN)Gateway.Addr[2],
+      (UINTN)Gateway.Addr[3]
+      );
+      
+    //
+    // Print route table entry.
+    //
+    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), 
gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);
 
-  @return TRUE      Some other host already uses the IpAddr.
-  @return FALSE     The address is unused.
-**/
-BOOLEAN
-EFIAPI
-IfconfigIsIpDuplicate (
-  IN  NIC_INFO                  *NicInfo,
-  IN  IP4_ADDR                  IpAddr
-  )
-{
-  EFI_ARP_PROTOCOL              *Arp;
-  EFI_ARP_CONFIG_DATA           ArpCfgData;
-  EFI_HANDLE                    ArpHandle;
-  ARP_REQUEST                   Request;
-  EFI_STATUS                    Status;
-
-  Arp           = NULL;
-  ArpHandle     = NULL;
-  ZeroMem (&Request, sizeof (ARP_REQUEST));
-
-  Status = NetLibCreateServiceChild (
-             NicInfo->Handle,
-             gImageHandle, 
-             &gEfiArpServiceBindingProtocolGuid,
-             &ArpHandle
-             );
+    for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
 
-  if (EFI_ERROR (Status)) {
-    return FALSE;
-  }
+      ShellPrintHiiEx(
+        -1, 
+        -1, 
+        NULL,
+        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
+        gShellNetwork1HiiHandle, 
+        L"Subnet ",
+        (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]
+        );
 
-  Status = gBS->OpenProtocol (
-                 ArpHandle,
-                 &gEfiArpProtocolGuid,
-                 (VOID**)&Arp,
-                 gImageHandle,
-                 ArpHandle,
-                 EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                 );
+      ShellPrintHiiEx(
+        -1, 
+        -1, 
+        NULL,
+        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
+        gShellNetwork1HiiHandle, 
+        L"Netmask",
+        (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]
+        );
 
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
+      ShellPrintHiiEx(
+        -1, 
+        -1, 
+        NULL,
+        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
+        gShellNetwork1HiiHandle, 
+        L"Gateway",
+        (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],
+        (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]
+        );
+    }
 
-  //
-  // Set up the Arp requests
-  //
-  EFI_IP4_TO_U32 (Request.DestIp.v4)  = IpAddr;
-  EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;
-  Request.LocalMac                    = NicInfo->NicAddress.MacAddr;
-  Request.MacLen                      = NicInfo->NicAddress.Len;
-  
-  Status = gBS->CreateEvent (
-                 EVT_NOTIFY_SIGNAL,
-                 TPL_CALLBACK,
-                 IfconfigOnArpResolved,
-                 (VOID *) &Request,
-                 &Request.OnResolved
-                 );
-  
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
-  
-  ArpCfgData.SwAddressType    = 0x0800;
-  ArpCfgData.SwAddressLength  = 4;
-  ArpCfgData.StationAddress   = &Request.LocalIp;
-  ArpCfgData.EntryTimeOut     = 0;
-  ArpCfgData.RetryCount       = 3;
-  ArpCfgData.RetryTimeOut     = 0;
-  
-  Status = Arp->Configure (Arp, &ArpCfgData);
-  
-  if (EFI_ERROR (Status)) {
-    goto ON_EXIT;
-  }
+    //
+    // Print dns server addresses list of the interface if has.
+    //
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);
 
-  Status = Arp->Request (
-                  Arp,
-                  &Request.DestIp,
-                  Request.OnResolved,
-                  &Request.DestMac
-                  );
-  
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
-    goto ON_EXIT;
-  }
+    for (Index = 0; Index < IfCb->DnsCnt; Index++) {
+      ShellPrintHiiEx(
+        -1, 
+        -1, 
+        NULL,
+        STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY), 
+        gShellNetwork1HiiHandle,
+        (UINTN) IfCb->DnsAddr[Index].Addr[0],
+        (UINTN) IfCb->DnsAddr[Index].Addr[1],
+        (UINTN) IfCb->DnsAddr[Index].Addr[2],
+        (UINTN) IfCb->DnsAddr[Index].Addr[3]
+        );
 
-  while (!ArpResolved) {
-    
-  }
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), 
gShellNetwork1HiiHandle);
+    }
 
-ON_EXIT:
-  if (Request.OnResolved != NULL) {
-    gBS->CloseEvent (Request.OnResolved);
-  }
+    //
+    // Print route table of the interface if has.
+    //
 
-  NetLibDestroyServiceChild (
-    NicInfo->Handle, 
-    gImageHandle, 
-    &gEfiArpServiceBindingProtocolGuid, 
-    ArpHandle
-    );
+    Entry = Entry->ForwardLink;
 
-  return Request.Duplicate;
+  }
+  ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), 
gShellNetwork1HiiHandle);
+  return EFI_SUCCESS;
 }
 
 /**
-  The callback function for the timer event used to get map.
+  The clean process of the IfConfig6 application.
+
+  @param[in]   IfList    The pointer of IfList(interface list).
+
+  @retval EFI_SUCCESS    The IfConfig6 clean processed successfully.
+  @retval others         The IfConfig6 clean process failed.
 
-  @param[in] Event    The event this function is registered to.
-  @param[in] Context  The context registered to the event.
 **/
-VOID
-EFIAPI
-TimeoutToGetMap (
-  IN EFI_EVENT      Event,
-  IN VOID           *Context
+EFI_STATUS
+IfConfigClearInterfaceInfo (
+  IN LIST_ENTRY    *IfList
   )
 {
-  mTimeout = TRUE;
-  return ;
+  return EFI_SUCCESS;
 }
 
 /**
-  Create an IP child, use it to start the auto configuration, then destroy it.
+  The set process of the IfConfig6 application.
+
+  @param[in]   IfList    The pointer of IfList(interface list).
+  @param[in]   VarArg    The pointer of ARG_LIST(Args with "-s" option).
 
-  @param[in] NicInfo    The pointer to the NIC_INFO of the Nic to be 
configured.
+  @retval EFI_SUCCESS    The IfConfig6 set processed successfully.
+  @retval others         The IfConfig6 set process failed.
 
-  @retval EFI_SUCCESS         The configuration is done.
 **/
 EFI_STATUS
-EFIAPI
-IfconfigStartIp4(
-  IN NIC_INFO                   *NicInfo
+IfConfigSetInterfaceInfo (
+  IN LIST_ENTRY    *IfList,
+  IN ARG_LIST      *VarArg
   )
 {
-  EFI_IP4_PROTOCOL              *Ip4;
-  EFI_HANDLE                    Ip4Handle;
-  EFI_HANDLE                    TimerToGetMap;
-  EFI_IP4_CONFIG_DATA           Ip4ConfigData;
-  EFI_IP4_MODE_DATA             Ip4Mode;
-  EFI_STATUS                    Status;
 
+  EFI_STATUS                       Status;
+  IFCONFIG_INTERFACE_CB            *IfCb;
+  VAR_CHECK_CODE                   CheckCode;
+  EFI_EVENT                        TimeOutEvt;
+  EFI_EVENT                        MappedEvt;
+  BOOLEAN                          IsAddressOk;
+
+  EFI_IP4_CONFIG2_POLICY           Policy;
+  EFI_IP4_CONFIG2_MANUAL_ADDRESS   ManualAddress;
+  UINTN                            DataSize;
+  EFI_IPv4_ADDRESS                 Gateway;
+  EFI_IPv4_ADDRESS                 *Dns;
+  ARG_LIST                         *Tmp;
+  UINTN                            Index;
+
+  Dns = NULL;
+
+  if (IsListEmpty (IfList)) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
+    return EFI_INVALID_PARAMETER;
+  }
   //
-  // Get the Ip4ServiceBinding Protocol
+  // Make sure to set only one interface each time.
   //
-  Ip4Handle     = NULL;
-  Ip4           = NULL;
-  TimerToGetMap = NULL;
+  IfCb   = BASE_CR (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
+  Status = EFI_SUCCESS;
 
-  ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), 
gShellNetwork1HiiHandle);
+  //
+  // Initialize check list mechanism.
+  //
+  CheckCode = IfConfigRetriveCheckListByName(
+                NULL,
+                NULL,
+                TRUE
+                );
 
-  Status = NetLibCreateServiceChild (
-             NicInfo->Handle,
-             gImageHandle,
-             &gEfiIp4ServiceBindingProtocolGuid,
-             &Ip4Handle
-             );
 
+  //
+  // Create events & timers for asynchronous settings.
+  //
+  Status = gBS->CreateEvent (
+                  EVT_TIMER,
+                  TPL_CALLBACK,
+                  NULL,
+                  NULL,
+                  &TimeOutEvt
+                  );
   if (EFI_ERROR (Status)) {
-    return Status;
+    goto ON_EXIT;
   }
 
-  Status = gBS->OpenProtocol (
-                 Ip4Handle,
-                 &gEfiIp4ProtocolGuid,
-                 (VOID **) &Ip4,
-                 NicInfo->Handle,
-                 gImageHandle,
-                 EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                 );
-
+  Status = gBS->CreateEvent (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_NOTIFY,
+                  IfConfigManualAddressNotify,
+                  &IsAddressOk,
+                  &MappedEvt
+                  );
   if (EFI_ERROR (Status)) {
     goto ON_EXIT;
   }
 
-  Ip4ConfigData.DefaultProtocol          = EFI_IP_PROTO_ICMP;
-  Ip4ConfigData.AcceptAnyProtocol        = FALSE;
-  Ip4ConfigData.AcceptIcmpErrors         = FALSE;
-  Ip4ConfigData.AcceptBroadcast          = FALSE;
-  Ip4ConfigData.AcceptPromiscuous        = FALSE;
-  Ip4ConfigData.UseDefaultAddress        = TRUE;
-  ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
-  ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-  Ip4ConfigData.TypeOfService            = 0;
-  Ip4ConfigData.TimeToLive               = 1;
-  Ip4ConfigData.DoNotFragment            = FALSE;
-  Ip4ConfigData.RawData                  = FALSE;
-  Ip4ConfigData.ReceiveTimeout           = 0;
-  Ip4ConfigData.TransmitTimeout          = 0;
-
-  Status = Ip4->Configure (Ip4, &Ip4ConfigData);
-
-  if (Status == EFI_NO_MAPPING) {
-    mTimeout = FALSE;
-    Status  = gBS->CreateEvent (
-                    EVT_NOTIFY_SIGNAL | EVT_TIMER,
-                    TPL_CALLBACK,
-                    TimeoutToGetMap,
-                    NULL,
-                    &TimerToGetMap
-                    );
-    
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
-    
-    Status = gBS->SetTimer (
-                   TimerToGetMap,
-                   TimerRelative,
-                   MultU64x32 (SecondsToNanoSeconds, 5)
-                   );
-    
-    if (EFI_ERROR (Status)) {
-      goto ON_EXIT;
-    }
+  //
+  // Parse the setting variables.
+  //
+  while (VarArg != NULL) {
+     //
+     // Check invalid parameters (duplication & unknown & conflict).
+     //
+    CheckCode = IfConfigRetriveCheckListByName(
+                  mSetCheckList,
+                  VarArg->Arg,
+                  FALSE
+                  );
 
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), 
gShellNetwork1HiiHandle);
-    
-    while (!mTimeout) {
-      Ip4->Poll (Ip4);
-  
-      if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) && 
-          Ip4Mode.IsConfigured) {       
-        break;
+    if (VarCheckOk != CheckCode) {
+      switch (CheckCode) {
+        case VarCheckDuplicate:
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+          break;
+
+        case VarCheckConflict:
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+          break;
+
+        case VarCheckUnknown:
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+          break;
+
+        default:
+          break;
       }
-    }    
-  }
 
-  Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);
+      VarArg = VarArg->Next;
+      continue;   
+    }
 
-  if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {
-    ShellPrintHiiEx(
-      -1, 
-      -1, 
-      NULL,
-      STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
-      gShellNetwork1HiiHandle, 
-      L"Default",
-      (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],
-      (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],
-      (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],
-      (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]
-      );
-  }
-  
-ON_EXIT: 
+    //
+    // Process valid variables.
+    //
+    if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
+      //
+      // Set automaic config policy
+      //
+      Policy = Ip4Config2PolicyDhcp;
+      Status = IfCb->IfCfg->SetData (
+                              IfCb->IfCfg,
+                              Ip4Config2DataTypePolicy,
+                              sizeof (EFI_IP4_CONFIG2_POLICY),
+                              &Policy
+                              );
+
+      if (EFI_ERROR(Status)) {
+        goto ON_EXIT;
+      }
 
-  if (EFI_ERROR (Status)) {
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);
-  }
+      VarArg= VarArg->Next;    
 
-  if (TimerToGetMap != NULL) {
-    gBS->SetTimer (TimerToGetMap, TimerCancel, 0);
-    gBS->CloseEvent (TimerToGetMap);
-  }
+    } else if (StrCmp (VarArg->Arg, L"static") == 0) {
+      //
+      // Set manual config policy.
+      //
+      Policy = Ip4Config2PolicyStatic;
+      Status = IfCb->IfCfg->SetData (
+                              IfCb->IfCfg,
+                              Ip4Config2DataTypePolicy,
+                              sizeof (EFI_IP4_CONFIG2_POLICY),
+                              &Policy
+                              );
+
+      if (EFI_ERROR(Status)) {
+        goto ON_EXIT;
+      }
 
-  NetLibDestroyServiceChild (
-    NicInfo->Handle,
-    gImageHandle,
-    &gEfiIp4ServiceBindingProtocolGuid,
-    Ip4Handle
-    );
-  
-  return Status;
-}
+      VarArg= VarArg->Next;   
 
-/**
-  Set the address for the nic specified by the params.
+      ZeroMem (&ManualAddress, sizeof (ManualAddress));
+    
+      //
+      // Get manual IP address.
+      //
+      Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
+      if (EFI_ERROR(Status)) {
+        goto ON_EXIT;
+      }
 
-  @param[in] Argc       The count of the passed in Params.
-  @param[in] Params     The command line arguments for the set operation.
+      //
+      // Get subnetmask.
+      //    
+      VarArg = VarArg->Next;
+      Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
+      if (EFI_ERROR(Status)) {
+        goto ON_EXIT;
+      }
 
-  @retval EFI_SUCCESS   The address set operation is done.
-  @return               Some error occurs.
-**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddr (
-  IN UINTN                      Argc,
-  IN CONST CHAR16               *Params
-  )
-{
-  NIC_IP4_CONFIG_INFO           *Config;
-  NIC_IP4_CONFIG_INFO           *OldConfig;
-  EFI_IP_ADDRESS                Ip;
-  EFI_IP_ADDRESS                Mask;
-  EFI_IP_ADDRESS                Gateway;
-  NIC_INFO                      *Info;
-  BOOLEAN                       Permanent;
-  SHELL_STATUS                  ShellStatus;
-  CONST CHAR16                  *Walker;
-  CHAR16                        *Temp;
-  CONST CHAR16                  *DhcpTemp;
-  CONST CHAR16                  *StaticTemp;
-  CONST CHAR16                  *PermTemp;
-  UINT32                        NetworkBytes1;
-  UINT32                        NetworkBytes2;
-  EFI_STATUS                    Status;
-
-  Walker  = Params;
-  Temp    = NULL;
-  Temp    = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
-  Info    = IfconfigFindNicByName (Temp);
-
-  if (Info == NULL) {
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);
-    return SHELL_NOT_FOUND;
-  }
+      //
+      // Get gateway.
+      //
+      VarArg = VarArg->Next;
+      Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
+      if (EFI_ERROR(Status)) {
+        goto ON_EXIT;
+      }
+      
+      IsAddressOk = FALSE;
+
+      Status = IfCb->IfCfg->RegisterDataNotify (
+                              IfCb->IfCfg,
+                              Ip4Config2DataTypeManualAddress,
+                              MappedEvt
+                              );
+      if (EFI_ERROR (Status)) {
+        goto ON_EXIT;
+      }
 
-  Walker  += StrLen(Temp) + 1;
-  FreePool(Temp);
-  Temp = NULL;
-  Temp    = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" 
")==NULL?0:StrStr(Walker, L" ")-Walker);
+      DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);
 
-  Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof 
(EFI_IP4_ROUTE_TABLE));
-  if (Config == NULL) {
-    return SHELL_OUT_OF_RESOURCES;
-  }
 
-  Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);
+      Status = IfCb->IfCfg->SetData (
+                              IfCb->IfCfg,
+                              Ip4Config2DataTypeManualAddress,
+                              DataSize,
+                              &ManualAddress
+                              );
 
-  OldConfig = Info->ConfigInfo;
-  Permanent   = FALSE;
-  ShellStatus = SHELL_INVALID_PARAMETER;
+      if (Status == EFI_NOT_READY) {
+        gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);
 
-  DhcpTemp = DhcpString;
-  StaticTemp = StaticString;
-  
-  if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {
-    //
-    // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 
DHCP permanent
-    //
-    if ((Argc != 2) && (Argc!= 3)) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ifconfig", Temp);  
-      ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
-      goto ON_EXIT;
-    }
+        while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
+          if (IsAddressOk) {
+            Status = EFI_SUCCESS;
+            break;
+          }
+        }
+      }
 
-    if (Argc == 3) {
-      Walker  += StrLen(Temp) + 1;
-      FreePool(Temp);
-      Temp    = NULL;
-      Temp    = StrnCatGrow(&Temp, NULL, Walker, 0);
+      IfCb->IfCfg->UnregisterDataNotify (
+                     IfCb->IfCfg,
+                     Ip4Config2DataTypeManualAddress,
+                     MappedEvt
+                     );
 
-      PermTemp = PermanentString;
-      if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
-        ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), 
gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");  
-        ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+      if (EFI_ERROR (Status)) {
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_MAN_HOST), gShellNetwork1HiiHandle, Status);
         goto ON_EXIT;
       }
 
-      Permanent = TRUE;
-    }
+      //
+      // Set gateway.
+      //
+      DataSize = sizeof (EFI_IPv4_ADDRESS);
 
-    if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&
-        (OldConfig->Permanent == Permanent)) {
 
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);
-      ShellStatus = SHELL_ALREADY_STARTED;
-      goto ON_EXIT;
-    }
+      Status = IfCb->IfCfg->SetData (
+                              IfCb->IfCfg,
+                              Ip4Config2DataTypeGateway,
+                              DataSize,
+                              &Gateway
+                              );
+      VarArg = VarArg->Next;
+      
+    } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
+      //
+      // Get DNS addresses.
+      //
+      VarArg = VarArg->Next;
+      Tmp    = VarArg;
+      Index  = 0;
+      while (Tmp != NULL) {
+        Index ++;
+        Tmp = Tmp->Next;
+      }
 
-    Config->Source = IP4_CONFIG_SOURCE_DHCP;
-  } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {
-    //
-    // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
-    // eth0 static IP NETMASK GATEWAY permanent 
-    //
-    if ((Argc != 5) && (Argc != 6)) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ifconfig", Temp);  
-      ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
-      goto ON_EXIT;
-    }
+      Dns   = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
+      Tmp   = VarArg;
+      Index = 0;
+      while (Tmp != NULL) {
+        Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
+        if (EFI_ERROR(Status)) {
+          goto ON_EXIT;
+        }
+        Index ++;
+        Tmp = Tmp->Next;
+      }
+      
+      VarArg = Tmp;
 
-    Walker  += StrLen(Temp) + 1;
-    FreePool(Temp);
-    Temp    = NULL;
-    Temp    = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
+      //
+      // Set DNS addresses.
+      //
+      DataSize = Index * sizeof (EFI_IPv4_ADDRESS);
 
-    if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), 
gShellNetwork1HiiHandle, Temp);
-      ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
-      goto ON_EXIT;
-    }
 
-    Walker  += StrLen(Temp) + 1;
-    FreePool(Temp);
-    Temp    = NULL;
-    Temp    = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
-    if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), 
gShellNetwork1HiiHandle, Temp);
-      ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
-      goto ON_EXIT;
-    }
+      Status = IfCb->IfCfg->SetData (
+                              IfCb->IfCfg,
+                              Ip4Config2DataTypeDnsServer,
+                              DataSize,
+                              Dns
+                              );        
+      
 
-    Walker  += StrLen(Temp) + 1;
-    FreePool(Temp);
-    Temp    = NULL;
-    if (Argc == 6) {
-      Temp    = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
-    } else {
-      Temp    = StrnCatGrow(&Temp, NULL, Walker, 0);
     }
-    if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), 
gShellNetwork1HiiHandle, Temp);
-      ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
-      goto ON_EXIT;
-    }
-
-    if (Argc == 6) {
-      Walker  += StrLen(Temp) + 1;
-      FreePool(Temp);
-      Temp    = NULL;
-      Temp    = StrnCatGrow(&Temp, NULL, Walker, 0);
 
-      PermTemp = PermanentString;
-      if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
-        ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), 
gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");  
-        ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
-        goto ON_EXIT;
-      }
+  }
 
-      Permanent = TRUE;
-    }
+ON_EXIT:
+  if (Dns != NULL) {
+    FreePool (Dns);
+  }
+  
+  return EFI_SUCCESS;
 
-    NetworkBytes1 = NTOHL (Ip.Addr[0]);
-    NetworkBytes2 = NTOHL (Mask.Addr[0]);
-    if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||
-        !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
+}
 
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);
-      ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
-      goto ON_EXIT;
-    }
+/**
+  The IfConfig main process.
 
-    NetworkBytes1 = NTOHL (Gateway.Addr[0]);
-    if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||
-        !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
-        
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);
-      ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
-      goto ON_EXIT;
-    }
+  @param[in]   Private    The pointer of IFCONFIG_PRIVATE_DATA.
 
-    //
-    // Set the configuration up, two route table entries are added:
-    // one for the direct connected network, and another for the 
-    // default gateway. Remember, some structure members are cleared
-    // by AllocateZeroPool
-    //
-    Config->Source = IP4_CONFIG_SOURCE_STATIC;
-    Config->Ip4Info.RouteTableSize = 2;
+  @retval EFI_SUCCESS    IfConfig processed successfully.
+  @retval others         The IfConfig process failed.
 
-    CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof 
(EFI_IPv4_ADDRESS));
-    CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
+**/
+EFI_STATUS
+IfConfig (
+  IN IFCONFIG_PRIVATE_DATA    *Private
+  )
+{
+  EFI_STATUS    Status;
 
-    Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];
+  //
+  // Get configure information of all interfaces.
+  //
+  Status = IfConfigGetInterfaceInfo (
+             Private->ImageHandle,
+             Private->IfName,
+             &Private->IfList
+             );
 
-    CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof 
(EFI_IPv4_ADDRESS));
-    CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof 
(EFI_IPv4_ADDRESS));
-    CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, 
sizeof (EFI_IPv4_ADDRESS));
-  } else {
-    // neither static or DHCP.  error.
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), 
gShellNetwork1HiiHandle, L"ifconfig");  
-    ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+  if (EFI_ERROR (Status)) {
     goto ON_EXIT;
   }
 
-  CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));
-  Config->Permanent = Permanent;
+  switch (Private->OpCode) {
+  case IfConfigOpList:
+    Status = IfConfigShowInterfaceInfo (&Private->IfList);
+    break;
 
-  //
-  // Use HII service to set NIC address
-  //
-  ShellStatus = IfconfigSetNicAddrByHii (Info, Config);
-  if (ShellStatus != SHELL_SUCCESS) {
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), 
gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
-    goto ON_EXIT;
-  } 
+  case IfConfigOpClear:
+    Status = IfConfigClearInterfaceInfo (&Private->IfList);
+    break;
 
-  Status = IfconfigStartIp4 (Info);
-  if (EFI_ERROR(Status)) {
-    ShellStatus = SHELL_ACCESS_DENIED;
-  }
+  case IfConfigOpSet:
+    Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+    break;
 
-  if (ShellStatus != SHELL_SUCCESS) {
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), 
gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
+  default:
+    Status = EFI_ABORTED;
   }
-  
+
 ON_EXIT:
-  SHELL_FREE_NON_NULL(Config);
-  
-  return ShellStatus;
+
+  return Status;
 }
 
 /**
-  Show the address information for the nic specified.
+  The IfConfig cleanup process, free the allocated memory.
+
+  @param[in]   Private    The pointer of  IFCONFIG6_PRIVATE_DATA.
 
-  @param[in] Name   A pointer to the string containg the nic's name, if NULL, 
-                    all nics' information is shown.
 **/
 VOID
-EFIAPI
-IfconfigShowNicInfo (
-  IN CONST CHAR16           *Name
+IfConfigCleanup (
+  IN IFCONFIG_PRIVATE_DATA  *Private
   )
 {
   LIST_ENTRY                *Entry;
   LIST_ENTRY                *NextEntry;
-  NIC_INFO                  *NicInfo;
-  UINT32                    Index;
-  EFI_IP4_IPCONFIG_DATA     *Ip4Config;
-  EFI_IPv4_ADDRESS          Gateway;
-  CONST CHAR16              *TempString;
-
-  NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
-    NicInfo = BASE_CR (Entry, NIC_INFO, Link);
-
-    TempString = (CHAR16*)NicInfo->Name;
-    if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {
-      continue;
-    }
-
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), 
gShellNetwork1HiiHandle, NicInfo->Name);
-
-    ShellPrintHiiEx(
-    -1,
-    -1,
-    NULL,
-    STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR), 
-    gShellNetwork1HiiHandle, 
-    (UINTN)NicInfo->NicAddress.MacAddr.Addr[0], 
-    (UINTN)NicInfo->NicAddress.MacAddr.Addr[1], 
-    (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],
-    (UINTN)NicInfo->NicAddress.MacAddr.Addr[3], 
-    (UINTN)NicInfo->NicAddress.MacAddr.Addr[4], 
-    (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]
-    );    
-
-    Print (L"  Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : 
L"Media disconnected");
-
-    if (NicInfo->ConfigInfo == NULL) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);
-      continue;
-    } 
+  IFCONFIG_INTERFACE_CB     *IfCb;
+  ARG_LIST                  *ArgNode;
+  ARG_LIST                  *ArgHead;
 
-    if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), 
gShellNetwork1HiiHandle, L"DHCP");
-    } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), 
gShellNetwork1HiiHandle, L"STATIC");
-    } else {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), 
gShellNetwork1HiiHandle, L"Unknown");
-    }
-
-    ShellPrintHiiEx(-1, -1, NULL,
-      STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),
-      gShellNetwork1HiiHandle,
-      (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")
-      );
+  ASSERT (Private != NULL);
 
-    Ip4Config = &NicInfo->ConfigInfo->Ip4Info;
-
-    ShellPrintHiiEx(
-      -1, 
-      -1, 
-      NULL,
-      STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
-      gShellNetwork1HiiHandle, 
-      L"IP address",
-      (UINTN)Ip4Config->StationAddress.Addr[0],
-      (UINTN)Ip4Config->StationAddress.Addr[1],
-      (UINTN)Ip4Config->StationAddress.Addr[2],
-      (UINTN)Ip4Config->StationAddress.Addr[3]
-      );
-    ShellPrintHiiEx(
-      -1, 
-      -1, 
-      NULL,
-      STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
-      gShellNetwork1HiiHandle, 
-      L"Mask",
-      (UINTN)Ip4Config->SubnetMask.Addr[0],
-      (UINTN)Ip4Config->SubnetMask.Addr[1],
-      (UINTN)Ip4Config->SubnetMask.Addr[2],
-      (UINTN)Ip4Config->SubnetMask.Addr[3]
-      );
+  //
+  // Clean the list which save the set config Args.
+  //
+  if (Private->VarArg != NULL) {
+    ArgHead = Private->VarArg;
 
-    ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-    
-    for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
-      if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, 
&mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
-          (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask   , 
&mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
-        CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, 
sizeof (EFI_IPv4_ADDRESS));
-      }
+    while (ArgHead->Next != NULL) {
+      ArgNode = ArgHead->Next;
+      FreePool (ArgHead);
+      ArgHead = ArgNode;
     }
-   
-    ShellPrintHiiEx(
-      -1, 
-      -1, 
-      NULL,
-      STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
-      gShellNetwork1HiiHandle, 
-      L"Gateway",
-      (UINTN)Gateway.Addr[0],
-      (UINTN)Gateway.Addr[1],
-      (UINTN)Gateway.Addr[2],
-      (UINTN)Gateway.Addr[3]
-      );
 
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), 
gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);
-
-    for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN 
(STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
+    FreePool (ArgHead);
+  }
 
-      ShellPrintHiiEx(
-        -1, 
-        -1, 
-        NULL,
-        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
-        gShellNetwork1HiiHandle, 
-        L"Subnet",
-        (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],
-        (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],
-        (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],
-        (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]
-        );
+  if (Private->IfName != NULL)
+    FreePool (Private->IfName);
 
-      ShellPrintHiiEx(
-        -1, 
-        -1, 
-        NULL,
-        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
-        gShellNetwork1HiiHandle, 
-        L"Netmask",
-        (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],
-        (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],
-        (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],
-        (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]
-        );
 
-      ShellPrintHiiEx(
-        -1, 
-        -1, 
-        NULL,
-        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 
-        gShellNetwork1HiiHandle, 
-        L"Gateway",
-        (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],
-        (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],
-        (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],
-        (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]
-        );
-    }
-  }
+  //
+  // Clean the IFCONFIG_INTERFACE_CB list.
+  //
+  Entry     = Private->IfList.ForwardLink;
+  NextEntry = Entry->ForwardLink;
 
-  return ;
-}
+  while (Entry != &Private->IfList) {
 
-/**
-  Clear address configuration for the nic specified.
+    IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
 
-  @param[in] Name     A pointer to the string containg the nic's name, 
-                      if NULL, all nics address configurations are cleared.
+    RemoveEntryList (&IfCb->Link);
 
-  @retval EFI_SUCCESS The address configuration is cleared.
-  @return             Some error occurs.
-**/
-EFI_STATUS
-EFIAPI
-IfconfigClearNicAddr (
-  IN CONST CHAR16                     *Name
-  )
-{
-  LIST_ENTRY                    *Entry;
-  LIST_ENTRY                    *NextEntry;
-  NIC_INFO                      *Info;
-  EFI_STATUS                    Status;
-  
-  NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
-    Info = BASE_CR (Entry, NIC_INFO, Link);
+    if (IfCb->IfInfo != NULL) {
 
-    if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {
-      continue;
+      FreePool (IfCb->IfInfo);
     }
 
-//    if (Info->NicIp4Config == NULL) { 
-      Status = IfconfigSetNicAddrByHii (Info, NULL);
-//    } else {
-//      Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
-//    }
+    FreePool (IfCb);
 
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
+    Entry     = NextEntry;
+    NextEntry = Entry->ForwardLink;
   }
 
-  return EFI_SUCCESS;
-  
+  FreePool (Private);
 }
 
 /**
   Function for 'ifconfig' command.
 
@@ -1631,133 +1136,131 @@ EFIAPI
 ShellCommandRunIfconfig (
   IN EFI_HANDLE        ImageHandle,
   IN EFI_SYSTEM_TABLE  *SystemTable
   )
 {
-  EFI_STATUS          Status;
-  LIST_ENTRY          *Package;
-  CHAR16              *ProblemParam;
-  SHELL_STATUS        ShellStatus;
-  BOOLEAN             ListOperation;
-  BOOLEAN             ClearOperation;
-  BOOLEAN             SetOperation;
-  CONST CHAR16        *Item;
-  LIST_ENTRY          *Entry;
-  NIC_INFO            *Info;
-
-  InitializeListHead (&NicInfoList);
-  Status = EFI_INVALID_PARAMETER;
-  ShellStatus = SHELL_SUCCESS;
+  EFI_STATUS                Status;
+  IFCONFIG_PRIVATE_DATA     *Private;
+  LIST_ENTRY                *ParamPackage;
+  CONST CHAR16              *ValueStr;
+  ARG_LIST                  *ArgList;
+  CHAR16                    *ProblemParam;
+  CHAR16                    *Str;
+
+  Private = NULL;
+
+  Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, 
&ProblemParam, TRUE, FALSE);
+  if (EFI_ERROR (Status)) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_INVALID_COMMAND), gShellNetwork1HiiHandle, ProblemParam);
+    goto ON_EXIT;
+  }
 
   //
-  // initialize the shell lib (we must be in non-auto-init...)
+  // To handle no option.
   //
-  Status = ShellInitialize();
-  ASSERT_EFI_ERROR(Status);
+  if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && 
!ShellCommandLineGetFlag (ParamPackage, L"-s") &&
+      !ShellCommandLineGetFlag (ParamPackage, L"-h") && 
!ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), 
gShellNetwork1HiiHandle);
+    goto ON_EXIT;
+  }
 
   //
-  // parse the command line
+  // To handle conflict options.
   //
-  Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
-  if (EFI_ERROR(Status)) {
-    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), 
gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);  
-      FreePool(ProblemParam);
-      ShellStatus = SHELL_INVALID_PARAMETER;
-    } else {
-      ASSERT(FALSE);
-    }
+  if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
+      ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+      ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+      ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+      ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+      ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && 
(ShellCommandLineGetFlag (ParamPackage, L"-h")))) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_CONFLICT_OPTIONS), gShellNetwork1HiiHandle);
+    goto ON_EXIT;
+  }
+  //
+  // To show the help information of ifconfig6 command.
+  //
+  if (ShellCommandLineGetFlag (ParamPackage, L"-h")) {
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_HELP), 
gShellNetwork1HiiHandle);
+    goto ON_EXIT;
+  }
+
+  Status = EFI_INVALID_PARAMETER;
+
+  Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
 
-    goto Done;
+  if (Private == NULL) {
+    Status = EFI_OUT_OF_RESOURCES;
+    goto ON_EXIT;
   }
 
-  ClearOperation = ShellCommandLineGetFlag(Package, L"-c");
-  ListOperation  = ShellCommandLineGetFlag(Package, L"-l");
-  SetOperation   = ShellCommandLineGetFlag(Package, L"-s");
-
-  if ((ClearOperation && ListOperation)
-    ||(SetOperation   && ListOperation)
-    ||(ClearOperation && SetOperation)
-    ) {
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), 
gShellNetwork1HiiHandle, L"ifconfig");  
-    ShellStatus = SHELL_INVALID_PARAMETER;
-    goto Done;
-  } else if (!ClearOperation && !ListOperation && !SetOperation) {
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), 
gShellNetwork1HiiHandle, L"ifconfig");  
-    ShellStatus = SHELL_INVALID_PARAMETER;
-    goto Done;
+  InitializeListHead (&Private->IfList);
+
+  //
+  // To get interface name for the list option.
+  //
+  if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+    Private->OpCode = IfConfigOpList;
+    ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
+    if (ValueStr != NULL) {
+      Str             = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+      ASSERT (Str != NULL);
+
+      Str             = StrCpy (Str, ValueStr);
+      Private->IfName = Str;
+    }
   }
-    
-    
-  Status = IfconfigGetAllNicInfoByHii ();
-  if (EFI_ERROR (Status)) {
-    if (mIp4ConfigExist) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), 
gShellNetwork1HiiHandle, Status);
-    } else {
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), 
gShellNetwork1HiiHandle, L"ifconfig", L"gEfiIp4ConfigProtocolGuid", 
&gEfiIp4ConfigProtocolGuid);  
+  //
+  // To get interface name for the clear option.
+  //
+  if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
+    Private->OpCode = IfConfigOpClear;
+    ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
+    if (ValueStr != NULL) {
+      Str             = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+      ASSERT (Str != NULL);
+
+      Str             = StrCpy (Str, ValueStr);
+      Private->IfName = Str;
     }
-
-    return SHELL_NOT_FOUND;
   }
+  //
+  // To get interface name and corresponding Args for the set option.
+  //
+  if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {
 
-  if (ListOperation) {
-    Item = ShellCommandLineGetValue (Package, L"-l");
-
-    if (Item != NULL && CountSubItems(Item) > 1) {
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), 
gShellNetwork1HiiHandle, L"ifconfig", Item, L"-l");  
-      ShellStatus = SHELL_INVALID_PARAMETER;
-      goto Done;
-    } 
-    
+    ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
+    if (ValueStr == NULL) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_LACK_INTERFACE), gShellNetwork1HiiHandle);
+      goto ON_EXIT;
+    }
     //
-    // Show the configuration.
+    // To split the configuration into multi-section.
     //
-    IfconfigShowNicInfo (Item);
-  } else if (SetOperation) {
-    Item = ShellCommandLineGetValue (Package, L"-s");
+    ArgList         = SplitStrToList (ValueStr, L' ');
+    ASSERT (ArgList != NULL);
 
-    //
-    // The correct command line arguments for setting address are:
-    // IfConfig -s eth0 DHCP [permanent]
-    // IfConfig -s eth0 static ip netmask gateway [permanent]
-    //
-    if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) 
|| (CountSubItems(Item) == 4)) {
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_NO_VALUE), 
gShellNetwork1HiiHandle, L"ifconfig", L"-s");  
-      ShellStatus = SHELL_INVALID_PARAMETER;
-      goto Done;
-    }
+    Private->OpCode = IfConfigOpSet;
+    Private->IfName = ArgList->Arg;
 
-    ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);
-  } else if (ClearOperation) {
-    Item = ShellCommandLineGetValue (Package, L"-c");
+    Private->VarArg = ArgList->Next;
 
-    if (Item != NULL && CountSubItems(Item) > 1) {
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), 
gShellNetwork1HiiHandle, L"ifconfig", Item, L"-c");  
-      ShellStatus = SHELL_INVALID_PARAMETER;
-      goto Done;
+    if (Private->IfName == NULL || Private->VarArg == NULL) {
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN 
(STR_IFCONFIG_ERR_LACK_COMMAND), gShellNetwork1HiiHandle);
+      goto ON_EXIT;
     }
-
-    IfconfigClearNicAddr (Item);
-  } else {
-    ASSERT(FALSE);
   }
+  //
+  // Main process of ifconfig.
+  //
+  Status = IfConfig (Private);
 
-Done:
-  while (!IsListEmpty (&NicInfoList)) {
-    Entry = NicInfoList.ForwardLink;
-    Info  = BASE_CR (Entry, NIC_INFO, Link);
+ON_EXIT:
 
-    RemoveEntryList (Entry);
+  ShellCommandLineFreeVarList (ParamPackage);
+  if (Private != NULL)
+    IfConfigCleanup (Private);
 
-    if (Info->ConfigInfo != NULL) {
-      FreePool (Info->ConfigInfo);
-    }
+  return Status;
+}
 
-    FreePool (Info);
-  }
 
-  if (Package != NULL) {
-    ShellCommandLineFreeVarList(Package);
-  }
 
-  return (ShellStatus);
-}
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index e23588a..a19c2cb 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -909,20 +909,20 @@ PingCreateIpInstance (
   //
   if (Private->IpChoice == PING_IP_CHOICE_IP6) {
     if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
         NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
         (HandleNum > 1)) {
-      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", mSrcString);  
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", mSrcString);  
       Status = EFI_INVALID_PARAMETER;
       goto ON_ERROR;
     }
   } else {
     ASSERT(Private->IpChoice == PING_IP_CHOICE_IP4);
     if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
         PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) 
&&
         (HandleNum > 1)) {
-      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", mSrcString);  
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", mSrcString);  
       Status = EFI_INVALID_PARAMETER;
       goto ON_ERROR;
     }
   }
   //
@@ -953,11 +953,11 @@ PingCreateIpInstance (
       // Ip6config protocol and ip6 service binding protocol are installed
       // on the same handle.
       //
       Status = gBS->HandleProtocol (
                       HandleBuffer[HandleIndex],
-                      Private->IpChoice == 
PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+                      Private->IpChoice == 
PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
                       (VOID **) &IpXCfg
                       );
 
       if (EFI_ERROR (Status)) {
         goto ON_ERROR;
@@ -971,12 +971,13 @@ PingCreateIpInstance (
                            Ip6ConfigDataTypeInterfaceInfo,
                            &IfInfoSize,
                            NULL
                            );
       } else {
-        Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+        Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
                            IpXCfg,
+                           Ip4Config2DataTypeInterfaceInfo,
                            &IfInfoSize,
                            NULL
                            );
       }
       
@@ -1007,12 +1008,13 @@ PingCreateIpInstance (
                            Ip6ConfigDataTypeInterfaceInfo,
                            &IfInfoSize,
                            IpXInterfaceInfo
                            );
       } else {
-        Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+        Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
                            IpXCfg,
+                           Ip4Config2DataTypeInterfaceInfo,
                            &IfInfoSize,
                            IpXInterfaceInfo
                            );
       }
 
@@ -1043,11 +1045,11 @@ PingCreateIpInstance (
         }
       } else {
         //
         // IP4 address check
         //
-        if (EFI_IP4_EQUAL (&Private->SrcAddress, 
&((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {
+        if (EFI_IP4_EQUAL (&Private->SrcAddress, 
&((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {
           //
           // Match a certain interface address.
           //
           break;
         }
@@ -1461,11 +1463,11 @@ ShellCommandRunPing (
   ShellStatus = SHELL_SUCCESS;
   ProblemParam = NULL;
 
   Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, 
&ProblemParam, TRUE, FALSE);
   if (EFI_ERROR(Status)) {
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ProblemParam);
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ProblemParam);
     ShellStatus = SHELL_INVALID_PARAMETER;
     goto ON_EXIT;
   }
 
   if (ShellCommandLineGetFlag (ParamPackage, L"-_ip6")) {
@@ -1481,11 +1483,11 @@ ShellCommandRunPing (
 
     //
     // ShellStrToUintn will return 0 when input is 0 or an invalid input 
string.
     //
     if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
-      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ValueStr);  
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ValueStr);  
       ShellStatus = SHELL_INVALID_PARAMETER;
       goto ON_EXIT;
     }
   } else {
     SendNumber = DEFAULT_SEND_COUNT;
@@ -1499,11 +1501,11 @@ ShellCommandRunPing (
 
     //
     // ShellStrToUintn will return 0 when input is 0 or an invalid input 
string.
     //
     if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
-      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ValueStr);  
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ValueStr);  
       ShellStatus = SHELL_INVALID_PARAMETER;
       goto ON_EXIT;
     }
   } else {
     BufferSize = DEFAULT_BUFFER_SIZE;
@@ -1522,26 +1524,26 @@ ShellCommandRunPing (
       Status = NetLibStrToIp6 (ValueStr, &SrcAddress);
     } else {
       Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
     }
     if (EFI_ERROR (Status)) {
-      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ValueStr);  
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ValueStr);  
       ShellStatus = SHELL_INVALID_PARAMETER;
       goto ON_EXIT;
     }
   }
   //
   // Parse the paramter of destination ip address.
   //
   NonOptionCount = ShellCommandLineGetCount(ParamPackage);
   if (NonOptionCount < 2) {
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), 
gShellNetwork1HiiHandle, L"ping");  
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_FEW), 
gShellNetwork1HiiHandle, L"ping");  
     ShellStatus = SHELL_INVALID_PARAMETER;
     goto ON_EXIT;
   }
   if (NonOptionCount > 2) {
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), 
gShellNetwork1HiiHandle, L"ping");  
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_MANY), 
gShellNetwork1HiiHandle, L"ping");  
     ShellStatus = SHELL_INVALID_PARAMETER;
     goto ON_EXIT;
   }
   ValueStr = ShellCommandLineGetRawValue (ParamPackage, 1);
   if (ValueStr != NULL) {
@@ -1550,11 +1552,11 @@ ShellCommandRunPing (
       Status = NetLibStrToIp6 (ValueStr, &DstAddress);
     } else {
       Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
     }
     if (EFI_ERROR (Status)) {
-      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ValueStr);  
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), 
gShellNetwork1HiiHandle, L"ping", ValueStr);  
       ShellStatus = SHELL_INVALID_PARAMETER;
       goto ON_EXIT;
     }
   }
   //
diff --git 
a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
index 49849a6..5151179 100644
--- 
a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
+++ 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
@@ -1,9 +1,9 @@
 /** @file
   Main file for NULL named library for network1 shell command functions.
 
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+  Copyright (c) 2010 - 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
 
@@ -63,11 +63,11 @@ ShellNetwork1CommandsLibConstructor (
   }
   //
   // install our shell command handlers
   //
   ShellCommandRegisterCommandName(L"ping",    ShellCommandRunPing     , 
ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , 
gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_PING));
-  ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , 
ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , 
gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_IFCONFIG));
+  ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , 
ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , 
gShellNetwork1HiiHandle, STRING_TOKEN(STR_IFCONFIG_HELP));
 
   return (EFI_SUCCESS);
 }
 
 /**
diff --git 
a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
index 68a7c93..98b40df 100644
--- 
a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
+++ 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
@@ -1,9 +1,9 @@
 /** @file
   header file for NULL named library for network1 shell command functions.
 
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+  Copyright (c) 2010 - 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
@@ -24,13 +24,11 @@
 #include <Protocol/Cpu.h>
 #include <Protocol/ServiceBinding.h>
 #include <Protocol/Ip6.h>
 #include <Protocol/Ip6Config.h>
 #include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/Ip4Config2.h>
 #include <Protocol/Arp.h>
 
 #include <Library/BaseLib.h>
 #include <Library/BaseMemoryLib.h>
 #include <Library/DebugLib.h>
@@ -45,12 +43,10 @@
 #include <Library/HiiLib.h>
 #include <Library/NetLib.h>
 #include <Library/DevicePathLib.h>
 #include <Library/PrintLib.h>
 
-#include <Guid/NicIp4ConfigNvData.h>
-
 extern EFI_HANDLE gShellNetwork1HiiHandle;
 
 /**
   Function for 'ping' command.
 
diff --git 
a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
index 527d2ef..94b9d2a 100644
--- 
a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+++ 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
@@ -57,11 +57,13 @@
   gEfiCpuArchProtocolGuid                       ## CONSUMES
   gEfiIp6ProtocolGuid                           ## SOMETIMES_CONSUMES
   gEfiIp6ServiceBindingProtocolGuid             ## SOMETIMES_CONSUMES
   gEfiIp6ConfigProtocolGuid                     ## SOMETIMES_CONSUMES
 
-  gEfiIp6ProtocolGuid                           ## SOMETIMES_CONSUMES
-  gEfiIp6ServiceBindingProtocolGuid             ## SOMETIMES_CONSUMES
-  gEfiIp6ConfigProtocolGuid                     ## SOMETIMES_CONSUMES
+  gEfiIp4ProtocolGuid                           ## SOMETIMES_CONSUMES
+  gEfiIp4ServiceBindingProtocolGuid             ## SOMETIMES_CONSUMES
+  gEfiIp4Config2ProtocolGuid                    ## SOMETIMES_CONSUMES
+
+  
   
 [Guids]
   gShellNetwork1HiiGuid                         ## SOMETIMES_CONSUMES ## HII
\ No newline at end of file
diff --git 
a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
 
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index 
aa27c678339c5e94c9c936d9a7ea74b6b043c200..f783a2a7ddf00fa0861c7762911521d7f0c27aca
 100644
GIT binary patch
literal 21014
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
AdjJ3c

literal 20112
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

-- 
1.9.5.msysgit.1



------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to