]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
ShellPkg: Fix ifconfig hang issue with incomplete parameters
[mirror_edk2.git] / ShellPkg / Library / UefiShellNetwork1CommandsLib / Ifconfig.c
index df19a9f90240a20d6f39ef0238d1aa2b327640bb..f8dbc88cf84273fc96d896016c1f0fe721c17ad5 100644 (file)
@@ -274,6 +274,85 @@ IfConfigManualAddressNotify (
 }\r
 \r
 \r
+/**\r
+  Create an IP child, use it to start the auto configuration, then destroy it.\r
+\r
+  @param[in] Controller       The controller which has the service installed.\r
+  @param[in] Image            The image handle used to open service.\r
+\r
+  @retval EFI_SUCCESS         The configuration is done.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IfConfigStartIp4(\r
+  IN  EFI_HANDLE            Controller,\r
+  IN  EFI_HANDLE            Image\r
+  )\r
+{\r
+  EFI_IP4_PROTOCOL              *Ip4;\r
+  EFI_HANDLE                    Ip4Handle;\r
+  EFI_IP4_CONFIG_DATA           Ip4ConfigData;\r
+  EFI_STATUS                    Status;\r
+\r
+  //\r
+  // Get the Ip4ServiceBinding Protocol\r
+  //\r
+  Ip4Handle     = NULL;\r
+  Ip4           = NULL;\r
+\r
+  Status = NetLibCreateServiceChild (\r
+             Controller,\r
+             Image,\r
+             &gEfiIp4ServiceBindingProtocolGuid,\r
+             &Ip4Handle\r
+             );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->OpenProtocol (\r
+                 Ip4Handle,\r
+                 &gEfiIp4ProtocolGuid,\r
+                 (VOID **) &Ip4,\r
+                 Controller,\r
+                 Image,\r
+                 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                 );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto ON_EXIT;\r
+  }\r
+\r
+  Ip4ConfigData.DefaultProtocol          = EFI_IP_PROTO_ICMP;\r
+  Ip4ConfigData.AcceptAnyProtocol        = FALSE;\r
+  Ip4ConfigData.AcceptIcmpErrors         = FALSE;\r
+  Ip4ConfigData.AcceptBroadcast          = FALSE;\r
+  Ip4ConfigData.AcceptPromiscuous        = FALSE;\r
+  Ip4ConfigData.UseDefaultAddress        = TRUE;\r
+  ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));\r
+  ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+  Ip4ConfigData.TypeOfService            = 0;\r
+  Ip4ConfigData.TimeToLive               = 1;\r
+  Ip4ConfigData.DoNotFragment            = FALSE;\r
+  Ip4ConfigData.RawData                  = FALSE;\r
+  Ip4ConfigData.ReceiveTimeout           = 0;\r
+  Ip4ConfigData.TransmitTimeout          = 0;\r
+\r
+  Ip4->Configure (Ip4, &Ip4ConfigData);\r
+  \r
+ON_EXIT: \r
+  NetLibDestroyServiceChild (\r
+    Controller,\r
+    Image,\r
+    &gEfiIp4ServiceBindingProtocolGuid,\r
+    Ip4Handle\r
+    );\r
+  \r
+  return Status;\r
+}\r
+\r
+\r
 /**\r
   Print MAC address.\r
 \r
@@ -344,7 +423,7 @@ IfConfigGetInterfaceInfo (
                   &HandleBuffer\r
                  );\r
   if (EFI_ERROR (Status) || (HandleNum == 0)) {\r
-    return EFI_ABORTED;\r
+    return Status;\r
   }\r
 \r
   //\r
@@ -508,20 +587,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
+  BOOLEAN                       MediaPresent;\r
+  EFI_IPv4_ADDRESS              Gateway;\r
+  UINT32                        Index;\r
+  \r
+  MediaPresent = TRUE;\r
 \r
   if (IsListEmpty (IfList)) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
@@ -538,7 +620,17 @@ 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
+    } else {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present");\r
+    }\r
 \r
     //\r
     // Print interface config policy.\r
@@ -691,7 +783,7 @@ IfConfigShowInterfaceInfo (
   \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
@@ -699,16 +791,17 @@ IfConfigShowInterfaceInfo (
 \r
   @param[in]   IfList    The pointer of IfList(interface list).\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
   )\r
 {\r
-  EFI_STATUS                Status;\r
+  EFI_STATUS                Status;  \r
+  SHELL_STATUS              ShellStatus;\r
   LIST_ENTRY                *Entry;\r
   LIST_ENTRY                *Next;\r
   IFCONFIG_INTERFACE_CB     *IfCb;\r
@@ -716,6 +809,7 @@ IfConfigClearInterfaceInfo (
 \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
@@ -733,13 +827,14 @@ IfConfigClearInterfaceInfo (
                             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 +843,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
@@ -780,7 +875,7 @@ 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
@@ -788,6 +883,7 @@ IfConfigSetInterfaceInfo (
   //\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 +905,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 +918,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
@@ -874,41 +974,41 @@ IfConfigSetInterfaceInfo (
     // Process valid variables.\r
     //\r
     if (StrCmp(VarArg->Arg, L"dhcp") == 0) {\r
-      //\r
-      // Set dhcp config policy\r
-      //\r
-      Policy = Ip4Config2PolicyDhcp;\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
-        goto ON_EXIT;\r
+      if (IfCb->Policy == Ip4Config2PolicyDhcp) {\r
+        Status = IfConfigStartIp4 (IfCb->NicHandle, gImageHandle);\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
+      } else {\r
+        //\r
+        // Set dhcp config policy\r
+        //\r
+        Policy = Ip4Config2PolicyDhcp;\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
+      \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
@@ -916,6 +1016,8 @@ IfConfigSetInterfaceInfo (
       //\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
@@ -923,8 +1025,16 @@ IfConfigSetInterfaceInfo (
       // Get subnetmask.\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 +1042,38 @@ 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
+      // 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 +1082,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
@@ -973,9 +1112,10 @@ 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
         goto ON_EXIT;\r
       }\r
 \r
@@ -990,6 +1130,12 @@ 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
     } else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
@@ -1011,6 +1157,8 @@ IfConfigSetInterfaceInfo (
       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
@@ -1030,6 +1178,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
@@ -1038,7 +1191,7 @@ ON_EXIT:
     FreePool (Dns);\r
   }\r
   \r
-  return EFI_SUCCESS;\r
+  return ShellStatus;\r
 \r
 }\r
 \r
@@ -1047,16 +1200,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 +1221,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);\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
@@ -1169,16 +1324,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
+  \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 +1352,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 +1362,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 +1373,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
@@ -1253,6 +1418,7 @@ 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
@@ -1269,6 +1435,7 @@ 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
@@ -1276,7 +1443,7 @@ ShellCommandRunIfconfig (
   //\r
   // Main process of ifconfig.\r
   //\r
-  Status = IfConfig (Private);\r
+  ShellStatus = IfConfig (Private);\r
 \r
 ON_EXIT:\r
 \r
@@ -1286,5 +1453,5 @@ ON_EXIT:
     IfConfigCleanup (Private);\r
   }\r
 \r
-  return Status;\r
+  return ShellStatus;\r
 }\r