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