X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=ShellPkg%2FLibrary%2FUefiShellNetwork1CommandsLib%2FIfconfig.c;h=cdc6db69c34e0372b18ee74e98eb907f12990679;hp=df19a9f90240a20d6f39ef0238d1aa2b327640bb;hb=4b2dc555d8a67e715d8fafab4c9131791d31a788;hpb=41a55ffe795c7507def0dbe61ae87c9633c13833
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index df19a9f902..cdc6db69c3 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -2,7 +2,7 @@
The implementation for Shell command ifconfig based on IP4Config2 protocol.
(C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.
- Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
@@ -45,7 +45,7 @@ typedef struct _IFCONFIG_INTERFACE_CB {
EFI_HANDLE NicHandle;
LIST_ENTRY Link;
EFI_IP4_CONFIG2_PROTOCOL *IfCfg;
- EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
EFI_IP4_CONFIG2_POLICY Policy;
UINT32 DnsCnt;
EFI_IPv4_ADDRESS DnsAddr[1];
@@ -129,6 +129,26 @@ VAR_CHECK_ITEM mSetCheckList[] = {
STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";
+/**
+ Free the ARG_LIST.
+
+ @param List Pointer to ARG_LIST to free.
+**/
+VOID
+FreeArgList (
+ ARG_LIST *List
+)
+{
+ ARG_LIST *Next;
+ while (List->Next != NULL) {
+ Next = List->Next;
+ FreePool (List);
+ List = Next;
+ }
+
+ FreePool (List);
+}
+
/**
Split a string with specified separator and save the substring to a list.
@@ -157,14 +177,18 @@ SplitStrToList (
// Copy the CONST string to a local copy.
//
Str = AllocateCopyPool (StrSize (String), String);
- ASSERT (Str != NULL);
+ if (Str == NULL) {
+ return NULL;
+ }
ArgStr = Str;
//
// init a node for the list head.
//
ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
- ASSERT (ArgNode != NULL);
+ if (ArgNode == NULL) {
+ return NULL;
+ }
ArgList = ArgNode;
//
@@ -176,7 +200,14 @@ SplitStrToList (
ArgNode->Arg = ArgStr;
ArgStr = Str + 1;
ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
- ASSERT (ArgNode->Next != NULL);
+ if (ArgNode->Next == NULL) {
+ //
+ // Free the local copy of string stored in the first node
+ //
+ FreePool (ArgList->Arg);
+ FreeArgList (ArgList);
+ return NULL;
+ }
ArgNode = ArgNode->Next;
}
@@ -273,7 +304,6 @@ IfConfigManualAddressNotify (
*((BOOLEAN *) Context) = TRUE;
}
-
/**
Print MAC address.
@@ -344,7 +374,7 @@ IfConfigGetInterfaceInfo (
&HandleBuffer
);
if (EFI_ERROR (Status) || (HandleNum == 0)) {
- return EFI_ABORTED;
+ return Status;
}
//
@@ -369,7 +399,7 @@ IfConfigGetInterfaceInfo (
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
-
+
//
// Get the interface information size.
//
@@ -390,7 +420,7 @@ IfConfigGetInterfaceInfo (
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
-
+
//
// Get the interface info.
//
@@ -404,7 +434,7 @@ IfConfigGetInterfaceInfo (
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
-
+
//
// Check the interface name if required.
//
@@ -414,7 +444,7 @@ IfConfigGetInterfaceInfo (
}
DataSize = 0;
-
+
//
// Get the size of dns server list.
//
@@ -508,20 +538,23 @@ ON_ERROR:
@param[in] IfList The pointer of IfList(interface list).
- @retval EFI_SUCCESS The ifconfig command list processed successfully.
+ @retval SHELL_SUCCESS The ifconfig command list processed successfully.
@retval others The ifconfig command list process failed.
**/
-EFI_STATUS
+SHELL_STATUS
IfConfigShowInterfaceInfo (
IN LIST_ENTRY *IfList
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *Next;
- IFCONFIG_INTERFACE_CB *IfCb;
- EFI_IPv4_ADDRESS Gateway;
- UINT32 Index;
+ LIST_ENTRY *Entry;
+ LIST_ENTRY *Next;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_STATUS MediaStatus;
+ EFI_IPv4_ADDRESS Gateway;
+ UINT32 Index;
+
+ MediaStatus = EFI_SUCCESS;
if (IsListEmpty (IfList)) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);
@@ -540,6 +573,19 @@ IfConfigShowInterfaceInfo (
//
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);
+ //
+ // Get Media State.
+ //
+ if (EFI_SUCCESS == NetLibDetectMediaWaitTimeout (IfCb->NicHandle, 0, &MediaStatus)) {
+ if (MediaStatus != EFI_SUCCESS) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media disconnected");
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present");
+ }
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media state unknown");
+ }
+
//
// Print interface config policy.
//
@@ -565,10 +611,10 @@ IfConfigShowInterfaceInfo (
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);
ShellPrintHiiEx(
- -1,
- -1,
+ -1,
+ -1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
gShellNetwork1HiiHandle,
(UINTN)IfCb->IfInfo->StationAddress.Addr[0],
(UINTN)IfCb->IfInfo->StationAddress.Addr[1],
@@ -582,10 +628,10 @@ IfConfigShowInterfaceInfo (
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
ShellPrintHiiEx(
- -1,
- -1,
+ -1,
+ -1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
gShellNetwork1HiiHandle,
(UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
(UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
@@ -599,26 +645,26 @@ IfConfigShowInterfaceInfo (
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);
ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-
+
for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
(CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
}
- }
+ }
ShellPrintHiiEx(
- -1,
- -1,
+ -1,
+ -1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
gShellNetwork1HiiHandle,
(UINTN)Gateway.Addr[0],
(UINTN)Gateway.Addr[1],
(UINTN)Gateway.Addr[2],
(UINTN)Gateway.Addr[3]
);
-
+
//
// Print route table entry.
//
@@ -628,11 +674,11 @@ IfConfigShowInterfaceInfo (
ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
ShellPrintHiiEx(
- -1,
- -1,
+ -1,
+ -1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
L"Subnet ",
(UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
(UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
@@ -641,11 +687,11 @@ IfConfigShowInterfaceInfo (
);
ShellPrintHiiEx(
- -1,
- -1,
+ -1,
+ -1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
L"Netmask",
(UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
(UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
@@ -654,11 +700,11 @@ IfConfigShowInterfaceInfo (
);
ShellPrintHiiEx(
- -1,
- -1,
+ -1,
+ -1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
L"Gateway",
(UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
(UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
@@ -674,10 +720,10 @@ IfConfigShowInterfaceInfo (
for (Index = 0; Index < IfCb->DnsCnt; Index++) {
ShellPrintHiiEx(
- -1,
- -1,
+ -1,
+ -1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
+ STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
gShellNetwork1HiiHandle,
(UINTN) IfCb->DnsAddr[Index].Addr[0],
(UINTN) IfCb->DnsAddr[Index].Addr[1],
@@ -688,34 +734,37 @@ IfConfigShowInterfaceInfo (
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
}
}
-
+
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
- return EFI_SUCCESS;
+ return SHELL_SUCCESS;
}
/**
The clean process of the ifconfig command to clear interface info.
@param[in] IfList The pointer of IfList(interface list).
+ @param[in] IfName The pointer of interface name.
- @retval EFI_SUCCESS The ifconfig command clean processed successfully.
+ @retval SHELL_SUCCESS The ifconfig command clean processed successfully.
@retval others The ifconfig command clean process failed.
**/
-EFI_STATUS
+SHELL_STATUS
IfConfigClearInterfaceInfo (
- IN LIST_ENTRY *IfList
+ IN LIST_ENTRY *IfList,
+ IN CHAR16 *IfName
)
{
EFI_STATUS Status;
+ SHELL_STATUS ShellStatus;
LIST_ENTRY *Entry;
LIST_ENTRY *Next;
IFCONFIG_INTERFACE_CB *IfCb;
EFI_IP4_CONFIG2_POLICY Policy;
- Policy = Ip4Config2PolicyDhcp;
Status = EFI_SUCCESS;
+ ShellStatus = SHELL_SUCCESS;
if (IsListEmpty (IfList)) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);
@@ -723,23 +772,44 @@ IfConfigClearInterfaceInfo (
//
// Go through the interface list.
+ // If the interface name is specified, DHCP DORA process will be
+ // triggered by the policy transition (static -> dhcp).
//
NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) {
IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link);
-
+
+ if ((IfName != NULL) && (StrCmp (IfName, IfCb->IfInfo->Name) == 0)) {
+ Policy = Ip4Config2PolicyStatic;
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_ACCESS_DENIED;
+ break;
+ }
+ }
+
+ Policy = Ip4Config2PolicyDhcp;
+
Status = IfCb->IfCfg->SetData (
IfCb->IfCfg,
Ip4Config2DataTypePolicy,
sizeof (EFI_IP4_CONFIG2_POLICY),
&Policy
);
-
if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_ACCESS_DENIED;
break;
}
}
- return Status;
+ return ShellStatus;
}
/**
@@ -748,18 +818,18 @@ IfConfigClearInterfaceInfo (
@param[in] IfList The pointer of IfList(interface list).
@param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).
- @retval EFI_SUCCESS The ifconfig command set processed successfully.
+ @retval SHELL_SUCCESS The ifconfig command set processed successfully.
@retval others The ifconfig command set process failed.
**/
-EFI_STATUS
+SHELL_STATUS
IfConfigSetInterfaceInfo (
IN LIST_ENTRY *IfList,
IN ARG_LIST *VarArg
)
{
-
EFI_STATUS Status;
+ SHELL_STATUS ShellStatus;
IFCONFIG_INTERFACE_CB *IfCb;
VAR_CHECK_CODE CheckCode;
EFI_EVENT TimeOutEvt;
@@ -770,6 +840,8 @@ IfConfigSetInterfaceInfo (
EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
UINTN DataSize;
EFI_IPv4_ADDRESS Gateway;
+ IP4_ADDR SubnetMask;
+ IP4_ADDR TempGateway;
EFI_IPv4_ADDRESS *Dns;
ARG_LIST *Tmp;
UINTN Index;
@@ -780,14 +852,15 @@ IfConfigSetInterfaceInfo (
if (IsListEmpty (IfList)) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);
- return EFI_INVALID_PARAMETER;
+ return SHELL_INVALID_PARAMETER;
}
-
+
//
// Make sure to set only one interface each time.
//
IfCb = NET_LIST_USER_STRUCT (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
Status = EFI_SUCCESS;
+ ShellStatus = SHELL_SUCCESS;
//
// Initialize check list mechanism.
@@ -809,6 +882,8 @@ IfConfigSetInterfaceInfo (
&TimeOutEvt
);
if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_ACCESS_DENIED;
goto ON_EXIT;
}
@@ -820,6 +895,8 @@ IfConfigSetInterfaceInfo (
&MappedEvt
);
if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_ACCESS_DENIED;
goto ON_EXIT;
}
@@ -867,7 +944,7 @@ IfConfigSetInterfaceInfo (
}
VarArg = VarArg->Next;
- continue;
+ continue;
}
//
@@ -884,47 +961,48 @@ IfConfigSetInterfaceInfo (
sizeof (EFI_IP4_CONFIG2_POLICY),
&Policy
);
-
if (EFI_ERROR(Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_ACCESS_DENIED;
goto ON_EXIT;
}
- VarArg= VarArg->Next;
+ VarArg= VarArg->Next;
} else if (StrCmp (VarArg->Arg, L"static") == 0) {
- //
- // Set manual config policy.
- //
- Policy = Ip4Config2PolicyStatic;
- Status = IfCb->IfCfg->SetData (
- IfCb->IfCfg,
- Ip4Config2DataTypePolicy,
- sizeof (EFI_IP4_CONFIG2_POLICY),
- &Policy
- );
-
- if (EFI_ERROR(Status)) {
+ VarArg= VarArg->Next;
+ if (VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
- VarArg= VarArg->Next;
-
ZeroMem (&ManualAddress, sizeof (ManualAddress));
-
+
//
// Get manual IP address.
//
Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
if (EFI_ERROR(Status)) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
//
// Get subnetmask.
- //
+ //
VarArg = VarArg->Next;
+ if (VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ goto ON_EXIT;
+ }
+
Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
if (EFI_ERROR(Status)) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
@@ -932,11 +1010,54 @@ IfConfigSetInterfaceInfo (
// Get gateway.
//
VarArg = VarArg->Next;
+ if (VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ goto ON_EXIT;
+ }
+
Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
if (EFI_ERROR(Status)) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg);
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
-
+
+ //
+ // Need to check the gateway validity before set Manual Address.
+ // In case we can set manual address but fail to configure Gateway.
+ //
+ CopyMem (&SubnetMask, &ManualAddress.SubnetMask, sizeof (IP4_ADDR));
+ CopyMem (&TempGateway, &Gateway, sizeof (IP4_ADDR));
+ SubnetMask = NTOHL (SubnetMask);
+ TempGateway = NTOHL (TempGateway);
+ if ((SubnetMask != 0) &&
+ (SubnetMask != 0xFFFFFFFFu) &&
+ !NetIp4IsUnicast (TempGateway, SubnetMask)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle, VarArg->Arg);
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ goto ON_EXIT;
+ }
+
+ //
+ // Set manual config policy.
+ //
+ Policy = Ip4Config2PolicyStatic;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+ if (EFI_ERROR(Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_ACCESS_DENIED;
+ goto ON_EXIT;
+ }
+
+ //
+ // Set Manual Address.
+ //
IsAddressOk = FALSE;
Status = IfCb->IfCfg->RegisterDataNotify (
@@ -945,6 +1066,8 @@ IfConfigSetInterfaceInfo (
MappedEvt
);
if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status);
+ ShellStatus = SHELL_ACCESS_DENIED;
goto ON_EXIT;
}
@@ -976,6 +1099,7 @@ IfConfigSetInterfaceInfo (
if (EFI_ERROR (Status)) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status);
+ ShellStatus = SHELL_ACCESS_DENIED;
goto ON_EXIT;
}
@@ -990,8 +1114,14 @@ IfConfigSetInterfaceInfo (
DataSize,
&Gateway
);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status);
+ ShellStatus = SHELL_ACCESS_DENIED;
+ goto ON_EXIT;
+ }
+
VarArg = VarArg->Next;
-
+
} else if (StrCmp (VarArg->Arg, L"dns") == 0) {
//
// Get DNS addresses.
@@ -1005,18 +1135,24 @@ IfConfigSetInterfaceInfo (
}
Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
- ASSERT(Dns != NULL);
+ if (Dns == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
Tmp = VarArg;
Index = 0;
while (Tmp != NULL) {
Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
if (EFI_ERROR(Status)) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, Tmp->Arg);
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
Index ++;
Tmp = Tmp->Next;
}
-
+
VarArg = Tmp;
//
@@ -1030,6 +1166,11 @@ IfConfigSetInterfaceInfo (
DataSize,
Dns
);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_ACCESS_DENIED;
+ goto ON_EXIT;
+ }
}
}
@@ -1037,8 +1178,8 @@ ON_EXIT:
if (Dns != NULL) {
FreePool (Dns);
}
-
- return EFI_SUCCESS;
+
+ return ShellStatus;
}
@@ -1047,16 +1188,19 @@ ON_EXIT:
@param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.
- @retval EFI_SUCCESS ifconfig command processed successfully.
+ @retval SHELL_SUCCESS ifconfig command processed successfully.
@retval others The ifconfig command process failed.
**/
-EFI_STATUS
+SHELL_STATUS
IfConfig (
IN IFCONFIG_PRIVATE_DATA *Private
)
{
EFI_STATUS Status;
+ SHELL_STATUS ShellStatus;
+
+ ShellStatus = SHELL_SUCCESS;
//
// Get configure information of all interfaces.
@@ -1065,31 +1209,30 @@ IfConfig (
Private->IfName,
&Private->IfList
);
-
if (EFI_ERROR (Status)) {
+ ShellStatus = SHELL_NOT_FOUND;
goto ON_EXIT;
}
switch (Private->OpCode) {
case IfConfigOpList:
- Status = IfConfigShowInterfaceInfo (&Private->IfList);
+ ShellStatus = IfConfigShowInterfaceInfo (&Private->IfList);
break;
case IfConfigOpClear:
- Status = IfConfigClearInterfaceInfo (&Private->IfList);
+ ShellStatus = IfConfigClearInterfaceInfo (&Private->IfList, Private->IfName);
break;
case IfConfigOpSet:
- Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+ ShellStatus = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
break;
default:
- Status = EFI_ABORTED;
+ ShellStatus = SHELL_UNSUPPORTED;
}
ON_EXIT:
-
- return Status;
+ return ShellStatus;
}
/**
@@ -1106,8 +1249,6 @@ IfConfigCleanup (
LIST_ENTRY *Entry;
LIST_ENTRY *NextEntry;
IFCONFIG_INTERFACE_CB *IfCb;
- ARG_LIST *ArgNode;
- ARG_LIST *ArgHead;
ASSERT (Private != NULL);
@@ -1115,15 +1256,7 @@ IfConfigCleanup (
// Clean the list which save the set config Args.
//
if (Private->VarArg != NULL) {
- ArgHead = Private->VarArg;
-
- while (ArgHead->Next != NULL) {
- ArgNode = ArgHead->Next;
- FreePool (ArgHead);
- ArgHead = ArgNode;
- }
-
- FreePool (ArgHead);
+ FreeArgList (Private->VarArg);
}
if (Private->IfName != NULL) {
@@ -1157,7 +1290,7 @@ IfConfigCleanup (
@retval EFI_SUCCESS ifconfig command processed successfully.
@retval others The ifconfig command process failed.
-
+
**/
SHELL_STATUS
EFIAPI
@@ -1169,16 +1302,26 @@ ShellCommandRunIfconfig (
EFI_STATUS Status;
IFCONFIG_PRIVATE_DATA *Private;
LIST_ENTRY *ParamPackage;
+ SHELL_STATUS ShellStatus;
CONST CHAR16 *ValueStr;
ARG_LIST *ArgList;
CHAR16 *ProblemParam;
CHAR16 *Str;
+ Status = EFI_INVALID_PARAMETER;
Private = NULL;
+ ShellStatus = SHELL_SUCCESS;
Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
+ if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
+ FreePool(ProblemParam);
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ } else {
+ ASSERT(FALSE);
+ }
+
goto ON_EXIT;
}
@@ -1187,6 +1330,7 @@ ShellCommandRunIfconfig (
//
if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
@@ -1196,6 +1340,7 @@ ShellCommandRunIfconfig (
if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
!ShellCommandLineGetFlag (ParamPackage, L"-l")) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
@@ -1206,15 +1351,13 @@ ShellCommandRunIfconfig (
((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l")))) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
- Status = EFI_INVALID_PARAMETER;
-
Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
-
if (Private == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
+ ShellStatus = SHELL_OUT_OF_RESOURCES;
goto ON_EXIT;
}
@@ -1228,11 +1371,15 @@ ShellCommandRunIfconfig (
ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
if (ValueStr != NULL) {
Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);
- ASSERT (Str != NULL);
+ if (Str == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
Private->IfName = Str;
}
}
-
+
//
// To get interface name for the clear option.
//
@@ -1241,11 +1388,15 @@ ShellCommandRunIfconfig (
ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
if (ValueStr != NULL) {
Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);
- ASSERT (Str != NULL);
+ if (Str == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
Private->IfName = Str;
}
}
-
+
//
// To get interface name and corresponding Args for the set option.
//
@@ -1253,14 +1404,19 @@ ShellCommandRunIfconfig (
ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
if (ValueStr == NULL) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_INTERFACE), gShellNetwork1HiiHandle);
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
-
+
//
// To split the configuration into multi-section.
//
- ArgList = SplitStrToList (ValueStr, L' ');
- ASSERT (ArgList != NULL);
+ ArgList = SplitStrToList (ValueStr, L' ');
+ if (ArgList == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig");
+ ShellStatus = SHELL_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
Private->OpCode = IfConfigOpSet;
Private->IfName = ArgList->Arg;
@@ -1269,22 +1425,23 @@ ShellCommandRunIfconfig (
if (Private->IfName == NULL || Private->VarArg == NULL) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);
+ ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
-
+
//
// Main process of ifconfig.
//
- Status = IfConfig (Private);
+ ShellStatus = IfConfig (Private);
ON_EXIT:
ShellCommandLineFreeVarList (ParamPackage);
-
+
if (Private != NULL) {
IfConfigCleanup (Private);
}
- return Status;
+ return ShellStatus;
}