The implementation for Shell command IfConfig6.\r
\r
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+ (C) Copyright 2017 Hewlett Packard Enterprise Development LP<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
},\r
};\r
\r
+/**\r
+ Free the ARG_LIST.\r
+\r
+ @param List Pointer to ARG_LIST to free.\r
+**/\r
+VOID\r
+IfConfig6FreeArgList (\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
//\r
// Copy the CONST string to a local copy.\r
//\r
- Str = AllocateCopyPool (StrSize (String), String);\r
- ASSERT (Str != NULL);\r
+ Str = AllocateCopyPool (StrSize (String), String);\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
+ IfConfig6FreeArgList (ArgList);\r
+ return NULL;\r
+ }\r
ArgNode = ArgNode->Next;\r
}\r
\r
}\r
\r
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
\r
return SHELL_SUCCESS;\r
}\r
The clean process of the IfConfig6 application.\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 IfConfig6 clean processed successfully.\r
@retval others The IfConfig6 clean process failed.\r
**/\r
SHELL_STATUS\r
IfConfig6ClearInterfaceInfo (\r
- IN LIST_ENTRY *IfList\r
+ IN LIST_ENTRY *IfList,\r
+ IN CHAR16 *IfName\r
)\r
{\r
EFI_STATUS Status;\r
IFCONFIG6_INTERFACE_CB *IfCb;\r
EFI_IP6_CONFIG_POLICY Policy;\r
\r
- Policy = Ip6ConfigPolicyAutomatic;\r
Entry = IfList->ForwardLink;\r
Status = EFI_SUCCESS;\r
ShellStatus = SHELL_SUCCESS;\r
}\r
\r
//\r
- // Go through the interface list.\r
+ // Go through the interface list.If the interface name is specified, then\r
+ // need to refresh the configuration.\r
//\r
while (Entry != IfList) {\r
\r
IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link);\r
\r
+ if ((IfName != NULL) && (StrCmp (IfName, IfCb->IfInfo->Name) == 0)) {\r
+ Policy = Ip6ConfigPolicyManual;\r
+\r
+ Status = IfCb->IfCfg->SetData (\r
+ IfCb->IfCfg,\r
+ Ip6ConfigDataTypePolicy,\r
+ sizeof (EFI_IP6_CONFIG_POLICY),\r
+ &Policy\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6");\r
+ ShellStatus = SHELL_ACCESS_DENIED;\r
+ break;\r
+ }\r
+ }\r
+\r
+ Policy = Ip6ConfigPolicyAutomatic;\r
+\r
Status = IfCb->IfCfg->SetData (\r
IfCb->IfCfg,\r
Ip6ConfigDataTypePolicy,\r
);\r
\r
if (EFI_ERROR (Status)) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6");\r
ShellStatus = SHELL_ACCESS_DENIED;\r
break;\r
}\r
\r
VarArg= VarArg->Next;\r
\r
+ if (VarArg != NULL) {\r
+ if (StrCmp (VarArg->Arg, L"host") == 0) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_IP_CONFIG), gShellNetwork2HiiHandle, Status);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ goto ON_EXIT;\r
+ } else if (StrCmp (VarArg->Arg, L"gw") == 0) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_GW_CONFIG), gShellNetwork2HiiHandle, Status);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ goto ON_EXIT;\r
+ } else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_DNS_CONFIG), gShellNetwork2HiiHandle, Status);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ goto ON_EXIT;\r
+ }\r
+ }\r
} else if (StrCmp (VarArg->Arg, L"man") == 0) {\r
//\r
// Set manual config policy.\r
&CfgManAddr[Index].Address,\r
&CfgManAddr[Index].PrefixLength\r
);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
}\r
}\r
\r
\r
if (EFI_ERROR (Status)) {\r
ShellStatus = SHELL_ACCESS_DENIED;\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_GW), gShellNetwork2HiiHandle, Status);\r
goto ON_EXIT;\r
}\r
\r
break;\r
\r
case IfConfig6OpClear:\r
- ShellStatus = IfConfig6ClearInterfaceInfo (&Private->IfList);\r
+ ShellStatus = IfConfig6ClearInterfaceInfo (&Private->IfList, Private->IfName);\r
break;\r
\r
case IfConfig6OpSet:\r
LIST_ENTRY *Entry;\r
LIST_ENTRY *NextEntry;\r
IFCONFIG6_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
+ IfConfig6FreeArgList (Private->VarArg);\r
}\r
\r
if (Private->IfName != NULL)\r
Private->OpCode = IfConfig6OpList;\r
ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");\r
if (ValueStr != NULL) {\r
- Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
- ASSERT (Str != NULL);\r
+ Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
+ if (Str == NULL) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
+ ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
Private->IfName = Str;\r
}\r
}\r
Private->OpCode = IfConfig6OpClear;\r
ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");\r
if (ValueStr != NULL) {\r
- Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
- ASSERT (Str != NULL);\r
+ Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
+ if (Str == NULL) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
+ ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
Private->IfName = Str;\r
}\r
}\r
//\r
// To split the configuration into multi-section.\r
//\r
- ArgList = IfConfig6SplitStrToList (ValueStr, L' ');\r
- ASSERT (ArgList != NULL);\r
+ ArgList = IfConfig6SplitStrToList (ValueStr, L' ');\r
+ if (ArgList == NULL) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
+ ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
\r
Private->OpCode = IfConfig6OpSet;\r
Private->IfName = ArgList->Arg;\r