]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
ShellPkg: Remove trailing white space
[mirror_edk2.git] / ShellPkg / Library / UefiShellNetwork1CommandsLib / Ifconfig.c
index df19a9f90240a20d6f39ef0238d1aa2b327640bb..cdc6db69c34e0372b18ee74e98eb907f12990679 100644 (file)
@@ -2,7 +2,7 @@
   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 - 2015, 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
@@ -45,7 +45,7 @@ typedef struct _IFCONFIG_INTERFACE_CB {
   EFI_HANDLE                                  NicHandle;\r
   LIST_ENTRY                                  Link;\r
   EFI_IP4_CONFIG2_PROTOCOL                    *IfCfg;\r
-  EFI_IP4_CONFIG2_INTERFACE_INFO              *IfInfo; \r
+  EFI_IP4_CONFIG2_INTERFACE_INFO              *IfInfo;\r
   EFI_IP4_CONFIG2_POLICY                      Policy;\r
   UINT32                                      DnsCnt;\r
   EFI_IPv4_ADDRESS                            DnsAddr[1];\r
@@ -129,6 +129,26 @@ VAR_CHECK_ITEM  mSetCheckList[] = {
 \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
+  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
 \r
@@ -157,14 +177,18 @@ SplitStrToList (
   // Copy the CONST string to a local copy.\r
   //\r
   Str = AllocateCopyPool (StrSize (String), String);\r
-  ASSERT (Str != NULL);\r
+  if (Str == NULL) {\r
+    return NULL;\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
+  if (ArgNode == NULL) {\r
+    return NULL;\r
+  }\r
   ArgList = ArgNode;\r
 \r
   //\r
@@ -176,7 +200,14 @@ SplitStrToList (
       ArgNode->Arg  = ArgStr;\r
       ArgStr        = Str + 1;\r
       ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
-      ASSERT (ArgNode->Next != NULL);\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
       ArgNode = ArgNode->Next;\r
     }\r
 \r
@@ -273,7 +304,6 @@ IfConfigManualAddressNotify (
   *((BOOLEAN *) Context) = TRUE;\r
 }\r
 \r
-\r
 /**\r
   Print MAC address.\r
 \r
@@ -344,7 +374,7 @@ IfConfigGetInterfaceInfo (
                   &HandleBuffer\r
                  );\r
   if (EFI_ERROR (Status) || (HandleNum == 0)) {\r
-    return EFI_ABORTED;\r
+    return Status;\r
   }\r
 \r
   //\r
@@ -369,7 +399,7 @@ IfConfigGetInterfaceInfo (
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
-    \r
+\r
     //\r
     // Get the interface information size.\r
     //\r
@@ -390,7 +420,7 @@ IfConfigGetInterfaceInfo (
       Status = EFI_OUT_OF_RESOURCES;\r
       goto ON_ERROR;\r
     }\r
-    \r
+\r
     //\r
     // Get the interface info.\r
     //\r
@@ -404,7 +434,7 @@ IfConfigGetInterfaceInfo (
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
-    \r
+\r
     //\r
     // Check the interface name if required.\r
     //\r
@@ -414,7 +444,7 @@ IfConfigGetInterfaceInfo (
     }\r
 \r
     DataSize = 0;\r
-    \r
+\r
     //\r
     // Get the size of dns server list.\r
     //\r
@@ -508,20 +538,23 @@ ON_ERROR:
 \r
   @param[in]   IfList    The pointer of IfList(interface list).\r
 \r
-  @retval EFI_SUCCESS    The ifconfig command list processed successfully.\r
+  @retval SHELL_SUCCESS  The ifconfig command list processed successfully.\r
   @retval others         The ifconfig command list process failed.\r
 \r
 **/\r
-EFI_STATUS\r
+SHELL_STATUS\r
 IfConfigShowInterfaceInfo (\r
   IN LIST_ENTRY    *IfList\r
   )\r
 {\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *Next;\r
-  IFCONFIG_INTERFACE_CB     *IfCb;\r
-  EFI_IPv4_ADDRESS          Gateway;\r
-  UINT32                    Index;\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,6 +573,19 @@ IfConfigShowInterfaceInfo (
     //\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);\r
 \r
+    //\r
+    // Get Media State.\r
+    //\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 state unknown");\r
+    }\r
+\r
     //\r
     // Print interface config policy.\r
     //\r
@@ -565,10 +611,10 @@ IfConfigShowInterfaceInfo (
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);\r
 \r
     ShellPrintHiiEx(\r
-      -1, \r
-      -1, \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
@@ -582,10 +628,10 @@ IfConfigShowInterfaceInfo (
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);\r
 \r
     ShellPrintHiiEx(\r
-      -1, \r
-      -1, \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
@@ -599,26 +645,26 @@ 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
         CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
       }\r
-    }    \r
+    }\r
 \r
     ShellPrintHiiEx(\r
-      -1, \r
-      -1, \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
@@ -628,11 +674,11 @@ IfConfigShowInterfaceInfo (
       ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);\r
 \r
       ShellPrintHiiEx(\r
-        -1, \r
-        -1, \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
@@ -641,11 +687,11 @@ IfConfigShowInterfaceInfo (
         );\r
 \r
       ShellPrintHiiEx(\r
-        -1, \r
-        -1, \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
@@ -654,11 +700,11 @@ IfConfigShowInterfaceInfo (
         );\r
 \r
       ShellPrintHiiEx(\r
-        -1, \r
-        -1, \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
@@ -674,10 +720,10 @@ IfConfigShowInterfaceInfo (
 \r
     for (Index = 0; Index < IfCb->DnsCnt; Index++) {\r
       ShellPrintHiiEx(\r
-        -1, \r
-        -1, \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
@@ -688,34 +734,37 @@ IfConfigShowInterfaceInfo (
       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 EFI_SUCCESS;\r
+  return SHELL_SUCCESS;\r
 }\r
 \r
 /**\r
   The clean process of the ifconfig command to clear interface info.\r
 \r
   @param[in]   IfList    The pointer of IfList(interface list).\r
+  @param[in]   IfName    The pointer of interface name.\r
 \r
-  @retval EFI_SUCCESS    The ifconfig command clean processed successfully.\r
+  @retval SHELL_SUCCESS  The ifconfig command clean processed successfully.\r
   @retval others         The ifconfig command clean process failed.\r
 \r
 **/\r
-EFI_STATUS\r
+SHELL_STATUS\r
 IfConfigClearInterfaceInfo (\r
-  IN LIST_ENTRY    *IfList\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
-  Policy = Ip4Config2PolicyDhcp;\r
   Status = EFI_SUCCESS;\r
+  ShellStatus = SHELL_SUCCESS;\r
 \r
   if (IsListEmpty (IfList)) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
@@ -723,23 +772,44 @@ IfConfigClearInterfaceInfo (
 \r
   //\r
   // Go through the interface list.\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
     IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link);\r
-    \r
+\r
+    if ((IfName != NULL) && (StrCmp (IfName, IfCb->IfInfo->Name) == 0)) {\r
+      Policy = Ip4Config2PolicyStatic;\r
+\r
+      Status = IfCb->IfCfg->SetData (\r
+                              IfCb->IfCfg,\r
+                              Ip4Config2DataTypePolicy,\r
+                              sizeof (EFI_IP4_CONFIG2_POLICY),\r
+                              &Policy\r
+                              );\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
+        break;\r
+      }\r
+    }\r
+\r
+    Policy = Ip4Config2PolicyDhcp;\r
+\r
     Status = IfCb->IfCfg->SetData (\r
                             IfCb->IfCfg,\r
                             Ip4Config2DataTypePolicy,\r
                             sizeof (EFI_IP4_CONFIG2_POLICY),\r
                             &Policy\r
                             );\r
-\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
       break;\r
     }\r
   }\r
 \r
-  return Status;\r
+  return ShellStatus;\r
 }\r
 \r
 /**\r
@@ -748,18 +818,18 @@ IfConfigClearInterfaceInfo (
   @param[in]   IfList    The pointer of IfList(interface list).\r
   @param[in]   VarArg    The pointer of ARG_LIST(Args with "-s" option).\r
 \r
-  @retval EFI_SUCCESS    The ifconfig command set processed successfully.\r
+  @retval SHELL_SUCCESS  The ifconfig command set processed successfully.\r
   @retval others         The ifconfig command set process failed.\r
 \r
 **/\r
-EFI_STATUS\r
+SHELL_STATUS\r
 IfConfigSetInterfaceInfo (\r
   IN LIST_ENTRY    *IfList,\r
   IN ARG_LIST      *VarArg\r
   )\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
@@ -770,6 +840,8 @@ IfConfigSetInterfaceInfo (
   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
@@ -780,14 +852,15 @@ IfConfigSetInterfaceInfo (
 \r
   if (IsListEmpty (IfList)) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
-    return EFI_INVALID_PARAMETER;\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
+  ShellStatus = SHELL_SUCCESS;\r
 \r
   //\r
   // Initialize check list mechanism.\r
@@ -809,6 +882,8 @@ IfConfigSetInterfaceInfo (
                   &TimeOutEvt\r
                   );\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
@@ -820,6 +895,8 @@ IfConfigSetInterfaceInfo (
                   &MappedEvt\r
                   );\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
@@ -867,7 +944,7 @@ IfConfigSetInterfaceInfo (
       }\r
 \r
       VarArg = VarArg->Next;\r
-      continue;   \r
+      continue;\r
     }\r
 \r
     //\r
@@ -884,47 +961,48 @@ IfConfigSetInterfaceInfo (
                               sizeof (EFI_IP4_CONFIG2_POLICY),\r
                               &Policy\r
                               );\r
-\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
+      VarArg= VarArg->Next;\r
 \r
     } else if (StrCmp (VarArg->Arg, L"static") == 0) {\r
-      //\r
-      // Set manual config policy.\r
-      //\r
-      Policy = Ip4Config2PolicyStatic;\r
-      Status = IfCb->IfCfg->SetData (\r
-                              IfCb->IfCfg,\r
-                              Ip4Config2DataTypePolicy,\r
-                              sizeof (EFI_IP4_CONFIG2_POLICY),\r
-                              &Policy\r
-                              );\r
-\r
-      if (EFI_ERROR(Status)) {\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
-      VarArg= VarArg->Next;   \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
+        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
       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
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto ON_EXIT;\r
       }\r
 \r
@@ -932,11 +1010,54 @@ IfConfigSetInterfaceInfo (
       // Get gateway.\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
       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
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto ON_EXIT;\r
       }\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
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle, VarArg->Arg);\r
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
+        goto ON_EXIT;\r
+      }\r
+\r
+      //\r
+      // Set manual config policy.\r
+      //\r
+      Policy = Ip4Config2PolicyStatic;\r
+      Status = IfCb->IfCfg->SetData (\r
+                              IfCb->IfCfg,\r
+                              Ip4Config2DataTypePolicy,\r
+                              sizeof (EFI_IP4_CONFIG2_POLICY),\r
+                              &Policy\r
+                              );\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
+      // Set Manual Address.\r
+      //\r
       IsAddressOk = FALSE;\r
 \r
       Status = IfCb->IfCfg->RegisterDataNotify (\r
@@ -945,6 +1066,8 @@ IfConfigSetInterfaceInfo (
                               MappedEvt\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
         goto ON_EXIT;\r
       }\r
 \r
@@ -976,6 +1099,7 @@ IfConfigSetInterfaceInfo (
 \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
         goto ON_EXIT;\r
       }\r
 \r
@@ -990,8 +1114,14 @@ IfConfigSetInterfaceInfo (
                               DataSize,\r
                               &Gateway\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
+        goto ON_EXIT;\r
+      }\r
+\r
       VarArg = VarArg->Next;\r
-      \r
+\r
     } else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
       //\r
       // Get DNS addresses.\r
@@ -1005,18 +1135,24 @@ IfConfigSetInterfaceInfo (
       }\r
 \r
       Dns   = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));\r
-      ASSERT(Dns != NULL);\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
       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
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
           goto ON_EXIT;\r
         }\r
         Index ++;\r
         Tmp = Tmp->Next;\r
       }\r
-      \r
+\r
       VarArg = Tmp;\r
 \r
       //\r
@@ -1030,6 +1166,11 @@ IfConfigSetInterfaceInfo (
                               DataSize,\r
                               Dns\r
                               );\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
@@ -1037,8 +1178,8 @@ ON_EXIT:
   if (Dns != NULL) {\r
     FreePool (Dns);\r
   }\r
-  \r
-  return EFI_SUCCESS;\r
+\r
+  return ShellStatus;\r
 \r
 }\r
 \r
@@ -1047,16 +1188,19 @@ ON_EXIT:
 \r
   @param[in]   Private    The pointer of IFCONFIG_PRIVATE_DATA.\r
 \r
-  @retval EFI_SUCCESS    ifconfig command processed successfully.\r
+  @retval SHELL_SUCCESS  ifconfig command processed successfully.\r
   @retval others         The ifconfig command process failed.\r
 \r
 **/\r
-EFI_STATUS\r
+SHELL_STATUS\r
 IfConfig (\r
   IN IFCONFIG_PRIVATE_DATA    *Private\r
   )\r
 {\r
   EFI_STATUS    Status;\r
+  SHELL_STATUS  ShellStatus;\r
+\r
+  ShellStatus = SHELL_SUCCESS;\r
 \r
   //\r
   // Get configure information of all interfaces.\r
@@ -1065,31 +1209,30 @@ IfConfig (
              Private->IfName,\r
              &Private->IfList\r
              );\r
-\r
   if (EFI_ERROR (Status)) {\r
+    ShellStatus = SHELL_NOT_FOUND;\r
     goto ON_EXIT;\r
   }\r
 \r
   switch (Private->OpCode) {\r
   case IfConfigOpList:\r
-    Status = IfConfigShowInterfaceInfo (&Private->IfList);\r
+    ShellStatus = IfConfigShowInterfaceInfo (&Private->IfList);\r
     break;\r
 \r
   case IfConfigOpClear:\r
-    Status = IfConfigClearInterfaceInfo (&Private->IfList);\r
+    ShellStatus = IfConfigClearInterfaceInfo (&Private->IfList, Private->IfName);\r
     break;\r
 \r
   case IfConfigOpSet:\r
-    Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);\r
+    ShellStatus = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);\r
     break;\r
 \r
   default:\r
-    Status = EFI_ABORTED;\r
+    ShellStatus = SHELL_UNSUPPORTED;\r
   }\r
 \r
 ON_EXIT:\r
-\r
-  return Status;\r
+  return ShellStatus;\r
 }\r
 \r
 /**\r
@@ -1106,8 +1249,6 @@ IfConfigCleanup (
   LIST_ENTRY                *Entry;\r
   LIST_ENTRY                *NextEntry;\r
   IFCONFIG_INTERFACE_CB     *IfCb;\r
-  ARG_LIST                  *ArgNode;\r
-  ARG_LIST                  *ArgHead;\r
 \r
   ASSERT (Private != NULL);\r
 \r
@@ -1115,15 +1256,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
@@ -1157,7 +1290,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
@@ -1169,16 +1302,26 @@ ShellCommandRunIfconfig (
   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
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);\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
+      ShellStatus = SHELL_INVALID_PARAMETER;\r
+    } else {\r
+      ASSERT(FALSE);\r
+    }\r
+\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -1187,6 +1330,7 @@ ShellCommandRunIfconfig (
   //\r
   if (ShellCommandLineGetFlag (ParamPackage, 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
 \r
@@ -1196,6 +1340,7 @@ ShellCommandRunIfconfig (
   if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&\r
       !ShellCommandLineGetFlag (ParamPackage, L"-l")) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);\r
+    ShellStatus = SHELL_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -1206,15 +1351,13 @@ ShellCommandRunIfconfig (
       ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||\r
       ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l")))) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");\r
+    ShellStatus = SHELL_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
   }\r
 \r
-  Status = EFI_INVALID_PARAMETER;\r
-\r
   Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));\r
-\r
   if (Private == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
+    ShellStatus = SHELL_OUT_OF_RESOURCES;\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -1228,11 +1371,15 @@ ShellCommandRunIfconfig (
     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
       Private->IfName = Str;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // To get interface name for the clear option.\r
   //\r
@@ -1241,11 +1388,15 @@ ShellCommandRunIfconfig (
     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
       Private->IfName = Str;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // To get interface name and corresponding Args for the set option.\r
   //\r
@@ -1253,14 +1404,19 @@ ShellCommandRunIfconfig (
     ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");\r
     if (ValueStr == NULL) {\r
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_INTERFACE), gShellNetwork1HiiHandle);\r
+      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
@@ -1269,22 +1425,23 @@ ShellCommandRunIfconfig (
 \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
-  Status = IfConfig (Private);\r
+  ShellStatus = IfConfig (Private);\r
 \r
 ON_EXIT:\r
 \r
   ShellCommandLineFreeVarList (ParamPackage);\r
-  \r
+\r
   if (Private != NULL) {\r
     IfConfigCleanup (Private);\r
   }\r
 \r
-  return Status;\r
+  return ShellStatus;\r
 }\r