]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
ShellPkg: Apply uncrustify changes
[mirror_edk2.git] / ShellPkg / Library / UefiShellNetwork1CommandsLib / Ifconfig.c
index 92108a14ade22c4895055ca84fda1314c98ddc70..71b08bdff153ca07abc6114a8df3c6bdf951c2d3 100644 (file)
@@ -2,29 +2,23 @@
   The implementation for Shell command ifconfig based on IP4Config2 protocol.\r
 \r
   (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
-  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "UefiShellNetwork1CommandsLib.h"\r
 \r
 typedef enum {\r
-  IfConfigOpList     = 1,\r
-  IfConfigOpSet      = 2,\r
-  IfConfigOpClear    = 3\r
+  IfConfigOpList  = 1,\r
+  IfConfigOpSet   = 2,\r
+  IfConfigOpClear = 3\r
 } IFCONFIG_OPCODE;\r
 \r
 typedef enum {\r
-  VarCheckReserved      = -1,\r
-  VarCheckOk            = 0,\r
+  VarCheckReserved = -1,\r
+  VarCheckOk       = 0,\r
   VarCheckDuplicate,\r
   VarCheckConflict,\r
   VarCheckUnknown,\r
@@ -33,22 +27,22 @@ typedef enum {
 } VAR_CHECK_CODE;\r
 \r
 typedef enum {\r
-  FlagTypeSingle         = 0,\r
+  FlagTypeSingle = 0,\r
   FlagTypeNeedVar,\r
   FlagTypeNeedSet,\r
   FlagTypeSkipUnknown\r
 } VAR_CHECK_FLAG_TYPE;\r
 \r
-#define MACADDRMAXSIZE    32\r
+#define MACADDRMAXSIZE  32\r
 \r
 typedef struct _IFCONFIG_INTERFACE_CB {\r
-  EFI_HANDLE                                  NicHandle;\r
-  LIST_ENTRY                                  Link;\r
-  EFI_IP4_CONFIG2_PROTOCOL                    *IfCfg;\r
-  EFI_IP4_CONFIG2_INTERFACE_INFO              *IfInfo; \r
-  EFI_IP4_CONFIG2_POLICY                      Policy;\r
-  UINT32                                      DnsCnt;\r
-  EFI_IPv4_ADDRESS                            DnsAddr[1];\r
+  EFI_HANDLE                        NicHandle;\r
+  LIST_ENTRY                        Link;\r
+  EFI_IP4_CONFIG2_PROTOCOL          *IfCfg;\r
+  EFI_IP4_CONFIG2_INTERFACE_INFO    *IfInfo;\r
+  EFI_IP4_CONFIG2_POLICY            Policy;\r
+  UINT32                            DnsCnt;\r
+  EFI_IPv4_ADDRESS                  DnsAddr[1];\r
 } IFCONFIG_INTERFACE_CB;\r
 \r
 typedef struct _ARG_LIST ARG_LIST;\r
@@ -59,21 +53,21 @@ struct _ARG_LIST {
 };\r
 \r
 typedef struct _IFCONFIG4_PRIVATE_DATA {\r
-  LIST_ENTRY  IfList;\r
+  LIST_ENTRY    IfList;\r
 \r
-  UINT32      OpCode;\r
-  CHAR16      *IfName;\r
-  ARG_LIST    *VarArg;\r
+  UINT32        OpCode;\r
+  CHAR16        *IfName;\r
+  ARG_LIST      *VarArg;\r
 } IFCONFIG_PRIVATE_DATA;\r
 \r
-typedef struct _VAR_CHECK_ITEM{\r
+typedef struct _VAR_CHECK_ITEM {\r
   CHAR16                 *FlagStr;\r
   UINT32                 FlagID;\r
   UINT32                 ConflictMask;\r
   VAR_CHECK_FLAG_TYPE    FlagType;\r
 } VAR_CHECK_ITEM;\r
 \r
-SHELL_PARAM_ITEM    mIfConfigCheckList[] = {\r
+SHELL_PARAM_ITEM  mIfConfigCheckList[] = {\r
   {\r
     L"-b",\r
     TypeFlag\r
@@ -102,7 +96,7 @@ SHELL_PARAM_ITEM    mIfConfigCheckList[] = {
 \r
 VAR_CHECK_ITEM  mSetCheckList[] = {\r
   {\r
-   L"static",\r
+    L"static",\r
     0x00000001,\r
     0x00000001,\r
     FlagTypeSingle\r
@@ -127,7 +121,28 @@ VAR_CHECK_ITEM  mSetCheckList[] = {
   },\r
 };\r
 \r
-STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";\r
+STATIC CONST CHAR16  PermanentString[10] = L"PERMANENT";\r
+\r
+/**\r
+  Free the ARG_LIST.\r
+\r
+  @param List Pointer to ARG_LIST to free.\r
+**/\r
+VOID\r
+FreeArgList (\r
+  ARG_LIST  *List\r
+  )\r
+{\r
+  ARG_LIST  *Next;\r
+\r
+  while (List->Next != NULL) {\r
+    Next = List->Next;\r
+    FreePool (List);\r
+    List = Next;\r
+  }\r
+\r
+  FreePool (List);\r
+}\r
 \r
 /**\r
   Split a string with specified separator and save the substring to a list.\r
@@ -140,14 +155,14 @@ STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";
 **/\r
 ARG_LIST *\r
 SplitStrToList (\r
-  IN CONST CHAR16    *String,\r
-  IN CHAR16          Separator\r
+  IN CONST CHAR16  *String,\r
+  IN CHAR16        Separator\r
   )\r
 {\r
-  CHAR16      *Str;\r
-  CHAR16      *ArgStr;\r
-  ARG_LIST    *ArgList;\r
-  ARG_LIST    *ArgNode;\r
+  CHAR16    *Str;\r
+  CHAR16    *ArgStr;\r
+  ARG_LIST  *ArgList;\r
+  ARG_LIST  *ArgNode;\r
 \r
   if (*String == L'\0') {\r
     return NULL;\r
@@ -157,14 +172,20 @@ SplitStrToList (
   // Copy the CONST string to a local copy.\r
   //\r
   Str = AllocateCopyPool (StrSize (String), String);\r
-  ASSERT (Str != NULL);\r
-  ArgStr  = Str;\r
+  if (Str == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  ArgStr = Str;\r
 \r
   //\r
   // init a node for the list head.\r
   //\r
-  ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
-  ASSERT (ArgNode != NULL);\r
+  ArgNode = (ARG_LIST *)AllocateZeroPool (sizeof (ARG_LIST));\r
+  if (ArgNode == NULL) {\r
+    return NULL;\r
+  }\r
+\r
   ArgList = ArgNode;\r
 \r
   //\r
@@ -175,8 +196,16 @@ SplitStrToList (
       *Str          = L'\0';\r
       ArgNode->Arg  = ArgStr;\r
       ArgStr        = Str + 1;\r
-      ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
-      ASSERT (ArgNode->Next != NULL);\r
+      ArgNode->Next = (ARG_LIST *)AllocateZeroPool (sizeof (ARG_LIST));\r
+      if (ArgNode->Next == NULL) {\r
+        //\r
+        // Free the local copy of string stored in the first node\r
+        //\r
+        FreePool (ArgList->Arg);\r
+        FreeArgList (ArgList);\r
+        return NULL;\r
+      }\r
+\r
       ArgNode = ArgNode->Next;\r
     }\r
 \r
@@ -203,17 +232,17 @@ SplitStrToList (
 \r
 **/\r
 VAR_CHECK_CODE\r
-IfConfigRetriveCheckListByName(\r
-  IN VAR_CHECK_ITEM    *CheckList,\r
-  IN CHAR16            *Name,\r
-  IN BOOLEAN           Init\r
-)\r
+IfConfigRetriveCheckListByName (\r
+  IN VAR_CHECK_ITEM  *CheckList,\r
+  IN CHAR16          *Name,\r
+  IN BOOLEAN         Init\r
+  )\r
 {\r
-  STATIC UINT32     CheckDuplicate;\r
-  STATIC UINT32     CheckConflict;\r
-  VAR_CHECK_CODE    RtCode;\r
-  UINT32            Index;\r
-  VAR_CHECK_ITEM    Arg;\r
+  STATIC UINT32   CheckDuplicate;\r
+  STATIC UINT32   CheckConflict;\r
+  VAR_CHECK_CODE  RtCode;\r
+  UINT32          Index;\r
+  VAR_CHECK_ITEM  Arg;\r
 \r
   if (Init) {\r
     CheckDuplicate = 0;\r
@@ -221,16 +250,15 @@ IfConfigRetriveCheckListByName(
     return VarCheckOk;\r
   }\r
 \r
-  RtCode  = VarCheckOk;\r
-  Index   = 0;\r
-  Arg     = CheckList[Index];\r
+  RtCode = VarCheckOk;\r
+  Index  = 0;\r
+  Arg    = CheckList[Index];\r
 \r
   //\r
   // Check the Duplicated/Conflicted/Unknown input Args.\r
   //\r
   while (Arg.FlagStr != NULL) {\r
     if (StrCmp (Arg.FlagStr, Name) == 0) {\r
-\r
       if (CheckDuplicate & Arg.FlagID) {\r
         RtCode = VarCheckDuplicate;\r
         break;\r
@@ -266,11 +294,11 @@ IfConfigRetriveCheckListByName(
 VOID\r
 EFIAPI\r
 IfConfigManualAddressNotify (\r
-  IN EFI_EVENT    Event,\r
-  IN VOID         *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
-  *((BOOLEAN *) Context) = TRUE;\r
+  *((BOOLEAN *)Context) = TRUE;\r
 }\r
 \r
 /**\r
@@ -282,11 +310,11 @@ IfConfigManualAddressNotify (
 **/\r
 VOID\r
 IfConfigPrintMacAddr (\r
-  IN UINT8     *Node,\r
-  IN UINT32    Size\r
+  IN UINT8   *Node,\r
+  IN UINT32  Size\r
   )\r
 {\r
-  UINTN    Index;\r
+  UINTN  Index;\r
 \r
   ASSERT (Size <= MACADDRMAXSIZE);\r
 \r
@@ -300,7 +328,6 @@ IfConfigPrintMacAddr (
   ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);\r
 }\r
 \r
-\r
 /**\r
   The get current status of all handles.\r
 \r
@@ -313,24 +340,24 @@ IfConfigPrintMacAddr (
 **/\r
 EFI_STATUS\r
 IfConfigGetInterfaceInfo (\r
-  IN CHAR16        *IfName,\r
-  IN LIST_ENTRY    *IfList\r
+  IN CHAR16      *IfName,\r
+  IN LIST_ENTRY  *IfList\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  UINTN                            HandleIndex;\r
-  UINTN                            HandleNum;\r
-  EFI_HANDLE                       *HandleBuffer;\r
-  EFI_IP4_CONFIG2_PROTOCOL         *Ip4Cfg2;\r
-  EFI_IP4_CONFIG2_INTERFACE_INFO   *IfInfo;\r
-  IFCONFIG_INTERFACE_CB            *IfCb;\r
-  UINTN                            DataSize;\r
+  EFI_STATUS                      Status;\r
+  UINTN                           HandleIndex;\r
+  UINTN                           HandleNum;\r
+  EFI_HANDLE                      *HandleBuffer;\r
+  EFI_IP4_CONFIG2_PROTOCOL        *Ip4Cfg2;\r
+  EFI_IP4_CONFIG2_INTERFACE_INFO  *IfInfo;\r
+  IFCONFIG_INTERFACE_CB           *IfCb;\r
+  UINTN                           DataSize;\r
 \r
   HandleBuffer = NULL;\r
   HandleNum    = 0;\r
 \r
-  IfInfo       = NULL;\r
-  IfCb         = NULL;\r
+  IfInfo = NULL;\r
+  IfCb   = NULL;\r
 \r
   //\r
   // Locate all the handles with ip4 service binding protocol.\r
@@ -341,7 +368,7 @@ IfConfigGetInterfaceInfo (
                   NULL,\r
                   &HandleNum,\r
                   &HandleBuffer\r
-                 );\r
+                  );\r
   if (EFI_ERROR (Status) || (HandleNum == 0)) {\r
     return Status;\r
   }\r
@@ -350,9 +377,9 @@ IfConfigGetInterfaceInfo (
   // Enumerate all handles that installed with ip4 service binding protocol.\r
   //\r
   for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {\r
-    IfCb      = NULL;\r
-    IfInfo    = NULL;\r
-    DataSize  = 0;\r
+    IfCb     = NULL;\r
+    IfInfo   = NULL;\r
+    DataSize = 0;\r
 \r
     //\r
     // Ip4config protocol and ip4 service binding protocol are installed\r
@@ -362,22 +389,22 @@ IfConfigGetInterfaceInfo (
     Status = gBS->HandleProtocol (\r
                     HandleBuffer[HandleIndex],\r
                     &gEfiIp4Config2ProtocolGuid,\r
-                    (VOID **) &Ip4Cfg2\r
+                    (VOID **)&Ip4Cfg2\r
                     );\r
 \r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
-    \r
+\r
     //\r
     // Get the interface information size.\r
     //\r
     Status = Ip4Cfg2->GetData (\r
-                       Ip4Cfg2,\r
-                       Ip4Config2DataTypeInterfaceInfo,\r
-                       &DataSize,\r
-                       NULL\r
-                       );\r
+                        Ip4Cfg2,\r
+                        Ip4Config2DataTypeInterfaceInfo,\r
+                        &DataSize,\r
+                        NULL\r
+                        );\r
 \r
     if (Status != EFI_BUFFER_TOO_SMALL) {\r
       goto ON_ERROR;\r
@@ -389,21 +416,21 @@ IfConfigGetInterfaceInfo (
       Status = EFI_OUT_OF_RESOURCES;\r
       goto ON_ERROR;\r
     }\r
-    \r
+\r
     //\r
     // Get the interface info.\r
     //\r
     Status = Ip4Cfg2->GetData (\r
-                       Ip4Cfg2,\r
-                       Ip4Config2DataTypeInterfaceInfo,\r
-                       &DataSize,\r
-                       IfInfo\r
-                       );\r
+                        Ip4Cfg2,\r
+                        Ip4Config2DataTypeInterfaceInfo,\r
+                        &DataSize,\r
+                        IfInfo\r
+                        );\r
 \r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
-    \r
+\r
     //\r
     // Check the interface name if required.\r
     //\r
@@ -413,16 +440,16 @@ IfConfigGetInterfaceInfo (
     }\r
 \r
     DataSize = 0;\r
-    \r
+\r
     //\r
     // Get the size of dns server list.\r
     //\r
     Status = Ip4Cfg2->GetData (\r
-                       Ip4Cfg2,\r
-                       Ip4Config2DataTypeDnsServer,\r
-                       &DataSize,\r
-                       NULL\r
-                       );\r
+                        Ip4Cfg2,\r
+                        Ip4Config2DataTypeDnsServer,\r
+                        &DataSize,\r
+                        NULL\r
+                        );\r
 \r
     if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {\r
       goto ON_ERROR;\r
@@ -438,18 +465,18 @@ IfConfigGetInterfaceInfo (
     IfCb->NicHandle = HandleBuffer[HandleIndex];\r
     IfCb->IfInfo    = IfInfo;\r
     IfCb->IfCfg     = Ip4Cfg2;\r
-    IfCb->DnsCnt    = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));\r
+    IfCb->DnsCnt    = (UINT32)(DataSize / sizeof (EFI_IPv4_ADDRESS));\r
 \r
     //\r
     // Get the dns server list if has.\r
     //\r
     if (DataSize > 0) {\r
       Status = Ip4Cfg2->GetData (\r
-                         Ip4Cfg2,\r
-                         Ip4Config2DataTypeDnsServer,\r
-                         &DataSize,\r
-                         IfCb->DnsAddr\r
-                         );\r
+                          Ip4Cfg2,\r
+                          Ip4Config2DataTypeDnsServer,\r
+                          &DataSize,\r
+                          IfCb->DnsAddr\r
+                          );\r
 \r
       if (EFI_ERROR (Status)) {\r
         goto ON_ERROR;\r
@@ -461,11 +488,11 @@ IfConfigGetInterfaceInfo (
     //\r
     DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);\r
     Status   = Ip4Cfg2->GetData (\r
-                         Ip4Cfg2,\r
-                         Ip4Config2DataTypePolicy,\r
-                         &DataSize,\r
-                         &IfCb->Policy\r
-                         );\r
+                          Ip4Cfg2,\r
+                          Ip4Config2DataTypePolicy,\r
+                          &DataSize,\r
+                          &IfCb->Policy\r
+                          );\r
 \r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
@@ -513,17 +540,17 @@ ON_ERROR:
 **/\r
 SHELL_STATUS\r
 IfConfigShowInterfaceInfo (\r
-  IN LIST_ENTRY    *IfList\r
+  IN LIST_ENTRY  *IfList\r
   )\r
 {\r
-  LIST_ENTRY                   *Entry;\r
-  LIST_ENTRY                   *Next;\r
-  IFCONFIG_INTERFACE_CB        *IfCb;\r
-  BOOLEAN                       MediaPresent;\r
-  EFI_IPv4_ADDRESS              Gateway;\r
-  UINT32                        Index;\r
-  \r
-  MediaPresent = TRUE;\r
+  LIST_ENTRY             *Entry;\r
+  LIST_ENTRY             *Next;\r
+  IFCONFIG_INTERFACE_CB  *IfCb;\r
+  EFI_STATUS             MediaStatus;\r
+  EFI_IPv4_ADDRESS       Gateway;\r
+  UINT32                 Index;\r
+\r
+  MediaStatus = EFI_SUCCESS;\r
 \r
   if (IsListEmpty (IfList)) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
@@ -540,16 +567,19 @@ IfConfigShowInterfaceInfo (
     //\r
     // Print interface name.\r
     //\r
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name); \r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);\r
 \r
     //\r
     // Get Media State.\r
     //\r
-    NetLibDetectMedia (IfCb->NicHandle, &MediaPresent);\r
-    if (!MediaPresent) {\r
-      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media disconnected");\r
+    if (EFI_SUCCESS == NetLibDetectMediaWaitTimeout (IfCb->NicHandle, 0, &MediaStatus)) {\r
+      if (MediaStatus != EFI_SUCCESS) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media disconnected");\r
+      } else {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present");\r
+      }\r
     } else {\r
-      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present");\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media state unknown");\r
     }\r
 \r
     //\r
@@ -576,11 +606,11 @@ IfConfigShowInterfaceInfo (
     //\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);\r
 \r
-    ShellPrintHiiEx(\r
-      -1, \r
-      -1, \r
+    ShellPrintHiiEx (\r
+      -1,\r
+      -1,\r
       NULL,\r
-      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), \r
+      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),\r
       gShellNetwork1HiiHandle,\r
       (UINTN)IfCb->IfInfo->StationAddress.Addr[0],\r
       (UINTN)IfCb->IfInfo->StationAddress.Addr[1],\r
@@ -593,11 +623,11 @@ IfConfigShowInterfaceInfo (
     //\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);\r
 \r
-    ShellPrintHiiEx(\r
-      -1, \r
-      -1, \r
+    ShellPrintHiiEx (\r
+      -1,\r
+      -1,\r
       NULL,\r
-      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), \r
+      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),\r
       gShellNetwork1HiiHandle,\r
       (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],\r
       (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],\r
@@ -611,40 +641,41 @@ IfConfigShowInterfaceInfo (
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);\r
 \r
     ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));\r
-    \r
+\r
     for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {\r
       if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&\r
-          (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask   , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){\r
+          (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0))\r
+      {\r
         CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
       }\r
-    }    \r
+    }\r
 \r
-    ShellPrintHiiEx(\r
-      -1, \r
-      -1, \r
+    ShellPrintHiiEx (\r
+      -1,\r
+      -1,\r
       NULL,\r
-      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), \r
+      STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),\r
       gShellNetwork1HiiHandle,\r
       (UINTN)Gateway.Addr[0],\r
       (UINTN)Gateway.Addr[1],\r
       (UINTN)Gateway.Addr[2],\r
       (UINTN)Gateway.Addr[3]\r
       );\r
-      \r
+\r
     //\r
     // Print route table entry.\r
     //\r
-    ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);\r
 \r
     for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {\r
-      ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);\r
 \r
-      ShellPrintHiiEx(\r
-        -1, \r
-        -1, \r
+      ShellPrintHiiEx (\r
+        -1,\r
+        -1,\r
         NULL,\r
-        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
-        gShellNetwork1HiiHandle, \r
+        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),\r
+        gShellNetwork1HiiHandle,\r
         L"Subnet ",\r
         (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],\r
         (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],\r
@@ -652,12 +683,12 @@ IfConfigShowInterfaceInfo (
         (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]\r
         );\r
 \r
-      ShellPrintHiiEx(\r
-        -1, \r
-        -1, \r
+      ShellPrintHiiEx (\r
+        -1,\r
+        -1,\r
         NULL,\r
-        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
-        gShellNetwork1HiiHandle, \r
+        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),\r
+        gShellNetwork1HiiHandle,\r
         L"Netmask",\r
         (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],\r
         (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],\r
@@ -665,12 +696,12 @@ IfConfigShowInterfaceInfo (
         (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]\r
         );\r
 \r
-      ShellPrintHiiEx(\r
-        -1, \r
-        -1, \r
+      ShellPrintHiiEx (\r
+        -1,\r
+        -1,\r
         NULL,\r
-        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
-        gShellNetwork1HiiHandle, \r
+        STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),\r
+        gShellNetwork1HiiHandle,\r
         L"Gateway",\r
         (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],\r
         (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],\r
@@ -685,22 +716,22 @@ IfConfigShowInterfaceInfo (
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);\r
 \r
     for (Index = 0; Index < IfCb->DnsCnt; Index++) {\r
-      ShellPrintHiiEx(\r
-        -1, \r
-        -1, \r
+      ShellPrintHiiEx (\r
+        -1,\r
+        -1,\r
         NULL,\r
-        STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY), \r
+        STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),\r
         gShellNetwork1HiiHandle,\r
-        (UINTN) IfCb->DnsAddr[Index].Addr[0],\r
-        (UINTN) IfCb->DnsAddr[Index].Addr[1],\r
-        (UINTN) IfCb->DnsAddr[Index].Addr[2],\r
-        (UINTN) IfCb->DnsAddr[Index].Addr[3]\r
+        (UINTN)IfCb->DnsAddr[Index].Addr[0],\r
+        (UINTN)IfCb->DnsAddr[Index].Addr[1],\r
+        (UINTN)IfCb->DnsAddr[Index].Addr[2],\r
+        (UINTN)IfCb->DnsAddr[Index].Addr[3]\r
         );\r
 \r
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);\r
     }\r
   }\r
-  \r
+\r
   ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);\r
 \r
   return SHELL_SUCCESS;\r
@@ -718,18 +749,18 @@ IfConfigShowInterfaceInfo (
 **/\r
 SHELL_STATUS\r
 IfConfigClearInterfaceInfo (\r
-  IN LIST_ENTRY    *IfList,\r
-  IN CHAR16        *IfName\r
+  IN LIST_ENTRY  *IfList,\r
+  IN CHAR16      *IfName\r
   )\r
 {\r
-  EFI_STATUS                Status;  \r
-  SHELL_STATUS              ShellStatus;\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *Next;\r
-  IFCONFIG_INTERFACE_CB     *IfCb;\r
-  EFI_IP4_CONFIG2_POLICY    Policy;\r
-  \r
-  Status = EFI_SUCCESS;\r
+  EFI_STATUS              Status;\r
+  SHELL_STATUS            ShellStatus;\r
+  LIST_ENTRY              *Entry;\r
+  LIST_ENTRY              *Next;\r
+  IFCONFIG_INTERFACE_CB   *IfCb;\r
+  EFI_IP4_CONFIG2_POLICY  Policy;\r
+\r
+  Status      = EFI_SUCCESS;\r
   ShellStatus = SHELL_SUCCESS;\r
 \r
   if (IsListEmpty (IfList)) {\r
@@ -738,7 +769,7 @@ IfConfigClearInterfaceInfo (
 \r
   //\r
   // Go through the interface list.\r
-  // If the interface name is specified, DHCP DORA process will be \r
+  // If the interface name is specified, DHCP DORA process will be\r
   // triggered by the policy transition (static -> dhcp).\r
   //\r
   NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) {\r
@@ -746,7 +777,7 @@ IfConfigClearInterfaceInfo (
 \r
     if ((IfName != NULL) && (StrCmp (IfName, IfCb->IfInfo->Name) == 0)) {\r
       Policy = Ip4Config2PolicyStatic;\r
-      \r
+\r
       Status = IfCb->IfCfg->SetData (\r
                               IfCb->IfCfg,\r
                               Ip4Config2DataTypePolicy,\r
@@ -757,11 +788,11 @@ IfConfigClearInterfaceInfo (
         ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");\r
         ShellStatus = SHELL_ACCESS_DENIED;\r
         break;\r
-      }  \r
+      }\r
     }\r
 \r
     Policy = Ip4Config2PolicyDhcp;\r
-    \r
+\r
     Status = IfCb->IfCfg->SetData (\r
                             IfCb->IfCfg,\r
                             Ip4Config2DataTypePolicy,\r
@@ -790,27 +821,29 @@ IfConfigClearInterfaceInfo (
 **/\r
 SHELL_STATUS\r
 IfConfigSetInterfaceInfo (\r
-  IN LIST_ENTRY    *IfList,\r
-  IN ARG_LIST      *VarArg\r
+  IN LIST_ENTRY  *IfList,\r
+  IN ARG_LIST    *VarArg\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  SHELL_STATUS                     ShellStatus;\r
-  IFCONFIG_INTERFACE_CB            *IfCb;\r
-  VAR_CHECK_CODE                   CheckCode;\r
-  EFI_EVENT                        TimeOutEvt;\r
-  EFI_EVENT                        MappedEvt;\r
-  BOOLEAN                          IsAddressOk;\r
-\r
-  EFI_IP4_CONFIG2_POLICY           Policy;\r
-  EFI_IP4_CONFIG2_MANUAL_ADDRESS   ManualAddress;\r
-  UINTN                            DataSize;\r
-  EFI_IPv4_ADDRESS                 Gateway;\r
-  EFI_IPv4_ADDRESS                 *Dns;\r
-  ARG_LIST                         *Tmp;\r
-  UINTN                            Index;\r
-\r
-  CONST CHAR16* TempString;\r
+  EFI_STATUS             Status;\r
+  SHELL_STATUS           ShellStatus;\r
+  IFCONFIG_INTERFACE_CB  *IfCb;\r
+  VAR_CHECK_CODE         CheckCode;\r
+  EFI_EVENT              TimeOutEvt;\r
+  EFI_EVENT              MappedEvt;\r
+  BOOLEAN                IsAddressOk;\r
+\r
+  EFI_IP4_CONFIG2_POLICY          Policy;\r
+  EFI_IP4_CONFIG2_MANUAL_ADDRESS  ManualAddress;\r
+  UINTN                           DataSize;\r
+  EFI_IPv4_ADDRESS                Gateway;\r
+  IP4_ADDR                        SubnetMask;\r
+  IP4_ADDR                        TempGateway;\r
+  EFI_IPv4_ADDRESS                *Dns;\r
+  ARG_LIST                        *Tmp;\r
+  UINTN                           Index;\r
+\r
+  CONST CHAR16  *TempString;\r
 \r
   Dns = NULL;\r
 \r
@@ -818,18 +851,18 @@ IfConfigSetInterfaceInfo (
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
     return SHELL_INVALID_PARAMETER;\r
   }\r
-  \r
+\r
   //\r
   // Make sure to set only one interface each time.\r
   //\r
-  IfCb   = NET_LIST_USER_STRUCT (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);\r
-  Status = EFI_SUCCESS;\r
+  IfCb        = NET_LIST_USER_STRUCT (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);\r
+  Status      = EFI_SUCCESS;\r
   ShellStatus = SHELL_SUCCESS;\r
 \r
   //\r
   // Initialize check list mechanism.\r
   //\r
-  CheckCode = IfConfigRetriveCheckListByName(\r
+  CheckCode = IfConfigRetriveCheckListByName (\r
                 NULL,\r
                 NULL,\r
                 TRUE\r
@@ -871,7 +904,7 @@ IfConfigSetInterfaceInfo (
     //\r
     // Check invalid parameters (duplication & unknown & conflict).\r
     //\r
-    CheckCode = IfConfigRetriveCheckListByName(\r
+    CheckCode = IfConfigRetriveCheckListByName (\r
                   mSetCheckList,\r
                   VarArg->Arg,\r
                   FALSE\r
@@ -892,8 +925,8 @@ IfConfigSetInterfaceInfo (
           // To handle unsupported option.\r
           //\r
           TempString = PermanentString;\r
-          if (StringNoCaseCompare(&VarArg->Arg, &TempString) == 0) {\r
-            ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString);\r
+          if (StringNoCaseCompare (&VarArg->Arg, &TempString) == 0) {\r
+            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString);\r
             goto ON_EXIT;\r
           }\r
 \r
@@ -908,13 +941,13 @@ IfConfigSetInterfaceInfo (
       }\r
 \r
       VarArg = VarArg->Next;\r
-      continue;   \r
+      continue;\r
     }\r
 \r
     //\r
     // Process valid variables.\r
     //\r
-    if (StrCmp(VarArg->Arg, L"dhcp") == 0) {\r
+    if (StrCmp (VarArg->Arg, L"dhcp") == 0) {\r
       //\r
       // Set dhcp config policy\r
       //\r
@@ -925,16 +958,15 @@ IfConfigSetInterfaceInfo (
                               sizeof (EFI_IP4_CONFIG2_POLICY),\r
                               &Policy\r
                               );\r
-      if (EFI_ERROR(Status)) {\r
+      if (EFI_ERROR (Status)) {\r
         ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");\r
         ShellStatus = SHELL_ACCESS_DENIED;\r
         goto ON_EXIT;\r
       }\r
-      \r
-      VarArg= VarArg->Next;    \r
 \r
+      VarArg = VarArg->Next;\r
     } else if (StrCmp (VarArg->Arg, L"static") == 0) {\r
-      VarArg= VarArg->Next;\r
+      VarArg = VarArg->Next;\r
       if (VarArg == NULL) {\r
         ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
@@ -942,30 +974,30 @@ IfConfigSetInterfaceInfo (
       }\r
 \r
       ZeroMem (&ManualAddress, sizeof (ManualAddress));\r
-    \r
+\r
       //\r
       // Get manual IP address.\r
       //\r
       Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);\r
-      if (EFI_ERROR(Status)) {\r
-        ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);\r
+      if (EFI_ERROR (Status)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto ON_EXIT;\r
       }\r
 \r
       //\r
       // Get subnetmask.\r
-      //    \r
+      //\r
       VarArg = VarArg->Next;\r
       if (VarArg == NULL) {\r
         ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto ON_EXIT;\r
       }\r
-      \r
+\r
       Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);\r
-      if (EFI_ERROR(Status)) {\r
-        ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);\r
+      if (EFI_ERROR (Status)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto ON_EXIT;\r
       }\r
@@ -979,10 +1011,27 @@ IfConfigSetInterfaceInfo (
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto ON_EXIT;\r
       }\r
-      \r
+\r
       Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);\r
-      if (EFI_ERROR(Status)) {\r
-        ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);\r
+      if (EFI_ERROR (Status)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);\r
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
+        goto ON_EXIT;\r
+      }\r
+\r
+      //\r
+      // Need to check the gateway validity before set Manual Address.\r
+      // In case we can set manual address but fail to configure Gateway.\r
+      //\r
+      CopyMem (&SubnetMask, &ManualAddress.SubnetMask, sizeof (IP4_ADDR));\r
+      CopyMem (&TempGateway, &Gateway, sizeof (IP4_ADDR));\r
+      SubnetMask  = NTOHL (SubnetMask);\r
+      TempGateway = NTOHL (TempGateway);\r
+      if ((SubnetMask != 0) &&\r
+          (SubnetMask != 0xFFFFFFFFu) &&\r
+          !NetIp4IsUnicast (TempGateway, SubnetMask))\r
+      {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle, VarArg->Arg);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto ON_EXIT;\r
       }\r
@@ -997,12 +1046,12 @@ IfConfigSetInterfaceInfo (
                               sizeof (EFI_IP4_CONFIG2_POLICY),\r
                               &Policy\r
                               );\r
-      if (EFI_ERROR(Status)) {\r
+      if (EFI_ERROR (Status)) {\r
         ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");\r
         ShellStatus = SHELL_ACCESS_DENIED;\r
         goto ON_EXIT;\r
       }\r
-      \r
+\r
       //\r
       // Set Manual Address.\r
       //\r
@@ -1044,7 +1093,7 @@ IfConfigSetInterfaceInfo (
                      Ip4Config2DataTypeManualAddress,\r
                      MappedEvt\r
                      );\r
-      \r
+\r
       if (EFI_ERROR (Status)) {\r
         ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status);\r
         ShellStatus = SHELL_ACCESS_DENIED;\r
@@ -1067,9 +1116,8 @@ IfConfigSetInterfaceInfo (
         ShellStatus = SHELL_ACCESS_DENIED;\r
         goto ON_EXIT;\r
       }\r
-      \r
+\r
       VarArg = VarArg->Next;\r
-      \r
     } else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
       //\r
       // Get DNS addresses.\r
@@ -1078,25 +1126,31 @@ IfConfigSetInterfaceInfo (
       Tmp    = VarArg;\r
       Index  = 0;\r
       while (Tmp != NULL) {\r
-        Index ++;\r
+        Index++;\r
         Tmp = Tmp->Next;\r
       }\r
 \r
-      Dns   = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));\r
-      ASSERT(Dns != NULL);\r
+      Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));\r
+      if (Dns == NULL) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig");\r
+        ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+        goto ON_EXIT;\r
+      }\r
+\r
       Tmp   = VarArg;\r
       Index = 0;\r
       while (Tmp != NULL) {\r
         Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);\r
-        if (EFI_ERROR(Status)) {\r
-          ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, Tmp->Arg);\r
+        if (EFI_ERROR (Status)) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, Tmp->Arg);\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
           goto ON_EXIT;\r
         }\r
-        Index ++;\r
+\r
+        Index++;\r
         Tmp = Tmp->Next;\r
       }\r
-      \r
+\r
       VarArg = Tmp;\r
 \r
       //\r
@@ -1122,9 +1176,8 @@ ON_EXIT:
   if (Dns != NULL) {\r
     FreePool (Dns);\r
   }\r
-  \r
-  return ShellStatus;\r
 \r
+  return ShellStatus;\r
 }\r
 \r
 /**\r
@@ -1138,7 +1191,7 @@ ON_EXIT:
 **/\r
 SHELL_STATUS\r
 IfConfig (\r
-  IN IFCONFIG_PRIVATE_DATA    *Private\r
+  IN IFCONFIG_PRIVATE_DATA  *Private\r
   )\r
 {\r
   EFI_STATUS    Status;\r
@@ -1154,25 +1207,25 @@ IfConfig (
              &Private->IfList\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    ShellStatus = SHELL_NOT_FOUND; \r
+    ShellStatus = SHELL_NOT_FOUND;\r
     goto ON_EXIT;\r
   }\r
 \r
   switch (Private->OpCode) {\r
-  case IfConfigOpList:\r
-    ShellStatus = IfConfigShowInterfaceInfo (&Private->IfList);\r
-    break;\r
+    case IfConfigOpList:\r
+      ShellStatus = IfConfigShowInterfaceInfo (&Private->IfList);\r
+      break;\r
 \r
-  case IfConfigOpClear:\r
-    ShellStatus = IfConfigClearInterfaceInfo (&Private->IfList, Private->IfName);\r
-    break;\r
+    case IfConfigOpClear:\r
+      ShellStatus = IfConfigClearInterfaceInfo (&Private->IfList, Private->IfName);\r
+      break;\r
 \r
-  case IfConfigOpSet:\r
-    ShellStatus = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);\r
-    break;\r
+    case IfConfigOpSet:\r
+      ShellStatus = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);\r
+      break;\r
 \r
-  default:\r
-    ShellStatus = SHELL_UNSUPPORTED;\r
+    default:\r
+      ShellStatus = SHELL_UNSUPPORTED;\r
   }\r
 \r
 ON_EXIT:\r
@@ -1190,11 +1243,9 @@ IfConfigCleanup (
   IN IFCONFIG_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *NextEntry;\r
-  IFCONFIG_INTERFACE_CB     *IfCb;\r
-  ARG_LIST                  *ArgNode;\r
-  ARG_LIST                  *ArgHead;\r
+  LIST_ENTRY             *Entry;\r
+  LIST_ENTRY             *NextEntry;\r
+  IFCONFIG_INTERFACE_CB  *IfCb;\r
 \r
   ASSERT (Private != NULL);\r
 \r
@@ -1202,15 +1253,7 @@ IfConfigCleanup (
   // Clean the list which save the set config Args.\r
   //\r
   if (Private->VarArg != NULL) {\r
-    ArgHead = Private->VarArg;\r
-\r
-    while (ArgHead->Next != NULL) {\r
-      ArgNode = ArgHead->Next;\r
-      FreePool (ArgHead);\r
-      ArgHead = ArgNode;\r
-    }\r
-\r
-    FreePool (ArgHead);\r
+    FreeArgList (Private->VarArg);\r
   }\r
 \r
   if (Private->IfName != NULL) {\r
@@ -1226,7 +1269,6 @@ IfConfigCleanup (
     RemoveEntryList (&IfCb->Link);\r
 \r
     if (IfCb->IfInfo != NULL) {\r
-\r
       FreePool (IfCb->IfInfo);\r
     }\r
 \r
@@ -1244,7 +1286,7 @@ IfConfigCleanup (
 \r
   @retval EFI_SUCCESS    ifconfig command processed successfully.\r
   @retval others         The ifconfig command process failed.\r
-  \r
+\r
 **/\r
 SHELL_STATUS\r
 EFIAPI\r
@@ -1253,29 +1295,29 @@ ShellCommandRunIfconfig (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  IFCONFIG_PRIVATE_DATA     *Private;\r
-  LIST_ENTRY                *ParamPackage;\r
-  SHELL_STATUS              ShellStatus;\r
-  CONST CHAR16              *ValueStr;\r
-  ARG_LIST                  *ArgList;\r
-  CHAR16                    *ProblemParam;\r
-  CHAR16                    *Str;\r
-  \r
-  Status = EFI_INVALID_PARAMETER;\r
-  Private = NULL;\r
+  EFI_STATUS             Status;\r
+  IFCONFIG_PRIVATE_DATA  *Private;\r
+  LIST_ENTRY             *ParamPackage;\r
+  SHELL_STATUS           ShellStatus;\r
+  CONST CHAR16           *ValueStr;\r
+  ARG_LIST               *ArgList;\r
+  CHAR16                 *ProblemParam;\r
+  CHAR16                 *Str;\r
+\r
+  Status      = EFI_INVALID_PARAMETER;\r
+  Private     = NULL;\r
   ShellStatus = SHELL_SUCCESS;\r
 \r
   Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);\r
   if (EFI_ERROR (Status)) {\r
-    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
+    if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);\r
-      FreePool(ProblemParam);\r
+      FreePool (ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
-      ASSERT(FALSE);\r
+      ASSERT (FALSE);\r
     }\r
-    \r
+\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -1283,7 +1325,7 @@ ShellCommandRunIfconfig (
   // To handle unsupported option.\r
   //\r
   if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {\r
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, L"-c");\r
     ShellStatus = SHELL_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
   }\r
@@ -1292,7 +1334,8 @@ ShellCommandRunIfconfig (
   // To handle no option.\r
   //\r
   if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&\r
-      !ShellCommandLineGetFlag (ParamPackage, L"-l")) {\r
+      !ShellCommandLineGetFlag (ParamPackage, L"-l"))\r
+  {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);\r
     ShellStatus = SHELL_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
@@ -1303,7 +1346,8 @@ ShellCommandRunIfconfig (
   //\r
   if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||\r
       ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||\r
-      ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l")))) {\r
+      ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))))\r
+  {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");\r
     ShellStatus = SHELL_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
@@ -1322,27 +1366,37 @@ ShellCommandRunIfconfig (
   //\r
   if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {\r
     Private->OpCode = IfConfigOpList;\r
-    ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");\r
+    ValueStr        = ShellCommandLineGetValue (ParamPackage, L"-l");\r
     if (ValueStr != NULL) {\r
       Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
-      ASSERT (Str != NULL);\r
+      if (Str == NULL) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig");\r
+        ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+        goto ON_EXIT;\r
+      }\r
+\r
       Private->IfName = Str;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // To get interface name for the clear option.\r
   //\r
   if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {\r
     Private->OpCode = IfConfigOpClear;\r
-    ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");\r
+    ValueStr        = ShellCommandLineGetValue (ParamPackage, L"-r");\r
     if (ValueStr != NULL) {\r
       Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
-      ASSERT (Str != NULL);\r
+      if (Str == NULL) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig");\r
+        ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+        goto ON_EXIT;\r
+      }\r
+\r
       Private->IfName = Str;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // To get interface name and corresponding Args for the set option.\r
   //\r
@@ -1353,25 +1407,29 @@ ShellCommandRunIfconfig (
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto ON_EXIT;\r
     }\r
-    \r
+\r
     //\r
     // To split the configuration into multi-section.\r
     //\r
-    ArgList         = SplitStrToList (ValueStr, L' ');\r
-    ASSERT (ArgList != NULL);\r
+    ArgList = SplitStrToList (ValueStr, L' ');\r
+    if (ArgList == NULL) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig");\r
+      ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+      goto ON_EXIT;\r
+    }\r
 \r
     Private->OpCode = IfConfigOpSet;\r
     Private->IfName = ArgList->Arg;\r
 \r
     Private->VarArg = ArgList->Next;\r
 \r
-    if (Private->IfName == NULL || Private->VarArg == NULL) {\r
+    if ((Private->IfName == NULL) || (Private->VarArg == NULL)) {\r
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto ON_EXIT;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // Main process of ifconfig.\r
   //\r
@@ -1380,7 +1438,7 @@ ShellCommandRunIfconfig (
 ON_EXIT:\r
 \r
   ShellCommandLineFreeVarList (ParamPackage);\r
-  \r
+\r
   if (Private != NULL) {\r
     IfConfigCleanup (Private);\r
   }\r