168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** @file 27c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu The implementation for Shell command ifconfig based on IP4Config2 protocol. 368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 4c011b6c9e2baf57fc0557117e9875ceb3dca55a3Tapan Shah (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR> 5e75390f02971bcd4d67a9696508050bee4936a01Qiu Shumin Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> 668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey This program and the accompanying materials 868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey are licensed and made available under the terms and conditions of the BSD License 968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey which accompanies this distribution. The full text of the license may be found at 1068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey http://opensource.org/licenses/bsd-license.php. 1168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 1268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 1568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 1668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 1768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey#include "UefiShellNetwork1CommandsLib.h" 1868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwutypedef enum { 207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfConfigOpList = 1, 217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfConfigOpSet = 2, 227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfConfigOpClear = 3 237c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu} IFCONFIG_OPCODE; 247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwutypedef enum { 267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarCheckReserved = -1, 277c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarCheckOk = 0, 287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarCheckDuplicate, 297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarCheckConflict, 307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarCheckUnknown, 317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarCheckLackValue, 327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarCheckOutOfMem 337c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu} VAR_CHECK_CODE; 347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwutypedef enum { 367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FlagTypeSingle = 0, 377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FlagTypeNeedVar, 387c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FlagTypeNeedSet, 397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FlagTypeSkipUnknown 407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu} VAR_CHECK_FLAG_TYPE; 417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu#define MACADDRMAXSIZE 32 437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwutypedef struct _IFCONFIG_INTERFACE_CB { 457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_HANDLE NicHandle; 467c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu LIST_ENTRY Link; 477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IP4_CONFIG2_PROTOCOL *IfCfg; 487c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo; 497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IP4_CONFIG2_POLICY Policy; 507c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINT32 DnsCnt; 517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IPv4_ADDRESS DnsAddr[1]; 527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu} IFCONFIG_INTERFACE_CB; 537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 547c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwutypedef struct _ARG_LIST ARG_LIST; 557c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwustruct _ARG_LIST { 577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ARG_LIST *Next; 587c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CHAR16 *Arg; 597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu}; 607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 617c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwutypedef struct _IFCONFIG4_PRIVATE_DATA { 627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu LIST_ENTRY IfList; 637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINT32 OpCode; 657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CHAR16 *IfName; 667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ARG_LIST *VarArg; 677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu} IFCONFIG_PRIVATE_DATA; 687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwutypedef struct _VAR_CHECK_ITEM{ 707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CHAR16 *FlagStr; 717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINT32 FlagID; 727c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINT32 ConflictMask; 737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VAR_CHECK_FLAG_TYPE FlagType; 747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu} VAR_CHECK_ITEM; 757c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuSHELL_PARAM_ITEM mIfConfigCheckList[] = { 777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 787c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"-b", 797c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TypeFlag 807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 827c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"-l", 837c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TypeValue 847c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 857c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 867c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"-r", 877c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TypeValue 887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 897c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"-c", 917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TypeValue 927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 937c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 947c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"-s", 957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TypeMaxValue 967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 977c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 987c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 997c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TypeMax 1007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 1017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu}; 1027c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 1037c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuVAR_CHECK_ITEM mSetCheckList[] = { 1047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 1057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"static", 1067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 0x00000001, 1077c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 0x00000001, 1087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FlagTypeSingle 1097c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 1107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 1117c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"dhcp", 1127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 0x00000002, 1137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 0x00000001, 1147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FlagTypeSingle 1157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 1167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 1177c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"dns", 1187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 0x00000008, 1197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 0x00000004, 1207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FlagTypeSingle 1217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 1227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu { 1237c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 1247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 0x0, 1257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 0x0, 1267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FlagTypeSkipUnknown 1277c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu }, 1287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu}; 12968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 13068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseySTATIC CONST CHAR16 PermanentString[10] = L"PERMANENT"; 13168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 13268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 1337c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Split a string with specified separator and save the substring to a list. 13468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 1357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] String The pointer of the input string. 1367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Separator The specified separator. 13768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 1387c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @return The pointer of headnode of ARG_LIST. 13968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 14068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 1417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuARG_LIST * 1427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuSplitStrToList ( 1437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN CONST CHAR16 *String, 1447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN CHAR16 Separator 14568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ) 14668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 1477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CHAR16 *Str; 1487c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CHAR16 *ArgStr; 1497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ARG_LIST *ArgList; 1507c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ARG_LIST *ArgNode; 15168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 1527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (*String == L'\0') { 1537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu return NULL; 15468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 15568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 15668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 1577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Copy the CONST string to a local copy. 15868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 1597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Str = AllocateCopyPool (StrSize (String), String); 1607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (Str != NULL); 1617c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgStr = Str; 16268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 16368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 1647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // init a node for the list head. 16568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 1667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST)); 1677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (ArgNode != NULL); 1687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgList = ArgNode; 16968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 17068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 1717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Split the local copy and save in the list node. 17268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 1737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu while (*Str != L'\0') { 1747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (*Str == Separator) { 1757c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu *Str = L'\0'; 1767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgNode->Arg = ArgStr; 1777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgStr = Str + 1; 1787c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST)); 1797c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (ArgNode->Next != NULL); 1807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgNode = ArgNode->Next; 18168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 1827c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 1837c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Str++; 18468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 18568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 1867c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgNode->Arg = ArgStr; 1877c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgNode->Next = NULL; 1887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 1897c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu return ArgList; 19068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 19168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 19268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 1937c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Check the correctness of input Args with '-s' option. 19468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 1957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] CheckList The pointer of VAR_CHECK_ITEM array. 1967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Name The pointer of input arg. 1977c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Init The switch to execute the check. 19868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 1997c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @return VarCheckOk Valid parameter or Initialize check successfully. 2007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @return VarCheckDuplicate Duplicated parameter happened. 2017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @return VarCheckConflict Conflicted parameter happened 2027c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @return VarCheckUnknown Unknown parameter. 20368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 20468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 2057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuVAR_CHECK_CODE 2067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfigRetriveCheckListByName( 2077c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN VAR_CHECK_ITEM *CheckList, 2087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN CHAR16 *Name, 2097c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN BOOLEAN Init 2107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu) 21168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 2127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STATIC UINT32 CheckDuplicate; 2137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STATIC UINT32 CheckConflict; 2147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VAR_CHECK_CODE RtCode; 2157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINT32 Index; 2167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VAR_CHECK_ITEM Arg; 2177c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 2187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Init) { 2197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CheckDuplicate = 0; 2207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CheckConflict = 0; 2217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu return VarCheckOk; 22268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 22368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu RtCode = VarCheckOk; 2257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Index = 0; 2267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Arg = CheckList[Index]; 22768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 22868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 2297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Check the Duplicated/Conflicted/Unknown input Args. 23068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 2317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu while (Arg.FlagStr != NULL) { 2327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (StrCmp (Arg.FlagStr, Name) == 0) { 23368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (CheckDuplicate & Arg.FlagID) { 2357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu RtCode = VarCheckDuplicate; 2367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 2377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 23868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (CheckConflict & Arg.ConflictMask) { 2407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu RtCode = VarCheckConflict; 2417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 2427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 24368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CheckDuplicate |= Arg.FlagID; 2457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CheckConflict |= Arg.ConflictMask; 2467c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 2477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 24868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Arg = CheckList[++Index]; 25068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 2517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 2527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Arg.FlagStr == NULL) { 2537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu RtCode = VarCheckUnknown; 25468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 25568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu return RtCode; 25768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 25868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 25968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 2607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu The notify function of create event when performing a manual config. 26168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Event The event this notify function registered to. 2637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Context Pointer to the context data registered to the event. 26468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu**/ 2667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuVOID 26768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseyEFIAPI 2687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfigManualAddressNotify ( 2697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN EFI_EVENT Event, 2707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN VOID *Context 2717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ) 27268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 2737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu *((BOOLEAN *) Context) = TRUE; 27468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 27568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 2767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 27768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 278d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Create an IP child, use it to start the auto configuration, then destroy it. 279d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 280d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu @param[in] Controller The controller which has the service installed. 281d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu @param[in] Image The image handle used to open service. 282d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 283d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu @retval EFI_SUCCESS The configuration is done. 284d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu**/ 285d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin WuEFI_STATUS 286d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin WuEFIAPI 287d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin WuIfConfigStartIp4( 288d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu IN EFI_HANDLE Controller, 289d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu IN EFI_HANDLE Image 290d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu ) 291d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu{ 292d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu EFI_IP4_PROTOCOL *Ip4; 293d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu EFI_HANDLE Ip4Handle; 294d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu EFI_IP4_CONFIG_DATA Ip4ConfigData; 295d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu EFI_STATUS Status; 296d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 297d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu // 298d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu // Get the Ip4ServiceBinding Protocol 299d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu // 300d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4Handle = NULL; 301d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4 = NULL; 302d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 303d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Status = NetLibCreateServiceChild ( 304d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Controller, 305d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Image, 306d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu &gEfiIp4ServiceBindingProtocolGuid, 307d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu &Ip4Handle 308d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu ); 309d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 310d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu if (EFI_ERROR (Status)) { 311d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu return Status; 312d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu } 313d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 314d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Status = gBS->OpenProtocol ( 315d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4Handle, 316d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu &gEfiIp4ProtocolGuid, 317d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu (VOID **) &Ip4, 318d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Controller, 319d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Image, 320d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu EFI_OPEN_PROTOCOL_GET_PROTOCOL 321d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu ); 322d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 323d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu if (EFI_ERROR (Status)) { 324d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu goto ON_EXIT; 325d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu } 326d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 327d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP; 328d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.AcceptAnyProtocol = FALSE; 329d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.AcceptIcmpErrors = FALSE; 330d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.AcceptBroadcast = FALSE; 331d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.AcceptPromiscuous = FALSE; 332d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.UseDefaultAddress = TRUE; 333d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS)); 334d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); 335d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.TypeOfService = 0; 336d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.TimeToLive = 1; 337d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.DoNotFragment = FALSE; 338d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.RawData = FALSE; 339d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.ReceiveTimeout = 0; 340d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4ConfigData.TransmitTimeout = 0; 341d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 342d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4->Configure (Ip4, &Ip4ConfigData); 343d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 344d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin WuON_EXIT: 345d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu NetLibDestroyServiceChild ( 346d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Controller, 347d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Image, 348d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu &gEfiIp4ServiceBindingProtocolGuid, 349d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4Handle 350d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu ); 351d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 352d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu return Status; 353d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu} 354d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 355d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 356d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu/** 3577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Print MAC address. 35868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 3597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Node The pointer of MAC address buffer. 3607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Size The size of MAC address buffer. 36168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 36268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 3637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuVOID 3647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfigPrintMacAddr ( 3657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN UINT8 *Node, 3667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN UINT32 Size 3677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ) 36868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 3697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINTN Index; 37068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 3717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (Size <= MACADDRMAXSIZE); 37268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 3737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu for (Index = 0; Index < Size; Index++) { 3747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]); 3757c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Index + 1 < Size) { 3767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle); 3777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 37868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 37968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 3807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle); 3817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu} 38268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 38368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 3847c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu/** 3857c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu The get current status of all handles. 38668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 3877c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] IfName The pointer of IfName(interface name). 3887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] IfList The pointer of IfList(interface list). 38968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 3907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @retval EFI_SUCCESS The get status processed successfully. 3917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @retval others The get status process failed. 39268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 39368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 39468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseyEFI_STATUS 3957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfigGetInterfaceInfo ( 3967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN CHAR16 *IfName, 3977c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN LIST_ENTRY *IfList 39868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ) 39968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 4007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_STATUS Status; 4017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINTN HandleIndex; 4027c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINTN HandleNum; 4037c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_HANDLE *HandleBuffer; 4047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2; 4057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo; 4067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IFCONFIG_INTERFACE_CB *IfCb; 4077c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINTN DataSize; 40868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 4097c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu HandleBuffer = NULL; 4107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu HandleNum = 0; 4117c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 4127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfInfo = NULL; 4137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb = NULL; 41468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 41568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 4167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Locate all the handles with ip4 service binding protocol. 41768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 41868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey Status = gBS->LocateHandleBuffer ( 4197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ByProtocol, 4207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &gEfiIp4ServiceBindingProtocolGuid, 4217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 4227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &HandleNum, 4237c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &HandleBuffer 42468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ); 4257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status) || (HandleNum == 0)) { 4266e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu return Status; 42768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 42868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 4297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 4307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Enumerate all handles that installed with ip4 service binding protocol. 4317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 4327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) { 4337c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb = NULL; 4347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfInfo = NULL; 4357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize = 0; 4367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 4377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 4387c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Ip4config protocol and ip4 service binding protocol are installed 4397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // on the same handle. 4407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 4417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (HandleBuffer != NULL); 4427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = gBS->HandleProtocol ( 4437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu HandleBuffer[HandleIndex], 4447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &gEfiIp4Config2ProtocolGuid, 4457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (VOID **) &Ip4Cfg2 4467c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 4477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 44868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey if (EFI_ERROR (Status)) { 4497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_ERROR; 45068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 4517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 45268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 4537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get the interface information size. 45468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 4557c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = Ip4Cfg2->GetData ( 4567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Cfg2, 4577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeInterfaceInfo, 4587c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &DataSize, 4597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL 4607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 4617c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 4627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Status != EFI_BUFFER_TOO_SMALL) { 4637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_ERROR; 46433c031ee2092282a069ce07d30202082ceaf61fejcarsey } 4657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 4667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfInfo = AllocateZeroPool (DataSize); 4677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 4687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IfInfo == NULL) { 46968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey Status = EFI_OUT_OF_RESOURCES; 47068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey goto ON_ERROR; 47168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 4727c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 47368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 4747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get the interface info. 47568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 4767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = Ip4Cfg2->GetData ( 4777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Cfg2, 4787c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeInterfaceInfo, 4797c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &DataSize, 4807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfInfo 4817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 48268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 4837c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 48468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey goto ON_ERROR; 48568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 4867c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 48768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 4887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Check the interface name if required. 48968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 4907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) { 4917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (IfInfo); 4927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu continue; 49368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 49468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 4957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize = 0; 4967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 49768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 4987c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get the size of dns server list. 49968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 5007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = Ip4Cfg2->GetData ( 5017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Cfg2, 5027c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeDnsServer, 5037c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &DataSize, 5047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL 5057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 5067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 5077c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) { 5087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_ERROR; 5097c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 5107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 5117c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize); 51268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 5137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IfCb == NULL) { 51468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey Status = EFI_OUT_OF_RESOURCES; 51568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey goto ON_ERROR; 51668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 51768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 5187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->NicHandle = HandleBuffer[HandleIndex]; 5197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfInfo = IfInfo; 5207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfCfg = Ip4Cfg2; 5217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS)); 5227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 52368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 5247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get the dns server list if has. 52568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 5267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (DataSize > 0) { 5277c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = Ip4Cfg2->GetData ( 5287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Cfg2, 5297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeDnsServer, 5307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &DataSize, 5317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->DnsAddr 5327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 5337c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 5347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 5357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_ERROR; 53668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 53768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 53868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 53968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 5407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get the config policy. 54168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 5427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize = sizeof (EFI_IP4_CONFIG2_POLICY); 5437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = Ip4Cfg2->GetData ( 5447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Cfg2, 5457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypePolicy, 5467c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &DataSize, 5477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &IfCb->Policy 5487c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 5497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 5507c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 5517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_ERROR; 5527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 5537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 5547c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu InsertTailList (IfList, &IfCb->Link); 55568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 5567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) { 5577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 5587c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Only need the appointed interface, keep the allocated buffer. 5597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 5607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb = NULL; 5617c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfInfo = NULL; 5627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 5637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 56468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 56568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 5667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (HandleBuffer != NULL) { 5677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (HandleBuffer); 5687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 56968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 57068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey return EFI_SUCCESS; 5717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 57268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseyON_ERROR: 5737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 5747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IfInfo != NULL) { 5757c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (IfInfo); 57668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 57768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 5787c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IfCb != NULL) { 5797c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (IfCb); 5807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 58168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 58268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey return Status; 58368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 58468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 58568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 5867c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu The list process of the ifconfig command. 58768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 5887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] IfList The pointer of IfList(interface list). 5897c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 5906e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu @retval SHELL_SUCCESS The ifconfig command list processed successfully. 5917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @retval others The ifconfig command list process failed. 59268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 59368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 5946e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin WuSHELL_STATUS 5957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfigShowInterfaceInfo ( 5967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN LIST_ENTRY *IfList 59768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ) 59868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 59934297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu LIST_ENTRY *Entry; 60034297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu LIST_ENTRY *Next; 60134297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu IFCONFIG_INTERFACE_CB *IfCb; 60234297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu BOOLEAN MediaPresent; 60334297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu EFI_IPv4_ADDRESS Gateway; 60434297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu UINT32 Index; 60534297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu 60634297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu MediaPresent = TRUE; 60768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IsListEmpty (IfList)) { 6097c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); 61068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 61168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 61268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 6137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Go through the interface list. 61468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 6157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) { 6167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link); 61768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle); 61968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Print interface name. 6227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 62334297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name); 62434297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu 62534297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu // 62634297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu // Get Media State. 62734297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu // 62834297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu NetLibDetectMedia (IfCb->NicHandle, &MediaPresent); 62934297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu if (!MediaPresent) { 63034297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media disconnected"); 63134297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu } else { 63234297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present"); 63334297cef1ea30f1dbe6c64e21ec1e30633a5396bJiaxin Wu } 63468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Print interface config policy. 6377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6387c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IfCb->Policy == Ip4Config2PolicyDhcp) { 6397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_DHCP), gShellNetwork1HiiHandle); 6407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } else { 6417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle); 6427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 64368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Print mac address of the interface. 6467c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle); 64868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfConfigPrintMacAddr ( 6507c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfInfo->HwAddress.Addr, 6517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfInfo->HwAddressSize 6527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 65368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6547c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6557c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Print IPv4 address list of the interface. 6567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle); 65868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx( 6607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 6617c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 6627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 6637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), 6647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu gShellNetwork1HiiHandle, 6657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->StationAddress.Addr[0], 6667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->StationAddress.Addr[1], 6677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->StationAddress.Addr[2], 6687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->StationAddress.Addr[3] 6697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 6707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 6717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6727c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Print subnet mask list of the interface. 6737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle); 67568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 67668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ShellPrintHiiEx( 67768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey -1, 67868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey -1, 67968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey NULL, 6807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), 6817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu gShellNetwork1HiiHandle, 6827c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->SubnetMask.Addr[0], 6837c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->SubnetMask.Addr[1], 6847c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->SubnetMask.Addr[2], 6857c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->SubnetMask.Addr[3] 68668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ); 68768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 6887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6897c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Print default gateway of the interface. 6907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 6917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle); 6927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 6937c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS)); 6947c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 6957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) { 6967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) && 6977c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){ 6987c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS)); 6997c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 7007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 7017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 70268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ShellPrintHiiEx( 7037c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 7067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), 7077c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu gShellNetwork1HiiHandle, 7087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)Gateway.Addr[0], 7097c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)Gateway.Addr[1], 7107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)Gateway.Addr[2], 7117c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)Gateway.Addr[3] 7127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 7137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 7157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Print route table entry. 7167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 7177c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize); 7187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) { 7207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index); 7217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx( 7237c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 7267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 7277c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu gShellNetwork1HiiHandle, 7287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"Subnet ", 7297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0], 7307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1], 7317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2], 7327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3] 7337c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 7347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx( 7367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7387c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 7397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 7407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu gShellNetwork1HiiHandle, 7417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"Netmask", 7427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0], 7437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1], 7447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2], 7457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3] 7467c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 7477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7487c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx( 7497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7507c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 7527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), 7537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu gShellNetwork1HiiHandle, 7547c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu L"Gateway", 7557c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0], 7567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1], 7577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2], 7587c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3] 7597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 7607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 7617c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 7637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Print dns server addresses list of the interface if has. 7647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 7657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle); 7667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu for (Index = 0; Index < IfCb->DnsCnt; Index++) { 7687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx( 7697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu -1, 7717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 7727c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY), 7737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu gShellNetwork1HiiHandle, 7747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN) IfCb->DnsAddr[Index].Addr[0], 7757c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN) IfCb->DnsAddr[Index].Addr[1], 7767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN) IfCb->DnsAddr[Index].Addr[2], 7777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu (UINTN) IfCb->DnsAddr[Index].Addr[3] 7787c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 7797c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle); 7817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 78268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 7837c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7847c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle); 78568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 7866e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu return SHELL_SUCCESS; 78768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 78868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 78968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 7907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu The clean process of the ifconfig command to clear interface info. 7917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 7927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] IfList The pointer of IfList(interface list). 79368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 7946e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu @retval SHELL_SUCCESS The ifconfig command clean processed successfully. 7957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @retval others The ifconfig command clean process failed. 79668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 79768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 7986e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin WuSHELL_STATUS 7997c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfigClearInterfaceInfo ( 8007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN LIST_ENTRY *IfList 80168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ) 80268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 8036e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu EFI_STATUS Status; 8046e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu SHELL_STATUS ShellStatus; 8057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu LIST_ENTRY *Entry; 8067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu LIST_ENTRY *Next; 8077c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IFCONFIG_INTERFACE_CB *IfCb; 8087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IP4_CONFIG2_POLICY Policy; 80968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Policy = Ip4Config2PolicyDhcp; 8117c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = EFI_SUCCESS; 8126e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_SUCCESS; 81368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IsListEmpty (IfList)) { 8157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); 81668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 81768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 81868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 8197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Go through the interface list. 82068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 8217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) { 8227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link); 82368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = IfCb->IfCfg->SetData ( 8257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfCfg, 8267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypePolicy, 8277c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu sizeof (EFI_IP4_CONFIG2_POLICY), 8287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &Policy 8297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 8307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 831d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); 8326e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 8337c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 8347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 83568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 83668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8376e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu return ShellStatus; 83868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 83968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 84068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 8417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu The set process of the ifconfig command. 84268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] IfList The pointer of IfList(interface list). 8447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option). 84568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8466e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu @retval SHELL_SUCCESS The ifconfig command set processed successfully. 8477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @retval others The ifconfig command set process failed. 84868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 84968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 8506e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin WuSHELL_STATUS 8517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfigSetInterfaceInfo ( 8527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN LIST_ENTRY *IfList, 8537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN ARG_LIST *VarArg 85468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ) 85568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 8567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_STATUS Status; 8576e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu SHELL_STATUS ShellStatus; 8587c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IFCONFIG_INTERFACE_CB *IfCb; 8597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VAR_CHECK_CODE CheckCode; 8607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_EVENT TimeOutEvt; 8617c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_EVENT MappedEvt; 8627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu BOOLEAN IsAddressOk; 86368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IP4_CONFIG2_POLICY Policy; 8657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress; 8667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINTN DataSize; 8677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IPv4_ADDRESS Gateway; 8687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_IPv4_ADDRESS *Dns; 8697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ARG_LIST *Tmp; 8707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu UINTN Index; 87168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8727c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CONST CHAR16* TempString; 87368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Dns = NULL; 87568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IsListEmpty (IfList)) { 8777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); 8786e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu return SHELL_INVALID_PARAMETER; 87968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 88068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 8827c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Make sure to set only one interface each time. 8837c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 8847c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb = NET_LIST_USER_STRUCT (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link); 8857c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = EFI_SUCCESS; 8866e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_SUCCESS; 88768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 8897c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Initialize check list mechanism. 8907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 8917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CheckCode = IfConfigRetriveCheckListByName( 8927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 8937c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 8947c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TRUE 8957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 89668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 8977c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 8987c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Create events & timers for asynchronous settings. 8997c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = gBS->CreateEvent ( 9017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EVT_TIMER, 9027c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TPL_CALLBACK, 9037c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 9047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NULL, 9057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &TimeOutEvt 9067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 90768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey if (EFI_ERROR (Status)) { 908d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); 9096e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 9107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 91168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 91268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 9137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = gBS->CreateEvent ( 9147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EVT_NOTIFY_SIGNAL, 9157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TPL_NOTIFY, 9167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfConfigManualAddressNotify, 9177c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &IsAddressOk, 9187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &MappedEvt 9197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 9207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 921d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); 9226e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 9237c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 92468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 92568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 9267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9277c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Parse the setting variables. 9287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu while (VarArg != NULL) { 9307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Check invalid parameters (duplication & unknown & conflict). 9327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9337c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CheckCode = IfConfigRetriveCheckListByName( 9347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu mSetCheckList, 9357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarArg->Arg, 9367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FALSE 9377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 93868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 9397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (VarCheckOk != CheckCode) { 9407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu switch (CheckCode) { 9417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu case VarCheckDuplicate: 9427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); 9437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 94468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 9457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu case VarCheckConflict: 9467c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); 9477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 94868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 9497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu case VarCheckUnknown: 9507c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To handle unsupported option. 9527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu TempString = PermanentString; 9547c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (StringNoCaseCompare(&VarArg->Arg, &TempString) == 0) { 9557c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString); 9567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 9577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 95868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 9597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To handle unknown option. 9617c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 9627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); 9637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 96468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 9657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu default: 9667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 9677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 96868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 9697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarArg = VarArg->Next; 9707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu continue; 9717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 97268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 97368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 9747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Process valid variables. 97568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 9767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (StrCmp(VarArg->Arg, L"dhcp") == 0) { 977d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu if (IfCb->Policy == Ip4Config2PolicyDhcp) { 978d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Status = IfConfigStartIp4 (IfCb->NicHandle, gImageHandle); 979d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu if (EFI_ERROR(Status)) { 980d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); 9816e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 982d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu goto ON_EXIT; 983d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu } 984d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu } else { 985d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu // 986d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu // Set dhcp config policy 987d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu // 988d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Policy = Ip4Config2PolicyDhcp; 989d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Status = IfCb->IfCfg->SetData ( 990d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu IfCb->IfCfg, 991d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu Ip4Config2DataTypePolicy, 992d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu sizeof (EFI_IP4_CONFIG2_POLICY), 993d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu &Policy 994d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu ); 995d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu if (EFI_ERROR(Status)) { 996d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); 9976e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 998d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu goto ON_EXIT; 999d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu } 10007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 1001d6cf1af908f387334e99cdb3930e8a244db03566Jiaxin Wu 10027c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarArg= VarArg->Next; 100368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 10047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } else if (StrCmp (VarArg->Arg, L"static") == 0) { 1005d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu VarArg= VarArg->Next; 1006d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu if (VarArg == NULL) { 1007d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); 1008d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 100968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey goto ON_EXIT; 101068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 101168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 10127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ZeroMem (&ManualAddress, sizeof (ManualAddress)); 10137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 10147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 10157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get manual IP address. 10167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 10177c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address); 10187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR(Status)) { 1019d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); 10206e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 10217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 10227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 102368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 10247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 10257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get subnetmask. 10267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 10277c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarArg = VarArg->Next; 1028d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu if (VarArg == NULL) { 1029d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); 1030d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 1031d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu goto ON_EXIT; 1032d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu } 1033d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu 10347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask); 10357c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR(Status)) { 1036d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); 10376e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 10387c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 10397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 104068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 10417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 10427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get gateway. 10437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 10447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarArg = VarArg->Next; 1045d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu if (VarArg == NULL) { 1046d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); 1047d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 1048d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu goto ON_EXIT; 1049d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu } 1050d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu 10517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = NetLibStrToIp4 (VarArg->Arg, &Gateway); 10527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR(Status)) { 1053d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); 10546e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 10557c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 10567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 1057d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu 1058d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu // 1059d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu // Set manual config policy. 1060d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu // 1061d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu Policy = Ip4Config2PolicyStatic; 1062d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu Status = IfCb->IfCfg->SetData ( 1063d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu IfCb->IfCfg, 1064d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu Ip4Config2DataTypePolicy, 1065d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu sizeof (EFI_IP4_CONFIG2_POLICY), 1066d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu &Policy 1067d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ); 1068d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu if (EFI_ERROR(Status)) { 1069d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); 1070d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 1071d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu goto ON_EXIT; 1072d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu } 10737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 1074d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu // 1075d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu // Set Manual Address. 1076d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu // 10777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IsAddressOk = FALSE; 10787c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 10797c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = IfCb->IfCfg->RegisterDataNotify ( 10807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfCfg, 10817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeManualAddress, 10827c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu MappedEvt 10837c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 10847c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 1085d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); 10866e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 10877c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 10887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 108968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 10907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS); 109168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 10927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = IfCb->IfCfg->SetData ( 10937c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfCfg, 10947c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeManualAddress, 10957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize, 10967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &ManualAddress 10977c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 109868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 10997c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Status == EFI_NOT_READY) { 11007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000); 110168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 11027c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) { 11037c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IsAddressOk) { 11047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = EFI_SUCCESS; 11057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 11067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 11077c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 11087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 110968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 11107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfCfg->UnregisterDataNotify ( 11117c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfCfg, 11127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeManualAddress, 11137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu MappedEvt 11147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 11156e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu 11167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 11177c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); 11186e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 111968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey goto ON_EXIT; 112068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 112168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 11227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 11237c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Set gateway. 11247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 11257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize = sizeof (EFI_IPv4_ADDRESS); 11267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 11277c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = IfCb->IfCfg->SetData ( 11287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfCfg, 11297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeGateway, 11307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize, 11317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &Gateway 11327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 11336e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu if (EFI_ERROR (Status)) { 1134d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); 11356e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 11366e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu goto ON_EXIT; 11376e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu } 11386e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu 11397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarArg = VarArg->Next; 11407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 11417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } else if (StrCmp (VarArg->Arg, L"dns") == 0) { 11427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 11437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get DNS addresses. 11447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 11457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarArg = VarArg->Next; 11467c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Tmp = VarArg; 11477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Index = 0; 11487c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu while (Tmp != NULL) { 11497c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Index ++; 11507c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Tmp = Tmp->Next; 11517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 115268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 11537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS)); 11547c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT(Dns != NULL); 11557c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Tmp = VarArg; 11567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Index = 0; 11577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu while (Tmp != NULL) { 11587c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index); 11597c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR(Status)) { 1160d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, Tmp->Arg); 11616e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 11627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 11637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 11647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Index ++; 11657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Tmp = Tmp->Next; 11667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 11677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 11687c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu VarArg = Tmp; 116968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 11707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 11717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Set DNS addresses. 11727c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 11737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize = Index * sizeof (EFI_IPv4_ADDRESS); 11747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 11757c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = IfCb->IfCfg->SetData ( 11767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb->IfCfg, 11777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Ip4Config2DataTypeDnsServer, 11787c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu DataSize, 11797c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Dns 11807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 11816e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu if (EFI_ERROR (Status)) { 1182d1baf355b1e5d3363ef7b8abcabffe08af43b8e5Jiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); 11836e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_ACCESS_DENIED; 11846e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu goto ON_EXIT; 11856e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu } 118668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 11877c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 118868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 11897c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuON_EXIT: 11907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Dns != NULL) { 11917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (Dns); 11927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 11937c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 11946e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu return ShellStatus; 119568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 11967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu} 119768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 11987c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu/** 11997c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu The ifconfig command main process. 120068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA. 120268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12036e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu @retval SHELL_SUCCESS ifconfig command processed successfully. 12047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @retval others The ifconfig command process failed. 120568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu**/ 12076e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin WuSHELL_STATUS 12087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfig ( 12097c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN IFCONFIG_PRIVATE_DATA *Private 12107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ) 12117c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu{ 12127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_STATUS Status; 12136e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu SHELL_STATUS ShellStatus; 12146e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu 12156e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_SUCCESS; 121668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 121768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 12187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Get configure information of all interfaces. 121968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 12207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = IfConfigGetInterfaceInfo ( 12217c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private->IfName, 12227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu &Private->IfList 12237c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ); 12247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 12256e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_NOT_FOUND; 12267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 122768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 122868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu switch (Private->OpCode) { 12307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu case IfConfigOpList: 12316e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = IfConfigShowInterfaceInfo (&Private->IfList); 12327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 12337c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 12347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu case IfConfigOpClear: 12356e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = IfConfigClearInterfaceInfo (&Private->IfList); 12367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 12377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 12387c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu case IfConfigOpSet: 12396e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg); 12407c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu break; 12417c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 12427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu default: 12436e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_UNSUPPORTED; 124468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 12457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 124668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseyON_EXIT: 12476e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu return ShellStatus; 124868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 124968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 125068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 12517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu The ifconfig command cleanup process, free the allocated memory. 12527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 12537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA. 125468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 125568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 125668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseyVOID 12577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuIfConfigCleanup ( 12587c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IN IFCONFIG_PRIVATE_DATA *Private 125968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ) 126068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 126168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey LIST_ENTRY *Entry; 126268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey LIST_ENTRY *NextEntry; 12637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IFCONFIG_INTERFACE_CB *IfCb; 12647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ARG_LIST *ArgNode; 12657c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ARG_LIST *ArgHead; 126668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12677c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (Private != NULL); 126868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 12707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Clean the list which save the set config Args. 12717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 12727c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Private->VarArg != NULL) { 12737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgHead = Private->VarArg; 127468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12757c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu while (ArgHead->Next != NULL) { 12767c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgNode = ArgHead->Next; 12777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (ArgHead); 12787c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgHead = ArgNode; 127968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 128068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (ArgHead); 128268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 128368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12847c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Private->IfName != NULL) { 12857c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (Private->IfName); 12867c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 128768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 12897c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Clean the IFCONFIG_INTERFACE_CB list. 12907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 12917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->IfList) { 12927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link); 129368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12947c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu RemoveEntryList (&IfCb->Link); 129568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (IfCb->IfInfo != NULL) { 129768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 12987c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (IfCb->IfInfo); 129968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 130068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 13017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (IfCb); 130268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 130368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 13047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu FreePool (Private); 130568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 130668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 130768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey/** 130868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey Function for 'ifconfig' command. 130968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 131068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey @param[in] ImageHandle Handle to the Image (NULL if Internal). 131168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey @param[in] SystemTable Pointer to the System Table (NULL if Internal). 13127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 13137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @retval EFI_SUCCESS ifconfig command processed successfully. 13147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu @retval others The ifconfig command process failed. 13157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 131668fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey**/ 131768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseySHELL_STATUS 131868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseyEFIAPI 131968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarseyShellCommandRunIfconfig ( 132068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey IN EFI_HANDLE ImageHandle, 132168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey IN EFI_SYSTEM_TABLE *SystemTable 132268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey ) 132368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey{ 13247c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu EFI_STATUS Status; 13257c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IFCONFIG_PRIVATE_DATA *Private; 13267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu LIST_ENTRY *ParamPackage; 13276e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu SHELL_STATUS ShellStatus; 13287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CONST CHAR16 *ValueStr; 13297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ARG_LIST *ArgList; 13307c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CHAR16 *ProblemParam; 13317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu CHAR16 *Str; 13326e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu 13336e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu Status = EFI_INVALID_PARAMETER; 13347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private = NULL; 13356e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_SUCCESS; 13367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 13377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE); 13387c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (EFI_ERROR (Status)) { 13396e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { 13406e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam); 13416e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu FreePool(ProblemParam); 13426e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 13436e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu } else { 13446e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ASSERT(FALSE); 13456e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu } 13466e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu 13477c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 13487c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 134968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 135068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 13517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To handle unsupported option. 135268fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 13537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (ShellCommandLineGetFlag (ParamPackage, L"-c")) { 13547c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c"); 13556e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 13567c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 13577c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 135868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 135968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 13607c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To handle no option. 136168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 13627c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") && 13637c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu !ShellCommandLineGetFlag (ParamPackage, L"-l")) { 13647c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle); 13656e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 13667c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 136768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 136868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 13697c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 13707c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To handle conflict options. 13717c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 13727c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) || 13737c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) || 13747c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l")))) { 13757c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig"); 13766e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 13777c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 137868fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 137968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 13807c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA)); 13817c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Private == NULL) { 13826e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_OUT_OF_RESOURCES; 13837c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 138468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 138568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 13867c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu InitializeListHead (&Private->IfList); 138768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 13887c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 13897c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To get interface name for the list option. 13907c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 13917c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (ShellCommandLineGetFlag (ParamPackage, L"-l")) { 13927c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private->OpCode = IfConfigOpList; 13937c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l"); 13947c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (ValueStr != NULL) { 13957c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Str = AllocateCopyPool (StrSize (ValueStr), ValueStr); 13967c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (Str != NULL); 13977c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private->IfName = Str; 13987c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 13997c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 14007c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 14017c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 14027c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To get interface name for the clear option. 14037c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 14047c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (ShellCommandLineGetFlag (ParamPackage, L"-r")) { 14057c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private->OpCode = IfConfigOpClear; 14067c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r"); 14077c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (ValueStr != NULL) { 14087c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Str = AllocateCopyPool (StrSize (ValueStr), ValueStr); 14097c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (Str != NULL); 14107c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private->IfName = Str; 14117c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 14127c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 14137c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 14147c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 14157c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To get interface name and corresponding Args for the set option. 14167c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 14177c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (ShellCommandLineGetFlag (ParamPackage, L"-s")) { 14187c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s"); 14197c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (ValueStr == NULL) { 14207c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_INTERFACE), gShellNetwork1HiiHandle); 14216e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 14227c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 14237c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu } 142468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 142568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 14267c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // To split the configuration into multi-section. 142768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey // 14287c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ArgList = SplitStrToList (ValueStr, L' '); 14297c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ASSERT (ArgList != NULL); 143068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 14317c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private->OpCode = IfConfigOpSet; 14327c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private->IfName = ArgList->Arg; 143368fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 14347c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu Private->VarArg = ArgList->Next; 143568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 14367c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Private->IfName == NULL || Private->VarArg == NULL) { 14377c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); 14386e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = SHELL_INVALID_PARAMETER; 14397c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu goto ON_EXIT; 144068fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 144168fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 14427c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 14437c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 14447c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // Main process of ifconfig. 14457c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu // 14466e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu ShellStatus = IfConfig (Private); 144768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 14487c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwuON_EXIT: 144968fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 14507c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu ShellCommandLineFreeVarList (ParamPackage); 14517c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu 14527c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu if (Private != NULL) { 14537c25b7ea5b2c029a9e7a0be57f7c20f31d720c7djiaxinwu IfConfigCleanup (Private); 145468fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey } 145568fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey 14566e3e562c9d3f3737b718b5be9c9a64e98784890bJiaxin Wu return ShellStatus; 145768fb05272b45b473fe030ac11dcb79d3f3c0aecdjcarsey} 1458