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
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
\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
// 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
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
*((BOOLEAN *) Context) = TRUE;\r
}\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
if (EFI_ERROR (Status)) {\r
goto ON_ERROR;\r
}\r
- \r
+\r
//\r
// Get the interface information size.\r
//\r
Status = EFI_OUT_OF_RESOURCES;\r
goto ON_ERROR;\r
}\r
- \r
+\r
//\r
// Get the interface info.\r
//\r
if (EFI_ERROR (Status)) {\r
goto ON_ERROR;\r
}\r
- \r
+\r
//\r
// Check the interface name if required.\r
//\r
}\r
\r
DataSize = 0;\r
- \r
+\r
//\r
// Get the size of dns server list.\r
//\r
LIST_ENTRY *Entry;\r
LIST_ENTRY *Next;\r
IFCONFIG_INTERFACE_CB *IfCb;\r
- BOOLEAN MediaPresent;\r
+ EFI_STATUS MediaStatus;\r
EFI_IPv4_ADDRESS Gateway;\r
UINT32 Index;\r
- \r
- MediaPresent = TRUE;\r
+\r
+ MediaStatus = EFI_SUCCESS;\r
\r
if (IsListEmpty (IfList)) {\r
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
//\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
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
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
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
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
);\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
);\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
\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
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
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 SHELL_SUCCESS The ifconfig command clean processed successfully.\r
@retval others The ifconfig command clean process failed.\r
**/\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
+ 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
\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
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
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
}\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 (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
+ // 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
- VarArg= VarArg->Next; \r
+\r
+ VarArg= VarArg->Next;\r
\r
} else if (StrCmp (VarArg->Arg, L"static") == 0) {\r
VarArg= VarArg->Next;\r
}\r
\r
ZeroMem (&ManualAddress, sizeof (ManualAddress));\r
- \r
+\r
//\r
// Get manual IP address.\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
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
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
+ 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
ShellStatus = SHELL_ACCESS_DENIED;\r
goto ON_EXIT;\r
}\r
- \r
+\r
//\r
// Set Manual Address.\r
//\r
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
ShellStatus = SHELL_ACCESS_DENIED;\r
goto ON_EXIT;\r
}\r
- \r
+\r
VarArg = VarArg->Next;\r
- \r
+\r
} else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
//\r
// Get DNS addresses.\r
}\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
Index ++;\r
Tmp = Tmp->Next;\r
}\r
- \r
+\r
VarArg = Tmp;\r
\r
//\r
if (Dns != NULL) {\r
FreePool (Dns);\r
}\r
- \r
+\r
return ShellStatus;\r
\r
}\r
&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
break;\r
\r
case IfConfigOpClear:\r
- ShellStatus = IfConfigClearInterfaceInfo (&Private->IfList);\r
+ ShellStatus = IfConfigClearInterfaceInfo (&Private->IfList, Private->IfName);\r
break;\r
\r
case IfConfigOpSet:\r
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
// 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
\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
ARG_LIST *ArgList;\r
CHAR16 *ProblemParam;\r
CHAR16 *Str;\r
- \r
+\r
Status = EFI_INVALID_PARAMETER;\r
Private = NULL;\r
ShellStatus = SHELL_SUCCESS;\r
} else {\r
ASSERT(FALSE);\r
}\r
- \r
+\r
goto ON_EXIT;\r
}\r
\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
Private->IfName = Str;\r
}\r
}\r
- \r
+\r
//\r
// To get interface name for the clear option.\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
Private->IfName = Str;\r
}\r
}\r
- \r
+\r
//\r
// To get interface name and corresponding Args for the set option.\r
//\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
goto ON_EXIT;\r
}\r
}\r
- \r
+\r
//\r
// Main process of ifconfig.\r
//\r
ON_EXIT:\r
\r
ShellCommandLineFreeVarList (ParamPackage);\r
- \r
+\r
if (Private != NULL) {\r
IfConfigCleanup (Private);\r
}\r