2 The implementation for Shell command IfConfig6.
\r
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
\r
5 (C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>
\r
7 This program and the accompanying materials
\r
8 are licensed and made available under the terms and conditions of the BSD License
\r
9 which accompanies this distribution. The full text of the license may be found at
\r
10 http://opensource.org/licenses/bsd-license.php.
\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
\r
16 #include "UefiShellNetwork2CommandsLib.h"
\r
19 IfConfig6OpList = 1,
\r
21 IfConfig6OpClear = 3
\r
25 VarCheckReserved = -1,
\r
39 } VAR_CHECK_FLAG_TYPE;
\r
41 #define MACADDRMAXSIZE 32
\r
42 #define PREFIXMAXLEN 16
\r
44 typedef struct _IFCONFIG6_INTERFACE_CB {
\r
45 EFI_HANDLE NicHandle;
\r
47 EFI_IP6_CONFIG_PROTOCOL *IfCfg;
\r
48 EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
\r
49 EFI_IP6_CONFIG_INTERFACE_ID *IfId;
\r
50 EFI_IP6_CONFIG_POLICY Policy;
\r
51 EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS Xmits;
\r
53 EFI_IPv6_ADDRESS DnsAddr[1];
\r
54 } IFCONFIG6_INTERFACE_CB;
\r
56 typedef struct _ARG_LIST ARG_LIST;
\r
63 typedef struct _IFCONFIG6_PRIVATE_DATA {
\r
64 EFI_HANDLE ImageHandle;
\r
70 } IFCONFIG6_PRIVATE_DATA;
\r
72 typedef struct _VAR_CHECK_ITEM{
\r
75 UINT32 ConflictMask;
\r
76 VAR_CHECK_FLAG_TYPE FlagType;
\r
80 SHELL_PARAM_ITEM mIfConfig6CheckList[] = {
\r
107 VAR_CHECK_ITEM mIfConfig6SetCheckList[] = {
\r
154 FlagTypeSkipUnknown
\r
161 @param List Pointer to ARG_LIST to free.
\r
164 IfConfig6FreeArgList (
\r
169 while (List->Next != NULL) {
\r
179 Split a string with specified separator and save the substring to a list.
\r
181 @param[in] String The pointer of the input string.
\r
182 @param[in] Separator The specified separator.
\r
184 @return The pointer of headnode of ARG_LIST.
\r
188 IfConfig6SplitStrToList (
\r
189 IN CONST CHAR16 *String,
\r
190 IN CHAR16 Separator
\r
198 if (String == NULL || *String == L'\0') {
\r
203 // Copy the CONST string to a local copy.
\r
205 Str = AllocateCopyPool (StrSize (String), String);
\r
212 // init a node for the list head.
\r
214 ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
\r
215 if (ArgNode == NULL) {
\r
221 // Split the local copy and save in the list node.
\r
223 while (*Str != L'\0') {
\r
224 if (*Str == Separator) {
\r
226 ArgNode->Arg = ArgStr;
\r
228 ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
\r
229 if (ArgNode->Next == NULL) {
\r
231 // Free the local copy of string stored in the first node
\r
233 FreePool (ArgList->Arg);
\r
234 IfConfig6FreeArgList (ArgList);
\r
237 ArgNode = ArgNode->Next;
\r
243 ArgNode->Arg = ArgStr;
\r
244 ArgNode->Next = NULL;
\r
250 Check the correctness of input Args with '-s' option.
\r
252 @param[in] CheckList The pointer of VAR_CHECK_ITEM array.
\r
253 @param[in] Name The pointer of input arg.
\r
254 @param[in] Init The switch to execute the check.
\r
256 @return The value of VAR_CHECK_CODE.
\r
260 IfConfig6RetriveCheckListByName(
\r
261 IN VAR_CHECK_ITEM *CheckList,
\r
266 STATIC UINT32 CheckDuplicate;
\r
267 STATIC UINT32 CheckConflict;
\r
268 VAR_CHECK_CODE RtCode;
\r
270 VAR_CHECK_ITEM Arg;
\r
273 CheckDuplicate = 0;
\r
278 RtCode = VarCheckOk;
\r
280 Arg = CheckList[Index];
\r
283 // Check the Duplicated/Conflicted/Unknown input Args.
\r
285 while (Arg.FlagStr != NULL) {
\r
286 if (StrCmp (Arg.FlagStr, Name) == 0) {
\r
288 if (CheckDuplicate & Arg.FlagID) {
\r
289 RtCode = VarCheckDuplicate;
\r
293 if (CheckConflict & Arg.ConflictMask) {
\r
294 RtCode = VarCheckConflict;
\r
298 CheckDuplicate |= Arg.FlagID;
\r
299 CheckConflict |= Arg.ConflictMask;
\r
303 Arg = CheckList[++Index];
\r
306 if (Arg.FlagStr == NULL) {
\r
307 RtCode = VarCheckUnknown;
\r
314 The notify function of create event when performing a manual config.
\r
316 @param[in] Event The event this notify function registered to.
\r
317 @param[in] Context Pointer to the context data registered to the event.
\r
322 IfConfig6ManualAddressNotify (
\r
323 IN EFI_EVENT Event,
\r
327 *((BOOLEAN *) Context) = TRUE;
\r
333 @param[in] Node The pointer of MAC address buffer.
\r
334 @param[in] Size The size of MAC address buffer.
\r
338 IfConfig6PrintMacAddr (
\r
345 ASSERT (Size <= MACADDRMAXSIZE);
\r
347 for (Index = 0; Index < Size; Index++) {
\r
348 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_MAC_ADDR_BODY), gShellNetwork2HiiHandle, Node[Index]);
\r
349 if (Index + 1 < Size) {
\r
350 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle);
\r
354 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);
\r
358 Print IPv6 address.
\r
360 @param[in] Ip The pointer of Ip bufffer in EFI_IPv6_ADDRESS format.
\r
361 @param[in] PrefixLen The pointer of PrefixLen that describes the size Prefix.
\r
365 IfConfig6PrintIpAddr (
\r
366 IN EFI_IPv6_ADDRESS *Ip,
\r
367 IN UINT8 *PrefixLen
\r
375 for (Index = 0; Index < PREFIXMAXLEN; Index = Index + 2) {
\r
377 if (!Short && (Index + 1 < PREFIXMAXLEN) && (Index % 2 == 0) && (Ip->Addr[Index] == 0) && (Ip->Addr[Index + 1] == 0)) {
\r
379 // Deal with the case of ::.
\r
383 // :: is at the beginning of the address.
\r
385 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle);
\r
387 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle);
\r
389 while ((Ip->Addr[Index] == 0) && (Ip->Addr[Index + 1] == 0) && (Index < PREFIXMAXLEN)) {
\r
391 if (Index > PREFIXMAXLEN - 2) {
\r
398 if (Index == PREFIXMAXLEN) {
\r
400 // :: is at the end of the address.
\r
406 if (Index < PREFIXMAXLEN - 1) {
\r
407 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_BODY), gShellNetwork2HiiHandle, Ip->Addr[Index]);
\r
408 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_BODY), gShellNetwork2HiiHandle, Ip->Addr[Index + 1]);
\r
411 if (Index + 2 < PREFIXMAXLEN) {
\r
412 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle);
\r
416 if (PrefixLen != NULL) {
\r
417 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_PREFIX_LEN), gShellNetwork2HiiHandle, *PrefixLen);
\r
422 Pick up host IPv6 address in string format from Args with "-s" option and convert it to EFI_IP6_CONFIG_MANUAL_ADDRESS format.
\r
424 @param[in, out] Arg The pointer of the address of ARG_LIST which save Args with the "-s" option.
\r
425 @param[out] Buf The pointer of the address of EFI_IP6_CONFIG_MANUAL_ADDRESS.
\r
426 @param[out] BufSize The pointer of BufSize that describes the size of Buf in bytes.
\r
428 @retval EFI_SUCCESS The convertion is successful.
\r
429 @retval Others Does't find the host address, or it is an invalid IPv6 address in string format.
\r
433 IfConfig6ParseManualAddressList (
\r
434 IN OUT ARG_LIST **Arg,
\r
435 OUT EFI_IP6_CONFIG_MANUAL_ADDRESS **Buf,
\r
440 EFI_IP6_CONFIG_MANUAL_ADDRESS *AddrBuf;
\r
442 EFI_IPv6_ADDRESS Address;
\r
451 Status = EFI_SUCCESS;
\r
454 // Go through the list to check the correctness of input host ip6 address.
\r
456 while ((!EFI_ERROR (Status)) && (VarArg != NULL)) {
\r
458 Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix);
\r
460 if (EFI_ERROR (Status)) {
\r
462 // host ip ip ... gw
\r
467 VarArg = VarArg->Next;
\r
471 if (AddrCnt == 0) {
\r
472 return EFI_INVALID_PARAMETER;
\r
475 AddrBuf = AllocateZeroPool (AddrCnt * sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS));
\r
476 ASSERT (AddrBuf != NULL);
\r
480 Status = EFI_SUCCESS;
\r
483 // Go through the list to fill in the EFI_IP6_CONFIG_MANUAL_ADDRESS structure.
\r
485 while ((!EFI_ERROR (Status)) && (VarArg != NULL)) {
\r
487 Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix);
\r
489 if (EFI_ERROR (Status)) {
\r
494 // If prefix length is not set, set it as Zero here. In the IfConfigSetInterfaceInfo()
\r
495 // Zero prefix, length will be transfered to default prefix length.
\r
497 if (Prefix == 0xFF) {
\r
500 AddrBuf[AddrCnt].IsAnycast = FALSE;
\r
501 AddrBuf[AddrCnt].PrefixLength = Prefix;
\r
502 IP6_COPY_ADDRESS (&AddrBuf[AddrCnt].Address, &Address);
\r
503 VarArg = VarArg->Next;
\r
509 if (EFI_ERROR (Status) && (Status != EFI_INVALID_PARAMETER)) {
\r
514 *BufSize = AddrCnt * sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS);
\r
516 return EFI_SUCCESS;
\r
520 FreePool (AddrBuf);
\r
525 Pick up gw/dns IPv6 address in string format from Args with "-s" option and convert it to EFI_IPv6_ADDRESS format.
\r
527 @param[in, out] Arg The pointer of the address of ARG_LIST that save Args with the "-s" option.
\r
528 @param[out] Buf The pointer of the address of EFI_IPv6_ADDRESS.
\r
529 @param[out] BufSize The pointer of BufSize that describes the size of Buf in bytes.
\r
531 @retval EFI_SUCCESS The conversion is successful.
\r
532 @retval Others Doesn't find the host address, or it is an invalid IPv6 address in string format.
\r
536 IfConfig6ParseGwDnsAddressList (
\r
537 IN OUT ARG_LIST **Arg,
\r
538 OUT EFI_IPv6_ADDRESS **Buf,
\r
543 EFI_IPv6_ADDRESS *AddrBuf;
\r
545 EFI_IPv6_ADDRESS Address;
\r
553 Status = EFI_SUCCESS;
\r
556 // Go through the list to check the correctness of input gw/dns address.
\r
558 while ((!EFI_ERROR (Status)) && (VarArg != NULL)) {
\r
560 Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix);
\r
562 if (EFI_ERROR (Status)) {
\r
564 // gw ip ip ... host
\r
569 VarArg = VarArg->Next;
\r
573 if (AddrCnt == 0) {
\r
574 return EFI_INVALID_PARAMETER;
\r
577 AddrBuf = AllocateZeroPool (AddrCnt * sizeof (EFI_IPv6_ADDRESS));
\r
578 ASSERT (AddrBuf != NULL);
\r
582 Status = EFI_SUCCESS;
\r
585 // Go through the list to fill in the EFI_IPv6_ADDRESS structure.
\r
587 while ((!EFI_ERROR (Status)) && (VarArg != NULL)) {
\r
589 Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix);
\r
591 if (EFI_ERROR (Status)) {
\r
595 IP6_COPY_ADDRESS (&AddrBuf[AddrCnt], &Address);
\r
597 VarArg = VarArg->Next;
\r
603 if (EFI_ERROR (Status) && (Status != EFI_INVALID_PARAMETER)) {
\r
608 *BufSize = AddrCnt * sizeof (EFI_IPv6_ADDRESS);
\r
610 return EFI_SUCCESS;
\r
614 FreePool (AddrBuf);
\r
619 Parse InterfaceId in string format from Args with the "-s" option and convert it to EFI_IP6_CONFIG_INTERFACE_ID format.
\r
621 @param[in, out] Arg The pointer of the address of ARG_LIST that saves Args with the "-s" option.
\r
622 @param[out] IfId The pointer of EFI_IP6_CONFIG_INTERFACE_ID.
\r
624 @retval EFI_SUCCESS The get status processed successfullly.
\r
625 @retval EFI_INVALID_PARAMETER The get status process failed.
\r
629 IfConfig6ParseInterfaceId (
\r
630 IN OUT ARG_LIST **Arg,
\r
631 OUT EFI_IP6_CONFIG_INTERFACE_ID **IfId
\r
638 if (*Arg == NULL) {
\r
639 return EFI_INVALID_PARAMETER;
\r
643 IdStr = (*Arg)->Arg;
\r
644 ASSERT (IfId != NULL);
\r
645 *IfId = AllocateZeroPool (sizeof (EFI_IP6_CONFIG_INTERFACE_ID));
\r
646 ASSERT (*IfId != NULL);
\r
648 while ((*IdStr != L'\0') && (Index < 8)) {
\r
651 while ((*IdStr != L':') && (*IdStr != L'\0')) {
\r
653 if ((*IdStr <= L'F') && (*IdStr >= L'A')) {
\r
654 NodeVal = (UINT8)((NodeVal << 4) + *IdStr - L'A' + 10);
\r
655 } else if ((*IdStr <= L'f') && (*IdStr >= L'a')) {
\r
656 NodeVal = (UINT8)((NodeVal << 4) + *IdStr - L'a' + 10);
\r
657 } else if ((*IdStr <= L'9') && (*IdStr >= L'0')) {
\r
658 NodeVal = (UINT8)((NodeVal << 4) + *IdStr - L'0');
\r
661 return EFI_INVALID_PARAMETER;
\r
667 (*IfId)->Id[Index++] = NodeVal;
\r
669 if (*IdStr == L':') {
\r
674 *Arg = (*Arg)->Next;
\r
675 return EFI_SUCCESS;
\r
679 Parse dad in string format from Args with the "-s" option and convert it to UINT32 format.
\r
681 @param[in, out] Arg The pointer of the address of ARG_LIST that saves Args with the "-s" option.
\r
682 @param[out] Xmits The pointer of Xmits.
\r
684 @retval EFI_SUCCESS The get status processed successfully.
\r
685 @retval others The get status process failed.
\r
689 IfConfig6ParseDadXmits (
\r
690 IN OUT ARG_LIST **Arg,
\r
696 if (*Arg == NULL) {
\r
697 return EFI_INVALID_PARAMETER;
\r
700 ValStr = (*Arg)->Arg;
\r
703 while (*ValStr != L'\0') {
\r
705 if ((*ValStr <= L'9') && (*ValStr >= L'0')) {
\r
707 *Xmits = (*Xmits * 10) + (*ValStr - L'0');
\r
711 return EFI_INVALID_PARAMETER;
\r
717 *Arg = (*Arg)->Next;
\r
718 return EFI_SUCCESS;
\r
722 The get current status of all handles.
\r
724 @param[in] ImageHandle The handle of ImageHandle.
\r
725 @param[in] IfName The pointer of IfName(interface name).
\r
726 @param[in] IfList The pointer of IfList(interface list).
\r
728 @retval EFI_SUCCESS The get status processed successfully.
\r
729 @retval others The get status process failed.
\r
733 IfConfig6GetInterfaceInfo (
\r
734 IN EFI_HANDLE ImageHandle,
\r
736 IN LIST_ENTRY *IfList
\r
742 EFI_HANDLE *HandleBuffer;
\r
743 EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;
\r
744 EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
\r
745 IFCONFIG6_INTERFACE_CB *IfCb;
\r
748 HandleBuffer = NULL;
\r
755 // Locate all the handles with ip6 service binding protocol.
\r
757 Status = gBS->LocateHandleBuffer (
\r
759 &gEfiIp6ServiceBindingProtocolGuid,
\r
764 if (EFI_ERROR (Status) || (HandleNum == 0)) {
\r
769 // Enumerate all handles that installed with ip6 service binding protocol.
\r
771 for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
\r
777 // Ip6config protocol and ip6 service binding protocol are installed
\r
778 // on the same handle.
\r
780 ASSERT (HandleBuffer != NULL);
\r
781 Status = gBS->HandleProtocol (
\r
782 HandleBuffer[HandleIndex],
\r
783 &gEfiIp6ConfigProtocolGuid,
\r
787 if (EFI_ERROR (Status)) {
\r
791 // Get the interface information size.
\r
793 Status = Ip6Cfg->GetData (
\r
795 Ip6ConfigDataTypeInterfaceInfo,
\r
800 if (Status != EFI_BUFFER_TOO_SMALL) {
\r
801 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
805 IfInfo = AllocateZeroPool (DataSize);
\r
807 if (IfInfo == NULL) {
\r
808 Status = EFI_OUT_OF_RESOURCES;
\r
812 // Get the interface info.
\r
814 Status = Ip6Cfg->GetData (
\r
816 Ip6ConfigDataTypeInterfaceInfo,
\r
821 if (EFI_ERROR (Status)) {
\r
822 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
826 // Check the interface name if required.
\r
828 if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
\r
835 // Get the size of dns server list.
\r
837 Status = Ip6Cfg->GetData (
\r
839 Ip6ConfigDataTypeDnsServer,
\r
844 if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
\r
845 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
849 IfCb = AllocateZeroPool (sizeof (IFCONFIG6_INTERFACE_CB) + DataSize);
\r
851 if (IfCb == NULL) {
\r
852 Status = EFI_OUT_OF_RESOURCES;
\r
856 IfCb->NicHandle = HandleBuffer[HandleIndex];
\r
857 IfCb->IfInfo = IfInfo;
\r
858 IfCb->IfCfg = Ip6Cfg;
\r
859 IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv6_ADDRESS));
\r
862 // Get the dns server list if has.
\r
864 if (DataSize > 0) {
\r
866 Status = Ip6Cfg->GetData (
\r
868 Ip6ConfigDataTypeDnsServer,
\r
873 if (EFI_ERROR (Status)) {
\r
874 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
879 // Get the interface id if has.
\r
881 DataSize = sizeof (EFI_IP6_CONFIG_INTERFACE_ID);
\r
882 IfCb->IfId = AllocateZeroPool (DataSize);
\r
884 if (IfCb->IfId == NULL) {
\r
888 Status = Ip6Cfg->GetData (
\r
890 Ip6ConfigDataTypeAltInterfaceId,
\r
895 if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
\r
896 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
900 if (Status == EFI_NOT_FOUND) {
\r
901 FreePool (IfCb->IfId);
\r
905 // Get the config policy.
\r
907 DataSize = sizeof (EFI_IP6_CONFIG_POLICY);
\r
908 Status = Ip6Cfg->GetData (
\r
910 Ip6ConfigDataTypePolicy,
\r
915 if (EFI_ERROR (Status)) {
\r
916 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
920 // Get the dad transmits.
\r
922 DataSize = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS);
\r
923 Status = Ip6Cfg->GetData (
\r
925 Ip6ConfigDataTypeDupAddrDetectTransmits,
\r
930 if (EFI_ERROR (Status)) {
\r
931 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
935 InsertTailList (IfList, &IfCb->Link);
\r
937 if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
\r
939 // Only need the appointed interface, keep the allocated buffer.
\r
947 if (HandleBuffer != NULL) {
\r
948 FreePool (HandleBuffer);
\r
951 return EFI_SUCCESS;
\r
955 if (IfInfo != NULL) {
\r
959 if (IfCb != NULL) {
\r
960 if (IfCb->IfId != NULL) {
\r
961 FreePool (IfCb->IfId);
\r
971 The list process of the IfConfig6 application.
\r
973 @param[in] IfList The pointer of IfList(interface list).
\r
975 @retval SHELL_SUCCESS The IfConfig6 list processed successfully.
\r
976 @retval others The IfConfig6 list process failed.
\r
980 IfConfig6ShowInterfaceInfo (
\r
981 IN LIST_ENTRY *IfList
\r
985 IFCONFIG6_INTERFACE_CB *IfCb;
\r
988 Entry = IfList->ForwardLink;
\r
990 if (IsListEmpty (IfList)) {
\r
991 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle);
\r
995 // Go through the interface list.
\r
997 while (Entry != IfList) {
\r
999 IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link);
\r
1001 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle);
\r
1004 // Print interface name.
\r
1006 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IF_NAME), gShellNetwork2HiiHandle, IfCb->IfInfo->Name);
\r
1009 // Print interface config policy.
\r
1011 if (IfCb->Policy == Ip6ConfigPolicyAutomatic) {
\r
1012 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_POLICY_AUTO), gShellNetwork2HiiHandle);
\r
1014 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_POLICY_MAN), gShellNetwork2HiiHandle);
\r
1018 // Print dad transmit.
\r
1020 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_DAD_TRANSMITS), gShellNetwork2HiiHandle, IfCb->Xmits);
\r
1023 // Print interface id if has.
\r
1025 if (IfCb->IfId != NULL) {
\r
1026 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_INTERFACE_ID_HEAD), gShellNetwork2HiiHandle);
\r
1028 IfConfig6PrintMacAddr (
\r
1034 // Print mac address of the interface.
\r
1036 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_MAC_ADDR_HEAD), gShellNetwork2HiiHandle);
\r
1038 IfConfig6PrintMacAddr (
\r
1039 IfCb->IfInfo->HwAddress.Addr,
\r
1040 IfCb->IfInfo->HwAddressSize
\r
1044 // Print ip addresses list of the interface.
\r
1046 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_HEAD), gShellNetwork2HiiHandle);
\r
1048 for (Index = 0; Index < IfCb->IfInfo->AddressInfoCount; Index++) {
\r
1049 IfConfig6PrintIpAddr (
\r
1050 &IfCb->IfInfo->AddressInfo[Index].Address,
\r
1051 &IfCb->IfInfo->AddressInfo[Index].PrefixLength
\r
1053 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);
\r
1057 // Print dns server addresses list of the interface if has.
\r
1059 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_DNS_ADDR_HEAD), gShellNetwork2HiiHandle);
\r
1061 for (Index = 0; Index < IfCb->DnsCnt; Index++) {
\r
1062 IfConfig6PrintIpAddr (
\r
1063 &IfCb->DnsAddr[Index],
\r
1066 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);
\r
1070 // Print route table of the interface if has.
\r
1072 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_ROUTE_HEAD), gShellNetwork2HiiHandle);
\r
1074 for (Index = 0; Index < IfCb->IfInfo->RouteCount; Index++) {
\r
1075 IfConfig6PrintIpAddr (
\r
1076 &IfCb->IfInfo->RouteTable[Index].Destination,
\r
1077 &IfCb->IfInfo->RouteTable[Index].PrefixLength
\r
1079 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_JOINT), gShellNetwork2HiiHandle);
\r
1081 IfConfig6PrintIpAddr (
\r
1082 &IfCb->IfInfo->RouteTable[Index].Gateway,
\r
1085 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);
\r
1088 Entry = Entry->ForwardLink;
\r
1091 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle);
\r
1092 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);
\r
1094 return SHELL_SUCCESS;
\r
1098 The clean process of the IfConfig6 application.
\r
1100 @param[in] IfList The pointer of IfList(interface list).
\r
1101 @param[in] IfName The pointer of interface name.
\r
1103 @retval SHELL_SUCCESS The IfConfig6 clean processed successfully.
\r
1104 @retval others The IfConfig6 clean process failed.
\r
1108 IfConfig6ClearInterfaceInfo (
\r
1109 IN LIST_ENTRY *IfList,
\r
1113 EFI_STATUS Status;
\r
1114 SHELL_STATUS ShellStatus;
\r
1115 LIST_ENTRY *Entry;
\r
1116 IFCONFIG6_INTERFACE_CB *IfCb;
\r
1117 EFI_IP6_CONFIG_POLICY Policy;
\r
1119 Entry = IfList->ForwardLink;
\r
1120 Status = EFI_SUCCESS;
\r
1121 ShellStatus = SHELL_SUCCESS;
\r
1123 if (IsListEmpty (IfList)) {
\r
1124 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle);
\r
1128 // Go through the interface list.If the interface name is specified, then
\r
1129 // need to refresh the configuration.
\r
1131 while (Entry != IfList) {
\r
1133 IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link);
\r
1135 if ((IfName != NULL) && (StrCmp (IfName, IfCb->IfInfo->Name) == 0)) {
\r
1136 Policy = Ip6ConfigPolicyManual;
\r
1138 Status = IfCb->IfCfg->SetData (
\r
1140 Ip6ConfigDataTypePolicy,
\r
1141 sizeof (EFI_IP6_CONFIG_POLICY),
\r
1144 if (EFI_ERROR (Status)) {
\r
1145 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6");
\r
1146 ShellStatus = SHELL_ACCESS_DENIED;
\r
1151 Policy = Ip6ConfigPolicyAutomatic;
\r
1153 Status = IfCb->IfCfg->SetData (
\r
1155 Ip6ConfigDataTypePolicy,
\r
1156 sizeof (EFI_IP6_CONFIG_POLICY),
\r
1160 if (EFI_ERROR (Status)) {
\r
1161 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6");
\r
1162 ShellStatus = SHELL_ACCESS_DENIED;
\r
1166 Entry = Entry->ForwardLink;
\r
1169 return ShellStatus;
\r
1173 The set process of the IfConfig6 application.
\r
1175 @param[in] IfList The pointer of IfList(interface list).
\r
1176 @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).
\r
1178 @retval SHELL_SUCCESS The IfConfig6 set processed successfully.
\r
1179 @retval others The IfConfig6 set process failed.
\r
1183 IfConfig6SetInterfaceInfo (
\r
1184 IN LIST_ENTRY *IfList,
\r
1185 IN ARG_LIST *VarArg
\r
1188 EFI_STATUS Status;
\r
1189 SHELL_STATUS ShellStatus;
\r
1190 IFCONFIG6_INTERFACE_CB *IfCb;
\r
1191 EFI_IP6_CONFIG_MANUAL_ADDRESS *CfgManAddr;
\r
1192 EFI_IPv6_ADDRESS *CfgAddr;
\r
1194 EFI_IP6_CONFIG_INTERFACE_ID *InterfaceId;
\r
1196 UINT32 CurDadXmits;
\r
1197 UINTN CurDadXmitsLen;
\r
1198 EFI_IP6_CONFIG_POLICY Policy;
\r
1200 VAR_CHECK_CODE CheckCode;
\r
1201 EFI_EVENT TimeOutEvt;
\r
1202 EFI_EVENT MappedEvt;
\r
1203 BOOLEAN IsAddressOk;
\r
1208 BOOLEAN IsAddressSet;
\r
1209 EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
\r
1211 CfgManAddr = NULL;
\r
1213 TimeOutEvt = NULL;
\r
1216 InterfaceId = NULL;
\r
1219 if (IsListEmpty (IfList)) {
\r
1220 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle);
\r
1221 return SHELL_INVALID_PARAMETER;
\r
1224 // Make sure to set only one interface each time.
\r
1226 IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG6_INTERFACE_CB, Link);
\r
1227 Status = EFI_SUCCESS;
\r
1228 ShellStatus = SHELL_SUCCESS;
\r
1231 // Initialize check list mechanism.
\r
1233 CheckCode = IfConfig6RetriveCheckListByName(
\r
1240 // Create events & timers for asynchronous settings.
\r
1242 Status = gBS->CreateEvent (
\r
1249 if (EFI_ERROR (Status)) {
\r
1250 ShellStatus = SHELL_ACCESS_DENIED;
\r
1254 Status = gBS->CreateEvent (
\r
1255 EVT_NOTIFY_SIGNAL,
\r
1257 IfConfig6ManualAddressNotify,
\r
1261 if (EFI_ERROR (Status)) {
\r
1262 ShellStatus = SHELL_ACCESS_DENIED;
\r
1266 // Parse the setting variables.
\r
1268 while (VarArg != NULL) {
\r
1270 // Check invalid parameters (duplication & unknown & conflict).
\r
1272 CheckCode = IfConfig6RetriveCheckListByName(
\r
1273 mIfConfig6SetCheckList,
\r
1278 if (VarCheckOk != CheckCode) {
\r
1279 switch (CheckCode) {
\r
1280 case VarCheckDuplicate:
\r
1281 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_DUPLICATE_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg);
\r
1284 case VarCheckConflict:
\r
1285 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_CONFLICT_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg);
\r
1288 case VarCheckUnknown:
\r
1289 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_UNKNOWN_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg);
\r
1296 VarArg = VarArg->Next;
\r
1300 // Process valid variables.
\r
1302 if (StrCmp(VarArg->Arg, L"auto") == 0) {
\r
1304 // Set automaic config policy
\r
1306 Policy = Ip6ConfigPolicyAutomatic;
\r
1307 Status = IfCb->IfCfg->SetData (
\r
1309 Ip6ConfigDataTypePolicy,
\r
1310 sizeof (EFI_IP6_CONFIG_POLICY),
\r
1314 if (EFI_ERROR(Status)) {
\r
1315 ShellStatus = SHELL_ACCESS_DENIED;
\r
1319 VarArg= VarArg->Next;
\r
1321 if (VarArg != NULL) {
\r
1322 if (StrCmp (VarArg->Arg, L"host") == 0) {
\r
1323 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_IP_CONFIG), gShellNetwork2HiiHandle, Status);
\r
1324 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1326 } else if (StrCmp (VarArg->Arg, L"gw") == 0) {
\r
1327 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_GW_CONFIG), gShellNetwork2HiiHandle, Status);
\r
1328 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1330 } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
\r
1331 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_DNS_CONFIG), gShellNetwork2HiiHandle, Status);
\r
1332 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1336 } else if (StrCmp (VarArg->Arg, L"man") == 0) {
\r
1338 // Set manual config policy.
\r
1340 Policy = Ip6ConfigPolicyManual;
\r
1341 Status = IfCb->IfCfg->SetData (
\r
1343 Ip6ConfigDataTypePolicy,
\r
1344 sizeof (EFI_IP6_CONFIG_POLICY),
\r
1348 if (EFI_ERROR(Status)) {
\r
1349 ShellStatus = SHELL_ACCESS_DENIED;
\r
1353 VarArg= VarArg->Next;
\r
1355 } else if (StrCmp (VarArg->Arg, L"host") == 0) {
\r
1357 // Parse till the next tag or the end of command line.
\r
1359 VarArg = VarArg->Next;
\r
1360 Status = IfConfig6ParseManualAddressList (
\r
1366 if (EFI_ERROR (Status)) {
\r
1367 if (Status == EFI_INVALID_PARAMETER) {
\r
1368 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1369 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"host");
\r
1372 ShellStatus = SHELL_ACCESS_DENIED;
\r
1377 // Set static host ip6 address list.
\r
1378 // This is a asynchronous process.
\r
1380 IsAddressOk = FALSE;
\r
1382 Status = IfCb->IfCfg->RegisterDataNotify (
\r
1384 Ip6ConfigDataTypeManualAddress,
\r
1387 if (EFI_ERROR (Status)) {
\r
1388 ShellStatus = SHELL_ACCESS_DENIED;
\r
1392 Status = IfCb->IfCfg->SetData (
\r
1394 Ip6ConfigDataTypeManualAddress,
\r
1399 if (Status == EFI_NOT_READY) {
\r
1401 // Get current dad transmits count.
\r
1403 CurDadXmitsLen = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS);
\r
1404 IfCb->IfCfg->GetData (
\r
1406 Ip6ConfigDataTypeDupAddrDetectTransmits,
\r
1411 gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000 + 10000000 * CurDadXmits);
\r
1413 while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
\r
1414 if (IsAddressOk) {
\r
1415 Status = EFI_SUCCESS;
\r
1421 IfCb->IfCfg->UnregisterDataNotify (
\r
1423 Ip6ConfigDataTypeManualAddress,
\r
1427 if (EFI_ERROR (Status)) {
\r
1428 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_HOST), gShellNetwork2HiiHandle, Status);
\r
1429 ShellStatus = SHELL_ACCESS_DENIED;
\r
1434 // Check whether the address is set successfully.
\r
1438 Status = IfCb->IfCfg->GetData (
\r
1440 Ip6ConfigDataTypeInterfaceInfo,
\r
1445 if (Status != EFI_BUFFER_TOO_SMALL) {
\r
1446 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
1447 ShellStatus = SHELL_ACCESS_DENIED;
\r
1451 IfInfo = AllocateZeroPool (DataSize);
\r
1453 if (IfInfo == NULL) {
\r
1454 ShellStatus = SHELL_OUT_OF_RESOURCES;
\r
1458 Status = IfCb->IfCfg->GetData (
\r
1460 Ip6ConfigDataTypeInterfaceInfo,
\r
1465 if (EFI_ERROR (Status)) {
\r
1466 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);
\r
1467 ShellStatus = SHELL_ACCESS_DENIED;
\r
1471 for ( Index = 0; Index < (UINTN) (AddrSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS)); Index++) {
\r
1472 IsAddressSet = FALSE;
\r
1474 // By default, the prefix length 0 is regarded as 64.
\r
1476 if (CfgManAddr[Index].PrefixLength == 0) {
\r
1477 CfgManAddr[Index].PrefixLength = 64;
\r
1480 for (Index2 = 0; Index2 < IfInfo->AddressInfoCount; Index2++) {
\r
1481 if (EFI_IP6_EQUAL (&IfInfo->AddressInfo[Index2].Address, &CfgManAddr[Index].Address) &&
\r
1482 (IfInfo->AddressInfo[Index2].PrefixLength == CfgManAddr[Index].PrefixLength)) {
\r
1483 IsAddressSet = TRUE;
\r
1488 if (!IsAddressSet) {
\r
1489 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_ADDRESS_FAILED), gShellNetwork2HiiHandle);
\r
1490 IfConfig6PrintIpAddr (
\r
1491 &CfgManAddr[Index].Address,
\r
1492 &CfgManAddr[Index].PrefixLength
\r
1494 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);
\r
1498 } else if (StrCmp (VarArg->Arg, L"gw") == 0) {
\r
1500 // Parse till the next tag or the end of command line.
\r
1502 VarArg = VarArg->Next;
\r
1503 Status = IfConfig6ParseGwDnsAddressList (
\r
1509 if (EFI_ERROR (Status)) {
\r
1510 if (Status == EFI_INVALID_PARAMETER) {
\r
1511 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1512 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"gw");
\r
1515 ShellStatus = SHELL_ACCESS_DENIED;
\r
1520 // Set static gateway ip6 address list.
\r
1522 Status = IfCb->IfCfg->SetData (
\r
1524 Ip6ConfigDataTypeGateway,
\r
1529 if (EFI_ERROR (Status)) {
\r
1530 ShellStatus = SHELL_ACCESS_DENIED;
\r
1531 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_GW), gShellNetwork2HiiHandle, Status);
\r
1535 } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
\r
1537 // Parse till the next tag or the end of command line.
\r
1539 VarArg = VarArg->Next;
\r
1540 Status = IfConfig6ParseGwDnsAddressList (
\r
1546 if (EFI_ERROR (Status)) {
\r
1547 if (Status == EFI_INVALID_PARAMETER) {
\r
1548 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1549 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"dns");
\r
1552 ShellStatus = SHELL_ACCESS_DENIED;
\r
1557 // Set static DNS server ip6 address list.
\r
1559 Status = IfCb->IfCfg->SetData (
\r
1561 Ip6ConfigDataTypeDnsServer,
\r
1566 if (EFI_ERROR (Status)) {
\r
1567 ShellStatus = SHELL_ACCESS_DENIED;
\r
1571 } else if (StrCmp (VarArg->Arg, L"id") == 0) {
\r
1573 // Parse till the next tag or the end of command line.
\r
1575 VarArg = VarArg->Next;
\r
1576 Status = IfConfig6ParseInterfaceId (&VarArg, &InterfaceId);
\r
1578 if (EFI_ERROR (Status)) {
\r
1579 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1583 // Set alternative interface id.
\r
1585 Status = IfCb->IfCfg->SetData (
\r
1587 Ip6ConfigDataTypeAltInterfaceId,
\r
1588 sizeof (EFI_IP6_CONFIG_INTERFACE_ID),
\r
1592 if (EFI_ERROR (Status)) {
\r
1593 ShellStatus = SHELL_ACCESS_DENIED;
\r
1597 } else if (StrCmp (VarArg->Arg, L"dad") == 0) {
\r
1599 // Parse till the next tag or the end of command line.
\r
1601 VarArg = VarArg->Next;
\r
1602 Status = IfConfig6ParseDadXmits (&VarArg, &DadXmits);
\r
1604 if (EFI_ERROR (Status)) {
\r
1605 ShellStatus = SHELL_ACCESS_DENIED;
\r
1609 // Set dad transmits count.
\r
1611 Status = IfCb->IfCfg->SetData (
\r
1613 Ip6ConfigDataTypeDupAddrDetectTransmits,
\r
1614 sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS),
\r
1618 if (EFI_ERROR(Status)) {
\r
1619 ShellStatus = SHELL_ACCESS_DENIED;
\r
1627 if (CfgManAddr != NULL) {
\r
1628 FreePool (CfgManAddr);
\r
1631 if (CfgAddr != NULL) {
\r
1632 FreePool (CfgAddr);
\r
1635 if (MappedEvt != NULL) {
\r
1636 gBS->CloseEvent (MappedEvt);
\r
1639 if (TimeOutEvt != NULL) {
\r
1640 gBS->CloseEvent (TimeOutEvt);
\r
1643 if (IfInfo != NULL) {
\r
1644 FreePool (IfInfo);
\r
1647 return ShellStatus;
\r
1652 The IfConfig6 main process.
\r
1654 @param[in] Private The pointer of IFCONFIG6_PRIVATE_DATA.
\r
1656 @retval SHELL_SUCCESS IfConfig6 processed successfully.
\r
1657 @retval others The IfConfig6 process failed.
\r
1662 IN IFCONFIG6_PRIVATE_DATA *Private
\r
1665 EFI_STATUS Status;
\r
1666 SHELL_STATUS ShellStatus;
\r
1668 ShellStatus = SHELL_SUCCESS;
\r
1671 // Get configure information of all interfaces.
\r
1673 Status = IfConfig6GetInterfaceInfo (
\r
1674 Private->ImageHandle,
\r
1679 if (EFI_ERROR (Status)) {
\r
1680 ShellStatus = SHELL_NOT_FOUND;
\r
1684 switch (Private->OpCode) {
\r
1685 case IfConfig6OpList:
\r
1686 ShellStatus = IfConfig6ShowInterfaceInfo (&Private->IfList);
\r
1689 case IfConfig6OpClear:
\r
1690 ShellStatus = IfConfig6ClearInterfaceInfo (&Private->IfList, Private->IfName);
\r
1693 case IfConfig6OpSet:
\r
1694 ShellStatus = IfConfig6SetInterfaceInfo (&Private->IfList, Private->VarArg);
\r
1698 ShellStatus = SHELL_UNSUPPORTED;
\r
1703 return ShellStatus;
\r
1707 The IfConfig6 cleanup process, free the allocated memory.
\r
1709 @param[in] Private The pointer of IFCONFIG6_PRIVATE_DATA.
\r
1713 IfConfig6Cleanup (
\r
1714 IN IFCONFIG6_PRIVATE_DATA *Private
\r
1717 LIST_ENTRY *Entry;
\r
1718 LIST_ENTRY *NextEntry;
\r
1719 IFCONFIG6_INTERFACE_CB *IfCb;
\r
1721 ASSERT (Private != NULL);
\r
1724 // Clean the list which save the set config Args.
\r
1726 if (Private->VarArg != NULL) {
\r
1727 IfConfig6FreeArgList (Private->VarArg);
\r
1730 if (Private->IfName != NULL)
\r
1731 FreePool (Private->IfName);
\r
1735 // Clean the IFCONFIG6_INTERFACE_CB list.
\r
1737 Entry = Private->IfList.ForwardLink;
\r
1738 NextEntry = Entry->ForwardLink;
\r
1740 while (Entry != &Private->IfList) {
\r
1742 IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link);
\r
1744 RemoveEntryList (&IfCb->Link);
\r
1746 if (IfCb->IfId != NULL) {
\r
1748 FreePool (IfCb->IfId);
\r
1751 if (IfCb->IfInfo != NULL) {
\r
1753 FreePool (IfCb->IfInfo);
\r
1758 Entry = NextEntry;
\r
1759 NextEntry = Entry->ForwardLink;
\r
1762 FreePool (Private);
\r
1766 Function for 'ifconfig6' command.
\r
1768 @param[in] ImageHandle Handle to the Image (NULL if Internal).
\r
1769 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
\r
1771 @retval SHELL_SUCCESS ifconfig6 command processed successfully.
\r
1772 @retval others The ifconfig6 command process failed.
\r
1777 ShellCommandRunIfconfig6 (
\r
1778 IN EFI_HANDLE ImageHandle,
\r
1779 IN EFI_SYSTEM_TABLE *SystemTable
\r
1782 EFI_STATUS Status;
\r
1783 SHELL_STATUS ShellStatus;
\r
1784 IFCONFIG6_PRIVATE_DATA *Private;
\r
1785 LIST_ENTRY *ParamPackage;
\r
1786 CONST CHAR16 *ValueStr;
\r
1787 ARG_LIST *ArgList;
\r
1788 CHAR16 *ProblemParam;
\r
1792 Status = EFI_INVALID_PARAMETER;
\r
1793 ShellStatus = SHELL_SUCCESS;
\r
1795 Status = ShellCommandLineParseEx (mIfConfig6CheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
\r
1796 if (EFI_ERROR (Status)) {
\r
1797 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_COMMAND), gShellNetwork2HiiHandle, L"ifconfig6", ProblemParam);
\r
1798 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1803 // To handle no option.
\r
1805 if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
\r
1806 !ShellCommandLineGetFlag (ParamPackage, L"-?") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
\r
1807 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_LACK_OPTION), gShellNetwork2HiiHandle);
\r
1808 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1812 // To handle conflict options.
\r
1814 if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
\r
1815 ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
\r
1816 ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-?"))) ||
\r
1817 ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
\r
1818 ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-?"))) ||
\r
1819 ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-?")))) {
\r
1820 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_CONFLICT_OPTIONS), gShellNetwork2HiiHandle);
\r
1821 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1825 Private = AllocateZeroPool (sizeof (IFCONFIG6_PRIVATE_DATA));
\r
1827 if (Private == NULL) {
\r
1828 ShellStatus = SHELL_OUT_OF_RESOURCES;
\r
1832 InitializeListHead (&Private->IfList);
\r
1835 // To get interface name for the list option.
\r
1837 if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
\r
1838 Private->OpCode = IfConfig6OpList;
\r
1839 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
\r
1840 if (ValueStr != NULL) {
\r
1841 Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);
\r
1842 if (Str == NULL) {
\r
1843 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");
\r
1844 ShellStatus = SHELL_OUT_OF_RESOURCES;
\r
1847 Private->IfName = Str;
\r
1851 // To get interface name for the clear option.
\r
1853 if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
\r
1854 Private->OpCode = IfConfig6OpClear;
\r
1855 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
\r
1856 if (ValueStr != NULL) {
\r
1857 Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);
\r
1858 if (Str == NULL) {
\r
1859 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");
\r
1860 ShellStatus = SHELL_OUT_OF_RESOURCES;
\r
1863 Private->IfName = Str;
\r
1867 // To get interface name and corresponding Args for the set option.
\r
1869 if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {
\r
1871 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
\r
1872 if (ValueStr == NULL) {
\r
1873 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_INTERFACE), gShellNetwork2HiiHandle);
\r
1874 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1878 // To split the configuration into multi-section.
\r
1880 ArgList = IfConfig6SplitStrToList (ValueStr, L' ');
\r
1881 if (ArgList == NULL) {
\r
1882 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");
\r
1883 ShellStatus = SHELL_OUT_OF_RESOURCES;
\r
1887 Private->OpCode = IfConfig6OpSet;
\r
1888 Private->IfName = ArgList->Arg;
\r
1890 Private->VarArg = ArgList->Next;
\r
1892 if (Private->IfName == NULL || Private->VarArg == NULL) {
\r
1893 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_COMMAND), gShellNetwork2HiiHandle);
\r
1894 ShellStatus = SHELL_INVALID_PARAMETER;
\r
1899 // Main process of ifconfig6.
\r
1901 ShellStatus = IfConfig6 (Private);
\r
1905 ShellCommandLineFreeVarList (ParamPackage);
\r
1906 if (Private != NULL) {
\r
1907 IfConfig6Cleanup (Private);
\r
1909 return ShellStatus;
\r