Discussion:
[edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library
Wu, Jiaxin
2015-07-01 15:54:32 UTC
Permalink
Hi Tapan,
Thank you for your comments, I have updated patch according below and other reviewers comments.
For the copyright, I have confirm that HP's copyright should be kept, I have recovered it and just update Intel copyright year.

Best Regards!
Jiaxin

-----Original Message-----
From: edk2-devel-***@lists.sourceforge.net [mailto:edk2-devel-***@lists.sourceforge.net]
Sent: Wednesday, July 1, 2015 12:55 AM
To: edk2-***@lists.sourceforge.net
Subject: edk2-devel Digest, Vol 66, Issue 424

Send edk2-devel mailing list submissions to
edk2-***@lists.sourceforge.net

To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/edk2-devel
or, via email, send a message with subject or body 'help' to
edk2-devel-***@lists.sourceforge.net

You can reach the person managing the list at
edk2-devel-***@lists.sourceforge.net

When replying, please edit your Subject line so it is more specific
than "Re: Contents of edk2-devel digest..."


Today's Topics:

1. Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
(Shah, Tapan)


----------------------------------------------------------------------

Message: 1
Date: Tue, 30 Jun 2015 16:54:24 +0000
From: "Shah, Tapan" <***@hp.com>
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig
library.
To: "edk2-***@lists.sourceforge.net"
<edk2-***@lists.sourceforge.net>
Message-ID:
<***@G1W3642.americas.hpqcorp.net>

Content-Type: text/plain; charset="utf-8"

Jiaxin,
I see that ifconfig is completely re-written and also removed HP's copyright. I am not sure if it's acceptable to remove HP's copyright from the file. I am assuming that you have done adequate testing for this major change, can you confirm what type of testing is performed to verify this change?

Below comments for .uni file changes:

1. No need to rename below three string tokens.
STR_GEN_TOO_MANY -> STR_PING_ERR_TOO_MANY
STR_GEN_TOO_FEW -> STR_PING_ERR_TOO_FEW
STR_GEN_PARAM_INV -> STR_PING_ERR_PARAM_INV

2. All other STR_GEN_* string tokens are removed from .uni file. I suspect it may break other command. They should remain as-is and no need to remove. We also keep it at the profile level .uni file to keep track of same generic token name and strings across all commands.

3. STR_IFCONFIG_HELP help output of new ifconfig is not following the help output format. Need to fix it. Existing ifconfig help output is a good example as a reference.

4. Below token shows message Ip4Config2->GetData which is not something we customer friendly. Make it a customer friendly message.

#string STR_IFCONFIG_ERR_IP4CFG_GETDATA #language en-US "Ip4Config2->GetData return %hr\n"

Thanks,
Tapan

-----Original Message-----
From: Qiu, Shumin [mailto:***@intel.com]
Sent: Monday, June 29, 2015 8:12 PM
To: edk2-***@lists.sourceforge.net
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Hi Jiaxin,
Can I have the patch file?

-Shumin

-----Original Message-----
From: jiaxinwu [mailto:***@intel.com]
Sent: Monday, June 29, 2015 10:50 PM
To: edk2-***@lists.sourceforge.net
Subject: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Version2 include:
Make the command options to be Shell2.1 compliant(For the unsupported option, display ?not supported?);
Safe string fix;
Coding style change.

This patch update ShellPkg ping/ifconfig library source code to consume Ip4Config2 protocol.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: jiaxinwu <***@intel.com>
---
.../UefiShellNetwork1CommandsLib/Ifconfig.c | 2462 ++++++++------------
.../Library/UefiShellNetwork1CommandsLib/Ping.c | 33 +-
.../UefiShellNetwork1CommandsLib.c | 4 +-
.../UefiShellNetwork1CommandsLib.h | 8 +-
.../UefiShellNetwork1CommandsLib.inf | 6 +-
.../UefiShellNetwork1CommandsLib.uni | Bin 20112 -> 21554 bytes
6 files changed, 1040 insertions(+), 1473 deletions(-)

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index 7c3f809..61328a3 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -1,1763 +1,1337 @@
/** @file
- The implementation for ifcommand shell command.
+ The implementation for Shell command ifconfig based on IP4Config2 protocol.

- (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
**/

#include "UefiShellNetwork1CommandsLib.h"

-#define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE)
-#define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))
-
-BOOLEAN mIp4ConfigExist = FALSE;
-STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL;
+enum {
+ IfConfigOpList = 1,
+ IfConfigOpSet = 2,
+ IfConfigOpClear = 3
+};
+
+typedef enum {
+ VarCheckReserved = -1,
+ VarCheckOk = 0,
+ VarCheckDuplicate,
+ VarCheckConflict,
+ VarCheckUnknown,
+ VarCheckLackValue,
+ VarCheckOutOfMem
+} VAR_CHECK_CODE;
+
+typedef enum {
+ FlagTypeSingle = 0,
+ FlagTypeNeedVar,
+ FlagTypeNeedSet,
+ FlagTypeSkipUnknown
+} VAR_CHECK_FLAG_TYPE;
+
+#define MACADDRMAXSIZE 32
+
+typedef struct _IFCONFIG_INTERFACE_CB {
+ EFI_HANDLE NicHandle;
+ LIST_ENTRY Link;
+ EFI_IP4_CONFIG2_PROTOCOL *IfCfg;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ EFI_IP4_CONFIG2_POLICY Policy;
+ UINT32 DnsCnt;
+ EFI_IPv4_ADDRESS DnsAddr[1];
+} IFCONFIG_INTERFACE_CB;
+
+typedef struct _ARG_LIST ARG_LIST;
+
+struct _ARG_LIST {
+ ARG_LIST *Next;
+ CHAR16 *Arg;
+};
+
+typedef struct _IFCONFIG4_PRIVATE_DATA {
+ EFI_HANDLE ImageHandle;
+ LIST_ENTRY IfList;
+
+ UINT32 OpCode;
+ CHAR16 *IfName;
+ ARG_LIST *VarArg;
+} IFCONFIG_PRIVATE_DATA;
+
+typedef struct _VAR_CHECK_ITEM{
+ CHAR16 *FlagStr;
+ UINT32 FlagID;
+ UINT32 ConflictMask;
+ VAR_CHECK_FLAG_TYPE FlagType;
+} VAR_CHECK_ITEM;
+
+SHELL_PARAM_ITEM mIfConfigCheckList[] = {
+ {
+ L"-b",
+ TypeFlag
+ },
+ {
+ L"-h",
+ TypeFlag
+ },
+ {
+ L"-l",
+ TypeValue
+ },
+ {
+ L"-r",
+ TypeValue
+ },
+ {
+ L"-c",
+ TypeValue
+ },
+ {
+ L"-s",
+ TypeMaxValue
+ },
+ {
+ NULL,
+ TypeMax
+ },
+};
+
+VAR_CHECK_ITEM mSetCheckList[] = {
+ {
+ L"static",
+ 0x00000001,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dhcp",
+ 0x00000002,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dns",
+ 0x00000008,
+ 0x00000004,
+ FlagTypeSingle
+ },
+ {
+ NULL,
+ 0x0,
+ 0x0,
+ FlagTypeSkipUnknown
+ },
+};

-STATIC CONST UINTN SecondsToNanoSeconds = 10000000;
-STATIC CONST CHAR16 DhcpString[5] = L"DHCP";
-STATIC CONST CHAR16 StaticString[7] = L"STATIC";
STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";

-typedef struct {
- LIST_ENTRY Link;
- EFI_HANDLE Handle;
- NIC_ADDR NicAddress;
- CHAR16 Name[IP4_NIC_NAME_LENGTH];
- BOOLEAN MediaPresentSupported;
- BOOLEAN MediaPresent;
- EFI_IP4_CONFIG_PROTOCOL *Ip4Config;
- NIC_IP4_CONFIG_INFO *ConfigInfo;
-} NIC_INFO;
-
-typedef struct {
- EFI_IP_ADDRESS DestIp;
- EFI_MAC_ADDRESS DestMac;
- EFI_IP_ADDRESS LocalIp;
- EFI_MAC_ADDRESS LocalMac;
- UINT8 MacLen;
- EFI_EVENT OnResolved;
- BOOLEAN Duplicate;
-} ARP_REQUEST;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- {L"-c", TypeValue},
- {L"-l", TypeValue},
- {L"-s", TypeMaxValue},
- {NULL, TypeMax}
- };
-
-STATIC LIST_ENTRY NicInfoList;
-STATIC BOOLEAN ArpResolved;
-STATIC BOOLEAN mTimeout;
-
/**
- Count the space delimited items in a string.
-
- @param[in] String A pointer to the string to count.
-
- @return The number of space-delimited items.
- @retval 0xFF an error occured.
-**/
-UINT8
-EFIAPI
-CountSubItems (
- IN CONST CHAR16 *String
- )
-{
- CONST CHAR16 *Walker;
- UINT8 Count;
-
- if (String == NULL || *String == CHAR_NULL) {
- return (0xFF);
- }
+ Split a string with specified separator and save the substring to a list.

- for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; Walker = (StrStr(Walker, L" ")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);
- return (Count);
-}
+ @param[in] String The pointer of the input string.
+ @param[in] Separator The specified separator.

-/**
- Find the NIC_INFO by the specified nic name.
+ @return The pointer of headnode of ARG_LIST.

- @param[in] Name The pointer to the string containing the NIC name.
-
- @return The pointer to the NIC_INFO if there is a NIC_INFO named by Name.
- @retval NULL No NIC_INFO was found for Name.
**/
-NIC_INFO*
-EFIAPI
-IfconfigFindNicByName (
- IN CONST CHAR16 *Name
+ARG_LIST *
+SplitStrToList (
+ IN CONST CHAR16 *String,
+ IN CHAR16 Separator
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- CHAR16 *TempString;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
- TempString = (CHAR16*)Info->Name;
+ CHAR16 *Str;
+ CHAR16 *ArgStr;
+ ARG_LIST *ArgList;
+ ARG_LIST *ArgNode;

- if (StringNoCaseCompare (&Name, &TempString) == 0) {
- return Info;
- }
+ if (*String == L'\0') {
+ return NULL;
}

- return NULL;
-}
-
-/**
- Tests whether a child handle is a child device of the controller.
-
- @param[in] ControllerHandle A handle for a (parent) controller to test.
- @param[in] ChildHandle A child handle to test.
- @param[in] ProtocolGuid Supplies the protocol that the child controller
- opens on its parent controller.
-
- @retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.
- @retval EFI_UNSUPPORTED ChildHandle is not a child of the ControllerHandle.
-**/
-EFI_STATUS
-EFIAPI
-TestChildHandle (
- IN CONST EFI_HANDLE ControllerHandle,
- IN CONST EFI_HANDLE ChildHandle,
- IN CONST EFI_GUID *ProtocolGuid
- )
-{
- EFI_STATUS Status;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- UINTN EntryCount;
- UINTN Index;
-
- ASSERT (ProtocolGuid != NULL);
-
//
- // Retrieve the list of agents that are consuming the specific protocol
- // on ControllerHandle.
+ // Copy the CONST string to a local copy.
//
- Status = gBS->OpenProtocolInformation (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (String));
+ ASSERT (Str != NULL);
+ StrCpyS (Str, StrSize (String)/sizeof (CHAR16), String);
+ ArgStr = Str;

//
- // Inspect if ChildHandle is one of the agents.
+ // init a node for the list head.
//
- Status = EFI_UNSUPPORTED;
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&
- (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = EFI_SUCCESS;
- break;
- }
- }
-
- FreePool (OpenInfoBuffer);
- return Status;
-}
-
-/**
- Get the child handle of the NIC handle.
-
- @param[in] Controller Routing information: GUID.
- @param[out] ChildHandle Returned child handle.
-
- @retval EFI_SUCCESS Successfully to get child handle.
-**/
-EFI_STATUS
-GetChildHandle (
- IN EFI_HANDLE Controller,
- OUT EFI_HANDLE *ChildHandle
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- UINTN Index;
- EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;
- VENDOR_DEVICE_PATH *VendorDeviceNode;
+ ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode != NULL);
+ ArgList = ArgNode;

//
- // Locate all EFI Hii Config Access protocols
+ // Split the local copy and save in the list node.
//
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiHiiConfigAccessProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
- );
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return Status;
- }
-
- Status = EFI_NOT_FOUND;
-
- for (Index = 0; Index < HandleCount; Index++) {
-
- Status = TestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);
- if (!EFI_ERROR (Status)) {
- //
- // Get device path on the child handle
- //
- Status = gBS->HandleProtocol (
- Handles[Index],
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ChildDeviceDevicePath
- );
-
- if (!EFI_ERROR (Status)) {
- while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
- ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
- //
- // Parse one instance
- //
- if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&
- ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
- VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
- if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
- //
- // Found item matched gEfiNicIp4ConfigVariableGuid
- //
- *ChildHandle = Handles[Index];
- FreePool (Handles);
- return EFI_SUCCESS;
- }
- }
- }
- }
+ while (*Str != L'\0') {
+ if (*Str == Separator) {
+ *Str = L'\0';
+ ArgNode->Arg = ArgStr;
+ ArgStr = Str + 1;
+ ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode->Next != NULL);
+ ArgNode = ArgNode->Next;
}
+
+ Str++;
}

- FreePool (Handles);
- return Status;
+ ArgNode->Arg = ArgStr;
+ ArgNode->Next = NULL;
+
+ return ArgList;
}

/**
- Append OFFSET/WIDTH/VALUE items at the beginning of string.
-
- @param[in, out] String The pointer to the string to append onto.
- @param[in] Offset Offset value.
- @param[in] Width Width value.
- @param[in] Block Point to data buffer.
-
- @return The count of unicode character that were appended.
-**/
-UINTN
-EFIAPI
-AppendOffsetWidthValue (
- IN OUT CHAR16 *String,
- IN UINTN Offset,
- IN UINTN Width,
- IN CONST UINT8 *Block
- )
-
-{
- CHAR16 *OriString;
-
- OriString = String;
-
- StrnCpy (String, L"&OFFSET=", 9);
- String += StrLen (L"&OFFSET=");
- String += UnicodeSPrint (String, 20, L"%x", Offset);
-
- StrnCpy (String,L"&WIDTH=", 8);
- String += StrLen (L"&WIDTH=");
- String += UnicodeSPrint (String, 20, L"%x", Width);
+ Check the correctness of input Args with '-s' option.

- if (Block != NULL) {
- StrnCpy (String,L"&VALUE=", 8);
- String += StrLen (L"&VALUE=");
- while ((Width--) != 0) {
- String += UnicodeSPrint (String, 20, L"%x", Block[Width]);
- }
- }
-
- return String - OriString;
-}
+ @param[in] CheckList The pointer of VAR_CHECK_ITEM array.
+ @param[in] Name The pointer of input arg.
+ @param[in] Init The switch to execute the check.

-/**
- Converts the unicode character of the string from uppercase to lowercase.
- This is a internal function.
+ @return The value of VAR_CHECK_CODE.

- @param ConfigString String to be converted
**/
-CHAR16*
-EFIAPI
-HiiToLower (
- IN CHAR16 *ConfigString
- )
+VAR_CHECK_CODE
+IfConfigRetriveCheckListByName(
+ IN VAR_CHECK_ITEM *CheckList,
+ IN CHAR16 *Name,
+ IN BOOLEAN Init
+)
{
- CHAR16 *String;
- BOOLEAN Lower;
-
- //
- // Convert all hex digits in range [A-F] in the configuration header to [a-f]
- //
- for (String = ConfigString, Lower = FALSE; String != NULL && *String != L'\0'; String++) {
- if (*String == L'=') {
- Lower = TRUE;
- } else if (*String == L'&') {
- Lower = FALSE;
- } else if (Lower && *String >= L'A' && *String <= L'F') {
- *String = (CHAR16) (*String - L'A' + L'a');
- }
+ STATIC UINT32 CheckDuplicate;
+ STATIC UINT32 CheckConflict;
+ VAR_CHECK_CODE RtCode;
+ UINT32 Index;
+ VAR_CHECK_ITEM Arg;
+
+ if (Init) {
+ CheckDuplicate = 0;
+ CheckConflict = 0;
+ return VarCheckOk;
}

- return (ConfigString);
-}
-
-
-/**
- Construct <ConfigHdr> using routing information GUID/NAME/PATH.
-
- @param[in] Guid Routing information: GUID.
- @param[in] Name Routing information: NAME.
- @param[in] DriverHandle Driver handle which contains the routing information: PATH.
-
- @retval NULL An error occured.
- @return The pointer to configHdr string.
-**/
-CHAR16 *
-EFIAPI
-ConstructConfigHdr (
- IN CONST EFI_GUID *Guid,
- IN CONST CHAR16 *Name,
- IN EFI_HANDLE DriverHandle
- )
-{
- EFI_STATUS Status;
- CHAR16 *ConfigHdr;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- CHAR16 *String;
- UINTN Index;
- UINT8 *Buffer;
- UINTN DevicePathLength;
- UINTN NameLength;
+ RtCode = VarCheckOk;
+ Index = 0;
+ Arg = CheckList[Index];

//
- // Get the device path from handle installed EFI HII Config Access protocol
+ // Check the Duplicated/Conflicted/Unknown input Args.
//
- Status = gBS->HandleProtocol (
- DriverHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath
- );
- if (EFI_ERROR (Status)) {
- return NULL;
- }
+ while (Arg.FlagStr != NULL) {
+ if (StrCmp (Arg.FlagStr, Name) == 0) {

- DevicePathLength = GetDevicePathSize (DevicePath);
- NameLength = StrLen (Name);
- ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));
- if (ConfigHdr == NULL) {
- return NULL;
- }
+ if (CheckDuplicate & Arg.FlagID) {
+ RtCode = VarCheckDuplicate;
+ break;
+ }

- String = ConfigHdr;
- StrnCpy (String, L"GUID=", 6);
- String += StrLen (L"GUID=");
+ if (CheckConflict & Arg.ConflictMask) {
+ RtCode = VarCheckConflict;
+ break;
+ }

- //
- // Append Guid converted to <HexCh>32
- //
- for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
- }
+ CheckDuplicate |= Arg.FlagID;
+ CheckConflict |= Arg.ConflictMask;
+ break;
+ }

- //
- // Append L"&NAME="
- //
- StrnCpy (String, L"&NAME=", 7);
- String += StrLen (L"&NAME=");
- for (Index = 0; Index < NameLength ; Index++) {
- String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);
+ Arg = CheckList[++Index];
}
-
- //
- // Append L"&PATH="
- //
- StrnCpy (String, L"&PATH=", 7);
- String += StrLen (L"&PATH=");
- for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
+
+ if (Arg.FlagStr == NULL) {
+ RtCode = VarCheckUnknown;
}

- return (HiiToLower(ConfigHdr));
+ return RtCode;
}

/**
- Get network physical device NIC information.
+ The notify function of create event when performing a manual config.

- @param[in] Handle The network physical device handle.
- @param[out] NicAddr NIC information.
+ @param[in] Event The event this notify function registered to.
+ @param[in] Context Pointer to the context data registered to the event.

- @retval EFI_SUCCESS Get NIC information successfully.
-**/
-EFI_STATUS
+**/
+VOID
EFIAPI
-IfConfigGetNicMacInfo (
- IN EFI_HANDLE Handle,
- OUT NIC_ADDR *NicAddr
- )
+IfConfigManualAddressNotify (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
- }
-
- NicAddr->Type = (UINT16) SnpMode.IfType;
- NicAddr->Len = (UINT8) SnpMode.HwAddressSize;
- CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);
-
-ON_ERROR:
-
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
-
- return Status;
-
+ *((BOOLEAN *) Context) = TRUE;
}

+
/**
- Get network physical device NIC information.
+ Print MAC address.

- @param[in] Handle The network physical device handle.
- @param[out] MediaPresentSupported
- Upon successful return, TRUE is media present
- is supported. FALSE otherwise.
- @param[out] MediaPresent Upon successful return, TRUE is media present
- is enabled. FALSE otherwise.
+ @param[in] Node The pointer of MAC address buffer.
+ @param[in] Size The size of MAC address buffer.

- @retval EFI_SUCCESS The operation was successful.
**/
-EFI_STATUS
-EFIAPI
-IfConfigGetNicMediaStatus (
- IN EFI_HANDLE Handle,
- OUT BOOLEAN *MediaPresentSupported,
- OUT BOOLEAN *MediaPresent
- )
-
+VOID
+IfConfigPrintMacAddr (
+ IN UINT8 *Node,
+ IN UINT32 Size
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
+ UINTN Index;

- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
+ ASSERT (Size <= MACADDRMAXSIZE);

- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
+ for (Index = 0; Index < Size; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);
+ if (Index + 1 < Size) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle);
+ }
}
-
- *MediaPresentSupported = SnpMode.MediaPresentSupported;
- *MediaPresent = SnpMode.MediaPresent;

-ON_ERROR:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+}

- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );

- return Status;
+/**
+ The get current status of all handles.

-}
+ @param[in] ImageHandle The handle of ImageHandle.
+ @param[in] IfName The pointer of IfName(interface name).
+ @param[in] IfList The pointer of IfList(interface list).

-/**
- Get all Nic's information through HII service.
+ @retval EFI_SUCCESS The get status processed successfully.
+ @retval others The get status process failed.

- @retval EFI_SUCCESS All the nic information is collected.
**/
EFI_STATUS
-EFIAPI
-IfconfigGetAllNicInfoByHii (
- VOID
+IfConfigGetInterfaceInfo (
+ IN EFI_HANDLE ImageHandle,
+ IN CHAR16 *IfName,
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- UINTN Index;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- UINTN BufferSize;
- NIC_INFO *NicInfo;
- NIC_IP4_CONFIG_INFO *NicConfigRequest;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfigRequest = NULL;
- NicInfo = NULL;
-
- InitializeListHead (&NicInfoList);
+ EFI_STATUS Status;
+ UINTN HandleIndex;
+ UINTN HandleNum;
+ EFI_HANDLE *HandleBuffer;
+ EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ UINTN DataSize;

- //
- // Check if HII Config Routing protocol available.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiConfigRoutingProtocolGuid,
- NULL,
- (VOID**)&mHiiConfigRouting
- );
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
+ HandleBuffer = NULL;
+ HandleNum = 0;
+
+ IfInfo = NULL;
+ IfCb = NULL;

//
- // Locate all network device handles
+ // Locate all the handles with ip4 service binding protocol.
//
Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
+ ByProtocol,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ NULL,
+ &HandleNum,
+ &HandleBuffer
);
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return EFI_NOT_FOUND;
+ if (EFI_ERROR (Status) || (HandleNum == 0)) {
+ return EFI_ABORTED;
}

- for (Index = 0; Index < HandleCount; Index++) {
- Status = GetChildHandle (Handles[Index], &ChildHandle);
+ //
+ // Enumerate all handles that installed with ip4 service binding protocol.
+ //
+ for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
+ IfCb = NULL;
+ IfInfo = NULL;
+ DataSize = 0;
+
+ //
+ // Ip4config protocol and ip4 service binding protocol are installed
+ // on the same handle.
+ //
+ ASSERT (HandleBuffer != NULL);
+ Status = gBS->HandleProtocol (
+ HandleBuffer[HandleIndex],
+ &gEfiIp4Config2ProtocolGuid,
+ (VOID **) &Ip4Cfg2
+ );
+
if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility.
- //
- ChildHandle = Handles[Index];
+ goto ON_ERROR;
}
+
//
- // Construct configuration request string header
+ // Get the interface information size.
//
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- Length = 0;
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ NULL
+ );
+
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
+
+ IfInfo = AllocateZeroPool (DataSize);
+
+ if (IfInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
-
+
//
- // Append OFFSET/WIDTH pair
+ // Get the interface info.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ IfInfo
+ );

- NicInfo = AllocateZeroPool (sizeof (NIC_INFO));
- if (NicInfo == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
goto ON_ERROR;
}
- NicInfo->Handle = Handles[Index];
-
+
//
- // Get network physical devcie MAC information
+ // Check the interface name if required.
//
- IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);
- if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);
- } else {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
+ FreePool (IfInfo);
+ continue;
}

+ DataSize = 0;
+
//
- // Get media status
+ // Get the size of dns server list.
//
- IfConfigGetNicMediaStatus (Handles[Index], &NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ NULL
+ );
+
+ if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfigRequest == NULL) {
+ IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);
+
+ if (IfCb == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}

+ IfCb->NicHandle = HandleBuffer[HandleIndex];
+ IfCb->IfInfo = IfInfo;
+ IfCb->IfCfg = Ip4Cfg2;
+ IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));
+
//
- // Get network parameters by HII service
+ // Get the dns server list if has.
//
- Status = mHiiConfigRouting->ExtractConfig (
- mHiiConfigRouting,
- ConfigResp,
- &AccessProgress,
- &AccessResults
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = NIC_ITEM_CONFIG_SIZE;
- Status = mHiiConfigRouting->ConfigToBlock (
- mHiiConfigRouting,
- AccessResults,
- (UINT8 *) NicConfigRequest,
- &BufferSize,
- &AccessProgress
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;
- NicConfig = AllocateZeroPool (BufferSize);
- if (NicConfig == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
- CopyMem (NicConfig, NicConfigRequest, BufferSize);
-
- //
- // If succeeds to get NIC configuration, fix up routetable pointer.
- //
- NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (&NicConfig->Ip4Info + 1);
- NicInfo->ConfigInfo = NicConfig;
-
- } else {
- NicInfo->ConfigInfo = NULL;
+ if (DataSize > 0) {
+
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ IfCb->DnsAddr
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
-
- FreePool (AccessResults);
-
- } else {
- NicInfo->ConfigInfo = NULL;
}

//
- // Add the Nic's info to the global NicInfoList.
+ // Get the config policy.
//
- InsertTailList (&NicInfoList, &NicInfo->Link);
+ DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypePolicy,
+ &DataSize,
+ &IfCb->Policy
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- FreePool (NicConfigRequest);
- FreePool (ConfigResp);
- FreePool (ConfigHdr);
+
+ InsertTailList (IfList, &IfCb->Link);
+
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
+ //
+ // Only need the appointed interface, keep the allocated buffer.
+ //
+ IfCb = NULL;
+ IfInfo = NULL;
+ break;
+ }
}

- FreePool (Handles);
+ if (HandleBuffer != NULL) {
+ FreePool (HandleBuffer);
+ }

return EFI_SUCCESS;
-
+
ON_ERROR:
- if (AccessResults != NULL) {
- FreePool (AccessResults);
- }
- if (NicConfigRequest != NULL) {
- FreePool (NicConfigRequest);
- }
- if (NicInfo != NULL) {
- FreePool (NicInfo);
- }
- if (ConfigResp != NULL) {
- FreePool (ConfigResp);
- }
- if (ConfigHdr != NULL) {
- FreePool (ConfigHdr);
+
+ if (IfInfo != NULL) {
+ FreePool (IfInfo);
}

- FreePool (Handles);
+ if (IfCb != NULL) {
+ FreePool (IfCb);
+ }

return Status;
}

/**
- Set the address for the specified nic by HII service.
+ The list process of the ifconfig command.

- @param[in] NicInfo A pointer to the NIC_INFO of the Nic to be configured.
- @param[in] Config The command line arguments for the set operation.
+ @param[in] IfList The pointer of IfList(interface list).
+
+ @retval EFI_SUCCESS The ifconfig command list processed successfully.
+ @retval others The ifconfig command list process failed.

- @retval EFI_SUCCESS The address set operation is done.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddrByHii (
- IN CONST NIC_INFO *NicInfo,
- IN CONST NIC_IP4_CONFIG_INFO *Config
+EFI_STATUS
+IfConfigShowInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- SHELL_STATUS ShellStatus;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfig = NULL;
- ShellStatus = SHELL_SUCCESS;
-
- Status = GetChildHandle (NicInfo->Handle, &ChildHandle);
- if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility
- //
- ChildHandle = NicInfo->Handle;
- }
- //
- // Construct config request string header
- //
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IPv4_ADDRESS Gateway;
+ UINT32 Index;

- NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfig == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- if (Config != NULL) {
- CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

//
- // Append OFFSET/WIDTH pair
+ // Go through the interface list.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ while (Entry != IfList) {
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

- //
- // Call HII helper function to generate configuration string
- //
- Status = mHiiConfigRouting->BlockToConfig (
- mHiiConfigRouting,
- ConfigResp,
- (UINT8 *) NicConfig,
- NIC_ITEM_CONFIG_SIZE,
- &AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);

- //
- // Set IP setting by HII servie
- //
- Status = mHiiConfigRouting->RouteConfig (
- mHiiConfigRouting,
- AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
- }
+ //
+ // Print interface name.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);

-ON_EXIT:
- SHELL_FREE_NON_NULL(AccessResults);
- SHELL_FREE_NON_NULL(NicConfig);
- SHELL_FREE_NON_NULL(ConfigResp);
- SHELL_FREE_NON_NULL(ConfigHdr);
+ //
+ // Print interface config policy.
+ //
+ if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_AUTO), gShellNetwork1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);
+ }

- return ShellStatus;
-}
+ //
+ // Print mac address of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);

-/**
- The callback function for the Arp address resolved event.
+ IfConfigPrintMacAddr (
+ IfCb->IfInfo->HwAddress.Addr,
+ IfCb->IfInfo->HwAddressSize
+ );

- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-IfconfigOnArpResolved (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- ARP_REQUEST *Request;
- UINT8 Index;
-
- Request = (ARP_REQUEST *) Context;
- ASSERT (Request != NULL);
+ //
+ // Print IPv4 address list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);

- Request->Duplicate = FALSE;
-
- if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, Request->MacLen)) {
ShellPrintHiiEx(
-1,
-1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Already Configured",
- (UINTN)Request->DestIp.v4.Addr[0],
- (UINTN)Request->DestIp.v4.Addr[1],
- (UINTN)Request->DestIp.v4.Addr[2],
- (UINTN)Request->DestIp.v4.Addr[3]
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[3]
);
- ArpResolved = TRUE;
- return;
- }
-
- for (Index = 0; Index < Request->MacLen; Index++) {
- if (Request->DestMac.Addr[Index] != 0) {
- Request->Duplicate = TRUE;
- }
- }

- if (Request->Duplicate) {
+ //
+ // Print subnet mask list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
+
ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)Request->DestMac.Addr[0],
- (UINTN)Request->DestMac.Addr[1],
- (UINTN)Request->DestMac.Addr[2],
- (UINTN)Request->DestMac.Addr[3],
- (UINTN)Request->DestMac.Addr[4],
- (UINTN)Request->DestMac.Addr[5]
- );
- }
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]
+ );

- ArpResolved = TRUE;
- return ;
-}
+ //
+ // Print default gateway of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);

-/**
- Check whether the address to be configured conflicts with other hosts.
+ ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
+
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
+ (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
+ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
+ }
+ }

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
- @param[in] IpAddr The IPv4 address to be configured to the Nic.
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)Gateway.Addr[0],
+ (UINTN)Gateway.Addr[1],
+ (UINTN)Gateway.Addr[2],
+ (UINTN)Gateway.Addr[3]
+ );
+
+ //
+ // Print route table entry.
+ //
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);

- @return TRUE Some other host already uses the IpAddr.
- @return FALSE The address is unused.
-**/
-BOOLEAN
-EFIAPI
-IfconfigIsIpDuplicate (
- IN NIC_INFO *NicInfo,
- IN IP4_ADDR IpAddr
- )
-{
- EFI_ARP_PROTOCOL *Arp;
- EFI_ARP_CONFIG_DATA ArpCfgData;
- EFI_HANDLE ArpHandle;
- ARP_REQUEST Request;
- EFI_STATUS Status;
-
- Arp = NULL;
- ArpHandle = NULL;
- ZeroMem (&Request, sizeof (ARP_REQUEST));
-
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- &ArpHandle
- );
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);

- if (EFI_ERROR (Status)) {
- return FALSE;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Subnet ",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]
+ );

- Status = gBS->OpenProtocol (
- ArpHandle,
- &gEfiArpProtocolGuid,
- (VOID**)&Arp,
- gImageHandle,
- ArpHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Netmask",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]
+ );

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Gateway",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]
+ );
+ }

- //
- // Set up the Arp requests
- //
- EFI_IP4_TO_U32 (Request.DestIp.v4) = IpAddr;
- EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;
- Request.LocalMac = NicInfo->NicAddress.MacAddr;
- Request.MacLen = NicInfo->NicAddress.Len;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- IfconfigOnArpResolved,
- (VOID *) &Request,
- &Request.OnResolved
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ArpCfgData.SwAddressType = 0x0800;
- ArpCfgData.SwAddressLength = 4;
- ArpCfgData.StationAddress = &Request.LocalIp;
- ArpCfgData.EntryTimeOut = 0;
- ArpCfgData.RetryCount = 3;
- ArpCfgData.RetryTimeOut = 0;
-
- Status = Arp->Configure (Arp, &ArpCfgData);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ //
+ // Print dns server addresses list of the interface if has.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);

- Status = Arp->Request (
- Arp,
- &Request.DestIp,
- Request.OnResolved,
- &Request.DestMac
- );
-
- if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
- goto ON_EXIT;
- }
+ for (Index = 0; Index < IfCb->DnsCnt; Index++) {
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN) IfCb->DnsAddr[Index].Addr[0],
+ (UINTN) IfCb->DnsAddr[Index].Addr[1],
+ (UINTN) IfCb->DnsAddr[Index].Addr[2],
+ (UINTN) IfCb->DnsAddr[Index].Addr[3]
+ );

- while (!ArpResolved) {
-
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+ }

-ON_EXIT:
- if (Request.OnResolved != NULL) {
- gBS->CloseEvent (Request.OnResolved);
- }
+ //
+ // Print route table of the interface if has.
+ //

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- ArpHandle
- );
+ Entry = Entry->ForwardLink;

- return Request.Duplicate;
+ }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
+ return EFI_SUCCESS;
}

/**
- The callback function for the timer event used to get map.
-
- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-TimeoutToGetMap (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- mTimeout = TRUE;
- return ;
-}
+ The clean process of the ifconfig command to clear interface info.

-/**
- Create an IP child, use it to start the auto configuration, then destroy it.
+ @param[in] IfList The pointer of IfList(interface list).

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
+ @retval EFI_SUCCESS The ifconfig command clean processed successfully.
+ @retval others The ifconfig command clean process failed.

- @retval EFI_SUCCESS The configuration is done.
**/
EFI_STATUS
-EFIAPI
-IfconfigStartIp4(
- IN NIC_INFO *NicInfo
+IfConfigClearInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_IP4_PROTOCOL *Ip4;
- EFI_HANDLE Ip4Handle;
- EFI_HANDLE TimerToGetMap;
- EFI_IP4_CONFIG_DATA Ip4ConfigData;
- EFI_IP4_MODE_DATA Ip4Mode;
- EFI_STATUS Status;
-
- //
- // Get the Ip4ServiceBinding Protocol
- //
- Ip4Handle = NULL;
- Ip4 = NULL;
- TimerToGetMap = NULL;
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IP4_CONFIG2_POLICY Policy;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), gShellNetwork1HiiHandle);
+ Policy = Ip4Config2PolicyDhcp;
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- &Ip4Handle
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

- Status = gBS->OpenProtocol (
- Ip4Handle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- NicInfo->Handle,
- gImageHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ //
+ // Go through the interface list.
+ //
+ while (Entry != IfList) {

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );

- Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
- Ip4ConfigData.AcceptAnyProtocol = FALSE;
- Ip4ConfigData.AcceptIcmpErrors = FALSE;
- Ip4ConfigData.AcceptBroadcast = FALSE;
- Ip4ConfigData.AcceptPromiscuous = FALSE;
- Ip4ConfigData.UseDefaultAddress = TRUE;
- ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
- ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- Ip4ConfigData.TypeOfService = 0;
- Ip4ConfigData.TimeToLive = 1;
- Ip4ConfigData.DoNotFragment = FALSE;
- Ip4ConfigData.RawData = FALSE;
- Ip4ConfigData.ReceiveTimeout = 0;
- Ip4ConfigData.TransmitTimeout = 0;
-
- Status = Ip4->Configure (Ip4, &Ip4ConfigData);
-
- if (Status == EFI_NO_MAPPING) {
- mTimeout = FALSE;
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL | EVT_TIMER,
- TPL_CALLBACK,
- TimeoutToGetMap,
- NULL,
- &TimerToGetMap
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->SetTimer (
- TimerToGetMap,
- TimerRelative,
- MultU64x32 (SecondsToNanoSeconds, 5)
- );
-
if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ break;
}

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), gShellNetwork1HiiHandle);
-
- while (!mTimeout) {
- Ip4->Poll (Ip4);
-
- if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) &&
- Ip4Mode.IsConfigured) {
- break;
- }
- }
- }
-
- Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);
-
- if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Default",
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]
- );
- }
-
-ON_EXIT:
-
- if (EFI_ERROR (Status)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);
- }
-
- if (TimerToGetMap != NULL) {
- gBS->SetTimer (TimerToGetMap, TimerCancel, 0);
- gBS->CloseEvent (TimerToGetMap);
+ Entry = Entry->ForwardLink;
}

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Ip4Handle
- );
-
return Status;
}

/**
- Set the address for the nic specified by the params.
+ The set process of the ifconfig command.
+
+ @param[in] IfList The pointer of IfList(interface list).
+ @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).

- @param[in] Argc The count of the passed in Params.
- @param[in] Params The command line arguments for the set operation.
+ @retval EFI_SUCCESS The ifconfig command set processed successfully.
+ @retval others The ifconfig command set process failed.

- @retval EFI_SUCCESS The address set operation is done.
- @return Some error occurs.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddr (
- IN UINTN Argc,
- IN CONST CHAR16 *Params
+EFI_STATUS
+IfConfigSetInterfaceInfo (
+ IN LIST_ENTRY *IfList,
+ IN ARG_LIST *VarArg
)
{
- NIC_IP4_CONFIG_INFO *Config;
- NIC_IP4_CONFIG_INFO *OldConfig;
- EFI_IP_ADDRESS Ip;
- EFI_IP_ADDRESS Mask;
- EFI_IP_ADDRESS Gateway;
- NIC_INFO *Info;
- BOOLEAN Permanent;
- SHELL_STATUS ShellStatus;
- CONST CHAR16 *Walker;
- CHAR16 *Temp;
- CONST CHAR16 *DhcpTemp;
- CONST CHAR16 *StaticTemp;
- CONST CHAR16 *PermTemp;
- UINT32 NetworkBytes1;
- UINT32 NetworkBytes2;
- EFI_STATUS Status;
-
- Walker = Params;
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- Info = IfconfigFindNicByName (Temp);
-
- if (Info == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);
- return SHELL_NOT_FOUND;
+
+ EFI_STATUS Status;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ VAR_CHECK_CODE CheckCode;
+ EFI_EVENT TimeOutEvt;
+ EFI_EVENT MappedEvt;
+ BOOLEAN IsAddressOk;
+
+ EFI_IP4_CONFIG2_POLICY Policy;
+ EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
+ UINTN DataSize;
+ EFI_IPv4_ADDRESS Gateway;
+ EFI_IPv4_ADDRESS *Dns;
+ ARG_LIST *Tmp;
+ UINTN Index;
+
+ CONST CHAR16* Temp1;
+ CONST CHAR16* Temp2;
+
+ Dns = NULL;
+
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
+ return EFI_INVALID_PARAMETER;
}
+
+ //
+ // Make sure to set only one interface each time.
+ //
+ IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
+ Status = EFI_SUCCESS;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")==NULL?0:StrStr(Walker, L" ")-Walker);
+ //
+ // Initialize check list mechanism.
+ //
+ CheckCode = IfConfigRetriveCheckListByName(
+ NULL,
+ NULL,
+ TRUE
+ );

- Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof (EFI_IP4_ROUTE_TABLE));
- if (Config == NULL) {
- return SHELL_OUT_OF_RESOURCES;
+ //
+ // Create events & timers for asynchronous settings.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &TimeOutEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
}

- Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);
-
- OldConfig = Info->ConfigInfo;
- Permanent = FALSE;
- ShellStatus = SHELL_INVALID_PARAMETER;
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ IfConfigManualAddressNotify,
+ &IsAddressOk,
+ &MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- DhcpTemp = DhcpString;
- StaticTemp = StaticString;
-
- if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {
+ //
+ // Parse the setting variables.
+ //
+ while (VarArg != NULL) {
//
- // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP permanent
+ // Check invalid parameters (duplication & unknown & conflict).
//
- if ((Argc != 2) && (Argc!= 3)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ CheckCode = IfConfigRetriveCheckListByName(
+ mSetCheckList,
+ VarArg->Arg,
+ FALSE
+ );

- if (Argc == 3) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ if (VarCheckOk != CheckCode) {
+ switch (CheckCode) {
+ case VarCheckDuplicate:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ case VarCheckConflict:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- Permanent = TRUE;
- }
+ case VarCheckUnknown:
+ //
+ // To handle unsupported option.
+ //
+ Temp1 = VarArg->Arg;
+ Temp2 = PermanentString;
+ if (StringNoCaseCompare(&Temp1, &Temp2) == 0) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString);
+ goto ON_EXIT;
+ }

- if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&
- (OldConfig->Permanent == Permanent)) {
+ //
+ // To handle unknown option.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);
- ShellStatus = SHELL_ALREADY_STARTED;
- goto ON_EXIT;
+ default:
+ break;
+ }
+
+ VarArg = VarArg->Next;
+ continue;
}

- Config->Source = IP4_CONFIG_SOURCE_DHCP;
- } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {
//
- // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
- // eth0 static IP NETMASK GATEWAY permanent
+ // Process valid variables.
//
- if ((Argc != 5) && (Argc != 6)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
-
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
+ if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
+ //
+ // Set dhcp config policy
+ //
+ Policy = Ip4Config2PolicyDhcp;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ } else if (StrCmp (VarArg->Arg, L"static") == 0) {
+ //
+ // Set manual config policy.
+ //
+ Policy = Ip4Config2PolicyStatic;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- if (Argc == 6) {
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- } else {
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
- }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- if (Argc == 6) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ ZeroMem (&ManualAddress, sizeof (ManualAddress));
+
+ //
+ // Get manual IP address.
+ //
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+ //
+ // Get subnetmask.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
+ if (EFI_ERROR(Status)) {
goto ON_EXIT;
}

- Permanent = TRUE;
- }
+ //
+ // Get gateway.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+
+ IsAddressOk = FALSE;
+
+ Status = IfCb->IfCfg->RegisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- NetworkBytes1 = NTOHL (Ip.Addr[0]);
- NetworkBytes2 = NTOHL (Mask.Addr[0]);
- if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
+ DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ DataSize,
+ &ManualAddress
+ );

- NetworkBytes1 = NTOHL (Gateway.Addr[0]);
- if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
-
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ if (Status == EFI_NOT_READY) {
+ gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);

- //
- // Set the configuration up, two route table entries are added:
- // one for the direct connected network, and another for the
- // default gateway. Remember, some structure members are cleared
- // by AllocateZeroPool
- //
- Config->Source = IP4_CONFIG_SOURCE_STATIC;
- Config->Ip4Info.RouteTableSize = 2;
+ while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
+ if (IsAddressOk) {
+ Status = EFI_SUCCESS;
+ break;
+ }
+ }
+ }

- CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
+ IfCb->IfCfg->UnregisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );

- Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_MAN_HOST), gShellNetwork1HiiHandle, Status);
+ goto ON_EXIT;
+ }

- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));
- } else {
- // neither static or DHCP. error.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ //
+ // Set gateway.
+ //
+ DataSize = sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeGateway,
+ DataSize,
+ &Gateway
+ );
+ VarArg = VarArg->Next;
+
+ } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
+ //
+ // Get DNS addresses.
+ //
+ VarArg = VarArg->Next;
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Index ++;
+ Tmp = Tmp->Next;
+ }

- CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));
- Config->Permanent = Permanent;
+ Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+ Index ++;
+ Tmp = Tmp->Next;
+ }
+
+ VarArg = Tmp;

- //
- // Use HII service to set NIC address
- //
- ShellStatus = IfconfigSetNicAddrByHii (Info, Config);
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- goto ON_EXIT;
- }
+ //
+ // Set DNS addresses.
+ //
+ DataSize = Index * sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeDnsServer,
+ DataSize,
+ Dns
+ );
+
+ }

- Status = IfconfigStartIp4 (Info);
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
}

- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- }
-
ON_EXIT:
- SHELL_FREE_NON_NULL(Config);
+ if (Dns != NULL) {
+ FreePool (Dns);
+ }

- return ShellStatus;
+ return EFI_SUCCESS;
+
}

/**
- Show the address information for the nic specified.
+ The ifconfig command main process.
+
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.
+
+ @retval EFI_SUCCESS ifconfig command processed successfully.
+ @retval others The ifconfig command process failed.

- @param[in] Name A pointer to the string containg the nic's name, if NULL,
- all nics' information is shown.
**/
-VOID
-EFIAPI
-IfconfigShowNicInfo (
- IN CONST CHAR16 *Name
+EFI_STATUS
+IfConfig (
+ IN IFCONFIG_PRIVATE_DATA *Private
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *NicInfo;
- UINT32 Index;
- EFI_IP4_IPCONFIG_DATA *Ip4Config;
- EFI_IPv4_ADDRESS Gateway;
- CONST CHAR16 *TempString;
+ EFI_STATUS Status;

- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- NicInfo = BASE_CR (Entry, NIC_INFO, Link);
+ //
+ // Get configure information of all interfaces.
+ //
+ Status = IfConfigGetInterfaceInfo (
+ Private->ImageHandle,
+ Private->IfName,
+ &Private->IfList
+ );

- TempString = (CHAR16*)NicInfo->Name;
- if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {
- continue;
- }
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), gShellNetwork1HiiHandle, NicInfo->Name);
+ switch (Private->OpCode) {
+ case IfConfigOpList:
+ Status = IfConfigShowInterfaceInfo (&Private->IfList);
+ break;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[0],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[1],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[3],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[4],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]
- );
-
- Print (L" Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : L"Media disconnected");
-
- if (NicInfo->ConfigInfo == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);
- continue;
- }
+ case IfConfigOpClear:
+ Status = IfConfigClearInterfaceInfo (&Private->IfList);
+ break;

- if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"DHCP");
- } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"STATIC");
- } else {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"Unknown");
- }
+ case IfConfigOpSet:
+ Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,
- STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),
- gShellNetwork1HiiHandle,
- (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")
- );
+ default:
+ Status = EFI_ABORTED;
+ }

- Ip4Config = &NicInfo->ConfigInfo->Ip4Info;
+ON_EXIT:

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"IP address",
- (UINTN)Ip4Config->StationAddress.Addr[0],
- (UINTN)Ip4Config->StationAddress.Addr[1],
- (UINTN)Ip4Config->StationAddress.Addr[2],
- (UINTN)Ip4Config->StationAddress.Addr[3]
- );
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Mask",
- (UINTN)Ip4Config->SubnetMask.Addr[0],
- (UINTN)Ip4Config->SubnetMask.Addr[1],
- (UINTN)Ip4Config->SubnetMask.Addr[2],
- (UINTN)Ip4Config->SubnetMask.Addr[3]
- );
+ return Status;
+}

- ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
- (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
- CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- }
-
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Gateway.Addr[0],
- (UINTN)Gateway.Addr[1],
- (UINTN)Gateway.Addr[2],
- (UINTN)Gateway.Addr[3]
- );
+/**
+ The ifconfig command cleanup process, free the allocated memory.

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.

- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
+**/
+VOID
+IfConfigCleanup (
+ IN IFCONFIG_PRIVATE_DATA *Private
+ )
+{
+ LIST_ENTRY *Entry;
+ LIST_ENTRY *NextEntry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ ARG_LIST *ArgNode;
+ ARG_LIST *ArgHead;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Subnet",
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]
- );
+ ASSERT (Private != NULL);

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Netmask",
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]
- );
+ //
+ // Clean the list which save the set config Args.
+ //
+ if (Private->VarArg != NULL) {
+ ArgHead = Private->VarArg;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]
- );
+ while (ArgHead->Next != NULL) {
+ ArgNode = ArgHead->Next;
+ FreePool (ArgHead);
+ ArgHead = ArgNode;
}
+
+ FreePool (ArgHead);
}

- return ;
-}
+ if (Private->IfName != NULL)
+ FreePool (Private->IfName);

-/**
- Clear address configuration for the nic specified.

- @param[in] Name A pointer to the string containg the nic's name,
- if NULL, all nics address configurations are cleared.
+ //
+ // Clean the IFCONFIG_INTERFACE_CB list.
+ //
+ Entry = Private->IfList.ForwardLink;
+ NextEntry = Entry->ForwardLink;

- @retval EFI_SUCCESS The address configuration is cleared.
- @return Some error occurs.
-**/
-EFI_STATUS
-EFIAPI
-IfconfigClearNicAddr (
- IN CONST CHAR16 *Name
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- EFI_STATUS Status;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ while (Entry != &Private->IfList) {

- if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {
- continue;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

-// if (Info->NicIp4Config == NULL) {
- Status = IfconfigSetNicAddrByHii (Info, NULL);
-// } else {
-// Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
-// }
+ RemoveEntryList (&IfCb->Link);

- if (EFI_ERROR (Status)) {
- return Status;
+ if (IfCb->IfInfo != NULL) {
+
+ FreePool (IfCb->IfInfo);
}
+
+ FreePool (IfCb);
+
+ Entry = NextEntry;
+ NextEntry = Entry->ForwardLink;
}

- return EFI_SUCCESS;
-
+ FreePool (Private);
}

/**
Function for 'ifconfig' command.

@param[in] ImageHandle Handle to the Image (NULL if Internal).
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
+
**/
SHELL_STATUS
EFIAPI
ShellCommandRunIfconfig (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- EFI_STATUS Status;
- LIST_ENTRY *Package;
- CHAR16 *ProblemParam;
- SHELL_STATUS ShellStatus;
- BOOLEAN ListOperation;
- BOOLEAN ClearOperation;
- BOOLEAN SetOperation;
- CONST CHAR16 *Item;
- LIST_ENTRY *Entry;
- NIC_INFO *Info;
-
- InitializeListHead (&NicInfoList);
- Status = EFI_INVALID_PARAMETER;
- ShellStatus = SHELL_SUCCESS;
+ EFI_STATUS Status;
+ IFCONFIG_PRIVATE_DATA *Private;
+ LIST_ENTRY *ParamPackage;
+ CONST CHAR16 *ValueStr;
+ ARG_LIST *ArgList;
+ CHAR16 *ProblemParam;
+ CHAR16 *Str;
+
+ Private = NULL;
+
+ Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_COMMAND), gShellNetwork1HiiHandle, ProblemParam);
+ goto ON_EXIT;
+ }

//
- // initialize the shell lib (we must be in non-auto-init...)
+ // To handle unsupported option.
//
- Status = ShellInitialize();
- ASSERT_EFI_ERROR(Status);
+ if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+ goto ON_EXIT;
+ }

//
- // parse the command line
+ // To handle no option.
//
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
- if (EFI_ERROR(Status)) {
- if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
- FreePool(ProblemParam);
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- ASSERT(FALSE);
- }
-
- goto Done;
+ if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
+ !ShellCommandLineGetFlag (ParamPackage, L"-h") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}

- ClearOperation = ShellCommandLineGetFlag(Package, L"-c");
- ListOperation = ShellCommandLineGetFlag(Package, L"-l");
- SetOperation = ShellCommandLineGetFlag(Package, L"-s");
-
- if ((ClearOperation && ListOperation)
- ||(SetOperation && ListOperation)
- ||(ClearOperation && SetOperation)
- ) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- } else if (!ClearOperation && !ListOperation && !SetOperation) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ //
+ // To handle conflict options.
+ //
+ if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-h")))) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_OPTIONS), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
+
+ //
+ // To show the help information of ifconfig command.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-h")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_HELP), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
-
- Status = IfconfigGetAllNicInfoByHii ();
- if (EFI_ERROR (Status)) {
- if (mIp4ConfigExist) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), gShellNetwork1HiiHandle, Status);
- } else {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellNetwork1HiiHandle, L"ifconfig", L"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid);
- }

- return SHELL_NOT_FOUND;
+ Status = EFI_INVALID_PARAMETER;
+
+ Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
+
+ if (Private == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
}

- if (ListOperation) {
- Item = ShellCommandLineGetValue (Package, L"-l");
+ InitializeListHead (&Private->IfList);
+
+ //
+ // To get interface name for the list option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ Private->OpCode = IfConfigOpList;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name for the clear option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
+ Private->OpCode = IfConfigOpClear;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name and corresponding Args for the set option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-l");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
+ if (ValueStr == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_INTERFACE), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }

//
- // Show the configuration.
+ // To split the configuration into multi-section.
//
- IfconfigShowNicInfo (Item);
- } else if (SetOperation) {
- Item = ShellCommandLineGetValue (Package, L"-s");
+ ArgList = SplitStrToList (ValueStr, L' ');
+ ASSERT (ArgList != NULL);

- //
- // The correct command line arguments for setting address are:
- // IfConfig -s eth0 DHCP [permanent]
- // IfConfig -s eth0 static ip netmask gateway [permanent]
- //
- if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) || (CountSubItems(Item) == 4)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_NO_VALUE), gShellNetwork1HiiHandle, L"ifconfig", L"-s");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ Private->OpCode = IfConfigOpSet;
+ Private->IfName = ArgList->Arg;

- ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);
- } else if (ClearOperation) {
- Item = ShellCommandLineGetValue (Package, L"-c");
+ Private->VarArg = ArgList->Next;

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-c");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ if (Private->IfName == NULL || Private->VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_COMMAND), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
- IfconfigClearNicAddr (Item);
- } else {
- ASSERT(FALSE);
}
+
+ //
+ // Main process of ifconfig.
+ //
+ Status = IfConfig (Private);

-Done:
- while (!IsListEmpty (&NicInfoList)) {
- Entry = NicInfoList.ForwardLink;
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ON_EXIT:

- RemoveEntryList (Entry);
+ ShellCommandLineFreeVarList (ParamPackage);
+ if (Private != NULL)
+ IfConfigCleanup (Private);

- if (Info->ConfigInfo != NULL) {
- FreePool (Info->ConfigInfo);
- }
+ return Status;
+}

- FreePool (Info);
- }

- if (Package != NULL) {
- ShellCommandLineFreeVarList(Package);
- }

- return (ShellStatus);
-}
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index e23588a..af96379 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -909,20 +909,20 @@ PingCreateIpInstance (
//
if (Private->IpChoice == PING_IP_CHOICE_IP6) {
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
} else {
ASSERT(Private->IpChoice == PING_IP_CHOICE_IP4);
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
}
//
@@ -953,11 +953,11 @@ PingCreateIpInstance (
// Ip6config protocol and ip6 service binding protocol are installed
// on the same handle.
//
Status = gBS->HandleProtocol (
HandleBuffer[HandleIndex],
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
(VOID **) &IpXCfg
);

if (EFI_ERROR (Status)) {
goto ON_ERROR;
@@ -971,12 +971,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
}

@@ -1007,12 +1008,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
}

@@ -1043,11 +1045,11 @@ PingCreateIpInstance (
}
} else {
//
// IP4 address check
//
- if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {
+ if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {
//
// Match a certain interface address.
//
break;
}
@@ -1135,15 +1137,10 @@ PingCreateIpInstance (
ZeroMem (&Ip4Config, sizeof (EFI_IP4_CONFIG_DATA));

//
// Configure the ip4 instance for icmp4 packet exchange.
//
-// PING_IP4_COPY_ADDRESS (&Ip4Config.StationAddress, &Private->SrcAddress);
-// Ip4Config.SubnetMask.Addr[0] = 0xFF;
-// Ip4Config.SubnetMask.Addr[1] = 0xFF;
-// Ip4Config.SubnetMask.Addr[2] = 0xFF;
-// Ip4Config.SubnetMask.Addr[3] = 0x00;
Ip4Config.DefaultProtocol = 1;
Ip4Config.AcceptAnyProtocol = FALSE;
Ip4Config.AcceptBroadcast = FALSE;
Ip4Config.AcceptIcmpErrors = TRUE;
Ip4Config.AcceptPromiscuous = FALSE;
@@ -1461,11 +1458,11 @@ ShellCommandRunPing (
ShellStatus = SHELL_SUCCESS;
ProblemParam = NULL;

Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}

if (ShellCommandLineGetFlag (ParamPackage, L"-_ip6")) {
@@ -1481,11 +1478,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
SendNumber = DEFAULT_SEND_COUNT;
@@ -1499,11 +1496,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
BufferSize = DEFAULT_BUFFER_SIZE;
@@ -1522,26 +1519,26 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &SrcAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
// Parse the paramter of destination ip address.
//
NonOptionCount = ShellCommandLineGetCount(ParamPackage);
if (NonOptionCount < 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (NonOptionCount > 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
ValueStr = ShellCommandLineGetRawValue (ParamPackage, 1);
if (ValueStr != NULL) {
@@ -1550,11 +1547,11 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &DstAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
index 49849a6..5151179 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
@@ -1,9 +1,9 @@
/** @file
Main file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

@@ -63,11 +63,11 @@ ShellNetwork1CommandsLibConstructor (
}
//
// install our shell command handlers
//
ShellCommandRegisterCommandName(L"ping", ShellCommandRunPing , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_PING));
- ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_IFCONFIG));
+ ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_IFCONFIG_HELP));

return (EFI_SUCCESS);
}

/**
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
index 68a7c93..98b40df 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
@@ -1,9 +1,9 @@
/** @file
header file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -24,13 +24,11 @@
#include <Protocol/Cpu.h>
#include <Protocol/ServiceBinding.h>
#include <Protocol/Ip6.h>
#include <Protocol/Ip6Config.h>
#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/Ip4Config2.h>
#include <Protocol/Arp.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
@@ -45,12 +43,10 @@
#include <Library/HiiLib.h>
#include <Library/NetLib.h>
#include <Library/DevicePathLib.h>
#include <Library/PrintLib.h>

-#include <Guid/NicIp4ConfigNvData.h>
-
extern EFI_HANDLE gShellNetwork1HiiHandle;

/**
Function for 'ping' command.

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
index 527d2ef..6dfbbe5 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
@@ -57,11 +57,11 @@
gEfiCpuArchProtocolGuid ## CONSUMES
gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES

- gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES

[Guids]
gShellNetwork1HiiGuid ## SOMETIMES_CONSUMES ## HII
\ No newline at end of file
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index aa27c678339c5e94c9c936d9a7ea74b6b043c200..65edb0a407754247e91009929a3525b2ad5dd96e 100644
GIT binary patch
literal 21554
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
NnXgL}rJk4f{{V5RRI&g7

literal 20112
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
--
1.9.5.msysgit.1



------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------

------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/

------------------------------

_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel


End of edk2-devel Digest, Vol 66, Issue 424
*******************************************
Shah, Tapan
2015-07-01 16:59:56 UTC
Permalink
Jiaxin,
Can you send out an updated patch file for review?

Thanks,
Tapan

-----Original Message-----
From: Wu, Jiaxin [mailto:***@intel.com]
Sent: Wednesday, July 01, 2015 10:55 AM
To: Shah, Tapan; edk2-***@lists.sourceforge.net
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Hi Tapan,
Thank you for your comments, I have updated patch according below and other reviewers comments.
For the copyright, I have confirm that HP's copyright should be kept, I have recovered it and just update Intel copyright year.

Best Regards!
Jiaxin

-----Original Message-----
From: edk2-devel-***@lists.sourceforge.net [mailto:edk2-devel-***@lists.sourceforge.net]
Sent: Wednesday, July 1, 2015 12:55 AM
To: edk2-***@lists.sourceforge.net
Subject: edk2-devel Digest, Vol 66, Issue 424

Send edk2-devel mailing list submissions to
edk2-***@lists.sourceforge.net

To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/edk2-devel
or, via email, send a message with subject or body 'help' to
edk2-devel-***@lists.sourceforge.net

You can reach the person managing the list at
edk2-devel-***@lists.sourceforge.net

When replying, please edit your Subject line so it is more specific
than "Re: Contents of edk2-devel digest..."


Today's Topics:

1. Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
(Shah, Tapan)


----------------------------------------------------------------------

Message: 1
Date: Tue, 30 Jun 2015 16:54:24 +0000
From: "Shah, Tapan" <***@hp.com>
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig
library.
To: "edk2-***@lists.sourceforge.net"
<edk2-***@lists.sourceforge.net>
Message-ID:
<***@G1W3642.americas.hpqcorp.net>

Content-Type: text/plain; charset="utf-8"

Jiaxin,
I see that ifconfig is completely re-written and also removed HP's copyright. I am not sure if it's acceptable to remove HP's copyright from the file. I am assuming that you have done adequate testing for this major change, can you confirm what type of testing is performed to verify this change?

Below comments for .uni file changes:

1. No need to rename below three string tokens.
STR_GEN_TOO_MANY -> STR_PING_ERR_TOO_MANY
STR_GEN_TOO_FEW -> STR_PING_ERR_TOO_FEW
STR_GEN_PARAM_INV -> STR_PING_ERR_PARAM_INV

2. All other STR_GEN_* string tokens are removed from .uni file. I suspect it may break other command. They should remain as-is and no need to remove. We also keep it at the profile level .uni file to keep track of same generic token name and strings across all commands.

3. STR_IFCONFIG_HELP help output of new ifconfig is not following the help output format. Need to fix it. Existing ifconfig help output is a good example as a reference.

4. Below token shows message Ip4Config2->GetData which is not something we customer friendly. Make it a customer friendly message.

#string STR_IFCONFIG_ERR_IP4CFG_GETDATA #language en-US "Ip4Config2->GetData return %hr\n"

Thanks,
Tapan

-----Original Message-----
From: Qiu, Shumin [mailto:***@intel.com]
Sent: Monday, June 29, 2015 8:12 PM
To: edk2-***@lists.sourceforge.net
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Hi Jiaxin,
Can I have the patch file?

-Shumin

-----Original Message-----
From: jiaxinwu [mailto:***@intel.com]
Sent: Monday, June 29, 2015 10:50 PM
To: edk2-***@lists.sourceforge.net
Subject: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Version2 include:
Make the command options to be Shell2.1 compliant(For the unsupported option, display ?not supported?);
Safe string fix;
Coding style change.

This patch update ShellPkg ping/ifconfig library source code to consume Ip4Config2 protocol.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: jiaxinwu <***@intel.com>
---
.../UefiShellNetwork1CommandsLib/Ifconfig.c | 2462 ++++++++------------
.../Library/UefiShellNetwork1CommandsLib/Ping.c | 33 +-
.../UefiShellNetwork1CommandsLib.c | 4 +-
.../UefiShellNetwork1CommandsLib.h | 8 +-
.../UefiShellNetwork1CommandsLib.inf | 6 +-
.../UefiShellNetwork1CommandsLib.uni | Bin 20112 -> 21554 bytes
6 files changed, 1040 insertions(+), 1473 deletions(-)

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index 7c3f809..61328a3 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -1,1763 +1,1337 @@
/** @file
- The implementation for ifcommand shell command.
+ The implementation for Shell command ifconfig based on IP4Config2 protocol.

- (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
**/

#include "UefiShellNetwork1CommandsLib.h"

-#define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE)
-#define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))
-
-BOOLEAN mIp4ConfigExist = FALSE;
-STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL;
+enum {
+ IfConfigOpList = 1,
+ IfConfigOpSet = 2,
+ IfConfigOpClear = 3
+};
+
+typedef enum {
+ VarCheckReserved = -1,
+ VarCheckOk = 0,
+ VarCheckDuplicate,
+ VarCheckConflict,
+ VarCheckUnknown,
+ VarCheckLackValue,
+ VarCheckOutOfMem
+} VAR_CHECK_CODE;
+
+typedef enum {
+ FlagTypeSingle = 0,
+ FlagTypeNeedVar,
+ FlagTypeNeedSet,
+ FlagTypeSkipUnknown
+} VAR_CHECK_FLAG_TYPE;
+
+#define MACADDRMAXSIZE 32
+
+typedef struct _IFCONFIG_INTERFACE_CB {
+ EFI_HANDLE NicHandle;
+ LIST_ENTRY Link;
+ EFI_IP4_CONFIG2_PROTOCOL *IfCfg;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ EFI_IP4_CONFIG2_POLICY Policy;
+ UINT32 DnsCnt;
+ EFI_IPv4_ADDRESS DnsAddr[1];
+} IFCONFIG_INTERFACE_CB;
+
+typedef struct _ARG_LIST ARG_LIST;
+
+struct _ARG_LIST {
+ ARG_LIST *Next;
+ CHAR16 *Arg;
+};
+
+typedef struct _IFCONFIG4_PRIVATE_DATA {
+ EFI_HANDLE ImageHandle;
+ LIST_ENTRY IfList;
+
+ UINT32 OpCode;
+ CHAR16 *IfName;
+ ARG_LIST *VarArg;
+} IFCONFIG_PRIVATE_DATA;
+
+typedef struct _VAR_CHECK_ITEM{
+ CHAR16 *FlagStr;
+ UINT32 FlagID;
+ UINT32 ConflictMask;
+ VAR_CHECK_FLAG_TYPE FlagType;
+} VAR_CHECK_ITEM;
+
+SHELL_PARAM_ITEM mIfConfigCheckList[] = {
+ {
+ L"-b",
+ TypeFlag
+ },
+ {
+ L"-h",
+ TypeFlag
+ },
+ {
+ L"-l",
+ TypeValue
+ },
+ {
+ L"-r",
+ TypeValue
+ },
+ {
+ L"-c",
+ TypeValue
+ },
+ {
+ L"-s",
+ TypeMaxValue
+ },
+ {
+ NULL,
+ TypeMax
+ },
+};
+
+VAR_CHECK_ITEM mSetCheckList[] = {
+ {
+ L"static",
+ 0x00000001,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dhcp",
+ 0x00000002,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dns",
+ 0x00000008,
+ 0x00000004,
+ FlagTypeSingle
+ },
+ {
+ NULL,
+ 0x0,
+ 0x0,
+ FlagTypeSkipUnknown
+ },
+};

-STATIC CONST UINTN SecondsToNanoSeconds = 10000000;
-STATIC CONST CHAR16 DhcpString[5] = L"DHCP";
-STATIC CONST CHAR16 StaticString[7] = L"STATIC";
STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";

-typedef struct {
- LIST_ENTRY Link;
- EFI_HANDLE Handle;
- NIC_ADDR NicAddress;
- CHAR16 Name[IP4_NIC_NAME_LENGTH];
- BOOLEAN MediaPresentSupported;
- BOOLEAN MediaPresent;
- EFI_IP4_CONFIG_PROTOCOL *Ip4Config;
- NIC_IP4_CONFIG_INFO *ConfigInfo;
-} NIC_INFO;
-
-typedef struct {
- EFI_IP_ADDRESS DestIp;
- EFI_MAC_ADDRESS DestMac;
- EFI_IP_ADDRESS LocalIp;
- EFI_MAC_ADDRESS LocalMac;
- UINT8 MacLen;
- EFI_EVENT OnResolved;
- BOOLEAN Duplicate;
-} ARP_REQUEST;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- {L"-c", TypeValue},
- {L"-l", TypeValue},
- {L"-s", TypeMaxValue},
- {NULL, TypeMax}
- };
-
-STATIC LIST_ENTRY NicInfoList;
-STATIC BOOLEAN ArpResolved;
-STATIC BOOLEAN mTimeout;
-
/**
- Count the space delimited items in a string.
-
- @param[in] String A pointer to the string to count.
-
- @return The number of space-delimited items.
- @retval 0xFF an error occured.
-**/
-UINT8
-EFIAPI
-CountSubItems (
- IN CONST CHAR16 *String
- )
-{
- CONST CHAR16 *Walker;
- UINT8 Count;
-
- if (String == NULL || *String == CHAR_NULL) {
- return (0xFF);
- }
+ Split a string with specified separator and save the substring to a list.

- for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; Walker = (StrStr(Walker, L" ")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);
- return (Count);
-}
+ @param[in] String The pointer of the input string.
+ @param[in] Separator The specified separator.

-/**
- Find the NIC_INFO by the specified nic name.
+ @return The pointer of headnode of ARG_LIST.

- @param[in] Name The pointer to the string containing the NIC name.
-
- @return The pointer to the NIC_INFO if there is a NIC_INFO named by Name.
- @retval NULL No NIC_INFO was found for Name.
**/
-NIC_INFO*
-EFIAPI
-IfconfigFindNicByName (
- IN CONST CHAR16 *Name
+ARG_LIST *
+SplitStrToList (
+ IN CONST CHAR16 *String,
+ IN CHAR16 Separator
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- CHAR16 *TempString;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
- TempString = (CHAR16*)Info->Name;
+ CHAR16 *Str;
+ CHAR16 *ArgStr;
+ ARG_LIST *ArgList;
+ ARG_LIST *ArgNode;

- if (StringNoCaseCompare (&Name, &TempString) == 0) {
- return Info;
- }
+ if (*String == L'\0') {
+ return NULL;
}

- return NULL;
-}
-
-/**
- Tests whether a child handle is a child device of the controller.
-
- @param[in] ControllerHandle A handle for a (parent) controller to test.
- @param[in] ChildHandle A child handle to test.
- @param[in] ProtocolGuid Supplies the protocol that the child controller
- opens on its parent controller.
-
- @retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.
- @retval EFI_UNSUPPORTED ChildHandle is not a child of the ControllerHandle.
-**/
-EFI_STATUS
-EFIAPI
-TestChildHandle (
- IN CONST EFI_HANDLE ControllerHandle,
- IN CONST EFI_HANDLE ChildHandle,
- IN CONST EFI_GUID *ProtocolGuid
- )
-{
- EFI_STATUS Status;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- UINTN EntryCount;
- UINTN Index;
-
- ASSERT (ProtocolGuid != NULL);
-
//
- // Retrieve the list of agents that are consuming the specific protocol
- // on ControllerHandle.
+ // Copy the CONST string to a local copy.
//
- Status = gBS->OpenProtocolInformation (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (String));
+ ASSERT (Str != NULL);
+ StrCpyS (Str, StrSize (String)/sizeof (CHAR16), String);
+ ArgStr = Str;

//
- // Inspect if ChildHandle is one of the agents.
+ // init a node for the list head.
//
- Status = EFI_UNSUPPORTED;
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&
- (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = EFI_SUCCESS;
- break;
- }
- }
-
- FreePool (OpenInfoBuffer);
- return Status;
-}
-
-/**
- Get the child handle of the NIC handle.
-
- @param[in] Controller Routing information: GUID.
- @param[out] ChildHandle Returned child handle.
-
- @retval EFI_SUCCESS Successfully to get child handle.
-**/
-EFI_STATUS
-GetChildHandle (
- IN EFI_HANDLE Controller,
- OUT EFI_HANDLE *ChildHandle
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- UINTN Index;
- EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;
- VENDOR_DEVICE_PATH *VendorDeviceNode;
+ ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode != NULL);
+ ArgList = ArgNode;

//
- // Locate all EFI Hii Config Access protocols
+ // Split the local copy and save in the list node.
//
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiHiiConfigAccessProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
- );
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return Status;
- }
-
- Status = EFI_NOT_FOUND;
-
- for (Index = 0; Index < HandleCount; Index++) {
-
- Status = TestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);
- if (!EFI_ERROR (Status)) {
- //
- // Get device path on the child handle
- //
- Status = gBS->HandleProtocol (
- Handles[Index],
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ChildDeviceDevicePath
- );
-
- if (!EFI_ERROR (Status)) {
- while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
- ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
- //
- // Parse one instance
- //
- if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&
- ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
- VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
- if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
- //
- // Found item matched gEfiNicIp4ConfigVariableGuid
- //
- *ChildHandle = Handles[Index];
- FreePool (Handles);
- return EFI_SUCCESS;
- }
- }
- }
- }
+ while (*Str != L'\0') {
+ if (*Str == Separator) {
+ *Str = L'\0';
+ ArgNode->Arg = ArgStr;
+ ArgStr = Str + 1;
+ ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode->Next != NULL);
+ ArgNode = ArgNode->Next;
}
+
+ Str++;
}

- FreePool (Handles);
- return Status;
+ ArgNode->Arg = ArgStr;
+ ArgNode->Next = NULL;
+
+ return ArgList;
}

/**
- Append OFFSET/WIDTH/VALUE items at the beginning of string.
-
- @param[in, out] String The pointer to the string to append onto.
- @param[in] Offset Offset value.
- @param[in] Width Width value.
- @param[in] Block Point to data buffer.
-
- @return The count of unicode character that were appended.
-**/
-UINTN
-EFIAPI
-AppendOffsetWidthValue (
- IN OUT CHAR16 *String,
- IN UINTN Offset,
- IN UINTN Width,
- IN CONST UINT8 *Block
- )
-
-{
- CHAR16 *OriString;
-
- OriString = String;
-
- StrnCpy (String, L"&OFFSET=", 9);
- String += StrLen (L"&OFFSET=");
- String += UnicodeSPrint (String, 20, L"%x", Offset);
-
- StrnCpy (String,L"&WIDTH=", 8);
- String += StrLen (L"&WIDTH=");
- String += UnicodeSPrint (String, 20, L"%x", Width);
+ Check the correctness of input Args with '-s' option.

- if (Block != NULL) {
- StrnCpy (String,L"&VALUE=", 8);
- String += StrLen (L"&VALUE=");
- while ((Width--) != 0) {
- String += UnicodeSPrint (String, 20, L"%x", Block[Width]);
- }
- }
-
- return String - OriString;
-}
+ @param[in] CheckList The pointer of VAR_CHECK_ITEM array.
+ @param[in] Name The pointer of input arg.
+ @param[in] Init The switch to execute the check.

-/**
- Converts the unicode character of the string from uppercase to lowercase.
- This is a internal function.
+ @return The value of VAR_CHECK_CODE.

- @param ConfigString String to be converted
**/
-CHAR16*
-EFIAPI
-HiiToLower (
- IN CHAR16 *ConfigString
- )
+VAR_CHECK_CODE
+IfConfigRetriveCheckListByName(
+ IN VAR_CHECK_ITEM *CheckList,
+ IN CHAR16 *Name,
+ IN BOOLEAN Init
+)
{
- CHAR16 *String;
- BOOLEAN Lower;
-
- //
- // Convert all hex digits in range [A-F] in the configuration header to [a-f]
- //
- for (String = ConfigString, Lower = FALSE; String != NULL && *String != L'\0'; String++) {
- if (*String == L'=') {
- Lower = TRUE;
- } else if (*String == L'&') {
- Lower = FALSE;
- } else if (Lower && *String >= L'A' && *String <= L'F') {
- *String = (CHAR16) (*String - L'A' + L'a');
- }
+ STATIC UINT32 CheckDuplicate;
+ STATIC UINT32 CheckConflict;
+ VAR_CHECK_CODE RtCode;
+ UINT32 Index;
+ VAR_CHECK_ITEM Arg;
+
+ if (Init) {
+ CheckDuplicate = 0;
+ CheckConflict = 0;
+ return VarCheckOk;
}

- return (ConfigString);
-}
-
-
-/**
- Construct <ConfigHdr> using routing information GUID/NAME/PATH.
-
- @param[in] Guid Routing information: GUID.
- @param[in] Name Routing information: NAME.
- @param[in] DriverHandle Driver handle which contains the routing information: PATH.
-
- @retval NULL An error occured.
- @return The pointer to configHdr string.
-**/
-CHAR16 *
-EFIAPI
-ConstructConfigHdr (
- IN CONST EFI_GUID *Guid,
- IN CONST CHAR16 *Name,
- IN EFI_HANDLE DriverHandle
- )
-{
- EFI_STATUS Status;
- CHAR16 *ConfigHdr;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- CHAR16 *String;
- UINTN Index;
- UINT8 *Buffer;
- UINTN DevicePathLength;
- UINTN NameLength;
+ RtCode = VarCheckOk;
+ Index = 0;
+ Arg = CheckList[Index];

//
- // Get the device path from handle installed EFI HII Config Access protocol
+ // Check the Duplicated/Conflicted/Unknown input Args.
//
- Status = gBS->HandleProtocol (
- DriverHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath
- );
- if (EFI_ERROR (Status)) {
- return NULL;
- }
+ while (Arg.FlagStr != NULL) {
+ if (StrCmp (Arg.FlagStr, Name) == 0) {

- DevicePathLength = GetDevicePathSize (DevicePath);
- NameLength = StrLen (Name);
- ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));
- if (ConfigHdr == NULL) {
- return NULL;
- }
+ if (CheckDuplicate & Arg.FlagID) {
+ RtCode = VarCheckDuplicate;
+ break;
+ }

- String = ConfigHdr;
- StrnCpy (String, L"GUID=", 6);
- String += StrLen (L"GUID=");
+ if (CheckConflict & Arg.ConflictMask) {
+ RtCode = VarCheckConflict;
+ break;
+ }

- //
- // Append Guid converted to <HexCh>32
- //
- for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
- }
+ CheckDuplicate |= Arg.FlagID;
+ CheckConflict |= Arg.ConflictMask;
+ break;
+ }

- //
- // Append L"&NAME="
- //
- StrnCpy (String, L"&NAME=", 7);
- String += StrLen (L"&NAME=");
- for (Index = 0; Index < NameLength ; Index++) {
- String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);
+ Arg = CheckList[++Index];
}
-
- //
- // Append L"&PATH="
- //
- StrnCpy (String, L"&PATH=", 7);
- String += StrLen (L"&PATH=");
- for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
+
+ if (Arg.FlagStr == NULL) {
+ RtCode = VarCheckUnknown;
}

- return (HiiToLower(ConfigHdr));
+ return RtCode;
}

/**
- Get network physical device NIC information.
+ The notify function of create event when performing a manual config.

- @param[in] Handle The network physical device handle.
- @param[out] NicAddr NIC information.
+ @param[in] Event The event this notify function registered to.
+ @param[in] Context Pointer to the context data registered to the event.

- @retval EFI_SUCCESS Get NIC information successfully.
-**/
-EFI_STATUS
+**/
+VOID
EFIAPI
-IfConfigGetNicMacInfo (
- IN EFI_HANDLE Handle,
- OUT NIC_ADDR *NicAddr
- )
+IfConfigManualAddressNotify (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
- }
-
- NicAddr->Type = (UINT16) SnpMode.IfType;
- NicAddr->Len = (UINT8) SnpMode.HwAddressSize;
- CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);
-
-ON_ERROR:
-
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
-
- return Status;
-
+ *((BOOLEAN *) Context) = TRUE;
}

+
/**
- Get network physical device NIC information.
+ Print MAC address.

- @param[in] Handle The network physical device handle.
- @param[out] MediaPresentSupported
- Upon successful return, TRUE is media present
- is supported. FALSE otherwise.
- @param[out] MediaPresent Upon successful return, TRUE is media present
- is enabled. FALSE otherwise.
+ @param[in] Node The pointer of MAC address buffer.
+ @param[in] Size The size of MAC address buffer.

- @retval EFI_SUCCESS The operation was successful.
**/
-EFI_STATUS
-EFIAPI
-IfConfigGetNicMediaStatus (
- IN EFI_HANDLE Handle,
- OUT BOOLEAN *MediaPresentSupported,
- OUT BOOLEAN *MediaPresent
- )
-
+VOID
+IfConfigPrintMacAddr (
+ IN UINT8 *Node,
+ IN UINT32 Size
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
+ UINTN Index;

- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
+ ASSERT (Size <= MACADDRMAXSIZE);

- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
+ for (Index = 0; Index < Size; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);
+ if (Index + 1 < Size) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle);
+ }
}
-
- *MediaPresentSupported = SnpMode.MediaPresentSupported;
- *MediaPresent = SnpMode.MediaPresent;

-ON_ERROR:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+}

- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );

- return Status;
+/**
+ The get current status of all handles.

-}
+ @param[in] ImageHandle The handle of ImageHandle.
+ @param[in] IfName The pointer of IfName(interface name).
+ @param[in] IfList The pointer of IfList(interface list).

-/**
- Get all Nic's information through HII service.
+ @retval EFI_SUCCESS The get status processed successfully.
+ @retval others The get status process failed.

- @retval EFI_SUCCESS All the nic information is collected.
**/
EFI_STATUS
-EFIAPI
-IfconfigGetAllNicInfoByHii (
- VOID
+IfConfigGetInterfaceInfo (
+ IN EFI_HANDLE ImageHandle,
+ IN CHAR16 *IfName,
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- UINTN Index;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- UINTN BufferSize;
- NIC_INFO *NicInfo;
- NIC_IP4_CONFIG_INFO *NicConfigRequest;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfigRequest = NULL;
- NicInfo = NULL;
-
- InitializeListHead (&NicInfoList);
+ EFI_STATUS Status;
+ UINTN HandleIndex;
+ UINTN HandleNum;
+ EFI_HANDLE *HandleBuffer;
+ EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ UINTN DataSize;

- //
- // Check if HII Config Routing protocol available.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiConfigRoutingProtocolGuid,
- NULL,
- (VOID**)&mHiiConfigRouting
- );
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
+ HandleBuffer = NULL;
+ HandleNum = 0;
+
+ IfInfo = NULL;
+ IfCb = NULL;

//
- // Locate all network device handles
+ // Locate all the handles with ip4 service binding protocol.
//
Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
+ ByProtocol,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ NULL,
+ &HandleNum,
+ &HandleBuffer
);
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return EFI_NOT_FOUND;
+ if (EFI_ERROR (Status) || (HandleNum == 0)) {
+ return EFI_ABORTED;
}

- for (Index = 0; Index < HandleCount; Index++) {
- Status = GetChildHandle (Handles[Index], &ChildHandle);
+ //
+ // Enumerate all handles that installed with ip4 service binding protocol.
+ //
+ for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
+ IfCb = NULL;
+ IfInfo = NULL;
+ DataSize = 0;
+
+ //
+ // Ip4config protocol and ip4 service binding protocol are installed
+ // on the same handle.
+ //
+ ASSERT (HandleBuffer != NULL);
+ Status = gBS->HandleProtocol (
+ HandleBuffer[HandleIndex],
+ &gEfiIp4Config2ProtocolGuid,
+ (VOID **) &Ip4Cfg2
+ );
+
if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility.
- //
- ChildHandle = Handles[Index];
+ goto ON_ERROR;
}
+
//
- // Construct configuration request string header
+ // Get the interface information size.
//
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- Length = 0;
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ NULL
+ );
+
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
+
+ IfInfo = AllocateZeroPool (DataSize);
+
+ if (IfInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
-
+
//
- // Append OFFSET/WIDTH pair
+ // Get the interface info.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ IfInfo
+ );

- NicInfo = AllocateZeroPool (sizeof (NIC_INFO));
- if (NicInfo == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
goto ON_ERROR;
}
- NicInfo->Handle = Handles[Index];
-
+
//
- // Get network physical devcie MAC information
+ // Check the interface name if required.
//
- IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);
- if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);
- } else {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
+ FreePool (IfInfo);
+ continue;
}

+ DataSize = 0;
+
//
- // Get media status
+ // Get the size of dns server list.
//
- IfConfigGetNicMediaStatus (Handles[Index], &NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ NULL
+ );
+
+ if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfigRequest == NULL) {
+ IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);
+
+ if (IfCb == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}

+ IfCb->NicHandle = HandleBuffer[HandleIndex];
+ IfCb->IfInfo = IfInfo;
+ IfCb->IfCfg = Ip4Cfg2;
+ IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));
+
//
- // Get network parameters by HII service
+ // Get the dns server list if has.
//
- Status = mHiiConfigRouting->ExtractConfig (
- mHiiConfigRouting,
- ConfigResp,
- &AccessProgress,
- &AccessResults
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = NIC_ITEM_CONFIG_SIZE;
- Status = mHiiConfigRouting->ConfigToBlock (
- mHiiConfigRouting,
- AccessResults,
- (UINT8 *) NicConfigRequest,
- &BufferSize,
- &AccessProgress
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;
- NicConfig = AllocateZeroPool (BufferSize);
- if (NicConfig == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
- CopyMem (NicConfig, NicConfigRequest, BufferSize);
-
- //
- // If succeeds to get NIC configuration, fix up routetable pointer.
- //
- NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (&NicConfig->Ip4Info + 1);
- NicInfo->ConfigInfo = NicConfig;
-
- } else {
- NicInfo->ConfigInfo = NULL;
+ if (DataSize > 0) {
+
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ IfCb->DnsAddr
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
-
- FreePool (AccessResults);
-
- } else {
- NicInfo->ConfigInfo = NULL;
}

//
- // Add the Nic's info to the global NicInfoList.
+ // Get the config policy.
//
- InsertTailList (&NicInfoList, &NicInfo->Link);
+ DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypePolicy,
+ &DataSize,
+ &IfCb->Policy
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- FreePool (NicConfigRequest);
- FreePool (ConfigResp);
- FreePool (ConfigHdr);
+
+ InsertTailList (IfList, &IfCb->Link);
+
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
+ //
+ // Only need the appointed interface, keep the allocated buffer.
+ //
+ IfCb = NULL;
+ IfInfo = NULL;
+ break;
+ }
}

- FreePool (Handles);
+ if (HandleBuffer != NULL) {
+ FreePool (HandleBuffer);
+ }

return EFI_SUCCESS;
-
+
ON_ERROR:
- if (AccessResults != NULL) {
- FreePool (AccessResults);
- }
- if (NicConfigRequest != NULL) {
- FreePool (NicConfigRequest);
- }
- if (NicInfo != NULL) {
- FreePool (NicInfo);
- }
- if (ConfigResp != NULL) {
- FreePool (ConfigResp);
- }
- if (ConfigHdr != NULL) {
- FreePool (ConfigHdr);
+
+ if (IfInfo != NULL) {
+ FreePool (IfInfo);
}

- FreePool (Handles);
+ if (IfCb != NULL) {
+ FreePool (IfCb);
+ }

return Status;
}

/**
- Set the address for the specified nic by HII service.
+ The list process of the ifconfig command.

- @param[in] NicInfo A pointer to the NIC_INFO of the Nic to be configured.
- @param[in] Config The command line arguments for the set operation.
+ @param[in] IfList The pointer of IfList(interface list).
+
+ @retval EFI_SUCCESS The ifconfig command list processed successfully.
+ @retval others The ifconfig command list process failed.

- @retval EFI_SUCCESS The address set operation is done.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddrByHii (
- IN CONST NIC_INFO *NicInfo,
- IN CONST NIC_IP4_CONFIG_INFO *Config
+EFI_STATUS
+IfConfigShowInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- SHELL_STATUS ShellStatus;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfig = NULL;
- ShellStatus = SHELL_SUCCESS;
-
- Status = GetChildHandle (NicInfo->Handle, &ChildHandle);
- if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility
- //
- ChildHandle = NicInfo->Handle;
- }
- //
- // Construct config request string header
- //
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IPv4_ADDRESS Gateway;
+ UINT32 Index;

- NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfig == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- if (Config != NULL) {
- CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

//
- // Append OFFSET/WIDTH pair
+ // Go through the interface list.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ while (Entry != IfList) {
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

- //
- // Call HII helper function to generate configuration string
- //
- Status = mHiiConfigRouting->BlockToConfig (
- mHiiConfigRouting,
- ConfigResp,
- (UINT8 *) NicConfig,
- NIC_ITEM_CONFIG_SIZE,
- &AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);

- //
- // Set IP setting by HII servie
- //
- Status = mHiiConfigRouting->RouteConfig (
- mHiiConfigRouting,
- AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
- }
+ //
+ // Print interface name.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);

-ON_EXIT:
- SHELL_FREE_NON_NULL(AccessResults);
- SHELL_FREE_NON_NULL(NicConfig);
- SHELL_FREE_NON_NULL(ConfigResp);
- SHELL_FREE_NON_NULL(ConfigHdr);
+ //
+ // Print interface config policy.
+ //
+ if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_AUTO), gShellNetwork1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);
+ }

- return ShellStatus;
-}
+ //
+ // Print mac address of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);

-/**
- The callback function for the Arp address resolved event.
+ IfConfigPrintMacAddr (
+ IfCb->IfInfo->HwAddress.Addr,
+ IfCb->IfInfo->HwAddressSize
+ );

- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-IfconfigOnArpResolved (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- ARP_REQUEST *Request;
- UINT8 Index;
-
- Request = (ARP_REQUEST *) Context;
- ASSERT (Request != NULL);
+ //
+ // Print IPv4 address list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);

- Request->Duplicate = FALSE;
-
- if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, Request->MacLen)) {
ShellPrintHiiEx(
-1,
-1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Already Configured",
- (UINTN)Request->DestIp.v4.Addr[0],
- (UINTN)Request->DestIp.v4.Addr[1],
- (UINTN)Request->DestIp.v4.Addr[2],
- (UINTN)Request->DestIp.v4.Addr[3]
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[3]
);
- ArpResolved = TRUE;
- return;
- }
-
- for (Index = 0; Index < Request->MacLen; Index++) {
- if (Request->DestMac.Addr[Index] != 0) {
- Request->Duplicate = TRUE;
- }
- }

- if (Request->Duplicate) {
+ //
+ // Print subnet mask list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
+
ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)Request->DestMac.Addr[0],
- (UINTN)Request->DestMac.Addr[1],
- (UINTN)Request->DestMac.Addr[2],
- (UINTN)Request->DestMac.Addr[3],
- (UINTN)Request->DestMac.Addr[4],
- (UINTN)Request->DestMac.Addr[5]
- );
- }
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]
+ );

- ArpResolved = TRUE;
- return ;
-}
+ //
+ // Print default gateway of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);

-/**
- Check whether the address to be configured conflicts with other hosts.
+ ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
+
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
+ (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
+ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
+ }
+ }

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
- @param[in] IpAddr The IPv4 address to be configured to the Nic.
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)Gateway.Addr[0],
+ (UINTN)Gateway.Addr[1],
+ (UINTN)Gateway.Addr[2],
+ (UINTN)Gateway.Addr[3]
+ );
+
+ //
+ // Print route table entry.
+ //
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);

- @return TRUE Some other host already uses the IpAddr.
- @return FALSE The address is unused.
-**/
-BOOLEAN
-EFIAPI
-IfconfigIsIpDuplicate (
- IN NIC_INFO *NicInfo,
- IN IP4_ADDR IpAddr
- )
-{
- EFI_ARP_PROTOCOL *Arp;
- EFI_ARP_CONFIG_DATA ArpCfgData;
- EFI_HANDLE ArpHandle;
- ARP_REQUEST Request;
- EFI_STATUS Status;
-
- Arp = NULL;
- ArpHandle = NULL;
- ZeroMem (&Request, sizeof (ARP_REQUEST));
-
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- &ArpHandle
- );
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);

- if (EFI_ERROR (Status)) {
- return FALSE;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Subnet ",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]
+ );

- Status = gBS->OpenProtocol (
- ArpHandle,
- &gEfiArpProtocolGuid,
- (VOID**)&Arp,
- gImageHandle,
- ArpHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Netmask",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]
+ );

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Gateway",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]
+ );
+ }

- //
- // Set up the Arp requests
- //
- EFI_IP4_TO_U32 (Request.DestIp.v4) = IpAddr;
- EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;
- Request.LocalMac = NicInfo->NicAddress.MacAddr;
- Request.MacLen = NicInfo->NicAddress.Len;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- IfconfigOnArpResolved,
- (VOID *) &Request,
- &Request.OnResolved
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ArpCfgData.SwAddressType = 0x0800;
- ArpCfgData.SwAddressLength = 4;
- ArpCfgData.StationAddress = &Request.LocalIp;
- ArpCfgData.EntryTimeOut = 0;
- ArpCfgData.RetryCount = 3;
- ArpCfgData.RetryTimeOut = 0;
-
- Status = Arp->Configure (Arp, &ArpCfgData);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ //
+ // Print dns server addresses list of the interface if has.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);

- Status = Arp->Request (
- Arp,
- &Request.DestIp,
- Request.OnResolved,
- &Request.DestMac
- );
-
- if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
- goto ON_EXIT;
- }
+ for (Index = 0; Index < IfCb->DnsCnt; Index++) {
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN) IfCb->DnsAddr[Index].Addr[0],
+ (UINTN) IfCb->DnsAddr[Index].Addr[1],
+ (UINTN) IfCb->DnsAddr[Index].Addr[2],
+ (UINTN) IfCb->DnsAddr[Index].Addr[3]
+ );

- while (!ArpResolved) {
-
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+ }

-ON_EXIT:
- if (Request.OnResolved != NULL) {
- gBS->CloseEvent (Request.OnResolved);
- }
+ //
+ // Print route table of the interface if has.
+ //

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- ArpHandle
- );
+ Entry = Entry->ForwardLink;

- return Request.Duplicate;
+ }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
+ return EFI_SUCCESS;
}

/**
- The callback function for the timer event used to get map.
-
- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-TimeoutToGetMap (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- mTimeout = TRUE;
- return ;
-}
+ The clean process of the ifconfig command to clear interface info.

-/**
- Create an IP child, use it to start the auto configuration, then destroy it.
+ @param[in] IfList The pointer of IfList(interface list).

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
+ @retval EFI_SUCCESS The ifconfig command clean processed successfully.
+ @retval others The ifconfig command clean process failed.

- @retval EFI_SUCCESS The configuration is done.
**/
EFI_STATUS
-EFIAPI
-IfconfigStartIp4(
- IN NIC_INFO *NicInfo
+IfConfigClearInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_IP4_PROTOCOL *Ip4;
- EFI_HANDLE Ip4Handle;
- EFI_HANDLE TimerToGetMap;
- EFI_IP4_CONFIG_DATA Ip4ConfigData;
- EFI_IP4_MODE_DATA Ip4Mode;
- EFI_STATUS Status;
-
- //
- // Get the Ip4ServiceBinding Protocol
- //
- Ip4Handle = NULL;
- Ip4 = NULL;
- TimerToGetMap = NULL;
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IP4_CONFIG2_POLICY Policy;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), gShellNetwork1HiiHandle);
+ Policy = Ip4Config2PolicyDhcp;
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- &Ip4Handle
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

- Status = gBS->OpenProtocol (
- Ip4Handle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- NicInfo->Handle,
- gImageHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ //
+ // Go through the interface list.
+ //
+ while (Entry != IfList) {

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );

- Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
- Ip4ConfigData.AcceptAnyProtocol = FALSE;
- Ip4ConfigData.AcceptIcmpErrors = FALSE;
- Ip4ConfigData.AcceptBroadcast = FALSE;
- Ip4ConfigData.AcceptPromiscuous = FALSE;
- Ip4ConfigData.UseDefaultAddress = TRUE;
- ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
- ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- Ip4ConfigData.TypeOfService = 0;
- Ip4ConfigData.TimeToLive = 1;
- Ip4ConfigData.DoNotFragment = FALSE;
- Ip4ConfigData.RawData = FALSE;
- Ip4ConfigData.ReceiveTimeout = 0;
- Ip4ConfigData.TransmitTimeout = 0;
-
- Status = Ip4->Configure (Ip4, &Ip4ConfigData);
-
- if (Status == EFI_NO_MAPPING) {
- mTimeout = FALSE;
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL | EVT_TIMER,
- TPL_CALLBACK,
- TimeoutToGetMap,
- NULL,
- &TimerToGetMap
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->SetTimer (
- TimerToGetMap,
- TimerRelative,
- MultU64x32 (SecondsToNanoSeconds, 5)
- );
-
if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ break;
}

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), gShellNetwork1HiiHandle);
-
- while (!mTimeout) {
- Ip4->Poll (Ip4);
-
- if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) &&
- Ip4Mode.IsConfigured) {
- break;
- }
- }
- }
-
- Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);
-
- if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Default",
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]
- );
- }
-
-ON_EXIT:
-
- if (EFI_ERROR (Status)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);
- }
-
- if (TimerToGetMap != NULL) {
- gBS->SetTimer (TimerToGetMap, TimerCancel, 0);
- gBS->CloseEvent (TimerToGetMap);
+ Entry = Entry->ForwardLink;
}

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Ip4Handle
- );
-
return Status;
}

/**
- Set the address for the nic specified by the params.
+ The set process of the ifconfig command.
+
+ @param[in] IfList The pointer of IfList(interface list).
+ @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).

- @param[in] Argc The count of the passed in Params.
- @param[in] Params The command line arguments for the set operation.
+ @retval EFI_SUCCESS The ifconfig command set processed successfully.
+ @retval others The ifconfig command set process failed.

- @retval EFI_SUCCESS The address set operation is done.
- @return Some error occurs.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddr (
- IN UINTN Argc,
- IN CONST CHAR16 *Params
+EFI_STATUS
+IfConfigSetInterfaceInfo (
+ IN LIST_ENTRY *IfList,
+ IN ARG_LIST *VarArg
)
{
- NIC_IP4_CONFIG_INFO *Config;
- NIC_IP4_CONFIG_INFO *OldConfig;
- EFI_IP_ADDRESS Ip;
- EFI_IP_ADDRESS Mask;
- EFI_IP_ADDRESS Gateway;
- NIC_INFO *Info;
- BOOLEAN Permanent;
- SHELL_STATUS ShellStatus;
- CONST CHAR16 *Walker;
- CHAR16 *Temp;
- CONST CHAR16 *DhcpTemp;
- CONST CHAR16 *StaticTemp;
- CONST CHAR16 *PermTemp;
- UINT32 NetworkBytes1;
- UINT32 NetworkBytes2;
- EFI_STATUS Status;
-
- Walker = Params;
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- Info = IfconfigFindNicByName (Temp);
-
- if (Info == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);
- return SHELL_NOT_FOUND;
+
+ EFI_STATUS Status;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ VAR_CHECK_CODE CheckCode;
+ EFI_EVENT TimeOutEvt;
+ EFI_EVENT MappedEvt;
+ BOOLEAN IsAddressOk;
+
+ EFI_IP4_CONFIG2_POLICY Policy;
+ EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
+ UINTN DataSize;
+ EFI_IPv4_ADDRESS Gateway;
+ EFI_IPv4_ADDRESS *Dns;
+ ARG_LIST *Tmp;
+ UINTN Index;
+
+ CONST CHAR16* Temp1;
+ CONST CHAR16* Temp2;
+
+ Dns = NULL;
+
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
+ return EFI_INVALID_PARAMETER;
}
+
+ //
+ // Make sure to set only one interface each time.
+ //
+ IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
+ Status = EFI_SUCCESS;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")==NULL?0:StrStr(Walker, L" ")-Walker);
+ //
+ // Initialize check list mechanism.
+ //
+ CheckCode = IfConfigRetriveCheckListByName(
+ NULL,
+ NULL,
+ TRUE
+ );

- Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof (EFI_IP4_ROUTE_TABLE));
- if (Config == NULL) {
- return SHELL_OUT_OF_RESOURCES;
+ //
+ // Create events & timers for asynchronous settings.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &TimeOutEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
}

- Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);
-
- OldConfig = Info->ConfigInfo;
- Permanent = FALSE;
- ShellStatus = SHELL_INVALID_PARAMETER;
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ IfConfigManualAddressNotify,
+ &IsAddressOk,
+ &MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- DhcpTemp = DhcpString;
- StaticTemp = StaticString;
-
- if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {
+ //
+ // Parse the setting variables.
+ //
+ while (VarArg != NULL) {
//
- // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP permanent
+ // Check invalid parameters (duplication & unknown & conflict).
//
- if ((Argc != 2) && (Argc!= 3)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ CheckCode = IfConfigRetriveCheckListByName(
+ mSetCheckList,
+ VarArg->Arg,
+ FALSE
+ );

- if (Argc == 3) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ if (VarCheckOk != CheckCode) {
+ switch (CheckCode) {
+ case VarCheckDuplicate:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ case VarCheckConflict:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- Permanent = TRUE;
- }
+ case VarCheckUnknown:
+ //
+ // To handle unsupported option.
+ //
+ Temp1 = VarArg->Arg;
+ Temp2 = PermanentString;
+ if (StringNoCaseCompare(&Temp1, &Temp2) == 0) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString);
+ goto ON_EXIT;
+ }

- if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&
- (OldConfig->Permanent == Permanent)) {
+ //
+ // To handle unknown option.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);
- ShellStatus = SHELL_ALREADY_STARTED;
- goto ON_EXIT;
+ default:
+ break;
+ }
+
+ VarArg = VarArg->Next;
+ continue;
}

- Config->Source = IP4_CONFIG_SOURCE_DHCP;
- } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {
//
- // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
- // eth0 static IP NETMASK GATEWAY permanent
+ // Process valid variables.
//
- if ((Argc != 5) && (Argc != 6)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
-
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
+ if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
+ //
+ // Set dhcp config policy
+ //
+ Policy = Ip4Config2PolicyDhcp;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ } else if (StrCmp (VarArg->Arg, L"static") == 0) {
+ //
+ // Set manual config policy.
+ //
+ Policy = Ip4Config2PolicyStatic;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- if (Argc == 6) {
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- } else {
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
- }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- if (Argc == 6) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ ZeroMem (&ManualAddress, sizeof (ManualAddress));
+
+ //
+ // Get manual IP address.
+ //
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+ //
+ // Get subnetmask.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
+ if (EFI_ERROR(Status)) {
goto ON_EXIT;
}

- Permanent = TRUE;
- }
+ //
+ // Get gateway.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+
+ IsAddressOk = FALSE;
+
+ Status = IfCb->IfCfg->RegisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- NetworkBytes1 = NTOHL (Ip.Addr[0]);
- NetworkBytes2 = NTOHL (Mask.Addr[0]);
- if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
+ DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ DataSize,
+ &ManualAddress
+ );

- NetworkBytes1 = NTOHL (Gateway.Addr[0]);
- if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
-
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ if (Status == EFI_NOT_READY) {
+ gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);

- //
- // Set the configuration up, two route table entries are added:
- // one for the direct connected network, and another for the
- // default gateway. Remember, some structure members are cleared
- // by AllocateZeroPool
- //
- Config->Source = IP4_CONFIG_SOURCE_STATIC;
- Config->Ip4Info.RouteTableSize = 2;
+ while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
+ if (IsAddressOk) {
+ Status = EFI_SUCCESS;
+ break;
+ }
+ }
+ }

- CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
+ IfCb->IfCfg->UnregisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );

- Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_MAN_HOST), gShellNetwork1HiiHandle, Status);
+ goto ON_EXIT;
+ }

- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));
- } else {
- // neither static or DHCP. error.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ //
+ // Set gateway.
+ //
+ DataSize = sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeGateway,
+ DataSize,
+ &Gateway
+ );
+ VarArg = VarArg->Next;
+
+ } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
+ //
+ // Get DNS addresses.
+ //
+ VarArg = VarArg->Next;
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Index ++;
+ Tmp = Tmp->Next;
+ }

- CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));
- Config->Permanent = Permanent;
+ Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+ Index ++;
+ Tmp = Tmp->Next;
+ }
+
+ VarArg = Tmp;

- //
- // Use HII service to set NIC address
- //
- ShellStatus = IfconfigSetNicAddrByHii (Info, Config);
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- goto ON_EXIT;
- }
+ //
+ // Set DNS addresses.
+ //
+ DataSize = Index * sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeDnsServer,
+ DataSize,
+ Dns
+ );
+
+ }

- Status = IfconfigStartIp4 (Info);
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
}

- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- }
-
ON_EXIT:
- SHELL_FREE_NON_NULL(Config);
+ if (Dns != NULL) {
+ FreePool (Dns);
+ }

- return ShellStatus;
+ return EFI_SUCCESS;
+
}

/**
- Show the address information for the nic specified.
+ The ifconfig command main process.
+
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.
+
+ @retval EFI_SUCCESS ifconfig command processed successfully.
+ @retval others The ifconfig command process failed.

- @param[in] Name A pointer to the string containg the nic's name, if NULL,
- all nics' information is shown.
**/
-VOID
-EFIAPI
-IfconfigShowNicInfo (
- IN CONST CHAR16 *Name
+EFI_STATUS
+IfConfig (
+ IN IFCONFIG_PRIVATE_DATA *Private
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *NicInfo;
- UINT32 Index;
- EFI_IP4_IPCONFIG_DATA *Ip4Config;
- EFI_IPv4_ADDRESS Gateway;
- CONST CHAR16 *TempString;
+ EFI_STATUS Status;

- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- NicInfo = BASE_CR (Entry, NIC_INFO, Link);
+ //
+ // Get configure information of all interfaces.
+ //
+ Status = IfConfigGetInterfaceInfo (
+ Private->ImageHandle,
+ Private->IfName,
+ &Private->IfList
+ );

- TempString = (CHAR16*)NicInfo->Name;
- if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {
- continue;
- }
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), gShellNetwork1HiiHandle, NicInfo->Name);
+ switch (Private->OpCode) {
+ case IfConfigOpList:
+ Status = IfConfigShowInterfaceInfo (&Private->IfList);
+ break;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[0],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[1],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[3],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[4],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]
- );
-
- Print (L" Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : L"Media disconnected");
-
- if (NicInfo->ConfigInfo == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);
- continue;
- }
+ case IfConfigOpClear:
+ Status = IfConfigClearInterfaceInfo (&Private->IfList);
+ break;

- if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"DHCP");
- } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"STATIC");
- } else {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"Unknown");
- }
+ case IfConfigOpSet:
+ Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,
- STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),
- gShellNetwork1HiiHandle,
- (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")
- );
+ default:
+ Status = EFI_ABORTED;
+ }

- Ip4Config = &NicInfo->ConfigInfo->Ip4Info;
+ON_EXIT:

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"IP address",
- (UINTN)Ip4Config->StationAddress.Addr[0],
- (UINTN)Ip4Config->StationAddress.Addr[1],
- (UINTN)Ip4Config->StationAddress.Addr[2],
- (UINTN)Ip4Config->StationAddress.Addr[3]
- );
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Mask",
- (UINTN)Ip4Config->SubnetMask.Addr[0],
- (UINTN)Ip4Config->SubnetMask.Addr[1],
- (UINTN)Ip4Config->SubnetMask.Addr[2],
- (UINTN)Ip4Config->SubnetMask.Addr[3]
- );
+ return Status;
+}

- ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
- (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
- CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- }
-
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Gateway.Addr[0],
- (UINTN)Gateway.Addr[1],
- (UINTN)Gateway.Addr[2],
- (UINTN)Gateway.Addr[3]
- );
+/**
+ The ifconfig command cleanup process, free the allocated memory.

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.

- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
+**/
+VOID
+IfConfigCleanup (
+ IN IFCONFIG_PRIVATE_DATA *Private
+ )
+{
+ LIST_ENTRY *Entry;
+ LIST_ENTRY *NextEntry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ ARG_LIST *ArgNode;
+ ARG_LIST *ArgHead;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Subnet",
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]
- );
+ ASSERT (Private != NULL);

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Netmask",
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]
- );
+ //
+ // Clean the list which save the set config Args.
+ //
+ if (Private->VarArg != NULL) {
+ ArgHead = Private->VarArg;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]
- );
+ while (ArgHead->Next != NULL) {
+ ArgNode = ArgHead->Next;
+ FreePool (ArgHead);
+ ArgHead = ArgNode;
}
+
+ FreePool (ArgHead);
}

- return ;
-}
+ if (Private->IfName != NULL)
+ FreePool (Private->IfName);

-/**
- Clear address configuration for the nic specified.

- @param[in] Name A pointer to the string containg the nic's name,
- if NULL, all nics address configurations are cleared.
+ //
+ // Clean the IFCONFIG_INTERFACE_CB list.
+ //
+ Entry = Private->IfList.ForwardLink;
+ NextEntry = Entry->ForwardLink;

- @retval EFI_SUCCESS The address configuration is cleared.
- @return Some error occurs.
-**/
-EFI_STATUS
-EFIAPI
-IfconfigClearNicAddr (
- IN CONST CHAR16 *Name
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- EFI_STATUS Status;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ while (Entry != &Private->IfList) {

- if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {
- continue;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

-// if (Info->NicIp4Config == NULL) {
- Status = IfconfigSetNicAddrByHii (Info, NULL);
-// } else {
-// Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
-// }
+ RemoveEntryList (&IfCb->Link);

- if (EFI_ERROR (Status)) {
- return Status;
+ if (IfCb->IfInfo != NULL) {
+
+ FreePool (IfCb->IfInfo);
}
+
+ FreePool (IfCb);
+
+ Entry = NextEntry;
+ NextEntry = Entry->ForwardLink;
}

- return EFI_SUCCESS;
-
+ FreePool (Private);
}

/**
Function for 'ifconfig' command.

@param[in] ImageHandle Handle to the Image (NULL if Internal).
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
+
**/
SHELL_STATUS
EFIAPI
ShellCommandRunIfconfig (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- EFI_STATUS Status;
- LIST_ENTRY *Package;
- CHAR16 *ProblemParam;
- SHELL_STATUS ShellStatus;
- BOOLEAN ListOperation;
- BOOLEAN ClearOperation;
- BOOLEAN SetOperation;
- CONST CHAR16 *Item;
- LIST_ENTRY *Entry;
- NIC_INFO *Info;
-
- InitializeListHead (&NicInfoList);
- Status = EFI_INVALID_PARAMETER;
- ShellStatus = SHELL_SUCCESS;
+ EFI_STATUS Status;
+ IFCONFIG_PRIVATE_DATA *Private;
+ LIST_ENTRY *ParamPackage;
+ CONST CHAR16 *ValueStr;
+ ARG_LIST *ArgList;
+ CHAR16 *ProblemParam;
+ CHAR16 *Str;
+
+ Private = NULL;
+
+ Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_COMMAND), gShellNetwork1HiiHandle, ProblemParam);
+ goto ON_EXIT;
+ }

//
- // initialize the shell lib (we must be in non-auto-init...)
+ // To handle unsupported option.
//
- Status = ShellInitialize();
- ASSERT_EFI_ERROR(Status);
+ if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+ goto ON_EXIT;
+ }

//
- // parse the command line
+ // To handle no option.
//
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
- if (EFI_ERROR(Status)) {
- if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
- FreePool(ProblemParam);
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- ASSERT(FALSE);
- }
-
- goto Done;
+ if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
+ !ShellCommandLineGetFlag (ParamPackage, L"-h") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}

- ClearOperation = ShellCommandLineGetFlag(Package, L"-c");
- ListOperation = ShellCommandLineGetFlag(Package, L"-l");
- SetOperation = ShellCommandLineGetFlag(Package, L"-s");
-
- if ((ClearOperation && ListOperation)
- ||(SetOperation && ListOperation)
- ||(ClearOperation && SetOperation)
- ) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- } else if (!ClearOperation && !ListOperation && !SetOperation) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ //
+ // To handle conflict options.
+ //
+ if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-h")))) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_OPTIONS), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
+
+ //
+ // To show the help information of ifconfig command.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-h")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_HELP), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
-
- Status = IfconfigGetAllNicInfoByHii ();
- if (EFI_ERROR (Status)) {
- if (mIp4ConfigExist) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), gShellNetwork1HiiHandle, Status);
- } else {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellNetwork1HiiHandle, L"ifconfig", L"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid);
- }

- return SHELL_NOT_FOUND;
+ Status = EFI_INVALID_PARAMETER;
+
+ Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
+
+ if (Private == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
}

- if (ListOperation) {
- Item = ShellCommandLineGetValue (Package, L"-l");
+ InitializeListHead (&Private->IfList);
+
+ //
+ // To get interface name for the list option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ Private->OpCode = IfConfigOpList;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name for the clear option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
+ Private->OpCode = IfConfigOpClear;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name and corresponding Args for the set option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-l");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
+ if (ValueStr == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_INTERFACE), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }

//
- // Show the configuration.
+ // To split the configuration into multi-section.
//
- IfconfigShowNicInfo (Item);
- } else if (SetOperation) {
- Item = ShellCommandLineGetValue (Package, L"-s");
+ ArgList = SplitStrToList (ValueStr, L' ');
+ ASSERT (ArgList != NULL);

- //
- // The correct command line arguments for setting address are:
- // IfConfig -s eth0 DHCP [permanent]
- // IfConfig -s eth0 static ip netmask gateway [permanent]
- //
- if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) || (CountSubItems(Item) == 4)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_NO_VALUE), gShellNetwork1HiiHandle, L"ifconfig", L"-s");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ Private->OpCode = IfConfigOpSet;
+ Private->IfName = ArgList->Arg;

- ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);
- } else if (ClearOperation) {
- Item = ShellCommandLineGetValue (Package, L"-c");
+ Private->VarArg = ArgList->Next;

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-c");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ if (Private->IfName == NULL || Private->VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_COMMAND), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
- IfconfigClearNicAddr (Item);
- } else {
- ASSERT(FALSE);
}
+
+ //
+ // Main process of ifconfig.
+ //
+ Status = IfConfig (Private);

-Done:
- while (!IsListEmpty (&NicInfoList)) {
- Entry = NicInfoList.ForwardLink;
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ON_EXIT:

- RemoveEntryList (Entry);
+ ShellCommandLineFreeVarList (ParamPackage);
+ if (Private != NULL)
+ IfConfigCleanup (Private);

- if (Info->ConfigInfo != NULL) {
- FreePool (Info->ConfigInfo);
- }
+ return Status;
+}

- FreePool (Info);
- }

- if (Package != NULL) {
- ShellCommandLineFreeVarList(Package);
- }

- return (ShellStatus);
-}
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index e23588a..af96379 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -909,20 +909,20 @@ PingCreateIpInstance (
//
if (Private->IpChoice == PING_IP_CHOICE_IP6) {
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
} else {
ASSERT(Private->IpChoice == PING_IP_CHOICE_IP4);
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
}
//
@@ -953,11 +953,11 @@ PingCreateIpInstance (
// Ip6config protocol and ip6 service binding protocol are installed
// on the same handle.
//
Status = gBS->HandleProtocol (
HandleBuffer[HandleIndex],
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
(VOID **) &IpXCfg
);

if (EFI_ERROR (Status)) {
goto ON_ERROR;
@@ -971,12 +971,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
}

@@ -1007,12 +1008,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
}

@@ -1043,11 +1045,11 @@ PingCreateIpInstance (
}
} else {
//
// IP4 address check
//
- if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {
+ if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {
//
// Match a certain interface address.
//
break;
}
@@ -1135,15 +1137,10 @@ PingCreateIpInstance (
ZeroMem (&Ip4Config, sizeof (EFI_IP4_CONFIG_DATA));

//
// Configure the ip4 instance for icmp4 packet exchange.
//
-// PING_IP4_COPY_ADDRESS (&Ip4Config.StationAddress, &Private->SrcAddress);
-// Ip4Config.SubnetMask.Addr[0] = 0xFF;
-// Ip4Config.SubnetMask.Addr[1] = 0xFF;
-// Ip4Config.SubnetMask.Addr[2] = 0xFF;
-// Ip4Config.SubnetMask.Addr[3] = 0x00;
Ip4Config.DefaultProtocol = 1;
Ip4Config.AcceptAnyProtocol = FALSE;
Ip4Config.AcceptBroadcast = FALSE;
Ip4Config.AcceptIcmpErrors = TRUE;
Ip4Config.AcceptPromiscuous = FALSE;
@@ -1461,11 +1458,11 @@ ShellCommandRunPing (
ShellStatus = SHELL_SUCCESS;
ProblemParam = NULL;

Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}

if (ShellCommandLineGetFlag (ParamPackage, L"-_ip6")) {
@@ -1481,11 +1478,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
SendNumber = DEFAULT_SEND_COUNT;
@@ -1499,11 +1496,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
BufferSize = DEFAULT_BUFFER_SIZE;
@@ -1522,26 +1519,26 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &SrcAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
// Parse the paramter of destination ip address.
//
NonOptionCount = ShellCommandLineGetCount(ParamPackage);
if (NonOptionCount < 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (NonOptionCount > 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
ValueStr = ShellCommandLineGetRawValue (ParamPackage, 1);
if (ValueStr != NULL) {
@@ -1550,11 +1547,11 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &DstAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
index 49849a6..5151179 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
@@ -1,9 +1,9 @@
/** @file
Main file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

@@ -63,11 +63,11 @@ ShellNetwork1CommandsLibConstructor (
}
//
// install our shell command handlers
//
ShellCommandRegisterCommandName(L"ping", ShellCommandRunPing , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_PING));
- ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_IFCONFIG));
+ ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_IFCONFIG_HELP));

return (EFI_SUCCESS);
}

/**
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
index 68a7c93..98b40df 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
@@ -1,9 +1,9 @@
/** @file
header file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -24,13 +24,11 @@
#include <Protocol/Cpu.h>
#include <Protocol/ServiceBinding.h>
#include <Protocol/Ip6.h>
#include <Protocol/Ip6Config.h>
#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/Ip4Config2.h>
#include <Protocol/Arp.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
@@ -45,12 +43,10 @@
#include <Library/HiiLib.h>
#include <Library/NetLib.h>
#include <Library/DevicePathLib.h>
#include <Library/PrintLib.h>

-#include <Guid/NicIp4ConfigNvData.h>
-
extern EFI_HANDLE gShellNetwork1HiiHandle;

/**
Function for 'ping' command.

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
index 527d2ef..6dfbbe5 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
@@ -57,11 +57,11 @@
gEfiCpuArchProtocolGuid ## CONSUMES
gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES

- gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES

[Guids]
gShellNetwork1HiiGuid ## SOMETIMES_CONSUMES ## HII
\ No newline at end of file
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index aa27c678339c5e94c9c936d9a7ea74b6b043c200..65edb0a407754247e91009929a3525b2ad5dd96e 100644
GIT binary patch
literal 21554
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
NnXgL}rJk4f{{V5RRI&g7

literal 20112
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
--
1.9.5.msysgit.1



------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------

------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/

------------------------------

_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel


End of edk2-devel Digest, Vol 66, Issue 424
*******************************************
Wu, Jiaxin
2015-07-02 00:41:36 UTC
Permalink
Hi Tapan,
I have already sent out the patch to edk2-devel.

Thanks.
Jiaxin

-----Original Message-----
From: Shah, Tapan [mailto:***@hp.com]
Sent: Thursday, July 2, 2015 1:00 AM
To: Wu, Jiaxin; edk2-***@lists.sourceforge.net
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Jiaxin,
Can you send out an updated patch file for review?

Thanks,
Tapan

-----Original Message-----
From: Wu, Jiaxin [mailto:***@intel.com]
Sent: Wednesday, July 01, 2015 10:55 AM
To: Shah, Tapan; edk2-***@lists.sourceforge.net
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Hi Tapan,
Thank you for your comments, I have updated patch according below and other reviewers comments.
For the copyright, I have confirm that HP's copyright should be kept, I have recovered it and just update Intel copyright year.

Best Regards!
Jiaxin

-----Original Message-----
From: edk2-devel-***@lists.sourceforge.net [mailto:edk2-devel-***@lists.sourceforge.net]
Sent: Wednesday, July 1, 2015 12:55 AM
To: edk2-***@lists.sourceforge.net
Subject: edk2-devel Digest, Vol 66, Issue 424

Send edk2-devel mailing list submissions to
edk2-***@lists.sourceforge.net

To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/edk2-devel
or, via email, send a message with subject or body 'help' to
edk2-devel-***@lists.sourceforge.net

You can reach the person managing the list at
edk2-devel-***@lists.sourceforge.net

When replying, please edit your Subject line so it is more specific
than "Re: Contents of edk2-devel digest..."


Today's Topics:

1. Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
(Shah, Tapan)


----------------------------------------------------------------------

Message: 1
Date: Tue, 30 Jun 2015 16:54:24 +0000
From: "Shah, Tapan" <***@hp.com>
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig
library.
To: "edk2-***@lists.sourceforge.net"
<edk2-***@lists.sourceforge.net>
Message-ID:
<***@G1W3642.americas.hpqcorp.net>

Content-Type: text/plain; charset="utf-8"

Jiaxin,
I see that ifconfig is completely re-written and also removed HP's copyright. I am not sure if it's acceptable to remove HP's copyright from the file. I am assuming that you have done adequate testing for this major change, can you confirm what type of testing is performed to verify this change?

Below comments for .uni file changes:

1. No need to rename below three string tokens.
STR_GEN_TOO_MANY -> STR_PING_ERR_TOO_MANY
STR_GEN_TOO_FEW -> STR_PING_ERR_TOO_FEW
STR_GEN_PARAM_INV -> STR_PING_ERR_PARAM_INV

2. All other STR_GEN_* string tokens are removed from .uni file. I suspect it may break other command. They should remain as-is and no need to remove. We also keep it at the profile level .uni file to keep track of same generic token name and strings across all commands.

3. STR_IFCONFIG_HELP help output of new ifconfig is not following the help output format. Need to fix it. Existing ifconfig help output is a good example as a reference.

4. Below token shows message Ip4Config2->GetData which is not something we customer friendly. Make it a customer friendly message.

#string STR_IFCONFIG_ERR_IP4CFG_GETDATA #language en-US "Ip4Config2->GetData return %hr\n"

Thanks,
Tapan

-----Original Message-----
From: Qiu, Shumin [mailto:***@intel.com]
Sent: Monday, June 29, 2015 8:12 PM
To: edk2-***@lists.sourceforge.net
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Hi Jiaxin,
Can I have the patch file?

-Shumin

-----Original Message-----
From: jiaxinwu [mailto:***@intel.com]
Sent: Monday, June 29, 2015 10:50 PM
To: edk2-***@lists.sourceforge.net
Subject: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Version2 include:
Make the command options to be Shell2.1 compliant(For the unsupported option, display ?not supported?);
Safe string fix;
Coding style change.

This patch update ShellPkg ping/ifconfig library source code to consume Ip4Config2 protocol.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: jiaxinwu <***@intel.com>
---
.../UefiShellNetwork1CommandsLib/Ifconfig.c | 2462 ++++++++------------
.../Library/UefiShellNetwork1CommandsLib/Ping.c | 33 +-
.../UefiShellNetwork1CommandsLib.c | 4 +-
.../UefiShellNetwork1CommandsLib.h | 8 +-
.../UefiShellNetwork1CommandsLib.inf | 6 +-
.../UefiShellNetwork1CommandsLib.uni | Bin 20112 -> 21554 bytes
6 files changed, 1040 insertions(+), 1473 deletions(-)

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index 7c3f809..61328a3 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -1,1763 +1,1337 @@
/** @file
- The implementation for ifcommand shell command.
+ The implementation for Shell command ifconfig based on IP4Config2 protocol.

- (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
**/

#include "UefiShellNetwork1CommandsLib.h"

-#define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE)
-#define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))
-
-BOOLEAN mIp4ConfigExist = FALSE;
-STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL;
+enum {
+ IfConfigOpList = 1,
+ IfConfigOpSet = 2,
+ IfConfigOpClear = 3
+};
+
+typedef enum {
+ VarCheckReserved = -1,
+ VarCheckOk = 0,
+ VarCheckDuplicate,
+ VarCheckConflict,
+ VarCheckUnknown,
+ VarCheckLackValue,
+ VarCheckOutOfMem
+} VAR_CHECK_CODE;
+
+typedef enum {
+ FlagTypeSingle = 0,
+ FlagTypeNeedVar,
+ FlagTypeNeedSet,
+ FlagTypeSkipUnknown
+} VAR_CHECK_FLAG_TYPE;
+
+#define MACADDRMAXSIZE 32
+
+typedef struct _IFCONFIG_INTERFACE_CB {
+ EFI_HANDLE NicHandle;
+ LIST_ENTRY Link;
+ EFI_IP4_CONFIG2_PROTOCOL *IfCfg;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ EFI_IP4_CONFIG2_POLICY Policy;
+ UINT32 DnsCnt;
+ EFI_IPv4_ADDRESS DnsAddr[1];
+} IFCONFIG_INTERFACE_CB;
+
+typedef struct _ARG_LIST ARG_LIST;
+
+struct _ARG_LIST {
+ ARG_LIST *Next;
+ CHAR16 *Arg;
+};
+
+typedef struct _IFCONFIG4_PRIVATE_DATA {
+ EFI_HANDLE ImageHandle;
+ LIST_ENTRY IfList;
+
+ UINT32 OpCode;
+ CHAR16 *IfName;
+ ARG_LIST *VarArg;
+} IFCONFIG_PRIVATE_DATA;
+
+typedef struct _VAR_CHECK_ITEM{
+ CHAR16 *FlagStr;
+ UINT32 FlagID;
+ UINT32 ConflictMask;
+ VAR_CHECK_FLAG_TYPE FlagType;
+} VAR_CHECK_ITEM;
+
+SHELL_PARAM_ITEM mIfConfigCheckList[] = {
+ {
+ L"-b",
+ TypeFlag
+ },
+ {
+ L"-h",
+ TypeFlag
+ },
+ {
+ L"-l",
+ TypeValue
+ },
+ {
+ L"-r",
+ TypeValue
+ },
+ {
+ L"-c",
+ TypeValue
+ },
+ {
+ L"-s",
+ TypeMaxValue
+ },
+ {
+ NULL,
+ TypeMax
+ },
+};
+
+VAR_CHECK_ITEM mSetCheckList[] = {
+ {
+ L"static",
+ 0x00000001,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dhcp",
+ 0x00000002,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dns",
+ 0x00000008,
+ 0x00000004,
+ FlagTypeSingle
+ },
+ {
+ NULL,
+ 0x0,
+ 0x0,
+ FlagTypeSkipUnknown
+ },
+};

-STATIC CONST UINTN SecondsToNanoSeconds = 10000000;
-STATIC CONST CHAR16 DhcpString[5] = L"DHCP";
-STATIC CONST CHAR16 StaticString[7] = L"STATIC";
STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";

-typedef struct {
- LIST_ENTRY Link;
- EFI_HANDLE Handle;
- NIC_ADDR NicAddress;
- CHAR16 Name[IP4_NIC_NAME_LENGTH];
- BOOLEAN MediaPresentSupported;
- BOOLEAN MediaPresent;
- EFI_IP4_CONFIG_PROTOCOL *Ip4Config;
- NIC_IP4_CONFIG_INFO *ConfigInfo;
-} NIC_INFO;
-
-typedef struct {
- EFI_IP_ADDRESS DestIp;
- EFI_MAC_ADDRESS DestMac;
- EFI_IP_ADDRESS LocalIp;
- EFI_MAC_ADDRESS LocalMac;
- UINT8 MacLen;
- EFI_EVENT OnResolved;
- BOOLEAN Duplicate;
-} ARP_REQUEST;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- {L"-c", TypeValue},
- {L"-l", TypeValue},
- {L"-s", TypeMaxValue},
- {NULL, TypeMax}
- };
-
-STATIC LIST_ENTRY NicInfoList;
-STATIC BOOLEAN ArpResolved;
-STATIC BOOLEAN mTimeout;
-
/**
- Count the space delimited items in a string.
-
- @param[in] String A pointer to the string to count.
-
- @return The number of space-delimited items.
- @retval 0xFF an error occured.
-**/
-UINT8
-EFIAPI
-CountSubItems (
- IN CONST CHAR16 *String
- )
-{
- CONST CHAR16 *Walker;
- UINT8 Count;
-
- if (String == NULL || *String == CHAR_NULL) {
- return (0xFF);
- }
+ Split a string with specified separator and save the substring to a list.

- for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; Walker = (StrStr(Walker, L" ")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);
- return (Count);
-}
+ @param[in] String The pointer of the input string.
+ @param[in] Separator The specified separator.

-/**
- Find the NIC_INFO by the specified nic name.
+ @return The pointer of headnode of ARG_LIST.

- @param[in] Name The pointer to the string containing the NIC name.
-
- @return The pointer to the NIC_INFO if there is a NIC_INFO named by Name.
- @retval NULL No NIC_INFO was found for Name.
**/
-NIC_INFO*
-EFIAPI
-IfconfigFindNicByName (
- IN CONST CHAR16 *Name
+ARG_LIST *
+SplitStrToList (
+ IN CONST CHAR16 *String,
+ IN CHAR16 Separator
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- CHAR16 *TempString;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
- TempString = (CHAR16*)Info->Name;
+ CHAR16 *Str;
+ CHAR16 *ArgStr;
+ ARG_LIST *ArgList;
+ ARG_LIST *ArgNode;

- if (StringNoCaseCompare (&Name, &TempString) == 0) {
- return Info;
- }
+ if (*String == L'\0') {
+ return NULL;
}

- return NULL;
-}
-
-/**
- Tests whether a child handle is a child device of the controller.
-
- @param[in] ControllerHandle A handle for a (parent) controller to test.
- @param[in] ChildHandle A child handle to test.
- @param[in] ProtocolGuid Supplies the protocol that the child controller
- opens on its parent controller.
-
- @retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.
- @retval EFI_UNSUPPORTED ChildHandle is not a child of the ControllerHandle.
-**/
-EFI_STATUS
-EFIAPI
-TestChildHandle (
- IN CONST EFI_HANDLE ControllerHandle,
- IN CONST EFI_HANDLE ChildHandle,
- IN CONST EFI_GUID *ProtocolGuid
- )
-{
- EFI_STATUS Status;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- UINTN EntryCount;
- UINTN Index;
-
- ASSERT (ProtocolGuid != NULL);
-
//
- // Retrieve the list of agents that are consuming the specific protocol
- // on ControllerHandle.
+ // Copy the CONST string to a local copy.
//
- Status = gBS->OpenProtocolInformation (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (String));
+ ASSERT (Str != NULL);
+ StrCpyS (Str, StrSize (String)/sizeof (CHAR16), String);
+ ArgStr = Str;

//
- // Inspect if ChildHandle is one of the agents.
+ // init a node for the list head.
//
- Status = EFI_UNSUPPORTED;
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&
- (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = EFI_SUCCESS;
- break;
- }
- }
-
- FreePool (OpenInfoBuffer);
- return Status;
-}
-
-/**
- Get the child handle of the NIC handle.
-
- @param[in] Controller Routing information: GUID.
- @param[out] ChildHandle Returned child handle.
-
- @retval EFI_SUCCESS Successfully to get child handle.
-**/
-EFI_STATUS
-GetChildHandle (
- IN EFI_HANDLE Controller,
- OUT EFI_HANDLE *ChildHandle
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- UINTN Index;
- EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;
- VENDOR_DEVICE_PATH *VendorDeviceNode;
+ ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode != NULL);
+ ArgList = ArgNode;

//
- // Locate all EFI Hii Config Access protocols
+ // Split the local copy and save in the list node.
//
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiHiiConfigAccessProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
- );
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return Status;
- }
-
- Status = EFI_NOT_FOUND;
-
- for (Index = 0; Index < HandleCount; Index++) {
-
- Status = TestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);
- if (!EFI_ERROR (Status)) {
- //
- // Get device path on the child handle
- //
- Status = gBS->HandleProtocol (
- Handles[Index],
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ChildDeviceDevicePath
- );
-
- if (!EFI_ERROR (Status)) {
- while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
- ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
- //
- // Parse one instance
- //
- if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&
- ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
- VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
- if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
- //
- // Found item matched gEfiNicIp4ConfigVariableGuid
- //
- *ChildHandle = Handles[Index];
- FreePool (Handles);
- return EFI_SUCCESS;
- }
- }
- }
- }
+ while (*Str != L'\0') {
+ if (*Str == Separator) {
+ *Str = L'\0';
+ ArgNode->Arg = ArgStr;
+ ArgStr = Str + 1;
+ ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode->Next != NULL);
+ ArgNode = ArgNode->Next;
}
+
+ Str++;
}

- FreePool (Handles);
- return Status;
+ ArgNode->Arg = ArgStr;
+ ArgNode->Next = NULL;
+
+ return ArgList;
}

/**
- Append OFFSET/WIDTH/VALUE items at the beginning of string.
-
- @param[in, out] String The pointer to the string to append onto.
- @param[in] Offset Offset value.
- @param[in] Width Width value.
- @param[in] Block Point to data buffer.
-
- @return The count of unicode character that were appended.
-**/
-UINTN
-EFIAPI
-AppendOffsetWidthValue (
- IN OUT CHAR16 *String,
- IN UINTN Offset,
- IN UINTN Width,
- IN CONST UINT8 *Block
- )
-
-{
- CHAR16 *OriString;
-
- OriString = String;
-
- StrnCpy (String, L"&OFFSET=", 9);
- String += StrLen (L"&OFFSET=");
- String += UnicodeSPrint (String, 20, L"%x", Offset);
-
- StrnCpy (String,L"&WIDTH=", 8);
- String += StrLen (L"&WIDTH=");
- String += UnicodeSPrint (String, 20, L"%x", Width);
+ Check the correctness of input Args with '-s' option.

- if (Block != NULL) {
- StrnCpy (String,L"&VALUE=", 8);
- String += StrLen (L"&VALUE=");
- while ((Width--) != 0) {
- String += UnicodeSPrint (String, 20, L"%x", Block[Width]);
- }
- }
-
- return String - OriString;
-}
+ @param[in] CheckList The pointer of VAR_CHECK_ITEM array.
+ @param[in] Name The pointer of input arg.
+ @param[in] Init The switch to execute the check.

-/**
- Converts the unicode character of the string from uppercase to lowercase.
- This is a internal function.
+ @return The value of VAR_CHECK_CODE.

- @param ConfigString String to be converted
**/
-CHAR16*
-EFIAPI
-HiiToLower (
- IN CHAR16 *ConfigString
- )
+VAR_CHECK_CODE
+IfConfigRetriveCheckListByName(
+ IN VAR_CHECK_ITEM *CheckList,
+ IN CHAR16 *Name,
+ IN BOOLEAN Init
+)
{
- CHAR16 *String;
- BOOLEAN Lower;
-
- //
- // Convert all hex digits in range [A-F] in the configuration header to [a-f]
- //
- for (String = ConfigString, Lower = FALSE; String != NULL && *String != L'\0'; String++) {
- if (*String == L'=') {
- Lower = TRUE;
- } else if (*String == L'&') {
- Lower = FALSE;
- } else if (Lower && *String >= L'A' && *String <= L'F') {
- *String = (CHAR16) (*String - L'A' + L'a');
- }
+ STATIC UINT32 CheckDuplicate;
+ STATIC UINT32 CheckConflict;
+ VAR_CHECK_CODE RtCode;
+ UINT32 Index;
+ VAR_CHECK_ITEM Arg;
+
+ if (Init) {
+ CheckDuplicate = 0;
+ CheckConflict = 0;
+ return VarCheckOk;
}

- return (ConfigString);
-}
-
-
-/**
- Construct <ConfigHdr> using routing information GUID/NAME/PATH.
-
- @param[in] Guid Routing information: GUID.
- @param[in] Name Routing information: NAME.
- @param[in] DriverHandle Driver handle which contains the routing information: PATH.
-
- @retval NULL An error occured.
- @return The pointer to configHdr string.
-**/
-CHAR16 *
-EFIAPI
-ConstructConfigHdr (
- IN CONST EFI_GUID *Guid,
- IN CONST CHAR16 *Name,
- IN EFI_HANDLE DriverHandle
- )
-{
- EFI_STATUS Status;
- CHAR16 *ConfigHdr;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- CHAR16 *String;
- UINTN Index;
- UINT8 *Buffer;
- UINTN DevicePathLength;
- UINTN NameLength;
+ RtCode = VarCheckOk;
+ Index = 0;
+ Arg = CheckList[Index];

//
- // Get the device path from handle installed EFI HII Config Access protocol
+ // Check the Duplicated/Conflicted/Unknown input Args.
//
- Status = gBS->HandleProtocol (
- DriverHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath
- );
- if (EFI_ERROR (Status)) {
- return NULL;
- }
+ while (Arg.FlagStr != NULL) {
+ if (StrCmp (Arg.FlagStr, Name) == 0) {

- DevicePathLength = GetDevicePathSize (DevicePath);
- NameLength = StrLen (Name);
- ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));
- if (ConfigHdr == NULL) {
- return NULL;
- }
+ if (CheckDuplicate & Arg.FlagID) {
+ RtCode = VarCheckDuplicate;
+ break;
+ }

- String = ConfigHdr;
- StrnCpy (String, L"GUID=", 6);
- String += StrLen (L"GUID=");
+ if (CheckConflict & Arg.ConflictMask) {
+ RtCode = VarCheckConflict;
+ break;
+ }

- //
- // Append Guid converted to <HexCh>32
- //
- for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
- }
+ CheckDuplicate |= Arg.FlagID;
+ CheckConflict |= Arg.ConflictMask;
+ break;
+ }

- //
- // Append L"&NAME="
- //
- StrnCpy (String, L"&NAME=", 7);
- String += StrLen (L"&NAME=");
- for (Index = 0; Index < NameLength ; Index++) {
- String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);
+ Arg = CheckList[++Index];
}
-
- //
- // Append L"&PATH="
- //
- StrnCpy (String, L"&PATH=", 7);
- String += StrLen (L"&PATH=");
- for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
+
+ if (Arg.FlagStr == NULL) {
+ RtCode = VarCheckUnknown;
}

- return (HiiToLower(ConfigHdr));
+ return RtCode;
}

/**
- Get network physical device NIC information.
+ The notify function of create event when performing a manual config.

- @param[in] Handle The network physical device handle.
- @param[out] NicAddr NIC information.
+ @param[in] Event The event this notify function registered to.
+ @param[in] Context Pointer to the context data registered to the event.

- @retval EFI_SUCCESS Get NIC information successfully.
-**/
-EFI_STATUS
+**/
+VOID
EFIAPI
-IfConfigGetNicMacInfo (
- IN EFI_HANDLE Handle,
- OUT NIC_ADDR *NicAddr
- )
+IfConfigManualAddressNotify (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
- }
-
- NicAddr->Type = (UINT16) SnpMode.IfType;
- NicAddr->Len = (UINT8) SnpMode.HwAddressSize;
- CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);
-
-ON_ERROR:
-
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
-
- return Status;
-
+ *((BOOLEAN *) Context) = TRUE;
}

+
/**
- Get network physical device NIC information.
+ Print MAC address.

- @param[in] Handle The network physical device handle.
- @param[out] MediaPresentSupported
- Upon successful return, TRUE is media present
- is supported. FALSE otherwise.
- @param[out] MediaPresent Upon successful return, TRUE is media present
- is enabled. FALSE otherwise.
+ @param[in] Node The pointer of MAC address buffer.
+ @param[in] Size The size of MAC address buffer.

- @retval EFI_SUCCESS The operation was successful.
**/
-EFI_STATUS
-EFIAPI
-IfConfigGetNicMediaStatus (
- IN EFI_HANDLE Handle,
- OUT BOOLEAN *MediaPresentSupported,
- OUT BOOLEAN *MediaPresent
- )
-
+VOID
+IfConfigPrintMacAddr (
+ IN UINT8 *Node,
+ IN UINT32 Size
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
+ UINTN Index;

- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
+ ASSERT (Size <= MACADDRMAXSIZE);

- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
+ for (Index = 0; Index < Size; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);
+ if (Index + 1 < Size) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle);
+ }
}
-
- *MediaPresentSupported = SnpMode.MediaPresentSupported;
- *MediaPresent = SnpMode.MediaPresent;

-ON_ERROR:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+}

- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );

- return Status;
+/**
+ The get current status of all handles.

-}
+ @param[in] ImageHandle The handle of ImageHandle.
+ @param[in] IfName The pointer of IfName(interface name).
+ @param[in] IfList The pointer of IfList(interface list).

-/**
- Get all Nic's information through HII service.
+ @retval EFI_SUCCESS The get status processed successfully.
+ @retval others The get status process failed.

- @retval EFI_SUCCESS All the nic information is collected.
**/
EFI_STATUS
-EFIAPI
-IfconfigGetAllNicInfoByHii (
- VOID
+IfConfigGetInterfaceInfo (
+ IN EFI_HANDLE ImageHandle,
+ IN CHAR16 *IfName,
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- UINTN Index;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- UINTN BufferSize;
- NIC_INFO *NicInfo;
- NIC_IP4_CONFIG_INFO *NicConfigRequest;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfigRequest = NULL;
- NicInfo = NULL;
-
- InitializeListHead (&NicInfoList);
+ EFI_STATUS Status;
+ UINTN HandleIndex;
+ UINTN HandleNum;
+ EFI_HANDLE *HandleBuffer;
+ EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ UINTN DataSize;

- //
- // Check if HII Config Routing protocol available.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiConfigRoutingProtocolGuid,
- NULL,
- (VOID**)&mHiiConfigRouting
- );
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
+ HandleBuffer = NULL;
+ HandleNum = 0;
+
+ IfInfo = NULL;
+ IfCb = NULL;

//
- // Locate all network device handles
+ // Locate all the handles with ip4 service binding protocol.
//
Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
+ ByProtocol,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ NULL,
+ &HandleNum,
+ &HandleBuffer
);
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return EFI_NOT_FOUND;
+ if (EFI_ERROR (Status) || (HandleNum == 0)) {
+ return EFI_ABORTED;
}

- for (Index = 0; Index < HandleCount; Index++) {
- Status = GetChildHandle (Handles[Index], &ChildHandle);
+ //
+ // Enumerate all handles that installed with ip4 service binding protocol.
+ //
+ for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
+ IfCb = NULL;
+ IfInfo = NULL;
+ DataSize = 0;
+
+ //
+ // Ip4config protocol and ip4 service binding protocol are installed
+ // on the same handle.
+ //
+ ASSERT (HandleBuffer != NULL);
+ Status = gBS->HandleProtocol (
+ HandleBuffer[HandleIndex],
+ &gEfiIp4Config2ProtocolGuid,
+ (VOID **) &Ip4Cfg2
+ );
+
if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility.
- //
- ChildHandle = Handles[Index];
+ goto ON_ERROR;
}
+
//
- // Construct configuration request string header
+ // Get the interface information size.
//
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- Length = 0;
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ NULL
+ );
+
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
+
+ IfInfo = AllocateZeroPool (DataSize);
+
+ if (IfInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
-
+
//
- // Append OFFSET/WIDTH pair
+ // Get the interface info.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ IfInfo
+ );

- NicInfo = AllocateZeroPool (sizeof (NIC_INFO));
- if (NicInfo == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
goto ON_ERROR;
}
- NicInfo->Handle = Handles[Index];
-
+
//
- // Get network physical devcie MAC information
+ // Check the interface name if required.
//
- IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);
- if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);
- } else {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
+ FreePool (IfInfo);
+ continue;
}

+ DataSize = 0;
+
//
- // Get media status
+ // Get the size of dns server list.
//
- IfConfigGetNicMediaStatus (Handles[Index], &NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ NULL
+ );
+
+ if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfigRequest == NULL) {
+ IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);
+
+ if (IfCb == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}

+ IfCb->NicHandle = HandleBuffer[HandleIndex];
+ IfCb->IfInfo = IfInfo;
+ IfCb->IfCfg = Ip4Cfg2;
+ IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));
+
//
- // Get network parameters by HII service
+ // Get the dns server list if has.
//
- Status = mHiiConfigRouting->ExtractConfig (
- mHiiConfigRouting,
- ConfigResp,
- &AccessProgress,
- &AccessResults
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = NIC_ITEM_CONFIG_SIZE;
- Status = mHiiConfigRouting->ConfigToBlock (
- mHiiConfigRouting,
- AccessResults,
- (UINT8 *) NicConfigRequest,
- &BufferSize,
- &AccessProgress
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;
- NicConfig = AllocateZeroPool (BufferSize);
- if (NicConfig == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
- CopyMem (NicConfig, NicConfigRequest, BufferSize);
-
- //
- // If succeeds to get NIC configuration, fix up routetable pointer.
- //
- NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (&NicConfig->Ip4Info + 1);
- NicInfo->ConfigInfo = NicConfig;
-
- } else {
- NicInfo->ConfigInfo = NULL;
+ if (DataSize > 0) {
+
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ IfCb->DnsAddr
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
-
- FreePool (AccessResults);
-
- } else {
- NicInfo->ConfigInfo = NULL;
}

//
- // Add the Nic's info to the global NicInfoList.
+ // Get the config policy.
//
- InsertTailList (&NicInfoList, &NicInfo->Link);
+ DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypePolicy,
+ &DataSize,
+ &IfCb->Policy
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- FreePool (NicConfigRequest);
- FreePool (ConfigResp);
- FreePool (ConfigHdr);
+
+ InsertTailList (IfList, &IfCb->Link);
+
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
+ //
+ // Only need the appointed interface, keep the allocated buffer.
+ //
+ IfCb = NULL;
+ IfInfo = NULL;
+ break;
+ }
}

- FreePool (Handles);
+ if (HandleBuffer != NULL) {
+ FreePool (HandleBuffer);
+ }

return EFI_SUCCESS;
-
+
ON_ERROR:
- if (AccessResults != NULL) {
- FreePool (AccessResults);
- }
- if (NicConfigRequest != NULL) {
- FreePool (NicConfigRequest);
- }
- if (NicInfo != NULL) {
- FreePool (NicInfo);
- }
- if (ConfigResp != NULL) {
- FreePool (ConfigResp);
- }
- if (ConfigHdr != NULL) {
- FreePool (ConfigHdr);
+
+ if (IfInfo != NULL) {
+ FreePool (IfInfo);
}

- FreePool (Handles);
+ if (IfCb != NULL) {
+ FreePool (IfCb);
+ }

return Status;
}

/**
- Set the address for the specified nic by HII service.
+ The list process of the ifconfig command.

- @param[in] NicInfo A pointer to the NIC_INFO of the Nic to be configured.
- @param[in] Config The command line arguments for the set operation.
+ @param[in] IfList The pointer of IfList(interface list).
+
+ @retval EFI_SUCCESS The ifconfig command list processed successfully.
+ @retval others The ifconfig command list process failed.

- @retval EFI_SUCCESS The address set operation is done.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddrByHii (
- IN CONST NIC_INFO *NicInfo,
- IN CONST NIC_IP4_CONFIG_INFO *Config
+EFI_STATUS
+IfConfigShowInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- SHELL_STATUS ShellStatus;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfig = NULL;
- ShellStatus = SHELL_SUCCESS;
-
- Status = GetChildHandle (NicInfo->Handle, &ChildHandle);
- if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility
- //
- ChildHandle = NicInfo->Handle;
- }
- //
- // Construct config request string header
- //
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IPv4_ADDRESS Gateway;
+ UINT32 Index;

- NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfig == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- if (Config != NULL) {
- CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

//
- // Append OFFSET/WIDTH pair
+ // Go through the interface list.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ while (Entry != IfList) {
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

- //
- // Call HII helper function to generate configuration string
- //
- Status = mHiiConfigRouting->BlockToConfig (
- mHiiConfigRouting,
- ConfigResp,
- (UINT8 *) NicConfig,
- NIC_ITEM_CONFIG_SIZE,
- &AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);

- //
- // Set IP setting by HII servie
- //
- Status = mHiiConfigRouting->RouteConfig (
- mHiiConfigRouting,
- AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
- }
+ //
+ // Print interface name.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);

-ON_EXIT:
- SHELL_FREE_NON_NULL(AccessResults);
- SHELL_FREE_NON_NULL(NicConfig);
- SHELL_FREE_NON_NULL(ConfigResp);
- SHELL_FREE_NON_NULL(ConfigHdr);
+ //
+ // Print interface config policy.
+ //
+ if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_AUTO), gShellNetwork1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);
+ }

- return ShellStatus;
-}
+ //
+ // Print mac address of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);

-/**
- The callback function for the Arp address resolved event.
+ IfConfigPrintMacAddr (
+ IfCb->IfInfo->HwAddress.Addr,
+ IfCb->IfInfo->HwAddressSize
+ );

- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-IfconfigOnArpResolved (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- ARP_REQUEST *Request;
- UINT8 Index;
-
- Request = (ARP_REQUEST *) Context;
- ASSERT (Request != NULL);
+ //
+ // Print IPv4 address list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);

- Request->Duplicate = FALSE;
-
- if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, Request->MacLen)) {
ShellPrintHiiEx(
-1,
-1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Already Configured",
- (UINTN)Request->DestIp.v4.Addr[0],
- (UINTN)Request->DestIp.v4.Addr[1],
- (UINTN)Request->DestIp.v4.Addr[2],
- (UINTN)Request->DestIp.v4.Addr[3]
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[3]
);
- ArpResolved = TRUE;
- return;
- }
-
- for (Index = 0; Index < Request->MacLen; Index++) {
- if (Request->DestMac.Addr[Index] != 0) {
- Request->Duplicate = TRUE;
- }
- }

- if (Request->Duplicate) {
+ //
+ // Print subnet mask list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
+
ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)Request->DestMac.Addr[0],
- (UINTN)Request->DestMac.Addr[1],
- (UINTN)Request->DestMac.Addr[2],
- (UINTN)Request->DestMac.Addr[3],
- (UINTN)Request->DestMac.Addr[4],
- (UINTN)Request->DestMac.Addr[5]
- );
- }
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]
+ );

- ArpResolved = TRUE;
- return ;
-}
+ //
+ // Print default gateway of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);

-/**
- Check whether the address to be configured conflicts with other hosts.
+ ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
+
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
+ (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
+ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
+ }
+ }

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
- @param[in] IpAddr The IPv4 address to be configured to the Nic.
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)Gateway.Addr[0],
+ (UINTN)Gateway.Addr[1],
+ (UINTN)Gateway.Addr[2],
+ (UINTN)Gateway.Addr[3]
+ );
+
+ //
+ // Print route table entry.
+ //
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);

- @return TRUE Some other host already uses the IpAddr.
- @return FALSE The address is unused.
-**/
-BOOLEAN
-EFIAPI
-IfconfigIsIpDuplicate (
- IN NIC_INFO *NicInfo,
- IN IP4_ADDR IpAddr
- )
-{
- EFI_ARP_PROTOCOL *Arp;
- EFI_ARP_CONFIG_DATA ArpCfgData;
- EFI_HANDLE ArpHandle;
- ARP_REQUEST Request;
- EFI_STATUS Status;
-
- Arp = NULL;
- ArpHandle = NULL;
- ZeroMem (&Request, sizeof (ARP_REQUEST));
-
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- &ArpHandle
- );
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);

- if (EFI_ERROR (Status)) {
- return FALSE;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Subnet ",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]
+ );

- Status = gBS->OpenProtocol (
- ArpHandle,
- &gEfiArpProtocolGuid,
- (VOID**)&Arp,
- gImageHandle,
- ArpHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Netmask",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]
+ );

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Gateway",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]
+ );
+ }

- //
- // Set up the Arp requests
- //
- EFI_IP4_TO_U32 (Request.DestIp.v4) = IpAddr;
- EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;
- Request.LocalMac = NicInfo->NicAddress.MacAddr;
- Request.MacLen = NicInfo->NicAddress.Len;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- IfconfigOnArpResolved,
- (VOID *) &Request,
- &Request.OnResolved
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ArpCfgData.SwAddressType = 0x0800;
- ArpCfgData.SwAddressLength = 4;
- ArpCfgData.StationAddress = &Request.LocalIp;
- ArpCfgData.EntryTimeOut = 0;
- ArpCfgData.RetryCount = 3;
- ArpCfgData.RetryTimeOut = 0;
-
- Status = Arp->Configure (Arp, &ArpCfgData);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ //
+ // Print dns server addresses list of the interface if has.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);

- Status = Arp->Request (
- Arp,
- &Request.DestIp,
- Request.OnResolved,
- &Request.DestMac
- );
-
- if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
- goto ON_EXIT;
- }
+ for (Index = 0; Index < IfCb->DnsCnt; Index++) {
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN) IfCb->DnsAddr[Index].Addr[0],
+ (UINTN) IfCb->DnsAddr[Index].Addr[1],
+ (UINTN) IfCb->DnsAddr[Index].Addr[2],
+ (UINTN) IfCb->DnsAddr[Index].Addr[3]
+ );

- while (!ArpResolved) {
-
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+ }

-ON_EXIT:
- if (Request.OnResolved != NULL) {
- gBS->CloseEvent (Request.OnResolved);
- }
+ //
+ // Print route table of the interface if has.
+ //

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- ArpHandle
- );
+ Entry = Entry->ForwardLink;

- return Request.Duplicate;
+ }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
+ return EFI_SUCCESS;
}

/**
- The callback function for the timer event used to get map.
-
- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-TimeoutToGetMap (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- mTimeout = TRUE;
- return ;
-}
+ The clean process of the ifconfig command to clear interface info.

-/**
- Create an IP child, use it to start the auto configuration, then destroy it.
+ @param[in] IfList The pointer of IfList(interface list).

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
+ @retval EFI_SUCCESS The ifconfig command clean processed successfully.
+ @retval others The ifconfig command clean process failed.

- @retval EFI_SUCCESS The configuration is done.
**/
EFI_STATUS
-EFIAPI
-IfconfigStartIp4(
- IN NIC_INFO *NicInfo
+IfConfigClearInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_IP4_PROTOCOL *Ip4;
- EFI_HANDLE Ip4Handle;
- EFI_HANDLE TimerToGetMap;
- EFI_IP4_CONFIG_DATA Ip4ConfigData;
- EFI_IP4_MODE_DATA Ip4Mode;
- EFI_STATUS Status;
-
- //
- // Get the Ip4ServiceBinding Protocol
- //
- Ip4Handle = NULL;
- Ip4 = NULL;
- TimerToGetMap = NULL;
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IP4_CONFIG2_POLICY Policy;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), gShellNetwork1HiiHandle);
+ Policy = Ip4Config2PolicyDhcp;
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- &Ip4Handle
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

- Status = gBS->OpenProtocol (
- Ip4Handle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- NicInfo->Handle,
- gImageHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ //
+ // Go through the interface list.
+ //
+ while (Entry != IfList) {

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );

- Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
- Ip4ConfigData.AcceptAnyProtocol = FALSE;
- Ip4ConfigData.AcceptIcmpErrors = FALSE;
- Ip4ConfigData.AcceptBroadcast = FALSE;
- Ip4ConfigData.AcceptPromiscuous = FALSE;
- Ip4ConfigData.UseDefaultAddress = TRUE;
- ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
- ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- Ip4ConfigData.TypeOfService = 0;
- Ip4ConfigData.TimeToLive = 1;
- Ip4ConfigData.DoNotFragment = FALSE;
- Ip4ConfigData.RawData = FALSE;
- Ip4ConfigData.ReceiveTimeout = 0;
- Ip4ConfigData.TransmitTimeout = 0;
-
- Status = Ip4->Configure (Ip4, &Ip4ConfigData);
-
- if (Status == EFI_NO_MAPPING) {
- mTimeout = FALSE;
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL | EVT_TIMER,
- TPL_CALLBACK,
- TimeoutToGetMap,
- NULL,
- &TimerToGetMap
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->SetTimer (
- TimerToGetMap,
- TimerRelative,
- MultU64x32 (SecondsToNanoSeconds, 5)
- );
-
if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ break;
}

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), gShellNetwork1HiiHandle);
-
- while (!mTimeout) {
- Ip4->Poll (Ip4);
-
- if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) &&
- Ip4Mode.IsConfigured) {
- break;
- }
- }
- }
-
- Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);
-
- if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Default",
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]
- );
- }
-
-ON_EXIT:
-
- if (EFI_ERROR (Status)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);
- }
-
- if (TimerToGetMap != NULL) {
- gBS->SetTimer (TimerToGetMap, TimerCancel, 0);
- gBS->CloseEvent (TimerToGetMap);
+ Entry = Entry->ForwardLink;
}

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Ip4Handle
- );
-
return Status;
}

/**
- Set the address for the nic specified by the params.
+ The set process of the ifconfig command.
+
+ @param[in] IfList The pointer of IfList(interface list).
+ @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).

- @param[in] Argc The count of the passed in Params.
- @param[in] Params The command line arguments for the set operation.
+ @retval EFI_SUCCESS The ifconfig command set processed successfully.
+ @retval others The ifconfig command set process failed.

- @retval EFI_SUCCESS The address set operation is done.
- @return Some error occurs.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddr (
- IN UINTN Argc,
- IN CONST CHAR16 *Params
+EFI_STATUS
+IfConfigSetInterfaceInfo (
+ IN LIST_ENTRY *IfList,
+ IN ARG_LIST *VarArg
)
{
- NIC_IP4_CONFIG_INFO *Config;
- NIC_IP4_CONFIG_INFO *OldConfig;
- EFI_IP_ADDRESS Ip;
- EFI_IP_ADDRESS Mask;
- EFI_IP_ADDRESS Gateway;
- NIC_INFO *Info;
- BOOLEAN Permanent;
- SHELL_STATUS ShellStatus;
- CONST CHAR16 *Walker;
- CHAR16 *Temp;
- CONST CHAR16 *DhcpTemp;
- CONST CHAR16 *StaticTemp;
- CONST CHAR16 *PermTemp;
- UINT32 NetworkBytes1;
- UINT32 NetworkBytes2;
- EFI_STATUS Status;
-
- Walker = Params;
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- Info = IfconfigFindNicByName (Temp);
-
- if (Info == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);
- return SHELL_NOT_FOUND;
+
+ EFI_STATUS Status;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ VAR_CHECK_CODE CheckCode;
+ EFI_EVENT TimeOutEvt;
+ EFI_EVENT MappedEvt;
+ BOOLEAN IsAddressOk;
+
+ EFI_IP4_CONFIG2_POLICY Policy;
+ EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
+ UINTN DataSize;
+ EFI_IPv4_ADDRESS Gateway;
+ EFI_IPv4_ADDRESS *Dns;
+ ARG_LIST *Tmp;
+ UINTN Index;
+
+ CONST CHAR16* Temp1;
+ CONST CHAR16* Temp2;
+
+ Dns = NULL;
+
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
+ return EFI_INVALID_PARAMETER;
}
+
+ //
+ // Make sure to set only one interface each time.
+ //
+ IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
+ Status = EFI_SUCCESS;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")==NULL?0:StrStr(Walker, L" ")-Walker);
+ //
+ // Initialize check list mechanism.
+ //
+ CheckCode = IfConfigRetriveCheckListByName(
+ NULL,
+ NULL,
+ TRUE
+ );

- Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof (EFI_IP4_ROUTE_TABLE));
- if (Config == NULL) {
- return SHELL_OUT_OF_RESOURCES;
+ //
+ // Create events & timers for asynchronous settings.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &TimeOutEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
}

- Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);
-
- OldConfig = Info->ConfigInfo;
- Permanent = FALSE;
- ShellStatus = SHELL_INVALID_PARAMETER;
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ IfConfigManualAddressNotify,
+ &IsAddressOk,
+ &MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- DhcpTemp = DhcpString;
- StaticTemp = StaticString;
-
- if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {
+ //
+ // Parse the setting variables.
+ //
+ while (VarArg != NULL) {
//
- // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP permanent
+ // Check invalid parameters (duplication & unknown & conflict).
//
- if ((Argc != 2) && (Argc!= 3)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ CheckCode = IfConfigRetriveCheckListByName(
+ mSetCheckList,
+ VarArg->Arg,
+ FALSE
+ );

- if (Argc == 3) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ if (VarCheckOk != CheckCode) {
+ switch (CheckCode) {
+ case VarCheckDuplicate:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ case VarCheckConflict:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- Permanent = TRUE;
- }
+ case VarCheckUnknown:
+ //
+ // To handle unsupported option.
+ //
+ Temp1 = VarArg->Arg;
+ Temp2 = PermanentString;
+ if (StringNoCaseCompare(&Temp1, &Temp2) == 0) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString);
+ goto ON_EXIT;
+ }

- if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&
- (OldConfig->Permanent == Permanent)) {
+ //
+ // To handle unknown option.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);
- ShellStatus = SHELL_ALREADY_STARTED;
- goto ON_EXIT;
+ default:
+ break;
+ }
+
+ VarArg = VarArg->Next;
+ continue;
}

- Config->Source = IP4_CONFIG_SOURCE_DHCP;
- } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {
//
- // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
- // eth0 static IP NETMASK GATEWAY permanent
+ // Process valid variables.
//
- if ((Argc != 5) && (Argc != 6)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
-
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
+ if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
+ //
+ // Set dhcp config policy
+ //
+ Policy = Ip4Config2PolicyDhcp;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ } else if (StrCmp (VarArg->Arg, L"static") == 0) {
+ //
+ // Set manual config policy.
+ //
+ Policy = Ip4Config2PolicyStatic;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- if (Argc == 6) {
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- } else {
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
- }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- if (Argc == 6) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ ZeroMem (&ManualAddress, sizeof (ManualAddress));
+
+ //
+ // Get manual IP address.
+ //
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+ //
+ // Get subnetmask.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
+ if (EFI_ERROR(Status)) {
goto ON_EXIT;
}

- Permanent = TRUE;
- }
+ //
+ // Get gateway.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+
+ IsAddressOk = FALSE;
+
+ Status = IfCb->IfCfg->RegisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- NetworkBytes1 = NTOHL (Ip.Addr[0]);
- NetworkBytes2 = NTOHL (Mask.Addr[0]);
- if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
+ DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ DataSize,
+ &ManualAddress
+ );

- NetworkBytes1 = NTOHL (Gateway.Addr[0]);
- if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
-
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ if (Status == EFI_NOT_READY) {
+ gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);

- //
- // Set the configuration up, two route table entries are added:
- // one for the direct connected network, and another for the
- // default gateway. Remember, some structure members are cleared
- // by AllocateZeroPool
- //
- Config->Source = IP4_CONFIG_SOURCE_STATIC;
- Config->Ip4Info.RouteTableSize = 2;
+ while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
+ if (IsAddressOk) {
+ Status = EFI_SUCCESS;
+ break;
+ }
+ }
+ }

- CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
+ IfCb->IfCfg->UnregisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );

- Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_MAN_HOST), gShellNetwork1HiiHandle, Status);
+ goto ON_EXIT;
+ }

- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));
- } else {
- // neither static or DHCP. error.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ //
+ // Set gateway.
+ //
+ DataSize = sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeGateway,
+ DataSize,
+ &Gateway
+ );
+ VarArg = VarArg->Next;
+
+ } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
+ //
+ // Get DNS addresses.
+ //
+ VarArg = VarArg->Next;
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Index ++;
+ Tmp = Tmp->Next;
+ }

- CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));
- Config->Permanent = Permanent;
+ Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+ Index ++;
+ Tmp = Tmp->Next;
+ }
+
+ VarArg = Tmp;

- //
- // Use HII service to set NIC address
- //
- ShellStatus = IfconfigSetNicAddrByHii (Info, Config);
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- goto ON_EXIT;
- }
+ //
+ // Set DNS addresses.
+ //
+ DataSize = Index * sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeDnsServer,
+ DataSize,
+ Dns
+ );
+
+ }

- Status = IfconfigStartIp4 (Info);
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
}

- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- }
-
ON_EXIT:
- SHELL_FREE_NON_NULL(Config);
+ if (Dns != NULL) {
+ FreePool (Dns);
+ }

- return ShellStatus;
+ return EFI_SUCCESS;
+
}

/**
- Show the address information for the nic specified.
+ The ifconfig command main process.
+
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.
+
+ @retval EFI_SUCCESS ifconfig command processed successfully.
+ @retval others The ifconfig command process failed.

- @param[in] Name A pointer to the string containg the nic's name, if NULL,
- all nics' information is shown.
**/
-VOID
-EFIAPI
-IfconfigShowNicInfo (
- IN CONST CHAR16 *Name
+EFI_STATUS
+IfConfig (
+ IN IFCONFIG_PRIVATE_DATA *Private
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *NicInfo;
- UINT32 Index;
- EFI_IP4_IPCONFIG_DATA *Ip4Config;
- EFI_IPv4_ADDRESS Gateway;
- CONST CHAR16 *TempString;
+ EFI_STATUS Status;

- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- NicInfo = BASE_CR (Entry, NIC_INFO, Link);
+ //
+ // Get configure information of all interfaces.
+ //
+ Status = IfConfigGetInterfaceInfo (
+ Private->ImageHandle,
+ Private->IfName,
+ &Private->IfList
+ );

- TempString = (CHAR16*)NicInfo->Name;
- if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {
- continue;
- }
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), gShellNetwork1HiiHandle, NicInfo->Name);
+ switch (Private->OpCode) {
+ case IfConfigOpList:
+ Status = IfConfigShowInterfaceInfo (&Private->IfList);
+ break;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[0],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[1],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[3],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[4],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]
- );
-
- Print (L" Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : L"Media disconnected");
-
- if (NicInfo->ConfigInfo == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);
- continue;
- }
+ case IfConfigOpClear:
+ Status = IfConfigClearInterfaceInfo (&Private->IfList);
+ break;

- if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"DHCP");
- } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"STATIC");
- } else {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"Unknown");
- }
+ case IfConfigOpSet:
+ Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,
- STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),
- gShellNetwork1HiiHandle,
- (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")
- );
+ default:
+ Status = EFI_ABORTED;
+ }

- Ip4Config = &NicInfo->ConfigInfo->Ip4Info;
+ON_EXIT:

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"IP address",
- (UINTN)Ip4Config->StationAddress.Addr[0],
- (UINTN)Ip4Config->StationAddress.Addr[1],
- (UINTN)Ip4Config->StationAddress.Addr[2],
- (UINTN)Ip4Config->StationAddress.Addr[3]
- );
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Mask",
- (UINTN)Ip4Config->SubnetMask.Addr[0],
- (UINTN)Ip4Config->SubnetMask.Addr[1],
- (UINTN)Ip4Config->SubnetMask.Addr[2],
- (UINTN)Ip4Config->SubnetMask.Addr[3]
- );
+ return Status;
+}

- ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
- (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
- CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- }
-
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Gateway.Addr[0],
- (UINTN)Gateway.Addr[1],
- (UINTN)Gateway.Addr[2],
- (UINTN)Gateway.Addr[3]
- );
+/**
+ The ifconfig command cleanup process, free the allocated memory.

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.

- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
+**/
+VOID
+IfConfigCleanup (
+ IN IFCONFIG_PRIVATE_DATA *Private
+ )
+{
+ LIST_ENTRY *Entry;
+ LIST_ENTRY *NextEntry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ ARG_LIST *ArgNode;
+ ARG_LIST *ArgHead;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Subnet",
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]
- );
+ ASSERT (Private != NULL);

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Netmask",
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]
- );
+ //
+ // Clean the list which save the set config Args.
+ //
+ if (Private->VarArg != NULL) {
+ ArgHead = Private->VarArg;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]
- );
+ while (ArgHead->Next != NULL) {
+ ArgNode = ArgHead->Next;
+ FreePool (ArgHead);
+ ArgHead = ArgNode;
}
+
+ FreePool (ArgHead);
}

- return ;
-}
+ if (Private->IfName != NULL)
+ FreePool (Private->IfName);

-/**
- Clear address configuration for the nic specified.

- @param[in] Name A pointer to the string containg the nic's name,
- if NULL, all nics address configurations are cleared.
+ //
+ // Clean the IFCONFIG_INTERFACE_CB list.
+ //
+ Entry = Private->IfList.ForwardLink;
+ NextEntry = Entry->ForwardLink;

- @retval EFI_SUCCESS The address configuration is cleared.
- @return Some error occurs.
-**/
-EFI_STATUS
-EFIAPI
-IfconfigClearNicAddr (
- IN CONST CHAR16 *Name
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- EFI_STATUS Status;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ while (Entry != &Private->IfList) {

- if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {
- continue;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

-// if (Info->NicIp4Config == NULL) {
- Status = IfconfigSetNicAddrByHii (Info, NULL);
-// } else {
-// Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
-// }
+ RemoveEntryList (&IfCb->Link);

- if (EFI_ERROR (Status)) {
- return Status;
+ if (IfCb->IfInfo != NULL) {
+
+ FreePool (IfCb->IfInfo);
}
+
+ FreePool (IfCb);
+
+ Entry = NextEntry;
+ NextEntry = Entry->ForwardLink;
}

- return EFI_SUCCESS;
-
+ FreePool (Private);
}

/**
Function for 'ifconfig' command.

@param[in] ImageHandle Handle to the Image (NULL if Internal).
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
+
**/
SHELL_STATUS
EFIAPI
ShellCommandRunIfconfig (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- EFI_STATUS Status;
- LIST_ENTRY *Package;
- CHAR16 *ProblemParam;
- SHELL_STATUS ShellStatus;
- BOOLEAN ListOperation;
- BOOLEAN ClearOperation;
- BOOLEAN SetOperation;
- CONST CHAR16 *Item;
- LIST_ENTRY *Entry;
- NIC_INFO *Info;
-
- InitializeListHead (&NicInfoList);
- Status = EFI_INVALID_PARAMETER;
- ShellStatus = SHELL_SUCCESS;
+ EFI_STATUS Status;
+ IFCONFIG_PRIVATE_DATA *Private;
+ LIST_ENTRY *ParamPackage;
+ CONST CHAR16 *ValueStr;
+ ARG_LIST *ArgList;
+ CHAR16 *ProblemParam;
+ CHAR16 *Str;
+
+ Private = NULL;
+
+ Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_COMMAND), gShellNetwork1HiiHandle, ProblemParam);
+ goto ON_EXIT;
+ }

//
- // initialize the shell lib (we must be in non-auto-init...)
+ // To handle unsupported option.
//
- Status = ShellInitialize();
- ASSERT_EFI_ERROR(Status);
+ if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+ goto ON_EXIT;
+ }

//
- // parse the command line
+ // To handle no option.
//
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
- if (EFI_ERROR(Status)) {
- if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
- FreePool(ProblemParam);
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- ASSERT(FALSE);
- }
-
- goto Done;
+ if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
+ !ShellCommandLineGetFlag (ParamPackage, L"-h") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}

- ClearOperation = ShellCommandLineGetFlag(Package, L"-c");
- ListOperation = ShellCommandLineGetFlag(Package, L"-l");
- SetOperation = ShellCommandLineGetFlag(Package, L"-s");
-
- if ((ClearOperation && ListOperation)
- ||(SetOperation && ListOperation)
- ||(ClearOperation && SetOperation)
- ) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- } else if (!ClearOperation && !ListOperation && !SetOperation) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ //
+ // To handle conflict options.
+ //
+ if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-h")))) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_OPTIONS), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
+
+ //
+ // To show the help information of ifconfig command.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-h")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_HELP), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
-
- Status = IfconfigGetAllNicInfoByHii ();
- if (EFI_ERROR (Status)) {
- if (mIp4ConfigExist) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), gShellNetwork1HiiHandle, Status);
- } else {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellNetwork1HiiHandle, L"ifconfig", L"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid);
- }

- return SHELL_NOT_FOUND;
+ Status = EFI_INVALID_PARAMETER;
+
+ Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
+
+ if (Private == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
}

- if (ListOperation) {
- Item = ShellCommandLineGetValue (Package, L"-l");
+ InitializeListHead (&Private->IfList);
+
+ //
+ // To get interface name for the list option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ Private->OpCode = IfConfigOpList;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name for the clear option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
+ Private->OpCode = IfConfigOpClear;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name and corresponding Args for the set option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-l");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
+ if (ValueStr == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_INTERFACE), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }

//
- // Show the configuration.
+ // To split the configuration into multi-section.
//
- IfconfigShowNicInfo (Item);
- } else if (SetOperation) {
- Item = ShellCommandLineGetValue (Package, L"-s");
+ ArgList = SplitStrToList (ValueStr, L' ');
+ ASSERT (ArgList != NULL);

- //
- // The correct command line arguments for setting address are:
- // IfConfig -s eth0 DHCP [permanent]
- // IfConfig -s eth0 static ip netmask gateway [permanent]
- //
- if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) || (CountSubItems(Item) == 4)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_NO_VALUE), gShellNetwork1HiiHandle, L"ifconfig", L"-s");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ Private->OpCode = IfConfigOpSet;
+ Private->IfName = ArgList->Arg;

- ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);
- } else if (ClearOperation) {
- Item = ShellCommandLineGetValue (Package, L"-c");
+ Private->VarArg = ArgList->Next;

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-c");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ if (Private->IfName == NULL || Private->VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_COMMAND), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
- IfconfigClearNicAddr (Item);
- } else {
- ASSERT(FALSE);
}
+
+ //
+ // Main process of ifconfig.
+ //
+ Status = IfConfig (Private);

-Done:
- while (!IsListEmpty (&NicInfoList)) {
- Entry = NicInfoList.ForwardLink;
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ON_EXIT:

- RemoveEntryList (Entry);
+ ShellCommandLineFreeVarList (ParamPackage);
+ if (Private != NULL)
+ IfConfigCleanup (Private);

- if (Info->ConfigInfo != NULL) {
- FreePool (Info->ConfigInfo);
- }
+ return Status;
+}

- FreePool (Info);
- }

- if (Package != NULL) {
- ShellCommandLineFreeVarList(Package);
- }

- return (ShellStatus);
-}
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index e23588a..af96379 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -909,20 +909,20 @@ PingCreateIpInstance (
//
if (Private->IpChoice == PING_IP_CHOICE_IP6) {
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
} else {
ASSERT(Private->IpChoice == PING_IP_CHOICE_IP4);
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
}
//
@@ -953,11 +953,11 @@ PingCreateIpInstance (
// Ip6config protocol and ip6 service binding protocol are installed
// on the same handle.
//
Status = gBS->HandleProtocol (
HandleBuffer[HandleIndex],
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
(VOID **) &IpXCfg
);

if (EFI_ERROR (Status)) {
goto ON_ERROR;
@@ -971,12 +971,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
}

@@ -1007,12 +1008,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
}

@@ -1043,11 +1045,11 @@ PingCreateIpInstance (
}
} else {
//
// IP4 address check
//
- if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {
+ if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {
//
// Match a certain interface address.
//
break;
}
@@ -1135,15 +1137,10 @@ PingCreateIpInstance (
ZeroMem (&Ip4Config, sizeof (EFI_IP4_CONFIG_DATA));

//
// Configure the ip4 instance for icmp4 packet exchange.
//
-// PING_IP4_COPY_ADDRESS (&Ip4Config.StationAddress, &Private->SrcAddress);
-// Ip4Config.SubnetMask.Addr[0] = 0xFF;
-// Ip4Config.SubnetMask.Addr[1] = 0xFF;
-// Ip4Config.SubnetMask.Addr[2] = 0xFF;
-// Ip4Config.SubnetMask.Addr[3] = 0x00;
Ip4Config.DefaultProtocol = 1;
Ip4Config.AcceptAnyProtocol = FALSE;
Ip4Config.AcceptBroadcast = FALSE;
Ip4Config.AcceptIcmpErrors = TRUE;
Ip4Config.AcceptPromiscuous = FALSE;
@@ -1461,11 +1458,11 @@ ShellCommandRunPing (
ShellStatus = SHELL_SUCCESS;
ProblemParam = NULL;

Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}

if (ShellCommandLineGetFlag (ParamPackage, L"-_ip6")) {
@@ -1481,11 +1478,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
SendNumber = DEFAULT_SEND_COUNT;
@@ -1499,11 +1496,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
BufferSize = DEFAULT_BUFFER_SIZE;
@@ -1522,26 +1519,26 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &SrcAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
// Parse the paramter of destination ip address.
//
NonOptionCount = ShellCommandLineGetCount(ParamPackage);
if (NonOptionCount < 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (NonOptionCount > 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
ValueStr = ShellCommandLineGetRawValue (ParamPackage, 1);
if (ValueStr != NULL) {
@@ -1550,11 +1547,11 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &DstAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
index 49849a6..5151179 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
@@ -1,9 +1,9 @@
/** @file
Main file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

@@ -63,11 +63,11 @@ ShellNetwork1CommandsLibConstructor (
}
//
// install our shell command handlers
//
ShellCommandRegisterCommandName(L"ping", ShellCommandRunPing , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_PING));
- ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_IFCONFIG));
+ ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_IFCONFIG_HELP));

return (EFI_SUCCESS);
}

/**
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
index 68a7c93..98b40df 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
@@ -1,9 +1,9 @@
/** @file
header file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -24,13 +24,11 @@
#include <Protocol/Cpu.h>
#include <Protocol/ServiceBinding.h>
#include <Protocol/Ip6.h>
#include <Protocol/Ip6Config.h>
#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/Ip4Config2.h>
#include <Protocol/Arp.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
@@ -45,12 +43,10 @@
#include <Library/HiiLib.h>
#include <Library/NetLib.h>
#include <Library/DevicePathLib.h>
#include <Library/PrintLib.h>

-#include <Guid/NicIp4ConfigNvData.h>
-
extern EFI_HANDLE gShellNetwork1HiiHandle;

/**
Function for 'ping' command.

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
index 527d2ef..6dfbbe5 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
@@ -57,11 +57,11 @@
gEfiCpuArchProtocolGuid ## CONSUMES
gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES

- gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES

[Guids]
gShellNetwork1HiiGuid ## SOMETIMES_CONSUMES ## HII
\ No newline at end of file
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index aa27c678339c5e94c9c936d9a7ea74b6b043c200..65edb0a407754247e91009929a3525b2ad5dd96e 100644
GIT binary patch
literal 21554
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
NnXgL}rJk4f{{V5RRI&g7

literal 20112
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
--
1.9.5.msysgit.1



------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------

------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/

------------------------------

_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel


End of edk2-devel Digest, Vol 66, Issue 424
*******************************************
Carsey, Jaben
2015-07-02 01:00:58 UTC
Permalink
Jiaxin, I think he meant to ask for the attachment .patch file.
Post by Wu, Jiaxin
-----Original Message-----
Sent: Wednesday, July 01, 2015 5:42 PM
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library
Importance: High
Hi Tapan,
I have already sent out the patch to edk2-devel.
Thanks.
Jiaxin
-----Original Message-----
Sent: Thursday, July 2, 2015 1:00 AM
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library
Jiaxin,
Can you send out an updated patch file for review?
Thanks,
Tapan
-----Original Message-----
Sent: Wednesday, July 01, 2015 10:55 AM
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library
Hi Tapan,
Thank you for your comments, I have updated patch according below and other reviewers comments.
For the copyright, I have confirm that HP's copyright should be kept, I have recovered it and just update Intel copyright year.
Best Regards!
Jiaxin
-----Original Message-----
Sent: Wednesday, July 1, 2015 12:55 AM
Subject: edk2-devel Digest, Vol 66, Issue 424
Send edk2-devel mailing list submissions to
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/edk2-devel
or, via email, send a message with subject or body 'help' to
You can reach the person managing the list at
When replying, please edit your Subject line so it is more specific
than "Re: Contents of edk2-devel digest..."
1. Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
(Shah, Tapan)
----------------------------------------------------------------------
Message: 1
Date: Tue, 30 Jun 2015 16:54:24 +0000
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
Content-Type: text/plain; charset="utf-8"
Jiaxin,
I see that ifconfig is completely re-written and also removed HP's copyright. I am not sure if it's acceptable to remove HP's copyright
from the file. I am assuming that you have done adequate testing for this major change, can you confirm what type of testing is
performed to verify this change?
1. No need to rename below three string tokens.
STR_GEN_TOO_MANY -> STR_PING_ERR_TOO_MANY
STR_GEN_TOO_FEW -> STR_PING_ERR_TOO_FEW
STR_GEN_PARAM_INV -> STR_PING_ERR_PARAM_INV
2. All other STR_GEN_* string tokens are removed from .uni file. I suspect it may break other command. They should remain as-is and
no need to remove. We also keep it at the profile level .uni file to keep track of same generic token name and strings across all
commands.
3. STR_IFCONFIG_HELP help output of new ifconfig is not following the help output format. Need to fix it. Existing ifconfig help output
is a good example as a reference.
4. Below token shows message Ip4Config2->GetData which is not something we customer friendly. Make it a customer friendly
message.
#string STR_IFCONFIG_ERR_IP4CFG_GETDATA #language en-US "Ip4Config2->GetData return %hr\n"
Thanks,
Tapan
-----Original Message-----
Sent: Monday, June 29, 2015 8:12 PM
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
Hi Jiaxin,
Can I have the patch file?
-Shumin
-----Original Message-----
Sent: Monday, June 29, 2015 10:50 PM
Subject: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
Make the command options to be Shell2.1 compliant(For the unsupported option, display ?not supported?);
Safe string fix;
Coding style change.
This patch update ShellPkg ping/ifconfig library source code to consume Ip4Config2 protocol.
Contributed-under: TianoCore Contribution Agreement 1.0
---
.../UefiShellNetwork1CommandsLib/Ifconfig.c | 2462 ++++++++------------
.../Library/UefiShellNetwork1CommandsLib/Ping.c | 33 +-
.../UefiShellNetwork1CommandsLib.c | 4 +-
.../UefiShellNetwork1CommandsLib.h | 8 +-
.../UefiShellNetwork1CommandsLib.inf | 6 +-
.../UefiShellNetwork1CommandsLib.uni | Bin 20112 -> 21554 bytes
6 files changed, 1040 insertions(+), 1473 deletions(-)
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index 7c3f809..61328a3 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -1,1763 +1,1337 @@
- The implementation for ifcommand shell command.
+ The implementation for Shell command ifconfig based on IP4Config2 protocol.
- (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
**/
#include "UefiShellNetwork1CommandsLib.h"
-#define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) *
MAX_IP4_CONFIG_IN_VARIABLE)
-#define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))
-
-BOOLEAN mIp4ConfigExist = FALSE;
-STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL;
+enum {
+ IfConfigOpList = 1,
+ IfConfigOpSet = 2,
+ IfConfigOpClear = 3
+};
+
+typedef enum {
+ VarCheckReserved = -1,
+ VarCheckOk = 0,
+ VarCheckDuplicate,
+ VarCheckConflict,
+ VarCheckUnknown,
+ VarCheckLackValue,
+ VarCheckOutOfMem
+} VAR_CHECK_CODE;
+
+typedef enum {
+ FlagTypeSingle = 0,
+ FlagTypeNeedVar,
+ FlagTypeNeedSet,
+ FlagTypeSkipUnknown
+} VAR_CHECK_FLAG_TYPE;
+
+#define MACADDRMAXSIZE 32
+
+typedef struct _IFCONFIG_INTERFACE_CB {
+ EFI_HANDLE NicHandle;
+ LIST_ENTRY Link;
+ EFI_IP4_CONFIG2_PROTOCOL *IfCfg;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ EFI_IP4_CONFIG2_POLICY Policy;
+ UINT32 DnsCnt;
+ EFI_IPv4_ADDRESS DnsAddr[1];
+} IFCONFIG_INTERFACE_CB;
+
+typedef struct _ARG_LIST ARG_LIST;
+
+struct _ARG_LIST {
+ ARG_LIST *Next;
+ CHAR16 *Arg;
+};
+
+typedef struct _IFCONFIG4_PRIVATE_DATA {
+ EFI_HANDLE ImageHandle;
+ LIST_ENTRY IfList;
+
+ UINT32 OpCode;
+ CHAR16 *IfName;
+ ARG_LIST *VarArg;
+} IFCONFIG_PRIVATE_DATA;
+
+typedef struct _VAR_CHECK_ITEM{
+ CHAR16 *FlagStr;
+ UINT32 FlagID;
+ UINT32 ConflictMask;
+ VAR_CHECK_FLAG_TYPE FlagType;
+} VAR_CHECK_ITEM;
+
+SHELL_PARAM_ITEM mIfConfigCheckList[] = {
+ {
+ L"-b",
+ TypeFlag
+ },
+ {
+ L"-h",
+ TypeFlag
+ },
+ {
+ L"-l",
+ TypeValue
+ },
+ {
+ L"-r",
+ TypeValue
+ },
+ {
+ L"-c",
+ TypeValue
+ },
+ {
+ L"-s",
+ TypeMaxValue
+ },
+ {
+ NULL,
+ TypeMax
+ },
+};
+
+VAR_CHECK_ITEM mSetCheckList[] = {
+ {
+ L"static",
+ 0x00000001,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dhcp",
+ 0x00000002,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dns",
+ 0x00000008,
+ 0x00000004,
+ FlagTypeSingle
+ },
+ {
+ NULL,
+ 0x0,
+ 0x0,
+ FlagTypeSkipUnknown
+ },
+};
-STATIC CONST UINTN SecondsToNanoSeconds = 10000000;
-STATIC CONST CHAR16 DhcpString[5] = L"DHCP";
-STATIC CONST CHAR16 StaticString[7] = L"STATIC";
STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";
-typedef struct {
- LIST_ENTRY Link;
- EFI_HANDLE Handle;
- NIC_ADDR NicAddress;
- CHAR16 Name[IP4_NIC_NAME_LENGTH];
- BOOLEAN MediaPresentSupported;
- BOOLEAN MediaPresent;
- EFI_IP4_CONFIG_PROTOCOL *Ip4Config;
- NIC_IP4_CONFIG_INFO *ConfigInfo;
-} NIC_INFO;
-
-typedef struct {
- EFI_IP_ADDRESS DestIp;
- EFI_MAC_ADDRESS DestMac;
- EFI_IP_ADDRESS LocalIp;
- EFI_MAC_ADDRESS LocalMac;
- UINT8 MacLen;
- EFI_EVENT OnResolved;
- BOOLEAN Duplicate;
-} ARP_REQUEST;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- {L"-c", TypeValue},
- {L"-l", TypeValue},
- {L"-s", TypeMaxValue},
- {NULL, TypeMax}
- };
-
-STATIC LIST_ENTRY NicInfoList;
-STATIC BOOLEAN ArpResolved;
-STATIC BOOLEAN mTimeout;
-
/**
- Count the space delimited items in a string.
-
-
-**/
-UINT8
-EFIAPI
-CountSubItems (
- IN CONST CHAR16 *String
- )
-{
- CONST CHAR16 *Walker;
- UINT8 Count;
-
- if (String == NULL || *String == CHAR_NULL) {
- return (0xFF);
- }
+ Split a string with specified separator and save the substring to a list.
- for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; Walker = (StrStr(Walker, L"
")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);
- return (Count);
-}
-/**
- Find the NIC_INFO by the specified nic name.
-
**/
-NIC_INFO*
-EFIAPI
-IfconfigFindNicByName (
- IN CONST CHAR16 *Name
+ARG_LIST *
+SplitStrToList (
+ IN CONST CHAR16 *String,
+ IN CHAR16 Separator
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- CHAR16 *TempString;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
- TempString = (CHAR16*)Info->Name;
+ CHAR16 *Str;
+ CHAR16 *ArgStr;
+ ARG_LIST *ArgList;
+ ARG_LIST *ArgNode;
- if (StringNoCaseCompare (&Name, &TempString) == 0) {
- return Info;
- }
+ if (*String == L'\0') {
+ return NULL;
}
- return NULL;
-}
-
-/**
- Tests whether a child handle is a child device of the controller.
-
- opens on its parent controller.
-
-**/
-EFI_STATUS
-EFIAPI
-TestChildHandle (
- IN CONST EFI_HANDLE ControllerHandle,
- IN CONST EFI_HANDLE ChildHandle,
- IN CONST EFI_GUID *ProtocolGuid
- )
-{
- EFI_STATUS Status;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- UINTN EntryCount;
- UINTN Index;
-
- ASSERT (ProtocolGuid != NULL);
-
//
- // Retrieve the list of agents that are consuming the specific protocol
- // on ControllerHandle.
+ // Copy the CONST string to a local copy.
//
- Status = gBS->OpenProtocolInformation (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (String));
+ ASSERT (Str != NULL);
+ StrCpyS (Str, StrSize (String)/sizeof (CHAR16), String);
+ ArgStr = Str;
//
- // Inspect if ChildHandle is one of the agents.
+ // init a node for the list head.
//
- Status = EFI_UNSUPPORTED;
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&
- (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = EFI_SUCCESS;
- break;
- }
- }
-
- FreePool (OpenInfoBuffer);
- return Status;
-}
-
-/**
- Get the child handle of the NIC handle.
-
-
-**/
-EFI_STATUS
-GetChildHandle (
- IN EFI_HANDLE Controller,
- OUT EFI_HANDLE *ChildHandle
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- UINTN Index;
- EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;
- VENDOR_DEVICE_PATH *VendorDeviceNode;
+ ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode != NULL);
+ ArgList = ArgNode;
//
- // Locate all EFI Hii Config Access protocols
+ // Split the local copy and save in the list node.
//
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiHiiConfigAccessProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
- );
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return Status;
- }
-
- Status = EFI_NOT_FOUND;
-
- for (Index = 0; Index < HandleCount; Index++) {
-
- Status = TestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);
- if (!EFI_ERROR (Status)) {
- //
- // Get device path on the child handle
- //
- Status = gBS->HandleProtocol (
- Handles[Index],
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ChildDeviceDevicePath
- );
-
- if (!EFI_ERROR (Status)) {
- while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
- ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
- //
- // Parse one instance
- //
- if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&
- ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
- VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
- if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
- //
- // Found item matched gEfiNicIp4ConfigVariableGuid
- //
- *ChildHandle = Handles[Index];
- FreePool (Handles);
- return EFI_SUCCESS;
- }
- }
- }
- }
+ while (*Str != L'\0') {
+ if (*Str == Separator) {
+ *Str = L'\0';
+ ArgNode->Arg = ArgStr;
+ ArgStr = Str + 1;
+ ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode->Next != NULL);
+ ArgNode = ArgNode->Next;
}
+
+ Str++;
}
- FreePool (Handles);
- return Status;
+ ArgNode->Arg = ArgStr;
+ ArgNode->Next = NULL;
+
+ return ArgList;
}
/**
- Append OFFSET/WIDTH/VALUE items at the beginning of string.
-
-
-**/
-UINTN
-EFIAPI
-AppendOffsetWidthValue (
- IN OUT CHAR16 *String,
- IN UINTN Offset,
- IN UINTN Width,
- IN CONST UINT8 *Block
- )
-
-{
- CHAR16 *OriString;
-
- OriString = String;
-
- StrnCpy (String, L"&OFFSET=", 9);
- String += StrLen (L"&OFFSET=");
- String += UnicodeSPrint (String, 20, L"%x", Offset);
-
- StrnCpy (String,L"&WIDTH=", 8);
- String += StrLen (L"&WIDTH=");
- String += UnicodeSPrint (String, 20, L"%x", Width);
+ Check the correctness of input Args with '-s' option.
- if (Block != NULL) {
- StrnCpy (String,L"&VALUE=", 8);
- String += StrLen (L"&VALUE=");
- while ((Width--) != 0) {
- String += UnicodeSPrint (String, 20, L"%x", Block[Width]);
- }
- }
-
- return String - OriString;
-}
-/**
- Converts the unicode character of the string from uppercase to lowercase.
- This is a internal function.
**/
-CHAR16*
-EFIAPI
-HiiToLower (
- IN CHAR16 *ConfigString
- )
+VAR_CHECK_CODE
+IfConfigRetriveCheckListByName(
+ IN VAR_CHECK_ITEM *CheckList,
+ IN CHAR16 *Name,
+ IN BOOLEAN Init
+)
{
- CHAR16 *String;
- BOOLEAN Lower;
-
- //
- // Convert all hex digits in range [A-F] in the configuration header to [a-f]
- //
- for (String = ConfigString, Lower = FALSE; String != NULL && *String != L'\0'; String++) {
- if (*String == L'=') {
- Lower = TRUE;
- } else if (*String == L'&') {
- Lower = FALSE;
- } else if (Lower && *String >= L'A' && *String <= L'F') {
- *String = (CHAR16) (*String - L'A' + L'a');
- }
+ STATIC UINT32 CheckDuplicate;
+ STATIC UINT32 CheckConflict;
+ VAR_CHECK_CODE RtCode;
+ UINT32 Index;
+ VAR_CHECK_ITEM Arg;
+
+ if (Init) {
+ CheckDuplicate = 0;
+ CheckConflict = 0;
+ return VarCheckOk;
}
- return (ConfigString);
-}
-
-
-/**
- Construct <ConfigHdr> using routing information GUID/NAME/PATH.
-
-
-**/
-CHAR16 *
-EFIAPI
-ConstructConfigHdr (
- IN CONST EFI_GUID *Guid,
- IN CONST CHAR16 *Name,
- IN EFI_HANDLE DriverHandle
- )
-{
- EFI_STATUS Status;
- CHAR16 *ConfigHdr;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- CHAR16 *String;
- UINTN Index;
- UINT8 *Buffer;
- UINTN DevicePathLength;
- UINTN NameLength;
+ RtCode = VarCheckOk;
+ Index = 0;
+ Arg = CheckList[Index];
//
- // Get the device path from handle installed EFI HII Config Access protocol
+ // Check the Duplicated/Conflicted/Unknown input Args.
//
- Status = gBS->HandleProtocol (
- DriverHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath
- );
- if (EFI_ERROR (Status)) {
- return NULL;
- }
+ while (Arg.FlagStr != NULL) {
+ if (StrCmp (Arg.FlagStr, Name) == 0) {
- DevicePathLength = GetDevicePathSize (DevicePath);
- NameLength = StrLen (Name);
- ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));
- if (ConfigHdr == NULL) {
- return NULL;
- }
+ if (CheckDuplicate & Arg.FlagID) {
+ RtCode = VarCheckDuplicate;
+ break;
+ }
- String = ConfigHdr;
- StrnCpy (String, L"GUID=", 6);
- String += StrLen (L"GUID=");
+ if (CheckConflict & Arg.ConflictMask) {
+ RtCode = VarCheckConflict;
+ break;
+ }
- //
- // Append Guid converted to <HexCh>32
- //
- for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
- }
+ CheckDuplicate |= Arg.FlagID;
+ CheckConflict |= Arg.ConflictMask;
+ break;
+ }
- //
- // Append L"&NAME="
- //
- StrnCpy (String, L"&NAME=", 7);
- String += StrLen (L"&NAME=");
- for (Index = 0; Index < NameLength ; Index++) {
- String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);
+ Arg = CheckList[++Index];
}
-
- //
- // Append L"&PATH="
- //
- StrnCpy (String, L"&PATH=", 7);
- String += StrLen (L"&PATH=");
- for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
+
+ if (Arg.FlagStr == NULL) {
+ RtCode = VarCheckUnknown;
}
- return (HiiToLower(ConfigHdr));
+ return RtCode;
}
/**
- Get network physical device NIC information.
+ The notify function of create event when performing a manual config.
-**/
-EFI_STATUS
+**/
+VOID
EFIAPI
-IfConfigGetNicMacInfo (
- IN EFI_HANDLE Handle,
- OUT NIC_ADDR *NicAddr
- )
+IfConfigManualAddressNotify (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
- }
-
- NicAddr->Type = (UINT16) SnpMode.IfType;
- NicAddr->Len = (UINT8) SnpMode.HwAddressSize;
- CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);
-
-
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
-
- return Status;
-
+ *((BOOLEAN *) Context) = TRUE;
}
+
/**
- Get network physical device NIC information.
+ Print MAC address.
- Upon successful return, TRUE is media present
- is supported. FALSE otherwise.
- is enabled. FALSE otherwise.
**/
-EFI_STATUS
-EFIAPI
-IfConfigGetNicMediaStatus (
- IN EFI_HANDLE Handle,
- OUT BOOLEAN *MediaPresentSupported,
- OUT BOOLEAN *MediaPresent
- )
-
+VOID
+IfConfigPrintMacAddr (
+ IN UINT8 *Node,
+ IN UINT32 Size
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
+ UINTN Index;
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
+ ASSERT (Size <= MACADDRMAXSIZE);
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
+ for (Index = 0; Index < Size; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);
+ if (Index + 1 < Size) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle);
+ }
}
-
- *MediaPresentSupported = SnpMode.MediaPresentSupported;
- *MediaPresent = SnpMode.MediaPresent;
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+}
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
- return Status;
+/**
+ The get current status of all handles.
-}
-/**
- Get all Nic's information through HII service.
**/
EFI_STATUS
-EFIAPI
-IfconfigGetAllNicInfoByHii (
- VOID
+IfConfigGetInterfaceInfo (
+ IN EFI_HANDLE ImageHandle,
+ IN CHAR16 *IfName,
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- UINTN Index;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- UINTN BufferSize;
- NIC_INFO *NicInfo;
- NIC_IP4_CONFIG_INFO *NicConfigRequest;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfigRequest = NULL;
- NicInfo = NULL;
-
- InitializeListHead (&NicInfoList);
+ EFI_STATUS Status;
+ UINTN HandleIndex;
+ UINTN HandleNum;
+ EFI_HANDLE *HandleBuffer;
+ EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ UINTN DataSize;
- //
- // Check if HII Config Routing protocol available.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiConfigRoutingProtocolGuid,
- NULL,
- (VOID**)&mHiiConfigRouting
- );
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
+ HandleBuffer = NULL;
+ HandleNum = 0;
+
+ IfInfo = NULL;
+ IfCb = NULL;
//
- // Locate all network device handles
+ // Locate all the handles with ip4 service binding protocol.
//
Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
+ ByProtocol,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ NULL,
+ &HandleNum,
+ &HandleBuffer
);
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return EFI_NOT_FOUND;
+ if (EFI_ERROR (Status) || (HandleNum == 0)) {
+ return EFI_ABORTED;
}
- for (Index = 0; Index < HandleCount; Index++) {
- Status = GetChildHandle (Handles[Index], &ChildHandle);
+ //
+ // Enumerate all handles that installed with ip4 service binding protocol.
+ //
+ for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
+ IfCb = NULL;
+ IfInfo = NULL;
+ DataSize = 0;
+
+ //
+ // Ip4config protocol and ip4 service binding protocol are installed
+ // on the same handle.
+ //
+ ASSERT (HandleBuffer != NULL);
+ Status = gBS->HandleProtocol (
+ HandleBuffer[HandleIndex],
+ &gEfiIp4Config2ProtocolGuid,
+ (VOID **) &Ip4Cfg2
+ );
+
if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility.
- //
- ChildHandle = Handles[Index];
+ goto ON_ERROR;
}
+
//
- // Construct configuration request string header
+ // Get the interface information size.
//
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- Length = 0;
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ NULL
+ );
+
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
+
+ IfInfo = AllocateZeroPool (DataSize);
+
+ if (IfInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
-
+
//
- // Append OFFSET/WIDTH pair
+ // Get the interface info.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ IfInfo
+ );
- NicInfo = AllocateZeroPool (sizeof (NIC_INFO));
- if (NicInfo == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
goto ON_ERROR;
}
- NicInfo->Handle = Handles[Index];
-
+
//
- // Get network physical devcie MAC information
+ // Check the interface name if required.
//
- IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);
- if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);
- } else {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
+ FreePool (IfInfo);
+ continue;
}
+ DataSize = 0;
+
//
- // Get media status
+ // Get the size of dns server list.
//
- IfConfigGetNicMediaStatus (Handles[Index], &NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ NULL
+ );
+
+ if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }
- NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfigRequest == NULL) {
+ IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);
+
+ if (IfCb == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
+ IfCb->NicHandle = HandleBuffer[HandleIndex];
+ IfCb->IfInfo = IfInfo;
+ IfCb->IfCfg = Ip4Cfg2;
+ IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));
+
//
- // Get network parameters by HII service
+ // Get the dns server list if has.
//
- Status = mHiiConfigRouting->ExtractConfig (
- mHiiConfigRouting,
- ConfigResp,
- &AccessProgress,
- &AccessResults
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = NIC_ITEM_CONFIG_SIZE;
- Status = mHiiConfigRouting->ConfigToBlock (
- mHiiConfigRouting,
- AccessResults,
- (UINT8 *) NicConfigRequest,
- &BufferSize,
- &AccessProgress
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;
- NicConfig = AllocateZeroPool (BufferSize);
- if (NicConfig == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
- CopyMem (NicConfig, NicConfigRequest, BufferSize);
-
- //
- // If succeeds to get NIC configuration, fix up routetable pointer.
- //
- NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (&NicConfig->Ip4Info + 1);
- NicInfo->ConfigInfo = NicConfig;
-
- } else {
- NicInfo->ConfigInfo = NULL;
+ if (DataSize > 0) {
+
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ IfCb->DnsAddr
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
-
- FreePool (AccessResults);
-
- } else {
- NicInfo->ConfigInfo = NULL;
}
//
- // Add the Nic's info to the global NicInfoList.
+ // Get the config policy.
//
- InsertTailList (&NicInfoList, &NicInfo->Link);
+ DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypePolicy,
+ &DataSize,
+ &IfCb->Policy
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }
- FreePool (NicConfigRequest);
- FreePool (ConfigResp);
- FreePool (ConfigHdr);
+
+ InsertTailList (IfList, &IfCb->Link);
+
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
+ //
+ // Only need the appointed interface, keep the allocated buffer.
+ //
+ IfCb = NULL;
+ IfInfo = NULL;
+ break;
+ }
}
- FreePool (Handles);
+ if (HandleBuffer != NULL) {
+ FreePool (HandleBuffer);
+ }
return EFI_SUCCESS;
-
+
- if (AccessResults != NULL) {
- FreePool (AccessResults);
- }
- if (NicConfigRequest != NULL) {
- FreePool (NicConfigRequest);
- }
- if (NicInfo != NULL) {
- FreePool (NicInfo);
- }
- if (ConfigResp != NULL) {
- FreePool (ConfigResp);
- }
- if (ConfigHdr != NULL) {
- FreePool (ConfigHdr);
+
+ if (IfInfo != NULL) {
+ FreePool (IfInfo);
}
- FreePool (Handles);
+ if (IfCb != NULL) {
+ FreePool (IfCb);
+ }
return Status;
}
/**
- Set the address for the specified nic by HII service.
+ The list process of the ifconfig command.
+
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddrByHii (
- IN CONST NIC_INFO *NicInfo,
- IN CONST NIC_IP4_CONFIG_INFO *Config
+EFI_STATUS
+IfConfigShowInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- SHELL_STATUS ShellStatus;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfig = NULL;
- ShellStatus = SHELL_SUCCESS;
-
- Status = GetChildHandle (NicInfo->Handle, &ChildHandle);
- if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility
- //
- ChildHandle = NicInfo->Handle;
- }
- //
- // Construct config request string header
- //
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IPv4_ADDRESS Gateway;
+ UINT32 Index;
- NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfig == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;
- if (Config != NULL) {
- CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}
//
- // Append OFFSET/WIDTH pair
+ // Go through the interface list.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ while (Entry != IfList) {
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
- //
- // Call HII helper function to generate configuration string
- //
- Status = mHiiConfigRouting->BlockToConfig (
- mHiiConfigRouting,
- ConfigResp,
- (UINT8 *) NicConfig,
- NIC_ITEM_CONFIG_SIZE,
- &AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
- //
- // Set IP setting by HII servie
- //
- Status = mHiiConfigRouting->RouteConfig (
- mHiiConfigRouting,
- AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
- }
+ //
+ // Print interface name.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);
- SHELL_FREE_NON_NULL(AccessResults);
- SHELL_FREE_NON_NULL(NicConfig);
- SHELL_FREE_NON_NULL(ConfigResp);
- SHELL_FREE_NON_NULL(ConfigHdr);
+ //
+ // Print interface config policy.
+ //
+ if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_AUTO), gShellNetwork1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);
+ }
- return ShellStatus;
-}
+ //
+ // Print mac address of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);
-/**
- The callback function for the Arp address resolved event.
+ IfConfigPrintMacAddr (
+ IfCb->IfInfo->HwAddress.Addr,
+ IfCb->IfInfo->HwAddressSize
+ );
-**/
-VOID
-EFIAPI
-IfconfigOnArpResolved (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- ARP_REQUEST *Request;
- UINT8 Index;
-
- Request = (ARP_REQUEST *) Context;
- ASSERT (Request != NULL);
+ //
+ // Print IPv4 address list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);
- Request->Duplicate = FALSE;
-
- if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, Request->MacLen)) {
ShellPrintHiiEx(
-1,
-1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Already Configured",
- (UINTN)Request->DestIp.v4.Addr[0],
- (UINTN)Request->DestIp.v4.Addr[1],
- (UINTN)Request->DestIp.v4.Addr[2],
- (UINTN)Request->DestIp.v4.Addr[3]
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[3]
);
- ArpResolved = TRUE;
- return;
- }
-
- for (Index = 0; Index < Request->MacLen; Index++) {
- if (Request->DestMac.Addr[Index] != 0) {
- Request->Duplicate = TRUE;
- }
- }
- if (Request->Duplicate) {
+ //
+ // Print subnet mask list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
+
ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)Request->DestMac.Addr[0],
- (UINTN)Request->DestMac.Addr[1],
- (UINTN)Request->DestMac.Addr[2],
- (UINTN)Request->DestMac.Addr[3],
- (UINTN)Request->DestMac.Addr[4],
- (UINTN)Request->DestMac.Addr[5]
- );
- }
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]
+ );
- ArpResolved = TRUE;
- return ;
-}
+ //
+ // Print default gateway of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);
-/**
- Check whether the address to be configured conflicts with other hosts.
+ ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
+
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
+ (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
+ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
+ }
+ }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)Gateway.Addr[0],
+ (UINTN)Gateway.Addr[1],
+ (UINTN)Gateway.Addr[2],
+ (UINTN)Gateway.Addr[3]
+ );
+
+ //
+ // Print route table entry.
+ //
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo-
Post by Wu, Jiaxin
RouteTableSize);
-**/
-BOOLEAN
-EFIAPI
-IfconfigIsIpDuplicate (
- IN NIC_INFO *NicInfo,
- IN IP4_ADDR IpAddr
- )
-{
- EFI_ARP_PROTOCOL *Arp;
- EFI_ARP_CONFIG_DATA ArpCfgData;
- EFI_HANDLE ArpHandle;
- ARP_REQUEST Request;
- EFI_STATUS Status;
-
- Arp = NULL;
- ArpHandle = NULL;
- ZeroMem (&Request, sizeof (ARP_REQUEST));
-
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- &ArpHandle
- );
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
- if (EFI_ERROR (Status)) {
- return FALSE;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Subnet ",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]
+ );
- Status = gBS->OpenProtocol (
- ArpHandle,
- &gEfiArpProtocolGuid,
- (VOID**)&Arp,
- gImageHandle,
- ArpHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Netmask",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]
+ );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Gateway",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]
+ );
+ }
- //
- // Set up the Arp requests
- //
- EFI_IP4_TO_U32 (Request.DestIp.v4) = IpAddr;
- EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;
- Request.LocalMac = NicInfo->NicAddress.MacAddr;
- Request.MacLen = NicInfo->NicAddress.Len;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- IfconfigOnArpResolved,
- (VOID *) &Request,
- &Request.OnResolved
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ArpCfgData.SwAddressType = 0x0800;
- ArpCfgData.SwAddressLength = 4;
- ArpCfgData.StationAddress = &Request.LocalIp;
- ArpCfgData.EntryTimeOut = 0;
- ArpCfgData.RetryCount = 3;
- ArpCfgData.RetryTimeOut = 0;
-
- Status = Arp->Configure (Arp, &ArpCfgData);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ //
+ // Print dns server addresses list of the interface if has.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);
- Status = Arp->Request (
- Arp,
- &Request.DestIp,
- Request.OnResolved,
- &Request.DestMac
- );
-
- if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
- goto ON_EXIT;
- }
+ for (Index = 0; Index < IfCb->DnsCnt; Index++) {
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN) IfCb->DnsAddr[Index].Addr[0],
+ (UINTN) IfCb->DnsAddr[Index].Addr[1],
+ (UINTN) IfCb->DnsAddr[Index].Addr[2],
+ (UINTN) IfCb->DnsAddr[Index].Addr[3]
+ );
- while (!ArpResolved) {
-
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+ }
- if (Request.OnResolved != NULL) {
- gBS->CloseEvent (Request.OnResolved);
- }
+ //
+ // Print route table of the interface if has.
+ //
- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- ArpHandle
- );
+ Entry = Entry->ForwardLink;
- return Request.Duplicate;
+ }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
+ return EFI_SUCCESS;
}
/**
- The callback function for the timer event used to get map.
-
-**/
-VOID
-EFIAPI
-TimeoutToGetMap (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- mTimeout = TRUE;
- return ;
-}
+ The clean process of the ifconfig command to clear interface info.
-/**
- Create an IP child, use it to start the auto configuration, then destroy it.
**/
EFI_STATUS
-EFIAPI
-IfconfigStartIp4(
- IN NIC_INFO *NicInfo
+IfConfigClearInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_IP4_PROTOCOL *Ip4;
- EFI_HANDLE Ip4Handle;
- EFI_HANDLE TimerToGetMap;
- EFI_IP4_CONFIG_DATA Ip4ConfigData;
- EFI_IP4_MODE_DATA Ip4Mode;
- EFI_STATUS Status;
-
- //
- // Get the Ip4ServiceBinding Protocol
- //
- Ip4Handle = NULL;
- Ip4 = NULL;
- TimerToGetMap = NULL;
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IP4_CONFIG2_POLICY Policy;
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), gShellNetwork1HiiHandle);
+ Policy = Ip4Config2PolicyDhcp;
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- &Ip4Handle
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}
- Status = gBS->OpenProtocol (
- Ip4Handle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- NicInfo->Handle,
- gImageHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ //
+ // Go through the interface list.
+ //
+ while (Entry != IfList) {
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
- Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
- Ip4ConfigData.AcceptAnyProtocol = FALSE;
- Ip4ConfigData.AcceptIcmpErrors = FALSE;
- Ip4ConfigData.AcceptBroadcast = FALSE;
- Ip4ConfigData.AcceptPromiscuous = FALSE;
- Ip4ConfigData.UseDefaultAddress = TRUE;
- ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
- ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- Ip4ConfigData.TypeOfService = 0;
- Ip4ConfigData.TimeToLive = 1;
- Ip4ConfigData.DoNotFragment = FALSE;
- Ip4ConfigData.RawData = FALSE;
- Ip4ConfigData.ReceiveTimeout = 0;
- Ip4ConfigData.TransmitTimeout = 0;
-
- Status = Ip4->Configure (Ip4, &Ip4ConfigData);
-
- if (Status == EFI_NO_MAPPING) {
- mTimeout = FALSE;
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL | EVT_TIMER,
- TPL_CALLBACK,
- TimeoutToGetMap,
- NULL,
- &TimerToGetMap
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->SetTimer (
- TimerToGetMap,
- TimerRelative,
- MultU64x32 (SecondsToNanoSeconds, 5)
- );
-
if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ break;
}
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), gShellNetwork1HiiHandle);
-
- while (!mTimeout) {
- Ip4->Poll (Ip4);
-
- if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) &&
- Ip4Mode.IsConfigured) {
- break;
- }
- }
- }
-
- Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);
-
- if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Default",
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]
- );
- }
-
-
- if (EFI_ERROR (Status)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);
- }
-
- if (TimerToGetMap != NULL) {
- gBS->SetTimer (TimerToGetMap, TimerCancel, 0);
- gBS->CloseEvent (TimerToGetMap);
+ Entry = Entry->ForwardLink;
}
- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Ip4Handle
- );
-
return Status;
}
/**
- Set the address for the nic specified by the params.
+ The set process of the ifconfig command.
+
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddr (
- IN UINTN Argc,
- IN CONST CHAR16 *Params
+EFI_STATUS
+IfConfigSetInterfaceInfo (
+ IN LIST_ENTRY *IfList,
+ IN ARG_LIST *VarArg
)
{
- NIC_IP4_CONFIG_INFO *Config;
- NIC_IP4_CONFIG_INFO *OldConfig;
- EFI_IP_ADDRESS Ip;
- EFI_IP_ADDRESS Mask;
- EFI_IP_ADDRESS Gateway;
- NIC_INFO *Info;
- BOOLEAN Permanent;
- SHELL_STATUS ShellStatus;
- CONST CHAR16 *Walker;
- CHAR16 *Temp;
- CONST CHAR16 *DhcpTemp;
- CONST CHAR16 *StaticTemp;
- CONST CHAR16 *PermTemp;
- UINT32 NetworkBytes1;
- UINT32 NetworkBytes2;
- EFI_STATUS Status;
-
- Walker = Params;
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- Info = IfconfigFindNicByName (Temp);
-
- if (Info == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);
- return SHELL_NOT_FOUND;
+
+ EFI_STATUS Status;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ VAR_CHECK_CODE CheckCode;
+ EFI_EVENT TimeOutEvt;
+ EFI_EVENT MappedEvt;
+ BOOLEAN IsAddressOk;
+
+ EFI_IP4_CONFIG2_POLICY Policy;
+ EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
+ UINTN DataSize;
+ EFI_IPv4_ADDRESS Gateway;
+ EFI_IPv4_ADDRESS *Dns;
+ ARG_LIST *Tmp;
+ UINTN Index;
+
+ CONST CHAR16* Temp1;
+ CONST CHAR16* Temp2;
+
+ Dns = NULL;
+
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
+ return EFI_INVALID_PARAMETER;
}
+
+ //
+ // Make sure to set only one interface each time.
+ //
+ IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
+ Status = EFI_SUCCESS;
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")==NULL?0:StrStr(Walker, L" ")-Walker);
+ //
+ // Initialize check list mechanism.
+ //
+ CheckCode = IfConfigRetriveCheckListByName(
+ NULL,
+ NULL,
+ TRUE
+ );
- Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof (EFI_IP4_ROUTE_TABLE));
- if (Config == NULL) {
- return SHELL_OUT_OF_RESOURCES;
+ //
+ // Create events & timers for asynchronous settings.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &TimeOutEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
}
- Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);
-
- OldConfig = Info->ConfigInfo;
- Permanent = FALSE;
- ShellStatus = SHELL_INVALID_PARAMETER;
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ IfConfigManualAddressNotify,
+ &IsAddressOk,
+ &MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
- DhcpTemp = DhcpString;
- StaticTemp = StaticString;
-
- if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {
+ //
+ // Parse the setting variables.
+ //
+ while (VarArg != NULL) {
//
- // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP permanent
+ // Check invalid parameters (duplication & unknown & conflict).
//
- if ((Argc != 2) && (Argc!= 3)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ CheckCode = IfConfigRetriveCheckListByName(
+ mSetCheckList,
+ VarArg->Arg,
+ FALSE
+ );
- if (Argc == 3) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ if (VarCheckOk != CheckCode) {
+ switch (CheckCode) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg-
Post by Wu, Jiaxin
Arg);
+ break;
- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp,
PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg-
Post by Wu, Jiaxin
Arg);
+ break;
- Permanent = TRUE;
- }
+ //
+ // To handle unsupported option.
+ //
+ Temp1 = VarArg->Arg;
+ Temp2 = PermanentString;
+ if (StringNoCaseCompare(&Temp1, &Temp2) == 0) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,
PermanentString);
+ goto ON_EXIT;
+ }
- if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&
- (OldConfig->Permanent == Permanent)) {
+ //
+ // To handle unknown option.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg-
Post by Wu, Jiaxin
Arg);
+ break;
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);
- ShellStatus = SHELL_ALREADY_STARTED;
- goto ON_EXIT;
+ break;
+ }
+
+ VarArg = VarArg->Next;
+ continue;
}
- Config->Source = IP4_CONFIG_SOURCE_DHCP;
- } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {
//
- // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
- // eth0 static IP NETMASK GATEWAY permanent
+ // Process valid variables.
//
- if ((Argc != 5) && (Argc != 6)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
-
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
+ if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
+ //
+ // Set dhcp config policy
+ //
+ Policy = Ip4Config2PolicyDhcp;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ } else if (StrCmp (VarArg->Arg, L"static") == 0) {
+ //
+ // Set manual config policy.
+ //
+ Policy = Ip4Config2PolicyStatic;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- if (Argc == 6) {
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- } else {
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
- }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;
- if (Argc == 6) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ ZeroMem (&ManualAddress, sizeof (ManualAddress));
+
+ //
+ // Get manual IP address.
+ //
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp,
PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+ //
+ // Get subnetmask.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
+ if (EFI_ERROR(Status)) {
goto ON_EXIT;
}
- Permanent = TRUE;
- }
+ //
+ // Get gateway.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+
+ IsAddressOk = FALSE;
+
+ Status = IfCb->IfCfg->RegisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
- NetworkBytes1 = NTOHL (Ip.Addr[0]);
- NetworkBytes2 = NTOHL (Mask.Addr[0]);
- if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
+ DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ DataSize,
+ &ManualAddress
+ );
- NetworkBytes1 = NTOHL (Gateway.Addr[0]);
- if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
-
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ if (Status == EFI_NOT_READY) {
+ gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);
- //
- // one for the direct connected network, and another for the
- // default gateway. Remember, some structure members are cleared
- // by AllocateZeroPool
- //
- Config->Source = IP4_CONFIG_SOURCE_STATIC;
- Config->Ip4Info.RouteTableSize = 2;
+ while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
+ if (IsAddressOk) {
+ Status = EFI_SUCCESS;
+ break;
+ }
+ }
+ }
- CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
+ IfCb->IfCfg->UnregisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
- Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_MAN_HOST), gShellNetwork1HiiHandle, Status);
+ goto ON_EXIT;
+ }
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));
- } else {
- // neither static or DHCP. error.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ //
+ // Set gateway.
+ //
+ DataSize = sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeGateway,
+ DataSize,
+ &Gateway
+ );
+ VarArg = VarArg->Next;
+
+ } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
+ //
+ // Get DNS addresses.
+ //
+ VarArg = VarArg->Next;
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Index ++;
+ Tmp = Tmp->Next;
+ }
- CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));
- Config->Permanent = Permanent;
+ Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+ Index ++;
+ Tmp = Tmp->Next;
+ }
+
+ VarArg = Tmp;
- //
- // Use HII service to set NIC address
- //
- ShellStatus = IfconfigSetNicAddrByHii (Info, Config);
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- goto ON_EXIT;
- }
+ //
+ // Set DNS addresses.
+ //
+ DataSize = Index * sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeDnsServer,
+ DataSize,
+ Dns
+ );
+
+ }
- Status = IfconfigStartIp4 (Info);
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
}
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- }
-
- SHELL_FREE_NON_NULL(Config);
+ if (Dns != NULL) {
+ FreePool (Dns);
+ }
- return ShellStatus;
+ return EFI_SUCCESS;
+
}
/**
- Show the address information for the nic specified.
+ The ifconfig command main process.
+
+
- all nics' information is shown.
**/
-VOID
-EFIAPI
-IfconfigShowNicInfo (
- IN CONST CHAR16 *Name
+EFI_STATUS
+IfConfig (
+ IN IFCONFIG_PRIVATE_DATA *Private
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *NicInfo;
- UINT32 Index;
- EFI_IP4_IPCONFIG_DATA *Ip4Config;
- EFI_IPv4_ADDRESS Gateway;
- CONST CHAR16 *TempString;
+ EFI_STATUS Status;
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- NicInfo = BASE_CR (Entry, NIC_INFO, Link);
+ //
+ // Get configure information of all interfaces.
+ //
+ Status = IfConfigGetInterfaceInfo (
+ Private->ImageHandle,
+ Private->IfName,
+ &Private->IfList
+ );
- TempString = (CHAR16*)NicInfo->Name;
- if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {
- continue;
- }
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), gShellNetwork1HiiHandle, NicInfo->Name);
+ switch (Private->OpCode) {
+ Status = IfConfigShowInterfaceInfo (&Private->IfList);
+ break;
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[0],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[1],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[3],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[4],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]
- );
-
- Print (L" Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : L"Media disconnected");
-
- if (NicInfo->ConfigInfo == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);
- continue;
- }
+ Status = IfConfigClearInterfaceInfo (&Private->IfList);
+ break;
- if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"DHCP");
- } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"STATIC");
- } else {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"Unknown");
- }
+ Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+ break;
- ShellPrintHiiEx(-1, -1, NULL,
- STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),
- gShellNetwork1HiiHandle,
- (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")
- );
+ Status = EFI_ABORTED;
+ }
- Ip4Config = &NicInfo->ConfigInfo->Ip4Info;
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"IP address",
- (UINTN)Ip4Config->StationAddress.Addr[0],
- (UINTN)Ip4Config->StationAddress.Addr[1],
- (UINTN)Ip4Config->StationAddress.Addr[2],
- (UINTN)Ip4Config->StationAddress.Addr[3]
- );
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Mask",
- (UINTN)Ip4Config->SubnetMask.Addr[0],
- (UINTN)Ip4Config->SubnetMask.Addr[1],
- (UINTN)Ip4Config->SubnetMask.Addr[2],
- (UINTN)Ip4Config->SubnetMask.Addr[3]
- );
+ return Status;
+}
- ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
- (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
- CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- }
-
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Gateway.Addr[0],
- (UINTN)Gateway.Addr[1],
- (UINTN)Gateway.Addr[2],
- (UINTN)Gateway.Addr[3]
- );
+/**
+ The ifconfig command cleanup process, free the allocated memory.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
+**/
+VOID
+IfConfigCleanup (
+ IN IFCONFIG_PRIVATE_DATA *Private
+ )
+{
+ LIST_ENTRY *Entry;
+ LIST_ENTRY *NextEntry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ ARG_LIST *ArgNode;
+ ARG_LIST *ArgHead;
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Subnet",
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]
- );
+ ASSERT (Private != NULL);
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Netmask",
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]
- );
+ //
+ // Clean the list which save the set config Args.
+ //
+ if (Private->VarArg != NULL) {
+ ArgHead = Private->VarArg;
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]
- );
+ while (ArgHead->Next != NULL) {
+ ArgNode = ArgHead->Next;
+ FreePool (ArgHead);
+ ArgHead = ArgNode;
}
+
+ FreePool (ArgHead);
}
- return ;
-}
+ if (Private->IfName != NULL)
+ FreePool (Private->IfName);
-/**
- Clear address configuration for the nic specified.
- if NULL, all nics address configurations are cleared.
+ //
+ // Clean the IFCONFIG_INTERFACE_CB list.
+ //
+ Entry = Private->IfList.ForwardLink;
+ NextEntry = Entry->ForwardLink;
-**/
-EFI_STATUS
-EFIAPI
-IfconfigClearNicAddr (
- IN CONST CHAR16 *Name
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- EFI_STATUS Status;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ while (Entry != &Private->IfList) {
- if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {
- continue;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
-// if (Info->NicIp4Config == NULL) {
- Status = IfconfigSetNicAddrByHii (Info, NULL);
-// } else {
-// Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
-// }
+ RemoveEntryList (&IfCb->Link);
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IfCb->IfInfo != NULL) {
+
+ FreePool (IfCb->IfInfo);
}
+
+ FreePool (IfCb);
+
+ Entry = NextEntry;
+ NextEntry = Entry->ForwardLink;
}
- return EFI_SUCCESS;
-
+ FreePool (Private);
}
/**
Function for 'ifconfig' command.
@param[in] ImageHandle Handle to the Image (NULL if Internal).
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
+
**/
SHELL_STATUS
EFIAPI
ShellCommandRunIfconfig (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- EFI_STATUS Status;
- LIST_ENTRY *Package;
- CHAR16 *ProblemParam;
- SHELL_STATUS ShellStatus;
- BOOLEAN ListOperation;
- BOOLEAN ClearOperation;
- BOOLEAN SetOperation;
- CONST CHAR16 *Item;
- LIST_ENTRY *Entry;
- NIC_INFO *Info;
-
- InitializeListHead (&NicInfoList);
- Status = EFI_INVALID_PARAMETER;
- ShellStatus = SHELL_SUCCESS;
+ EFI_STATUS Status;
+ IFCONFIG_PRIVATE_DATA *Private;
+ LIST_ENTRY *ParamPackage;
+ CONST CHAR16 *ValueStr;
+ ARG_LIST *ArgList;
+ CHAR16 *ProblemParam;
+ CHAR16 *Str;
+
+ Private = NULL;
+
+ Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_COMMAND), gShellNetwork1HiiHandle,
ProblemParam);
+ goto ON_EXIT;
+ }
//
- // initialize the shell lib (we must be in non-auto-init...)
+ // To handle unsupported option.
//
- Status = ShellInitialize();
- ASSERT_EFI_ERROR(Status);
+ if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+ goto ON_EXIT;
+ }
//
- // parse the command line
+ // To handle no option.
//
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
- if (EFI_ERROR(Status)) {
- if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
- FreePool(ProblemParam);
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- ASSERT(FALSE);
- }
-
- goto Done;
+ if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
+ !ShellCommandLineGetFlag (ParamPackage, L"-h") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
- ClearOperation = ShellCommandLineGetFlag(Package, L"-c");
- ListOperation = ShellCommandLineGetFlag(Package, L"-l");
- SetOperation = ShellCommandLineGetFlag(Package, L"-s");
-
- if ((ClearOperation && ListOperation)
- ||(SetOperation && ListOperation)
- ||(ClearOperation && SetOperation)
- ) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- } else if (!ClearOperation && !ListOperation && !SetOperation) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ //
+ // To handle conflict options.
+ //
+ if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-h")))) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_OPTIONS), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
+
+ //
+ // To show the help information of ifconfig command.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-h")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_HELP), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
-
- Status = IfconfigGetAllNicInfoByHii ();
- if (EFI_ERROR (Status)) {
- if (mIp4ConfigExist) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), gShellNetwork1HiiHandle, Status);
- } else {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellNetwork1HiiHandle, L"ifconfig",
L"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid);
- }
- return SHELL_NOT_FOUND;
+ Status = EFI_INVALID_PARAMETER;
+
+ Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
+
+ if (Private == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
}
- if (ListOperation) {
- Item = ShellCommandLineGetValue (Package, L"-l");
+ InitializeListHead (&Private->IfList);
+
+ //
+ // To get interface name for the list option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ Private->OpCode = IfConfigOpList;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name for the clear option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
+ Private->OpCode = IfConfigOpClear;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name and corresponding Args for the set option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {
- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-l");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
+ if (ValueStr == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_INTERFACE), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
//
- // Show the configuration.
+ // To split the configuration into multi-section.
//
- IfconfigShowNicInfo (Item);
- } else if (SetOperation) {
- Item = ShellCommandLineGetValue (Package, L"-s");
+ ArgList = SplitStrToList (ValueStr, L' ');
+ ASSERT (ArgList != NULL);
- //
- // IfConfig -s eth0 DHCP [permanent]
- // IfConfig -s eth0 static ip netmask gateway [permanent]
- //
- if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) || (CountSubItems(Item) == 4)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_NO_VALUE), gShellNetwork1HiiHandle, L"ifconfig", L"-s");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ Private->OpCode = IfConfigOpSet;
+ Private->IfName = ArgList->Arg;
- ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);
- } else if (ClearOperation) {
- Item = ShellCommandLineGetValue (Package, L"-c");
+ Private->VarArg = ArgList->Next;
- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-c");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ if (Private->IfName == NULL || Private->VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_COMMAND), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
- IfconfigClearNicAddr (Item);
- } else {
- ASSERT(FALSE);
}
+
+ //
+ // Main process of ifconfig.
+ //
+ Status = IfConfig (Private);
- while (!IsListEmpty (&NicInfoList)) {
- Entry = NicInfoList.ForwardLink;
- Info = BASE_CR (Entry, NIC_INFO, Link);
- RemoveEntryList (Entry);
+ ShellCommandLineFreeVarList (ParamPackage);
+ if (Private != NULL)
+ IfConfigCleanup (Private);
- if (Info->ConfigInfo != NULL) {
- FreePool (Info->ConfigInfo);
- }
+ return Status;
+}
- FreePool (Info);
- }
- if (Package != NULL) {
- ShellCommandLineFreeVarList(Package);
- }
- return (ShellStatus);
-}
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index e23588a..af96379 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -909,20 +909,20 @@ PingCreateIpInstance (
//
if (Private->IpChoice == PING_IP_CHOICE_IP6) {
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
} else {
ASSERT(Private->IpChoice == PING_IP_CHOICE_IP4);
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
}
//
@@ -953,11 +953,11 @@ PingCreateIpInstance (
// Ip6config protocol and ip6 service binding protocol are installed
// on the same handle.
//
Status = gBS->HandleProtocol (
HandleBuffer[HandleIndex],
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
(VOID **) &IpXCfg
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
@@ -971,12 +971,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
}
@@ -1007,12 +1008,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
}
@@ -1043,11 +1045,11 @@ PingCreateIpInstance (
}
} else {
//
// IP4 address check
//
- if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {
+ if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {
//
// Match a certain interface address.
//
break;
}
@@ -1135,15 +1137,10 @@ PingCreateIpInstance (
ZeroMem (&Ip4Config, sizeof (EFI_IP4_CONFIG_DATA));
//
// Configure the ip4 instance for icmp4 packet exchange.
//
-// PING_IP4_COPY_ADDRESS (&Ip4Config.StationAddress, &Private->SrcAddress);
-// Ip4Config.SubnetMask.Addr[0] = 0xFF;
-// Ip4Config.SubnetMask.Addr[1] = 0xFF;
-// Ip4Config.SubnetMask.Addr[2] = 0xFF;
-// Ip4Config.SubnetMask.Addr[3] = 0x00;
Ip4Config.DefaultProtocol = 1;
Ip4Config.AcceptAnyProtocol = FALSE;
Ip4Config.AcceptBroadcast = FALSE;
Ip4Config.AcceptIcmpErrors = TRUE;
Ip4Config.AcceptPromiscuous = FALSE;
@@ -1461,11 +1458,11 @@ ShellCommandRunPing (
ShellStatus = SHELL_SUCCESS;
ProblemParam = NULL;
Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (ShellCommandLineGetFlag (ParamPackage, L"-_ip6")) {
@@ -1481,11 +1478,11 @@ ShellCommandRunPing (
//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
SendNumber = DEFAULT_SEND_COUNT;
@@ -1499,11 +1496,11 @@ ShellCommandRunPing (
//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
BufferSize = DEFAULT_BUFFER_SIZE;
@@ -1522,26 +1519,26 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &SrcAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
// Parse the paramter of destination ip address.
//
NonOptionCount = ShellCommandLineGetCount(ParamPackage);
if (NonOptionCount < 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (NonOptionCount > 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
ValueStr = ShellCommandLineGetRawValue (ParamPackage, 1);
if (ValueStr != NULL) {
@@ -1550,11 +1547,11 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &DstAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
index 49849a6..5151179 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
@@ -1,9 +1,9 @@
Main file for NULL named library for network1 shell command functions.
- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -63,11 +63,11 @@ ShellNetwork1CommandsLibConstructor (
}
//
// install our shell command handlers
//
ShellCommandRegisterCommandName(L"ping", ShellCommandRunPing , ShellCommandGetManFileNameNetwork1, 0,
L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_PING));
- ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0,
L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_IFCONFIG));
+ ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0,
L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_IFCONFIG_HELP));
return (EFI_SUCCESS);
}
/**
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
index 68a7c93..98b40df 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
@@ -1,9 +1,9 @@
header file for NULL named library for network1 shell command functions.
- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -24,13 +24,11 @@
#include <Protocol/Cpu.h>
#include <Protocol/ServiceBinding.h>
#include <Protocol/Ip6.h>
#include <Protocol/Ip6Config.h>
#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/Ip4Config2.h>
#include <Protocol/Arp.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
@@ -45,12 +43,10 @@
#include <Library/HiiLib.h>
#include <Library/NetLib.h>
#include <Library/DevicePathLib.h>
#include <Library/PrintLib.h>
-#include <Guid/NicIp4ConfigNvData.h>
-
extern EFI_HANDLE gShellNetwork1HiiHandle;
/**
Function for 'ping' command.
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
index 527d2ef..6dfbbe5 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
@@ -57,11 +57,11 @@
gEfiCpuArchProtocolGuid ## CONSUMES
gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES
[Guids]
gShellNetwork1HiiGuid ## SOMETIMES_CONSUMES ## HII
\ No newline at end of file
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index aa27c678339c5e94c9c936d9a7ea74b6b043c200..65edb0a407754247e91009929a3525b2ad5dd96e 100644
GIT binary patch
literal 21554
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
NnXgL}rJk4f{{V5RRI&g7
literal 20112
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
--
1.9.5.msysgit.1
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
------------------------------
_______________________________________________
edk2-devel mailing list
https://lists.sourceforge.net/lists/listinfo/edk2-devel
End of edk2-devel Digest, Vol 66, Issue 424
*******************************************
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
https://lists.sourceforge.net/lists/listinfo/edk2-devel
Shah, Tapan
2015-07-02 14:59:04 UTC
Permalink
Jiaxin,
I saw the new patch file and my review comments below. I still waiting to get an answer for what level of testing was performed to verify this change, can you elaborate?


1. Change this help message :
" -r - (renew) Renew configuration of interface and set dhcp policy.\r\n"

To:

" -r - Renew configuration of interface and set dhcp policy.\r\n"


2. Change this token:

#string STR_IFCONFIG_INFO_DNS_ADDR_HEAD #language en-US "\n%Hdns server : %N\n"

To:

#string STR_IFCONFIG_INFO_DNS_ADDR_HEAD #language en-US "\n%HDNS server : %N\n"

3. Since there is no code change in the file, so no need to change only copyright year in UefiShellNetwork1CommandsLib.c file. Please revert this change.

Thanks,
Tapan

-----Original Message-----
From: Wu, Jiaxin [mailto:***@intel.com]
Sent: Wednesday, July 01, 2015 7:42 PM
To: Shah, Tapan; edk2-***@lists.sourceforge.net
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Hi Tapan,
I have already sent out the patch to edk2-devel.

Thanks.
Jiaxin

-----Original Message-----
From: Shah, Tapan [mailto:***@hp.com]
Sent: Thursday, July 2, 2015 1:00 AM
To: Wu, Jiaxin; edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Jiaxin,
Can you send out an updated patch file for review?

Thanks,
Tapan

-----Original Message-----
From: Wu, Jiaxin [mailto:***@intel.com]
Sent: Wednesday, July 01, 2015 10:55 AM
To: Shah, Tapan; edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Hi Tapan,
Thank you for your comments, I have updated patch according below and other reviewers comments.
For the copyright, I have confirm that HP's copyright should be kept, I have recovered it and just update Intel copyright year.

Best Regards!
Jiaxin

-----Original Message-----
From: edk2-devel-***@lists.sourceforge.net<mailto:edk2-devel-***@lists.sourceforge.net> [mailto:edk2-devel-***@lists.sourceforge.net]
Sent: Wednesday, July 1, 2015 12:55 AM
To: edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: edk2-devel Digest, Vol 66, Issue 424

Send edk2-devel mailing list submissions to
edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>

To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/edk2-devel
or, via email, send a message with subject or body 'help' to
edk2-devel-***@lists.sourceforge.net<mailto:edk2-devel-***@lists.sourceforge.net>

You can reach the person managing the list at
edk2-devel-***@lists.sourceforge.net<mailto:edk2-devel-***@lists.sourceforge.net>

When replying, please edit your Subject line so it is more specific
than "Re: Contents of edk2-devel digest..."


Today's Topics:

1. Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
(Shah, Tapan)


----------------------------------------------------------------------

Message: 1
Date: Tue, 30 Jun 2015 16:54:24 +0000
From: "Shah, Tapan" <***@hp.com<mailto:***@hp.com>>
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig
library.
To: "edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>"
<edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>>
Message-ID:
<***@G1W3642.americas.hpqcorp.net<mailto:***@G1W3642.americas.hpqcorp.net>>

Content-Type: text/plain; charset="utf-8"

Jiaxin,
I see that ifconfig is completely re-written and also removed HP's copyright. I am not sure if it's acceptable to remove HP's copyright from the file. I am assuming that you have done adequate testing for this major change, can you confirm what type of testing is performed to verify this change?

Below comments for .uni file changes:

1. No need to rename below three string tokens.
STR_GEN_TOO_MANY -> STR_PING_ERR_TOO_MANY
STR_GEN_TOO_FEW -> STR_PING_ERR_TOO_FEW
STR_GEN_PARAM_INV -> STR_PING_ERR_PARAM_INV

2. All other STR_GEN_* string tokens are removed from .uni file. I suspect it may break other command. They should remain as-is and no need to remove. We also keep it at the profile level .uni file to keep track of same generic token name and strings across all commands.

3. STR_IFCONFIG_HELP help output of new ifconfig is not following the help output format. Need to fix it. Existing ifconfig help output is a good example as a reference.

4. Below token shows message Ip4Config2->GetData which is not something we customer friendly. Make it a customer friendly message.

#string STR_IFCONFIG_ERR_IP4CFG_GETDATA #language en-US "Ip4Config2->GetData return %hr\n"

Thanks,
Tapan

-----Original Message-----
From: Qiu, Shumin [mailto:***@intel.com]
Sent: Monday, June 29, 2015 8:12 PM
To: edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Hi Jiaxin,
Can I have the patch file?

-Shumin

-----Original Message-----
From: jiaxinwu [mailto:***@intel.com]
Sent: Monday, June 29, 2015 10:50 PM
To: edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Version2 include:
Make the command options to be Shell2.1 compliant(For the unsupported option, display ?not supported?);
Safe string fix;
Coding style change.

This patch update ShellPkg ping/ifconfig library source code to consume Ip4Config2 protocol.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: jiaxinwu <***@intel.com<mailto:***@intel.com>>
---
.../UefiShellNetwork1CommandsLib/Ifconfig.c | 2462 ++++++++------------
.../Library/UefiShellNetwork1CommandsLib/Ping.c | 33 +-
.../UefiShellNetwork1CommandsLib.c | 4 +-
.../UefiShellNetwork1CommandsLib.h | 8 +-
.../UefiShellNetwork1CommandsLib.inf | 6 +-
.../UefiShellNetwork1CommandsLib.uni | Bin 20112 -> 21554 bytes
6 files changed, 1040 insertions(+), 1473 deletions(-)

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index 7c3f809..61328a3 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -1,1763 +1,1337 @@
/** @file
- The implementation for ifcommand shell command.
+ The implementation for Shell command ifconfig based on IP4Config2 protocol.

- (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
**/

#include "UefiShellNetwork1CommandsLib.h"

-#define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE)
-#define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))
-
-BOOLEAN mIp4ConfigExist = FALSE;
-STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL;
+enum {
+ IfConfigOpList = 1,
+ IfConfigOpSet = 2,
+ IfConfigOpClear = 3
+};
+
+typedef enum {
+ VarCheckReserved = -1,
+ VarCheckOk = 0,
+ VarCheckDuplicate,
+ VarCheckConflict,
+ VarCheckUnknown,
+ VarCheckLackValue,
+ VarCheckOutOfMem
+} VAR_CHECK_CODE;
+
+typedef enum {
+ FlagTypeSingle = 0,
+ FlagTypeNeedVar,
+ FlagTypeNeedSet,
+ FlagTypeSkipUnknown
+} VAR_CHECK_FLAG_TYPE;
+
+#define MACADDRMAXSIZE 32
+
+typedef struct _IFCONFIG_INTERFACE_CB {
+ EFI_HANDLE NicHandle;
+ LIST_ENTRY Link;
+ EFI_IP4_CONFIG2_PROTOCOL *IfCfg;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ EFI_IP4_CONFIG2_POLICY Policy;
+ UINT32 DnsCnt;
+ EFI_IPv4_ADDRESS DnsAddr[1];
+} IFCONFIG_INTERFACE_CB;
+
+typedef struct _ARG_LIST ARG_LIST;
+
+struct _ARG_LIST {
+ ARG_LIST *Next;
+ CHAR16 *Arg;
+};
+
+typedef struct _IFCONFIG4_PRIVATE_DATA {
+ EFI_HANDLE ImageHandle;
+ LIST_ENTRY IfList;
+
+ UINT32 OpCode;
+ CHAR16 *IfName;
+ ARG_LIST *VarArg;
+} IFCONFIG_PRIVATE_DATA;
+
+typedef struct _VAR_CHECK_ITEM{
+ CHAR16 *FlagStr;
+ UINT32 FlagID;
+ UINT32 ConflictMask;
+ VAR_CHECK_FLAG_TYPE FlagType;
+} VAR_CHECK_ITEM;
+
+SHELL_PARAM_ITEM mIfConfigCheckList[] = {
+ {
+ L"-b",
+ TypeFlag
+ },
+ {
+ L"-h",
+ TypeFlag
+ },
+ {
+ L"-l",
+ TypeValue
+ },
+ {
+ L"-r",
+ TypeValue
+ },
+ {
+ L"-c",
+ TypeValue
+ },
+ {
+ L"-s",
+ TypeMaxValue
+ },
+ {
+ NULL,
+ TypeMax
+ },
+};
+
+VAR_CHECK_ITEM mSetCheckList[] = {
+ {
+ L"static",
+ 0x00000001,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dhcp",
+ 0x00000002,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dns",
+ 0x00000008,
+ 0x00000004,
+ FlagTypeSingle
+ },
+ {
+ NULL,
+ 0x0,
+ 0x0,
+ FlagTypeSkipUnknown
+ },
+};

-STATIC CONST UINTN SecondsToNanoSeconds = 10000000;
-STATIC CONST CHAR16 DhcpString[5] = L"DHCP";
-STATIC CONST CHAR16 StaticString[7] = L"STATIC";
STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";

-typedef struct {
- LIST_ENTRY Link;
- EFI_HANDLE Handle;
- NIC_ADDR NicAddress;
- CHAR16 Name[IP4_NIC_NAME_LENGTH];
- BOOLEAN MediaPresentSupported;
- BOOLEAN MediaPresent;
- EFI_IP4_CONFIG_PROTOCOL *Ip4Config;
- NIC_IP4_CONFIG_INFO *ConfigInfo;
-} NIC_INFO;
-
-typedef struct {
- EFI_IP_ADDRESS DestIp;
- EFI_MAC_ADDRESS DestMac;
- EFI_IP_ADDRESS LocalIp;
- EFI_MAC_ADDRESS LocalMac;
- UINT8 MacLen;
- EFI_EVENT OnResolved;
- BOOLEAN Duplicate;
-} ARP_REQUEST;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- {L"-c", TypeValue},
- {L"-l", TypeValue},
- {L"-s", TypeMaxValue},
- {NULL, TypeMax}
- };
-
-STATIC LIST_ENTRY NicInfoList;
-STATIC BOOLEAN ArpResolved;
-STATIC BOOLEAN mTimeout;
-
/**
- Count the space delimited items in a string.
-
- @param[in] String A pointer to the string to count.
-
- @return The number of space-delimited items.
- @retval 0xFF an error occured.
-**/
-UINT8
-EFIAPI
-CountSubItems (
- IN CONST CHAR16 *String
- )
-{
- CONST CHAR16 *Walker;
- UINT8 Count;
-
- if (String == NULL || *String == CHAR_NULL) {
- return (0xFF);
- }
+ Split a string with specified separator and save the substring to a list.

- for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; Walker = (StrStr(Walker, L" ")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);
- return (Count);
-}
+ @param[in] String The pointer of the input string.
+ @param[in] Separator The specified separator.

-/**
- Find the NIC_INFO by the specified nic name.
+ @return The pointer of headnode of ARG_LIST.

- @param[in] Name The pointer to the string containing the NIC name.
-
- @return The pointer to the NIC_INFO if there is a NIC_INFO named by Name.
- @retval NULL No NIC_INFO was found for Name.
**/
-NIC_INFO*
-EFIAPI
-IfconfigFindNicByName (
- IN CONST CHAR16 *Name
+ARG_LIST *
+SplitStrToList (
+ IN CONST CHAR16 *String,
+ IN CHAR16 Separator
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- CHAR16 *TempString;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
- TempString = (CHAR16*)Info->Name;
+ CHAR16 *Str;
+ CHAR16 *ArgStr;
+ ARG_LIST *ArgList;
+ ARG_LIST *ArgNode;

- if (StringNoCaseCompare (&Name, &TempString) == 0) {
- return Info;
- }
+ if (*String == L'\0') {
+ return NULL;
}

- return NULL;
-}
-
-/**
- Tests whether a child handle is a child device of the controller.
-
- @param[in] ControllerHandle A handle for a (parent) controller to test.
- @param[in] ChildHandle A child handle to test.
- @param[in] ProtocolGuid Supplies the protocol that the child controller
- opens on its parent controller.
-
- @retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.
- @retval EFI_UNSUPPORTED ChildHandle is not a child of the ControllerHandle.
-**/
-EFI_STATUS
-EFIAPI
-TestChildHandle (
- IN CONST EFI_HANDLE ControllerHandle,
- IN CONST EFI_HANDLE ChildHandle,
- IN CONST EFI_GUID *ProtocolGuid
- )
-{
- EFI_STATUS Status;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- UINTN EntryCount;
- UINTN Index;
-
- ASSERT (ProtocolGuid != NULL);
-
//
- // Retrieve the list of agents that are consuming the specific protocol
- // on ControllerHandle.
+ // Copy the CONST string to a local copy.
//
- Status = gBS->OpenProtocolInformation (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (String));
+ ASSERT (Str != NULL);
+ StrCpyS (Str, StrSize (String)/sizeof (CHAR16), String);
+ ArgStr = Str;

//
- // Inspect if ChildHandle is one of the agents.
+ // init a node for the list head.
//
- Status = EFI_UNSUPPORTED;
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&
- (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = EFI_SUCCESS;
- break;
- }
- }
-
- FreePool (OpenInfoBuffer);
- return Status;
-}
-
-/**
- Get the child handle of the NIC handle.
-
- @param[in] Controller Routing information: GUID.
- @param[out] ChildHandle Returned child handle.
-
- @retval EFI_SUCCESS Successfully to get child handle.
-**/
-EFI_STATUS
-GetChildHandle (
- IN EFI_HANDLE Controller,
- OUT EFI_HANDLE *ChildHandle
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- UINTN Index;
- EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;
- VENDOR_DEVICE_PATH *VendorDeviceNode;
+ ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode != NULL);
+ ArgList = ArgNode;

//
- // Locate all EFI Hii Config Access protocols
+ // Split the local copy and save in the list node.
//
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiHiiConfigAccessProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
- );
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return Status;
- }
-
- Status = EFI_NOT_FOUND;
-
- for (Index = 0; Index < HandleCount; Index++) {
-
- Status = TestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);
- if (!EFI_ERROR (Status)) {
- //
- // Get device path on the child handle
- //
- Status = gBS->HandleProtocol (
- Handles[Index],
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ChildDeviceDevicePath
- );
-
- if (!EFI_ERROR (Status)) {
- while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
- ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
- //
- // Parse one instance
- //
- if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&
- ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
- VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
- if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
- //
- // Found item matched gEfiNicIp4ConfigVariableGuid
- //
- *ChildHandle = Handles[Index];
- FreePool (Handles);
- return EFI_SUCCESS;
- }
- }
- }
- }
+ while (*Str != L'\0') {
+ if (*Str == Separator) {
+ *Str = L'\0';
+ ArgNode->Arg = ArgStr;
+ ArgStr = Str + 1;
+ ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode->Next != NULL);
+ ArgNode = ArgNode->Next;
}
+
+ Str++;
}

- FreePool (Handles);
- return Status;
+ ArgNode->Arg = ArgStr;
+ ArgNode->Next = NULL;
+
+ return ArgList;
}

/**
- Append OFFSET/WIDTH/VALUE items at the beginning of string.
-
- @param[in, out] String The pointer to the string to append onto.
- @param[in] Offset Offset value.
- @param[in] Width Width value.
- @param[in] Block Point to data buffer.
-
- @return The count of unicode character that were appended.
-**/
-UINTN
-EFIAPI
-AppendOffsetWidthValue (
- IN OUT CHAR16 *String,
- IN UINTN Offset,
- IN UINTN Width,
- IN CONST UINT8 *Block
- )
-
-{
- CHAR16 *OriString;
-
- OriString = String;
-
- StrnCpy (String, L"&OFFSET=", 9);
- String += StrLen (L"&OFFSET=");
- String += UnicodeSPrint (String, 20, L"%x", Offset);
-
- StrnCpy (String,L"&WIDTH=", 8);
- String += StrLen (L"&WIDTH=");
- String += UnicodeSPrint (String, 20, L"%x", Width);
+ Check the correctness of input Args with '-s' option.

- if (Block != NULL) {
- StrnCpy (String,L"&VALUE=", 8);
- String += StrLen (L"&VALUE=");
- while ((Width--) != 0) {
- String += UnicodeSPrint (String, 20, L"%x", Block[Width]);
- }
- }
-
- return String - OriString;
-}
+ @param[in] CheckList The pointer of VAR_CHECK_ITEM array.
+ @param[in] Name The pointer of input arg.
+ @param[in] Init The switch to execute the check.

-/**
- Converts the unicode character of the string from uppercase to lowercase.
- This is a internal function.
+ @return The value of VAR_CHECK_CODE.

- @param ConfigString String to be converted
**/
-CHAR16*
-EFIAPI
-HiiToLower (
- IN CHAR16 *ConfigString
- )
+VAR_CHECK_CODE
+IfConfigRetriveCheckListByName(
+ IN VAR_CHECK_ITEM *CheckList,
+ IN CHAR16 *Name,
+ IN BOOLEAN Init
+)
{
- CHAR16 *String;
- BOOLEAN Lower;
-
- //
- // Convert all hex digits in range [A-F] in the configuration header to [a-f]
- //
- for (String = ConfigString, Lower = FALSE; String != NULL && *String != L'\0'; String++) {
- if (*String == L'=') {
- Lower = TRUE;
- } else if (*String == L'&') {
- Lower = FALSE;
- } else if (Lower && *String >= L'A' && *String <= L'F') {
- *String = (CHAR16) (*String - L'A' + L'a');
- }
+ STATIC UINT32 CheckDuplicate;
+ STATIC UINT32 CheckConflict;
+ VAR_CHECK_CODE RtCode;
+ UINT32 Index;
+ VAR_CHECK_ITEM Arg;
+
+ if (Init) {
+ CheckDuplicate = 0;
+ CheckConflict = 0;
+ return VarCheckOk;
}

- return (ConfigString);
-}
-
-
-/**
- Construct <ConfigHdr> using routing information GUID/NAME/PATH.
-
- @param[in] Guid Routing information: GUID.
- @param[in] Name Routing information: NAME.
- @param[in] DriverHandle Driver handle which contains the routing information: PATH.
-
- @retval NULL An error occured.
- @return The pointer to configHdr string.
-**/
-CHAR16 *
-EFIAPI
-ConstructConfigHdr (
- IN CONST EFI_GUID *Guid,
- IN CONST CHAR16 *Name,
- IN EFI_HANDLE DriverHandle
- )
-{
- EFI_STATUS Status;
- CHAR16 *ConfigHdr;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- CHAR16 *String;
- UINTN Index;
- UINT8 *Buffer;
- UINTN DevicePathLength;
- UINTN NameLength;
+ RtCode = VarCheckOk;
+ Index = 0;
+ Arg = CheckList[Index];

//
- // Get the device path from handle installed EFI HII Config Access protocol
+ // Check the Duplicated/Conflicted/Unknown input Args.
//
- Status = gBS->HandleProtocol (
- DriverHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath
- );
- if (EFI_ERROR (Status)) {
- return NULL;
- }
+ while (Arg.FlagStr != NULL) {
+ if (StrCmp (Arg.FlagStr, Name) == 0) {

- DevicePathLength = GetDevicePathSize (DevicePath);
- NameLength = StrLen (Name);
- ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));
- if (ConfigHdr == NULL) {
- return NULL;
- }
+ if (CheckDuplicate & Arg.FlagID) {
+ RtCode = VarCheckDuplicate;
+ break;
+ }

- String = ConfigHdr;
- StrnCpy (String, L"GUID=", 6);
- String += StrLen (L"GUID=");
+ if (CheckConflict & Arg.ConflictMask) {
+ RtCode = VarCheckConflict;
+ break;
+ }

- //
- // Append Guid converted to <HexCh>32
- //
- for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
- }
+ CheckDuplicate |= Arg.FlagID;
+ CheckConflict |= Arg.ConflictMask;
+ break;
+ }

- //
- // Append L"&NAME="
- //
- StrnCpy (String, L"&NAME=", 7);
- String += StrLen (L"&NAME=");
- for (Index = 0; Index < NameLength ; Index++) {
- String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);
+ Arg = CheckList[++Index];
}
-
- //
- // Append L"&PATH="
- //
- StrnCpy (String, L"&PATH=", 7);
- String += StrLen (L"&PATH=");
- for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
+
+ if (Arg.FlagStr == NULL) {
+ RtCode = VarCheckUnknown;
}

- return (HiiToLower(ConfigHdr));
+ return RtCode;
}

/**
- Get network physical device NIC information.
+ The notify function of create event when performing a manual config.

- @param[in] Handle The network physical device handle.
- @param[out] NicAddr NIC information.
+ @param[in] Event The event this notify function registered to.
+ @param[in] Context Pointer to the context data registered to the event.

- @retval EFI_SUCCESS Get NIC information successfully.
-**/
-EFI_STATUS
+**/
+VOID
EFIAPI
-IfConfigGetNicMacInfo (
- IN EFI_HANDLE Handle,
- OUT NIC_ADDR *NicAddr
- )
+IfConfigManualAddressNotify (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
- }
-
- NicAddr->Type = (UINT16) SnpMode.IfType;
- NicAddr->Len = (UINT8) SnpMode.HwAddressSize;
- CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);
-
-ON_ERROR:
-
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
-
- return Status;
-
+ *((BOOLEAN *) Context) = TRUE;
}

+
/**
- Get network physical device NIC information.
+ Print MAC address.

- @param[in] Handle The network physical device handle.
- @param[out] MediaPresentSupported
- Upon successful return, TRUE is media present
- is supported. FALSE otherwise.
- @param[out] MediaPresent Upon successful return, TRUE is media present
- is enabled. FALSE otherwise.
+ @param[in] Node The pointer of MAC address buffer.
+ @param[in] Size The size of MAC address buffer.

- @retval EFI_SUCCESS The operation was successful.
**/
-EFI_STATUS
-EFIAPI
-IfConfigGetNicMediaStatus (
- IN EFI_HANDLE Handle,
- OUT BOOLEAN *MediaPresentSupported,
- OUT BOOLEAN *MediaPresent
- )
-
+VOID
+IfConfigPrintMacAddr (
+ IN UINT8 *Node,
+ IN UINT32 Size
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
+ UINTN Index;

- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
+ ASSERT (Size <= MACADDRMAXSIZE);

- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
+ for (Index = 0; Index < Size; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);
+ if (Index + 1 < Size) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle);
+ }
}
-
- *MediaPresentSupported = SnpMode.MediaPresentSupported;
- *MediaPresent = SnpMode.MediaPresent;

-ON_ERROR:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+}

- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );

- return Status;
+/**
+ The get current status of all handles.

-}
+ @param[in] ImageHandle The handle of ImageHandle.
+ @param[in] IfName The pointer of IfName(interface name).
+ @param[in] IfList The pointer of IfList(interface list).

-/**
- Get all Nic's information through HII service.
+ @retval EFI_SUCCESS The get status processed successfully.
+ @retval others The get status process failed.

- @retval EFI_SUCCESS All the nic information is collected.
**/
EFI_STATUS
-EFIAPI
-IfconfigGetAllNicInfoByHii (
- VOID
+IfConfigGetInterfaceInfo (
+ IN EFI_HANDLE ImageHandle,
+ IN CHAR16 *IfName,
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- UINTN Index;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- UINTN BufferSize;
- NIC_INFO *NicInfo;
- NIC_IP4_CONFIG_INFO *NicConfigRequest;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfigRequest = NULL;
- NicInfo = NULL;
-
- InitializeListHead (&NicInfoList);
+ EFI_STATUS Status;
+ UINTN HandleIndex;
+ UINTN HandleNum;
+ EFI_HANDLE *HandleBuffer;
+ EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ UINTN DataSize;

- //
- // Check if HII Config Routing protocol available.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiConfigRoutingProtocolGuid,
- NULL,
- (VOID**)&mHiiConfigRouting
- );
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
+ HandleBuffer = NULL;
+ HandleNum = 0;
+
+ IfInfo = NULL;
+ IfCb = NULL;

//
- // Locate all network device handles
+ // Locate all the handles with ip4 service binding protocol.
//
Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
+ ByProtocol,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ NULL,
+ &HandleNum,
+ &HandleBuffer
);
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return EFI_NOT_FOUND;
+ if (EFI_ERROR (Status) || (HandleNum == 0)) {
+ return EFI_ABORTED;
}

- for (Index = 0; Index < HandleCount; Index++) {
- Status = GetChildHandle (Handles[Index], &ChildHandle);
+ //
+ // Enumerate all handles that installed with ip4 service binding protocol.
+ //
+ for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
+ IfCb = NULL;
+ IfInfo = NULL;
+ DataSize = 0;
+
+ //
+ // Ip4config protocol and ip4 service binding protocol are installed
+ // on the same handle.
+ //
+ ASSERT (HandleBuffer != NULL);
+ Status = gBS->HandleProtocol (
+ HandleBuffer[HandleIndex],
+ &gEfiIp4Config2ProtocolGuid,
+ (VOID **) &Ip4Cfg2
+ );
+
if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility.
- //
- ChildHandle = Handles[Index];
+ goto ON_ERROR;
}
+
//
- // Construct configuration request string header
+ // Get the interface information size.
//
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- Length = 0;
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ NULL
+ );
+
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
+
+ IfInfo = AllocateZeroPool (DataSize);
+
+ if (IfInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
-
+
//
- // Append OFFSET/WIDTH pair
+ // Get the interface info.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ IfInfo
+ );

- NicInfo = AllocateZeroPool (sizeof (NIC_INFO));
- if (NicInfo == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
goto ON_ERROR;
}
- NicInfo->Handle = Handles[Index];
-
+
//
- // Get network physical devcie MAC information
+ // Check the interface name if required.
//
- IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);
- if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);
- } else {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
+ FreePool (IfInfo);
+ continue;
}

+ DataSize = 0;
+
//
- // Get media status
+ // Get the size of dns server list.
//
- IfConfigGetNicMediaStatus (Handles[Index], &NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ NULL
+ );
+
+ if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfigRequest == NULL) {
+ IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);
+
+ if (IfCb == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}

+ IfCb->NicHandle = HandleBuffer[HandleIndex];
+ IfCb->IfInfo = IfInfo;
+ IfCb->IfCfg = Ip4Cfg2;
+ IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));
+
//
- // Get network parameters by HII service
+ // Get the dns server list if has.
//
- Status = mHiiConfigRouting->ExtractConfig (
- mHiiConfigRouting,
- ConfigResp,
- &AccessProgress,
- &AccessResults
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = NIC_ITEM_CONFIG_SIZE;
- Status = mHiiConfigRouting->ConfigToBlock (
- mHiiConfigRouting,
- AccessResults,
- (UINT8 *) NicConfigRequest,
- &BufferSize,
- &AccessProgress
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;
- NicConfig = AllocateZeroPool (BufferSize);
- if (NicConfig == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
- CopyMem (NicConfig, NicConfigRequest, BufferSize);
-
- //
- // If succeeds to get NIC configuration, fix up routetable pointer.
- //
- NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (&NicConfig->Ip4Info + 1);
- NicInfo->ConfigInfo = NicConfig;
-
- } else {
- NicInfo->ConfigInfo = NULL;
+ if (DataSize > 0) {
+
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ IfCb->DnsAddr
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
-
- FreePool (AccessResults);
-
- } else {
- NicInfo->ConfigInfo = NULL;
}

//
- // Add the Nic's info to the global NicInfoList.
+ // Get the config policy.
//
- InsertTailList (&NicInfoList, &NicInfo->Link);
+ DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypePolicy,
+ &DataSize,
+ &IfCb->Policy
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- FreePool (NicConfigRequest);
- FreePool (ConfigResp);
- FreePool (ConfigHdr);
+
+ InsertTailList (IfList, &IfCb->Link);
+
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
+ //
+ // Only need the appointed interface, keep the allocated buffer.
+ //
+ IfCb = NULL;
+ IfInfo = NULL;
+ break;
+ }
}

- FreePool (Handles);
+ if (HandleBuffer != NULL) {
+ FreePool (HandleBuffer);
+ }

return EFI_SUCCESS;
-
+
ON_ERROR:
- if (AccessResults != NULL) {
- FreePool (AccessResults);
- }
- if (NicConfigRequest != NULL) {
- FreePool (NicConfigRequest);
- }
- if (NicInfo != NULL) {
- FreePool (NicInfo);
- }
- if (ConfigResp != NULL) {
- FreePool (ConfigResp);
- }
- if (ConfigHdr != NULL) {
- FreePool (ConfigHdr);
+
+ if (IfInfo != NULL) {
+ FreePool (IfInfo);
}

- FreePool (Handles);
+ if (IfCb != NULL) {
+ FreePool (IfCb);
+ }

return Status;
}

/**
- Set the address for the specified nic by HII service.
+ The list process of the ifconfig command.

- @param[in] NicInfo A pointer to the NIC_INFO of the Nic to be configured.
- @param[in] Config The command line arguments for the set operation.
+ @param[in] IfList The pointer of IfList(interface list).
+
+ @retval EFI_SUCCESS The ifconfig command list processed successfully.
+ @retval others The ifconfig command list process failed.

- @retval EFI_SUCCESS The address set operation is done.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddrByHii (
- IN CONST NIC_INFO *NicInfo,
- IN CONST NIC_IP4_CONFIG_INFO *Config
+EFI_STATUS
+IfConfigShowInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- SHELL_STATUS ShellStatus;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfig = NULL;
- ShellStatus = SHELL_SUCCESS;
-
- Status = GetChildHandle (NicInfo->Handle, &ChildHandle);
- if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility
- //
- ChildHandle = NicInfo->Handle;
- }
- //
- // Construct config request string header
- //
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IPv4_ADDRESS Gateway;
+ UINT32 Index;

- NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfig == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- if (Config != NULL) {
- CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

//
- // Append OFFSET/WIDTH pair
+ // Go through the interface list.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ while (Entry != IfList) {
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

- //
- // Call HII helper function to generate configuration string
- //
- Status = mHiiConfigRouting->BlockToConfig (
- mHiiConfigRouting,
- ConfigResp,
- (UINT8 *) NicConfig,
- NIC_ITEM_CONFIG_SIZE,
- &AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);

- //
- // Set IP setting by HII servie
- //
- Status = mHiiConfigRouting->RouteConfig (
- mHiiConfigRouting,
- AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
- }
+ //
+ // Print interface name.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);

-ON_EXIT:
- SHELL_FREE_NON_NULL(AccessResults);
- SHELL_FREE_NON_NULL(NicConfig);
- SHELL_FREE_NON_NULL(ConfigResp);
- SHELL_FREE_NON_NULL(ConfigHdr);
+ //
+ // Print interface config policy.
+ //
+ if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_AUTO), gShellNetwork1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);
+ }

- return ShellStatus;
-}
+ //
+ // Print mac address of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);

-/**
- The callback function for the Arp address resolved event.
+ IfConfigPrintMacAddr (
+ IfCb->IfInfo->HwAddress.Addr,
+ IfCb->IfInfo->HwAddressSize
+ );

- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-IfconfigOnArpResolved (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- ARP_REQUEST *Request;
- UINT8 Index;
-
- Request = (ARP_REQUEST *) Context;
- ASSERT (Request != NULL);
+ //
+ // Print IPv4 address list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);

- Request->Duplicate = FALSE;
-
- if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, Request->MacLen)) {
ShellPrintHiiEx(
-1,
-1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Already Configured",
- (UINTN)Request->DestIp.v4.Addr[0],
- (UINTN)Request->DestIp.v4.Addr[1],
- (UINTN)Request->DestIp.v4.Addr[2],
- (UINTN)Request->DestIp.v4.Addr[3]
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[3]
);
- ArpResolved = TRUE;
- return;
- }
-
- for (Index = 0; Index < Request->MacLen; Index++) {
- if (Request->DestMac.Addr[Index] != 0) {
- Request->Duplicate = TRUE;
- }
- }

- if (Request->Duplicate) {
+ //
+ // Print subnet mask list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
+
ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)Request->DestMac.Addr[0],
- (UINTN)Request->DestMac.Addr[1],
- (UINTN)Request->DestMac.Addr[2],
- (UINTN)Request->DestMac.Addr[3],
- (UINTN)Request->DestMac.Addr[4],
- (UINTN)Request->DestMac.Addr[5]
- );
- }
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]
+ );

- ArpResolved = TRUE;
- return ;
-}
+ //
+ // Print default gateway of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);

-/**
- Check whether the address to be configured conflicts with other hosts.
+ ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
+
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
+ (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
+ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
+ }
+ }

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
- @param[in] IpAddr The IPv4 address to be configured to the Nic.
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)Gateway.Addr[0],
+ (UINTN)Gateway.Addr[1],
+ (UINTN)Gateway.Addr[2],
+ (UINTN)Gateway.Addr[3]
+ );
+
+ //
+ // Print route table entry.
+ //
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);

- @return TRUE Some other host already uses the IpAddr.
- @return FALSE The address is unused.
-**/
-BOOLEAN
-EFIAPI
-IfconfigIsIpDuplicate (
- IN NIC_INFO *NicInfo,
- IN IP4_ADDR IpAddr
- )
-{
- EFI_ARP_PROTOCOL *Arp;
- EFI_ARP_CONFIG_DATA ArpCfgData;
- EFI_HANDLE ArpHandle;
- ARP_REQUEST Request;
- EFI_STATUS Status;
-
- Arp = NULL;
- ArpHandle = NULL;
- ZeroMem (&Request, sizeof (ARP_REQUEST));
-
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- &ArpHandle
- );
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);

- if (EFI_ERROR (Status)) {
- return FALSE;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Subnet ",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]
+ );

- Status = gBS->OpenProtocol (
- ArpHandle,
- &gEfiArpProtocolGuid,
- (VOID**)&Arp,
- gImageHandle,
- ArpHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Netmask",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]
+ );

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Gateway",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]
+ );
+ }

- //
- // Set up the Arp requests
- //
- EFI_IP4_TO_U32 (Request.DestIp.v4) = IpAddr;
- EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;
- Request.LocalMac = NicInfo->NicAddress.MacAddr;
- Request.MacLen = NicInfo->NicAddress.Len;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- IfconfigOnArpResolved,
- (VOID *) &Request,
- &Request.OnResolved
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ArpCfgData.SwAddressType = 0x0800;
- ArpCfgData.SwAddressLength = 4;
- ArpCfgData.StationAddress = &Request.LocalIp;
- ArpCfgData.EntryTimeOut = 0;
- ArpCfgData.RetryCount = 3;
- ArpCfgData.RetryTimeOut = 0;
-
- Status = Arp->Configure (Arp, &ArpCfgData);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ //
+ // Print dns server addresses list of the interface if has.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);

- Status = Arp->Request (
- Arp,
- &Request.DestIp,
- Request.OnResolved,
- &Request.DestMac
- );
-
- if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
- goto ON_EXIT;
- }
+ for (Index = 0; Index < IfCb->DnsCnt; Index++) {
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN) IfCb->DnsAddr[Index].Addr[0],
+ (UINTN) IfCb->DnsAddr[Index].Addr[1],
+ (UINTN) IfCb->DnsAddr[Index].Addr[2],
+ (UINTN) IfCb->DnsAddr[Index].Addr[3]
+ );

- while (!ArpResolved) {
-
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+ }

-ON_EXIT:
- if (Request.OnResolved != NULL) {
- gBS->CloseEvent (Request.OnResolved);
- }
+ //
+ // Print route table of the interface if has.
+ //

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- ArpHandle
- );
+ Entry = Entry->ForwardLink;

- return Request.Duplicate;
+ }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
+ return EFI_SUCCESS;
}

/**
- The callback function for the timer event used to get map.
-
- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-TimeoutToGetMap (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- mTimeout = TRUE;
- return ;
-}
+ The clean process of the ifconfig command to clear interface info.

-/**
- Create an IP child, use it to start the auto configuration, then destroy it.
+ @param[in] IfList The pointer of IfList(interface list).

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
+ @retval EFI_SUCCESS The ifconfig command clean processed successfully.
+ @retval others The ifconfig command clean process failed.

- @retval EFI_SUCCESS The configuration is done.
**/
EFI_STATUS
-EFIAPI
-IfconfigStartIp4(
- IN NIC_INFO *NicInfo
+IfConfigClearInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_IP4_PROTOCOL *Ip4;
- EFI_HANDLE Ip4Handle;
- EFI_HANDLE TimerToGetMap;
- EFI_IP4_CONFIG_DATA Ip4ConfigData;
- EFI_IP4_MODE_DATA Ip4Mode;
- EFI_STATUS Status;
-
- //
- // Get the Ip4ServiceBinding Protocol
- //
- Ip4Handle = NULL;
- Ip4 = NULL;
- TimerToGetMap = NULL;
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IP4_CONFIG2_POLICY Policy;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), gShellNetwork1HiiHandle);
+ Policy = Ip4Config2PolicyDhcp;
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- &Ip4Handle
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

- Status = gBS->OpenProtocol (
- Ip4Handle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- NicInfo->Handle,
- gImageHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ //
+ // Go through the interface list.
+ //
+ while (Entry != IfList) {

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );

- Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
- Ip4ConfigData.AcceptAnyProtocol = FALSE;
- Ip4ConfigData.AcceptIcmpErrors = FALSE;
- Ip4ConfigData.AcceptBroadcast = FALSE;
- Ip4ConfigData.AcceptPromiscuous = FALSE;
- Ip4ConfigData.UseDefaultAddress = TRUE;
- ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
- ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- Ip4ConfigData.TypeOfService = 0;
- Ip4ConfigData.TimeToLive = 1;
- Ip4ConfigData.DoNotFragment = FALSE;
- Ip4ConfigData.RawData = FALSE;
- Ip4ConfigData.ReceiveTimeout = 0;
- Ip4ConfigData.TransmitTimeout = 0;
-
- Status = Ip4->Configure (Ip4, &Ip4ConfigData);
-
- if (Status == EFI_NO_MAPPING) {
- mTimeout = FALSE;
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL | EVT_TIMER,
- TPL_CALLBACK,
- TimeoutToGetMap,
- NULL,
- &TimerToGetMap
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->SetTimer (
- TimerToGetMap,
- TimerRelative,
- MultU64x32 (SecondsToNanoSeconds, 5)
- );
-
if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ break;
}

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), gShellNetwork1HiiHandle);
-
- while (!mTimeout) {
- Ip4->Poll (Ip4);
-
- if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) &&
- Ip4Mode.IsConfigured) {
- break;
- }
- }
- }
-
- Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);
-
- if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Default",
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]
- );
- }
-
-ON_EXIT:
-
- if (EFI_ERROR (Status)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);
- }
-
- if (TimerToGetMap != NULL) {
- gBS->SetTimer (TimerToGetMap, TimerCancel, 0);
- gBS->CloseEvent (TimerToGetMap);
+ Entry = Entry->ForwardLink;
}

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Ip4Handle
- );
-
return Status;
}

/**
- Set the address for the nic specified by the params.
+ The set process of the ifconfig command.
+
+ @param[in] IfList The pointer of IfList(interface list).
+ @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).

- @param[in] Argc The count of the passed in Params.
- @param[in] Params The command line arguments for the set operation.
+ @retval EFI_SUCCESS The ifconfig command set processed successfully.
+ @retval others The ifconfig command set process failed.

- @retval EFI_SUCCESS The address set operation is done.
- @return Some error occurs.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddr (
- IN UINTN Argc,
- IN CONST CHAR16 *Params
+EFI_STATUS
+IfConfigSetInterfaceInfo (
+ IN LIST_ENTRY *IfList,
+ IN ARG_LIST *VarArg
)
{
- NIC_IP4_CONFIG_INFO *Config;
- NIC_IP4_CONFIG_INFO *OldConfig;
- EFI_IP_ADDRESS Ip;
- EFI_IP_ADDRESS Mask;
- EFI_IP_ADDRESS Gateway;
- NIC_INFO *Info;
- BOOLEAN Permanent;
- SHELL_STATUS ShellStatus;
- CONST CHAR16 *Walker;
- CHAR16 *Temp;
- CONST CHAR16 *DhcpTemp;
- CONST CHAR16 *StaticTemp;
- CONST CHAR16 *PermTemp;
- UINT32 NetworkBytes1;
- UINT32 NetworkBytes2;
- EFI_STATUS Status;
-
- Walker = Params;
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- Info = IfconfigFindNicByName (Temp);
-
- if (Info == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);
- return SHELL_NOT_FOUND;
+
+ EFI_STATUS Status;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ VAR_CHECK_CODE CheckCode;
+ EFI_EVENT TimeOutEvt;
+ EFI_EVENT MappedEvt;
+ BOOLEAN IsAddressOk;
+
+ EFI_IP4_CONFIG2_POLICY Policy;
+ EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
+ UINTN DataSize;
+ EFI_IPv4_ADDRESS Gateway;
+ EFI_IPv4_ADDRESS *Dns;
+ ARG_LIST *Tmp;
+ UINTN Index;
+
+ CONST CHAR16* Temp1;
+ CONST CHAR16* Temp2;
+
+ Dns = NULL;
+
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
+ return EFI_INVALID_PARAMETER;
}
+
+ //
+ // Make sure to set only one interface each time.
+ //
+ IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
+ Status = EFI_SUCCESS;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")==NULL?0:StrStr(Walker, L" ")-Walker);
+ //
+ // Initialize check list mechanism.
+ //
+ CheckCode = IfConfigRetriveCheckListByName(
+ NULL,
+ NULL,
+ TRUE
+ );

- Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof (EFI_IP4_ROUTE_TABLE));
- if (Config == NULL) {
- return SHELL_OUT_OF_RESOURCES;
+ //
+ // Create events & timers for asynchronous settings.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &TimeOutEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
}

- Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);
-
- OldConfig = Info->ConfigInfo;
- Permanent = FALSE;
- ShellStatus = SHELL_INVALID_PARAMETER;
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ IfConfigManualAddressNotify,
+ &IsAddressOk,
+ &MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- DhcpTemp = DhcpString;
- StaticTemp = StaticString;
-
- if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {
+ //
+ // Parse the setting variables.
+ //
+ while (VarArg != NULL) {
//
- // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP permanent
+ // Check invalid parameters (duplication & unknown & conflict).
//
- if ((Argc != 2) && (Argc!= 3)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ CheckCode = IfConfigRetriveCheckListByName(
+ mSetCheckList,
+ VarArg->Arg,
+ FALSE
+ );

- if (Argc == 3) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ if (VarCheckOk != CheckCode) {
+ switch (CheckCode) {
+ case VarCheckDuplicate:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ case VarCheckConflict:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- Permanent = TRUE;
- }
+ case VarCheckUnknown:
+ //
+ // To handle unsupported option.
+ //
+ Temp1 = VarArg->Arg;
+ Temp2 = PermanentString;
+ if (StringNoCaseCompare(&Temp1, &Temp2) == 0) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString);
+ goto ON_EXIT;
+ }

- if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&
- (OldConfig->Permanent == Permanent)) {
+ //
+ // To handle unknown option.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);
- ShellStatus = SHELL_ALREADY_STARTED;
- goto ON_EXIT;
+ default:
+ break;
+ }
+
+ VarArg = VarArg->Next;
+ continue;
}

- Config->Source = IP4_CONFIG_SOURCE_DHCP;
- } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {
//
- // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
- // eth0 static IP NETMASK GATEWAY permanent
+ // Process valid variables.
//
- if ((Argc != 5) && (Argc != 6)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
-
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
+ if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
+ //
+ // Set dhcp config policy
+ //
+ Policy = Ip4Config2PolicyDhcp;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ } else if (StrCmp (VarArg->Arg, L"static") == 0) {
+ //
+ // Set manual config policy.
+ //
+ Policy = Ip4Config2PolicyStatic;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- if (Argc == 6) {
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- } else {
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
- }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- if (Argc == 6) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ ZeroMem (&ManualAddress, sizeof (ManualAddress));
+
+ //
+ // Get manual IP address.
+ //
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+ //
+ // Get subnetmask.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
+ if (EFI_ERROR(Status)) {
goto ON_EXIT;
}

- Permanent = TRUE;
- }
+ //
+ // Get gateway.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+
+ IsAddressOk = FALSE;
+
+ Status = IfCb->IfCfg->RegisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- NetworkBytes1 = NTOHL (Ip.Addr[0]);
- NetworkBytes2 = NTOHL (Mask.Addr[0]);
- if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
+ DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ DataSize,
+ &ManualAddress
+ );

- NetworkBytes1 = NTOHL (Gateway.Addr[0]);
- if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
-
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ if (Status == EFI_NOT_READY) {
+ gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);

- //
- // Set the configuration up, two route table entries are added:
- // one for the direct connected network, and another for the
- // default gateway. Remember, some structure members are cleared
- // by AllocateZeroPool
- //
- Config->Source = IP4_CONFIG_SOURCE_STATIC;
- Config->Ip4Info.RouteTableSize = 2;
+ while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
+ if (IsAddressOk) {
+ Status = EFI_SUCCESS;
+ break;
+ }
+ }
+ }

- CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
+ IfCb->IfCfg->UnregisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );

- Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_MAN_HOST), gShellNetwork1HiiHandle, Status);
+ goto ON_EXIT;
+ }

- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));
- } else {
- // neither static or DHCP. error.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ //
+ // Set gateway.
+ //
+ DataSize = sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeGateway,
+ DataSize,
+ &Gateway
+ );
+ VarArg = VarArg->Next;
+
+ } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
+ //
+ // Get DNS addresses.
+ //
+ VarArg = VarArg->Next;
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Index ++;
+ Tmp = Tmp->Next;
+ }

- CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));
- Config->Permanent = Permanent;
+ Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+ Index ++;
+ Tmp = Tmp->Next;
+ }
+
+ VarArg = Tmp;

- //
- // Use HII service to set NIC address
- //
- ShellStatus = IfconfigSetNicAddrByHii (Info, Config);
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- goto ON_EXIT;
- }
+ //
+ // Set DNS addresses.
+ //
+ DataSize = Index * sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeDnsServer,
+ DataSize,
+ Dns
+ );
+
+ }

- Status = IfconfigStartIp4 (Info);
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
}

- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- }
-
ON_EXIT:
- SHELL_FREE_NON_NULL(Config);
+ if (Dns != NULL) {
+ FreePool (Dns);
+ }

- return ShellStatus;
+ return EFI_SUCCESS;
+
}

/**
- Show the address information for the nic specified.
+ The ifconfig command main process.
+
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.
+
+ @retval EFI_SUCCESS ifconfig command processed successfully.
+ @retval others The ifconfig command process failed.

- @param[in] Name A pointer to the string containg the nic's name, if NULL,
- all nics' information is shown.
**/
-VOID
-EFIAPI
-IfconfigShowNicInfo (
- IN CONST CHAR16 *Name
+EFI_STATUS
+IfConfig (
+ IN IFCONFIG_PRIVATE_DATA *Private
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *NicInfo;
- UINT32 Index;
- EFI_IP4_IPCONFIG_DATA *Ip4Config;
- EFI_IPv4_ADDRESS Gateway;
- CONST CHAR16 *TempString;
+ EFI_STATUS Status;

- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- NicInfo = BASE_CR (Entry, NIC_INFO, Link);
+ //
+ // Get configure information of all interfaces.
+ //
+ Status = IfConfigGetInterfaceInfo (
+ Private->ImageHandle,
+ Private->IfName,
+ &Private->IfList
+ );

- TempString = (CHAR16*)NicInfo->Name;
- if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {
- continue;
- }
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), gShellNetwork1HiiHandle, NicInfo->Name);
+ switch (Private->OpCode) {
+ case IfConfigOpList:
+ Status = IfConfigShowInterfaceInfo (&Private->IfList);
+ break;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[0],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[1],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[3],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[4],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]
- );
-
- Print (L" Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : L"Media disconnected");
-
- if (NicInfo->ConfigInfo == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);
- continue;
- }
+ case IfConfigOpClear:
+ Status = IfConfigClearInterfaceInfo (&Private->IfList);
+ break;

- if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"DHCP");
- } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"STATIC");
- } else {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"Unknown");
- }
+ case IfConfigOpSet:
+ Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,
- STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),
- gShellNetwork1HiiHandle,
- (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")
- );
+ default:
+ Status = EFI_ABORTED;
+ }

- Ip4Config = &NicInfo->ConfigInfo->Ip4Info;
+ON_EXIT:

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"IP address",
- (UINTN)Ip4Config->StationAddress.Addr[0],
- (UINTN)Ip4Config->StationAddress.Addr[1],
- (UINTN)Ip4Config->StationAddress.Addr[2],
- (UINTN)Ip4Config->StationAddress.Addr[3]
- );
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Mask",
- (UINTN)Ip4Config->SubnetMask.Addr[0],
- (UINTN)Ip4Config->SubnetMask.Addr[1],
- (UINTN)Ip4Config->SubnetMask.Addr[2],
- (UINTN)Ip4Config->SubnetMask.Addr[3]
- );
+ return Status;
+}

- ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
- (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
- CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- }
-
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Gateway.Addr[0],
- (UINTN)Gateway.Addr[1],
- (UINTN)Gateway.Addr[2],
- (UINTN)Gateway.Addr[3]
- );
+/**
+ The ifconfig command cleanup process, free the allocated memory.

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.

- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
+**/
+VOID
+IfConfigCleanup (
+ IN IFCONFIG_PRIVATE_DATA *Private
+ )
+{
+ LIST_ENTRY *Entry;
+ LIST_ENTRY *NextEntry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ ARG_LIST *ArgNode;
+ ARG_LIST *ArgHead;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Subnet",
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]
- );
+ ASSERT (Private != NULL);

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Netmask",
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]
- );
+ //
+ // Clean the list which save the set config Args.
+ //
+ if (Private->VarArg != NULL) {
+ ArgHead = Private->VarArg;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]
- );
+ while (ArgHead->Next != NULL) {
+ ArgNode = ArgHead->Next;
+ FreePool (ArgHead);
+ ArgHead = ArgNode;
}
+
+ FreePool (ArgHead);
}

- return ;
-}
+ if (Private->IfName != NULL)
+ FreePool (Private->IfName);

-/**
- Clear address configuration for the nic specified.

- @param[in] Name A pointer to the string containg the nic's name,
- if NULL, all nics address configurations are cleared.
+ //
+ // Clean the IFCONFIG_INTERFACE_CB list.
+ //
+ Entry = Private->IfList.ForwardLink;
+ NextEntry = Entry->ForwardLink;

- @retval EFI_SUCCESS The address configuration is cleared.
- @return Some error occurs.
-**/
-EFI_STATUS
-EFIAPI
-IfconfigClearNicAddr (
- IN CONST CHAR16 *Name
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- EFI_STATUS Status;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ while (Entry != &Private->IfList) {

- if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {
- continue;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

-// if (Info->NicIp4Config == NULL) {
- Status = IfconfigSetNicAddrByHii (Info, NULL);
-// } else {
-// Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
-// }
+ RemoveEntryList (&IfCb->Link);

- if (EFI_ERROR (Status)) {
- return Status;
+ if (IfCb->IfInfo != NULL) {
+
+ FreePool (IfCb->IfInfo);
}
+
+ FreePool (IfCb);
+
+ Entry = NextEntry;
+ NextEntry = Entry->ForwardLink;
}

- return EFI_SUCCESS;
-
+ FreePool (Private);
}

/**
Function for 'ifconfig' command.

@param[in] ImageHandle Handle to the Image (NULL if Internal).
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
+
**/
SHELL_STATUS
EFIAPI
ShellCommandRunIfconfig (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- EFI_STATUS Status;
- LIST_ENTRY *Package;
- CHAR16 *ProblemParam;
- SHELL_STATUS ShellStatus;
- BOOLEAN ListOperation;
- BOOLEAN ClearOperation;
- BOOLEAN SetOperation;
- CONST CHAR16 *Item;
- LIST_ENTRY *Entry;
- NIC_INFO *Info;
-
- InitializeListHead (&NicInfoList);
- Status = EFI_INVALID_PARAMETER;
- ShellStatus = SHELL_SUCCESS;
+ EFI_STATUS Status;
+ IFCONFIG_PRIVATE_DATA *Private;
+ LIST_ENTRY *ParamPackage;
+ CONST CHAR16 *ValueStr;
+ ARG_LIST *ArgList;
+ CHAR16 *ProblemParam;
+ CHAR16 *Str;
+
+ Private = NULL;
+
+ Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_COMMAND), gShellNetwork1HiiHandle, ProblemParam);
+ goto ON_EXIT;
+ }

//
- // initialize the shell lib (we must be in non-auto-init...)
+ // To handle unsupported option.
//
- Status = ShellInitialize();
- ASSERT_EFI_ERROR(Status);
+ if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+ goto ON_EXIT;
+ }

//
- // parse the command line
+ // To handle no option.
//
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
- if (EFI_ERROR(Status)) {
- if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
- FreePool(ProblemParam);
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- ASSERT(FALSE);
- }
-
- goto Done;
+ if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
+ !ShellCommandLineGetFlag (ParamPackage, L"-h") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}

- ClearOperation = ShellCommandLineGetFlag(Package, L"-c");
- ListOperation = ShellCommandLineGetFlag(Package, L"-l");
- SetOperation = ShellCommandLineGetFlag(Package, L"-s");
-
- if ((ClearOperation && ListOperation)
- ||(SetOperation && ListOperation)
- ||(ClearOperation && SetOperation)
- ) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- } else if (!ClearOperation && !ListOperation && !SetOperation) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ //
+ // To handle conflict options.
+ //
+ if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-h")))) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_OPTIONS), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
+
+ //
+ // To show the help information of ifconfig command.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-h")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_HELP), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
-
- Status = IfconfigGetAllNicInfoByHii ();
- if (EFI_ERROR (Status)) {
- if (mIp4ConfigExist) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), gShellNetwork1HiiHandle, Status);
- } else {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellNetwork1HiiHandle, L"ifconfig", L"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid);
- }

- return SHELL_NOT_FOUND;
+ Status = EFI_INVALID_PARAMETER;
+
+ Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
+
+ if (Private == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
}

- if (ListOperation) {
- Item = ShellCommandLineGetValue (Package, L"-l");
+ InitializeListHead (&Private->IfList);
+
+ //
+ // To get interface name for the list option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ Private->OpCode = IfConfigOpList;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name for the clear option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
+ Private->OpCode = IfConfigOpClear;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name and corresponding Args for the set option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-l");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
+ if (ValueStr == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_INTERFACE), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }

//
- // Show the configuration.
+ // To split the configuration into multi-section.
//
- IfconfigShowNicInfo (Item);
- } else if (SetOperation) {
- Item = ShellCommandLineGetValue (Package, L"-s");
+ ArgList = SplitStrToList (ValueStr, L' ');
+ ASSERT (ArgList != NULL);

- //
- // The correct command line arguments for setting address are:
- // IfConfig -s eth0 DHCP [permanent]
- // IfConfig -s eth0 static ip netmask gateway [permanent]
- //
- if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) || (CountSubItems(Item) == 4)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_NO_VALUE), gShellNetwork1HiiHandle, L"ifconfig", L"-s");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ Private->OpCode = IfConfigOpSet;
+ Private->IfName = ArgList->Arg;

- ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);
- } else if (ClearOperation) {
- Item = ShellCommandLineGetValue (Package, L"-c");
+ Private->VarArg = ArgList->Next;

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-c");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ if (Private->IfName == NULL || Private->VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_COMMAND), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
- IfconfigClearNicAddr (Item);
- } else {
- ASSERT(FALSE);
}
+
+ //
+ // Main process of ifconfig.
+ //
+ Status = IfConfig (Private);

-Done:
- while (!IsListEmpty (&NicInfoList)) {
- Entry = NicInfoList.ForwardLink;
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ON_EXIT:

- RemoveEntryList (Entry);
+ ShellCommandLineFreeVarList (ParamPackage);
+ if (Private != NULL)
+ IfConfigCleanup (Private);

- if (Info->ConfigInfo != NULL) {
- FreePool (Info->ConfigInfo);
- }
+ return Status;
+}

- FreePool (Info);
- }

- if (Package != NULL) {
- ShellCommandLineFreeVarList(Package);
- }

- return (ShellStatus);
-}
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index e23588a..af96379 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -909,20 +909,20 @@ PingCreateIpInstance (
//
if (Private->IpChoice == PING_IP_CHOICE_IP6) {
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
} else {
ASSERT(Private->IpChoice == PING_IP_CHOICE_IP4);
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
}
//
@@ -953,11 +953,11 @@ PingCreateIpInstance (
// Ip6config protocol and ip6 service binding protocol are installed
// on the same handle.
//
Status = gBS->HandleProtocol (
HandleBuffer[HandleIndex],
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
(VOID **) &IpXCfg
);

if (EFI_ERROR (Status)) {
goto ON_ERROR;
@@ -971,12 +971,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
}

@@ -1007,12 +1008,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
}

@@ -1043,11 +1045,11 @@ PingCreateIpInstance (
}
} else {
//
// IP4 address check
//
- if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {
+ if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {
//
// Match a certain interface address.
//
break;
}
@@ -1135,15 +1137,10 @@ PingCreateIpInstance (
ZeroMem (&Ip4Config, sizeof (EFI_IP4_CONFIG_DATA));

//
// Configure the ip4 instance for icmp4 packet exchange.
//
-// PING_IP4_COPY_ADDRESS (&Ip4Config.StationAddress, &Private->SrcAddress);
-// Ip4Config.SubnetMask.Addr[0] = 0xFF;
-// Ip4Config.SubnetMask.Addr[1] = 0xFF;
-// Ip4Config.SubnetMask.Addr[2] = 0xFF;
-// Ip4Config.SubnetMask.Addr[3] = 0x00;
Ip4Config.DefaultProtocol = 1;
Ip4Config.AcceptAnyProtocol = FALSE;
Ip4Config.AcceptBroadcast = FALSE;
Ip4Config.AcceptIcmpErrors = TRUE;
Ip4Config.AcceptPromiscuous = FALSE;
@@ -1461,11 +1458,11 @@ ShellCommandRunPing (
ShellStatus = SHELL_SUCCESS;
ProblemParam = NULL;

Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}

if (ShellCommandLineGetFlag (ParamPackage, L"-_ip6")) {
@@ -1481,11 +1478,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
SendNumber = DEFAULT_SEND_COUNT;
@@ -1499,11 +1496,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
BufferSize = DEFAULT_BUFFER_SIZE;
@@ -1522,26 +1519,26 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &SrcAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
// Parse the paramter of destination ip address.
//
NonOptionCount = ShellCommandLineGetCount(ParamPackage);
if (NonOptionCount < 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (NonOptionCount > 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
ValueStr = ShellCommandLineGetRawValue (ParamPackage, 1);
if (ValueStr != NULL) {
@@ -1550,11 +1547,11 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &DstAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
index 49849a6..5151179 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
@@ -1,9 +1,9 @@
/** @file
Main file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

@@ -63,11 +63,11 @@ ShellNetwork1CommandsLibConstructor (
}
//
// install our shell command handlers
//
ShellCommandRegisterCommandName(L"ping", ShellCommandRunPing , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_PING));
- ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_IFCONFIG));
+ ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_IFCONFIG_HELP));

return (EFI_SUCCESS);
}

/**
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
index 68a7c93..98b40df 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
@@ -1,9 +1,9 @@
/** @file
header file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -24,13 +24,11 @@
#include <Protocol/Cpu.h>
#include <Protocol/ServiceBinding.h>
#include <Protocol/Ip6.h>
#include <Protocol/Ip6Config.h>
#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/Ip4Config2.h>
#include <Protocol/Arp.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
@@ -45,12 +43,10 @@
#include <Library/HiiLib.h>
#include <Library/NetLib.h>
#include <Library/DevicePathLib.h>
#include <Library/PrintLib.h>

-#include <Guid/NicIp4ConfigNvData.h>
-
extern EFI_HANDLE gShellNetwork1HiiHandle;

/**
Function for 'ping' command.

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
index 527d2ef..6dfbbe5 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
@@ -57,11 +57,11 @@
gEfiCpuArchProtocolGuid ## CONSUMES
gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES

- gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES

[Guids]
gShellNetwork1HiiGuid ## SOMETIMES_CONSUMES ## HII
\ No newline at end of file
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index aa27c678339c5e94c9c936d9a7ea74b6b043c200..65edb0a407754247e91009929a3525b2ad5dd96e 100644
GIT binary patch
literal 21554
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
NnXgL}rJk4f{{V5RRI&g7

literal 20112
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

--
1.9.5.msysgit.1



------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------

------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/

------------------------------

_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel


End of edk2-devel Digest, Vol 66, Issue 424
*******************************************
Wu, Jiaxin
2015-07-03 02:16:55 UTC
Permalink
Hi Tapan,
Thanks for below comments, I will update patch again.

For the level of testing, I verified the common usage for ifconfig and ping ipv4, detailed shows in below:
Ifconfig verified command:
Ifconfig -l
Ifconfig -l -b
ifconfig -l eth0
Ifconfig -s eth0 dhcp
Ifconfig -s eth0 static 192.168.10.12 255.255.255.0 192.168.10.1
Ifconfig -s eth0 dns 192.168.10.8 192.168.10.9
Ifconfig -c eth0 #(Return '-c' is unsupported option.)
ifconfig -r eth0
Ifconfig -s eth0 static 192.168.10.12 255.255.255.0 192.168.10.1 permanent #(Return 'permanent' is unsupported option.)

Ping verified command:
Ping 192.168.10.8
Ping -_s 192.168.10.12 192.168.10.8

Thanks.
Jiaxin
_____________________________________________
From: Shah, Tapan [mailto:***@hp.com]
Sent: Thursday, July 2, 2015 10:59 PM
To: Wu, Jiaxin; edk2-***@lists.sourceforge.net
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library


Jiaxin,
I saw the new patch file and my review comments below. I still waiting to get an answer for what level of testing was performed to verify this change, can you elaborate?


1. Change this help message :
" -r - (renew) Renew configuration of interface and set dhcp policy.\r\n"

To:

" -r - Renew configuration of interface and set dhcp policy.\r\n"


2. Change this token:

#string STR_IFCONFIG_INFO_DNS_ADDR_HEAD #language en-US "\n%Hdns server : %N\n"

To:

#string STR_IFCONFIG_INFO_DNS_ADDR_HEAD #language en-US "\n%HDNS server : %N\n"

3. Since there is no code change in the file, so no need to change only copyright year in UefiShellNetwork1CommandsLib.c file. Please revert this change.

Thanks,
Tapan

-----Original Message-----
From: Wu, Jiaxin [mailto:***@intel.com]
Sent: Wednesday, July 01, 2015 7:42 PM
To: Shah, Tapan; edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Hi Tapan,
I have already sent out the patch to edk2-devel.

Thanks.
Jiaxin

-----Original Message-----
From: Shah, Tapan [mailto:***@hp.com]
Sent: Thursday, July 2, 2015 1:00 AM
To: Wu, Jiaxin; edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Jiaxin,
Can you send out an updated patch file for review?

Thanks,
Tapan

-----Original Message-----
From: Wu, Jiaxin [mailto:***@intel.com]
Sent: Wednesday, July 01, 2015 10:55 AM
To: Shah, Tapan; edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library

Hi Tapan,
Thank you for your comments, I have updated patch according below and other reviewers comments.
For the copyright, I have confirm that HP's copyright should be kept, I have recovered it and just update Intel copyright year.

Best Regards!
Jiaxin

-----Original Message-----
From: edk2-devel-***@lists.sourceforge.net<mailto:edk2-devel-***@lists.sourceforge.net> [mailto:edk2-devel-***@lists.sourceforge.net]
Sent: Wednesday, July 1, 2015 12:55 AM
To: edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: edk2-devel Digest, Vol 66, Issue 424

Send edk2-devel mailing list submissions to
edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>

To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/edk2-devel
or, via email, send a message with subject or body 'help' to
edk2-devel-***@lists.sourceforge.net<mailto:edk2-devel-***@lists.sourceforge.net>

You can reach the person managing the list at
edk2-devel-***@lists.sourceforge.net<mailto:edk2-devel-***@lists.sourceforge.net>

When replying, please edit your Subject line so it is more specific
than "Re: Contents of edk2-devel digest..."


Today's Topics:

1. Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
(Shah, Tapan)


----------------------------------------------------------------------

Message: 1
Date: Tue, 30 Jun 2015 16:54:24 +0000
From: "Shah, Tapan" <***@hp.com<mailto:***@hp.com>>
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig
library.
To: "edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>"
<edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>>
Message-ID:
<***@G1W3642.americas.hpqcorp.net<mailto:***@G1W3642.americas.hpqcorp.net>>

Content-Type: text/plain; charset="utf-8"

Jiaxin,
I see that ifconfig is completely re-written and also removed HP's copyright. I am not sure if it's acceptable to remove HP's copyright from the file. I am assuming that you have done adequate testing for this major change, can you confirm what type of testing is performed to verify this change?

Below comments for .uni file changes:

1. No need to rename below three string tokens.
STR_GEN_TOO_MANY -> STR_PING_ERR_TOO_MANY
STR_GEN_TOO_FEW -> STR_PING_ERR_TOO_FEW
STR_GEN_PARAM_INV -> STR_PING_ERR_PARAM_INV

2. All other STR_GEN_* string tokens are removed from .uni file. I suspect it may break other command. They should remain as-is and no need to remove. We also keep it at the profile level .uni file to keep track of same generic token name and strings across all commands.

3. STR_IFCONFIG_HELP help output of new ifconfig is not following the help output format. Need to fix it. Existing ifconfig help output is a good example as a reference.

4. Below token shows message Ip4Config2->GetData which is not something we customer friendly. Make it a customer friendly message.

#string STR_IFCONFIG_ERR_IP4CFG_GETDATA #language en-US "Ip4Config2->GetData return %hr\n"

Thanks,
Tapan

-----Original Message-----
From: Qiu, Shumin [mailto:***@intel.com]
Sent: Monday, June 29, 2015 8:12 PM
To: edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Hi Jiaxin,
Can I have the patch file?

-Shumin

-----Original Message-----
From: jiaxinwu [mailto:***@intel.com]
Sent: Monday, June 29, 2015 10:50 PM
To: edk2-***@lists.sourceforge.net<mailto:edk2-***@lists.sourceforge.net>
Subject: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.

Version2 include:
Make the command options to be Shell2.1 compliant(For the unsupported option, display ?not supported?);
Safe string fix;
Coding style change.

This patch update ShellPkg ping/ifconfig library source code to consume Ip4Config2 protocol.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: jiaxinwu <***@intel.com<mailto:***@intel.com>>
---
.../UefiShellNetwork1CommandsLib/Ifconfig.c | 2462 ++++++++------------
.../Library/UefiShellNetwork1CommandsLib/Ping.c | 33 +-
.../UefiShellNetwork1CommandsLib.c | 4 +-
.../UefiShellNetwork1CommandsLib.h | 8 +-
.../UefiShellNetwork1CommandsLib.inf | 6 +-
.../UefiShellNetwork1CommandsLib.uni | Bin 20112 -> 21554 bytes
6 files changed, 1040 insertions(+), 1473 deletions(-)

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index 7c3f809..61328a3 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -1,1763 +1,1337 @@
/** @file
- The implementation for ifcommand shell command.
+ The implementation for Shell command ifconfig based on IP4Config2 protocol.

- (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
**/

#include "UefiShellNetwork1CommandsLib.h"

-#define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE)
-#define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))
-
-BOOLEAN mIp4ConfigExist = FALSE;
-STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL;
+enum {
+ IfConfigOpList = 1,
+ IfConfigOpSet = 2,
+ IfConfigOpClear = 3
+};
+
+typedef enum {
+ VarCheckReserved = -1,
+ VarCheckOk = 0,
+ VarCheckDuplicate,
+ VarCheckConflict,
+ VarCheckUnknown,
+ VarCheckLackValue,
+ VarCheckOutOfMem
+} VAR_CHECK_CODE;
+
+typedef enum {
+ FlagTypeSingle = 0,
+ FlagTypeNeedVar,
+ FlagTypeNeedSet,
+ FlagTypeSkipUnknown
+} VAR_CHECK_FLAG_TYPE;
+
+#define MACADDRMAXSIZE 32
+
+typedef struct _IFCONFIG_INTERFACE_CB {
+ EFI_HANDLE NicHandle;
+ LIST_ENTRY Link;
+ EFI_IP4_CONFIG2_PROTOCOL *IfCfg;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ EFI_IP4_CONFIG2_POLICY Policy;
+ UINT32 DnsCnt;
+ EFI_IPv4_ADDRESS DnsAddr[1];
+} IFCONFIG_INTERFACE_CB;
+
+typedef struct _ARG_LIST ARG_LIST;
+
+struct _ARG_LIST {
+ ARG_LIST *Next;
+ CHAR16 *Arg;
+};
+
+typedef struct _IFCONFIG4_PRIVATE_DATA {
+ EFI_HANDLE ImageHandle;
+ LIST_ENTRY IfList;
+
+ UINT32 OpCode;
+ CHAR16 *IfName;
+ ARG_LIST *VarArg;
+} IFCONFIG_PRIVATE_DATA;
+
+typedef struct _VAR_CHECK_ITEM{
+ CHAR16 *FlagStr;
+ UINT32 FlagID;
+ UINT32 ConflictMask;
+ VAR_CHECK_FLAG_TYPE FlagType;
+} VAR_CHECK_ITEM;
+
+SHELL_PARAM_ITEM mIfConfigCheckList[] = {
+ {
+ L"-b",
+ TypeFlag
+ },
+ {
+ L"-h",
+ TypeFlag
+ },
+ {
+ L"-l",
+ TypeValue
+ },
+ {
+ L"-r",
+ TypeValue
+ },
+ {
+ L"-c",
+ TypeValue
+ },
+ {
+ L"-s",
+ TypeMaxValue
+ },
+ {
+ NULL,
+ TypeMax
+ },
+};
+
+VAR_CHECK_ITEM mSetCheckList[] = {
+ {
+ L"static",
+ 0x00000001,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dhcp",
+ 0x00000002,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dns",
+ 0x00000008,
+ 0x00000004,
+ FlagTypeSingle
+ },
+ {
+ NULL,
+ 0x0,
+ 0x0,
+ FlagTypeSkipUnknown
+ },
+};

-STATIC CONST UINTN SecondsToNanoSeconds = 10000000;
-STATIC CONST CHAR16 DhcpString[5] = L"DHCP";
-STATIC CONST CHAR16 StaticString[7] = L"STATIC";
STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";

-typedef struct {
- LIST_ENTRY Link;
- EFI_HANDLE Handle;
- NIC_ADDR NicAddress;
- CHAR16 Name[IP4_NIC_NAME_LENGTH];
- BOOLEAN MediaPresentSupported;
- BOOLEAN MediaPresent;
- EFI_IP4_CONFIG_PROTOCOL *Ip4Config;
- NIC_IP4_CONFIG_INFO *ConfigInfo;
-} NIC_INFO;
-
-typedef struct {
- EFI_IP_ADDRESS DestIp;
- EFI_MAC_ADDRESS DestMac;
- EFI_IP_ADDRESS LocalIp;
- EFI_MAC_ADDRESS LocalMac;
- UINT8 MacLen;
- EFI_EVENT OnResolved;
- BOOLEAN Duplicate;
-} ARP_REQUEST;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- {L"-c", TypeValue},
- {L"-l", TypeValue},
- {L"-s", TypeMaxValue},
- {NULL, TypeMax}
- };
-
-STATIC LIST_ENTRY NicInfoList;
-STATIC BOOLEAN ArpResolved;
-STATIC BOOLEAN mTimeout;
-
/**
- Count the space delimited items in a string.
-
- @param[in] String A pointer to the string to count.
-
- @return The number of space-delimited items.
- @retval 0xFF an error occured.
-**/
-UINT8
-EFIAPI
-CountSubItems (
- IN CONST CHAR16 *String
- )
-{
- CONST CHAR16 *Walker;
- UINT8 Count;
-
- if (String == NULL || *String == CHAR_NULL) {
- return (0xFF);
- }
+ Split a string with specified separator and save the substring to a list.

- for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; Walker = (StrStr(Walker, L" ")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);
- return (Count);
-}
+ @param[in] String The pointer of the input string.
+ @param[in] Separator The specified separator.

-/**
- Find the NIC_INFO by the specified nic name.
+ @return The pointer of headnode of ARG_LIST.

- @param[in] Name The pointer to the string containing the NIC name.
-
- @return The pointer to the NIC_INFO if there is a NIC_INFO named by Name.
- @retval NULL No NIC_INFO was found for Name.
**/
-NIC_INFO*
-EFIAPI
-IfconfigFindNicByName (
- IN CONST CHAR16 *Name
+ARG_LIST *
+SplitStrToList (
+ IN CONST CHAR16 *String,
+ IN CHAR16 Separator
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- CHAR16 *TempString;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
- TempString = (CHAR16*)Info->Name;
+ CHAR16 *Str;
+ CHAR16 *ArgStr;
+ ARG_LIST *ArgList;
+ ARG_LIST *ArgNode;

- if (StringNoCaseCompare (&Name, &TempString) == 0) {
- return Info;
- }
+ if (*String == L'\0') {
+ return NULL;
}

- return NULL;
-}
-
-/**
- Tests whether a child handle is a child device of the controller.
-
- @param[in] ControllerHandle A handle for a (parent) controller to test.
- @param[in] ChildHandle A child handle to test.
- @param[in] ProtocolGuid Supplies the protocol that the child controller
- opens on its parent controller.
-
- @retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.
- @retval EFI_UNSUPPORTED ChildHandle is not a child of the ControllerHandle.
-**/
-EFI_STATUS
-EFIAPI
-TestChildHandle (
- IN CONST EFI_HANDLE ControllerHandle,
- IN CONST EFI_HANDLE ChildHandle,
- IN CONST EFI_GUID *ProtocolGuid
- )
-{
- EFI_STATUS Status;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- UINTN EntryCount;
- UINTN Index;
-
- ASSERT (ProtocolGuid != NULL);
-
//
- // Retrieve the list of agents that are consuming the specific protocol
- // on ControllerHandle.
+ // Copy the CONST string to a local copy.
//
- Status = gBS->OpenProtocolInformation (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (String));
+ ASSERT (Str != NULL);
+ StrCpyS (Str, StrSize (String)/sizeof (CHAR16), String);
+ ArgStr = Str;

//
- // Inspect if ChildHandle is one of the agents.
+ // init a node for the list head.
//
- Status = EFI_UNSUPPORTED;
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&
- (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = EFI_SUCCESS;
- break;
- }
- }
-
- FreePool (OpenInfoBuffer);
- return Status;
-}
-
-/**
- Get the child handle of the NIC handle.
-
- @param[in] Controller Routing information: GUID.
- @param[out] ChildHandle Returned child handle.
-
- @retval EFI_SUCCESS Successfully to get child handle.
-**/
-EFI_STATUS
-GetChildHandle (
- IN EFI_HANDLE Controller,
- OUT EFI_HANDLE *ChildHandle
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- UINTN Index;
- EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;
- VENDOR_DEVICE_PATH *VendorDeviceNode;
+ ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode != NULL);
+ ArgList = ArgNode;

//
- // Locate all EFI Hii Config Access protocols
+ // Split the local copy and save in the list node.
//
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiHiiConfigAccessProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
- );
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return Status;
- }
-
- Status = EFI_NOT_FOUND;
-
- for (Index = 0; Index < HandleCount; Index++) {
-
- Status = TestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);
- if (!EFI_ERROR (Status)) {
- //
- // Get device path on the child handle
- //
- Status = gBS->HandleProtocol (
- Handles[Index],
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ChildDeviceDevicePath
- );
-
- if (!EFI_ERROR (Status)) {
- while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
- ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
- //
- // Parse one instance
- //
- if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&
- ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
- VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
- if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
- //
- // Found item matched gEfiNicIp4ConfigVariableGuid
- //
- *ChildHandle = Handles[Index];
- FreePool (Handles);
- return EFI_SUCCESS;
- }
- }
- }
- }
+ while (*Str != L'\0') {
+ if (*Str == Separator) {
+ *Str = L'\0';
+ ArgNode->Arg = ArgStr;
+ ArgStr = Str + 1;
+ ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode->Next != NULL);
+ ArgNode = ArgNode->Next;
}
+
+ Str++;
}

- FreePool (Handles);
- return Status;
+ ArgNode->Arg = ArgStr;
+ ArgNode->Next = NULL;
+
+ return ArgList;
}

/**
- Append OFFSET/WIDTH/VALUE items at the beginning of string.
-
- @param[in, out] String The pointer to the string to append onto.
- @param[in] Offset Offset value.
- @param[in] Width Width value.
- @param[in] Block Point to data buffer.
-
- @return The count of unicode character that were appended.
-**/
-UINTN
-EFIAPI
-AppendOffsetWidthValue (
- IN OUT CHAR16 *String,
- IN UINTN Offset,
- IN UINTN Width,
- IN CONST UINT8 *Block
- )
-
-{
- CHAR16 *OriString;
-
- OriString = String;
-
- StrnCpy (String, L"&OFFSET=", 9);
- String += StrLen (L"&OFFSET=");
- String += UnicodeSPrint (String, 20, L"%x", Offset);
-
- StrnCpy (String,L"&WIDTH=", 8);
- String += StrLen (L"&WIDTH=");
- String += UnicodeSPrint (String, 20, L"%x", Width);
+ Check the correctness of input Args with '-s' option.

- if (Block != NULL) {
- StrnCpy (String,L"&VALUE=", 8);
- String += StrLen (L"&VALUE=");
- while ((Width--) != 0) {
- String += UnicodeSPrint (String, 20, L"%x", Block[Width]);
- }
- }
-
- return String - OriString;
-}
+ @param[in] CheckList The pointer of VAR_CHECK_ITEM array.
+ @param[in] Name The pointer of input arg.
+ @param[in] Init The switch to execute the check.

-/**
- Converts the unicode character of the string from uppercase to lowercase.
- This is a internal function.
+ @return The value of VAR_CHECK_CODE.

- @param ConfigString String to be converted
**/
-CHAR16*
-EFIAPI
-HiiToLower (
- IN CHAR16 *ConfigString
- )
+VAR_CHECK_CODE
+IfConfigRetriveCheckListByName(
+ IN VAR_CHECK_ITEM *CheckList,
+ IN CHAR16 *Name,
+ IN BOOLEAN Init
+)
{
- CHAR16 *String;
- BOOLEAN Lower;
-
- //
- // Convert all hex digits in range [A-F] in the configuration header to [a-f]
- //
- for (String = ConfigString, Lower = FALSE; String != NULL && *String != L'\0'; String++) {
- if (*String == L'=') {
- Lower = TRUE;
- } else if (*String == L'&') {
- Lower = FALSE;
- } else if (Lower && *String >= L'A' && *String <= L'F') {
- *String = (CHAR16) (*String - L'A' + L'a');
- }
+ STATIC UINT32 CheckDuplicate;
+ STATIC UINT32 CheckConflict;
+ VAR_CHECK_CODE RtCode;
+ UINT32 Index;
+ VAR_CHECK_ITEM Arg;
+
+ if (Init) {
+ CheckDuplicate = 0;
+ CheckConflict = 0;
+ return VarCheckOk;
}

- return (ConfigString);
-}
-
-
-/**
- Construct <ConfigHdr> using routing information GUID/NAME/PATH.
-
- @param[in] Guid Routing information: GUID.
- @param[in] Name Routing information: NAME.
- @param[in] DriverHandle Driver handle which contains the routing information: PATH.
-
- @retval NULL An error occured.
- @return The pointer to configHdr string.
-**/
-CHAR16 *
-EFIAPI
-ConstructConfigHdr (
- IN CONST EFI_GUID *Guid,
- IN CONST CHAR16 *Name,
- IN EFI_HANDLE DriverHandle
- )
-{
- EFI_STATUS Status;
- CHAR16 *ConfigHdr;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- CHAR16 *String;
- UINTN Index;
- UINT8 *Buffer;
- UINTN DevicePathLength;
- UINTN NameLength;
+ RtCode = VarCheckOk;
+ Index = 0;
+ Arg = CheckList[Index];

//
- // Get the device path from handle installed EFI HII Config Access protocol
+ // Check the Duplicated/Conflicted/Unknown input Args.
//
- Status = gBS->HandleProtocol (
- DriverHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath
- );
- if (EFI_ERROR (Status)) {
- return NULL;
- }
+ while (Arg.FlagStr != NULL) {
+ if (StrCmp (Arg.FlagStr, Name) == 0) {

- DevicePathLength = GetDevicePathSize (DevicePath);
- NameLength = StrLen (Name);
- ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));
- if (ConfigHdr == NULL) {
- return NULL;
- }
+ if (CheckDuplicate & Arg.FlagID) {
+ RtCode = VarCheckDuplicate;
+ break;
+ }

- String = ConfigHdr;
- StrnCpy (String, L"GUID=", 6);
- String += StrLen (L"GUID=");
+ if (CheckConflict & Arg.ConflictMask) {
+ RtCode = VarCheckConflict;
+ break;
+ }

- //
- // Append Guid converted to <HexCh>32
- //
- for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
- }
+ CheckDuplicate |= Arg.FlagID;
+ CheckConflict |= Arg.ConflictMask;
+ break;
+ }

- //
- // Append L"&NAME="
- //
- StrnCpy (String, L"&NAME=", 7);
- String += StrLen (L"&NAME=");
- for (Index = 0; Index < NameLength ; Index++) {
- String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);
+ Arg = CheckList[++Index];
}
-
- //
- // Append L"&PATH="
- //
- StrnCpy (String, L"&PATH=", 7);
- String += StrLen (L"&PATH=");
- for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
+
+ if (Arg.FlagStr == NULL) {
+ RtCode = VarCheckUnknown;
}

- return (HiiToLower(ConfigHdr));
+ return RtCode;
}

/**
- Get network physical device NIC information.
+ The notify function of create event when performing a manual config.

- @param[in] Handle The network physical device handle.
- @param[out] NicAddr NIC information.
+ @param[in] Event The event this notify function registered to.
+ @param[in] Context Pointer to the context data registered to the event.

- @retval EFI_SUCCESS Get NIC information successfully.
-**/
-EFI_STATUS
+**/
+VOID
EFIAPI
-IfConfigGetNicMacInfo (
- IN EFI_HANDLE Handle,
- OUT NIC_ADDR *NicAddr
- )
+IfConfigManualAddressNotify (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
- }
-
- NicAddr->Type = (UINT16) SnpMode.IfType;
- NicAddr->Len = (UINT8) SnpMode.HwAddressSize;
- CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);
-
-ON_ERROR:
-
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
-
- return Status;
-
+ *((BOOLEAN *) Context) = TRUE;
}

+
/**
- Get network physical device NIC information.
+ Print MAC address.

- @param[in] Handle The network physical device handle.
- @param[out] MediaPresentSupported
- Upon successful return, TRUE is media present
- is supported. FALSE otherwise.
- @param[out] MediaPresent Upon successful return, TRUE is media present
- is enabled. FALSE otherwise.
+ @param[in] Node The pointer of MAC address buffer.
+ @param[in] Size The size of MAC address buffer.

- @retval EFI_SUCCESS The operation was successful.
**/
-EFI_STATUS
-EFIAPI
-IfConfigGetNicMediaStatus (
- IN EFI_HANDLE Handle,
- OUT BOOLEAN *MediaPresentSupported,
- OUT BOOLEAN *MediaPresent
- )
-
+VOID
+IfConfigPrintMacAddr (
+ IN UINT8 *Node,
+ IN UINT32 Size
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
+ UINTN Index;

- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
+ ASSERT (Size <= MACADDRMAXSIZE);

- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
+ for (Index = 0; Index < Size; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);
+ if (Index + 1 < Size) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle);
+ }
}
-
- *MediaPresentSupported = SnpMode.MediaPresentSupported;
- *MediaPresent = SnpMode.MediaPresent;

-ON_ERROR:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+}

- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );

- return Status;
+/**
+ The get current status of all handles.

-}
+ @param[in] ImageHandle The handle of ImageHandle.
+ @param[in] IfName The pointer of IfName(interface name).
+ @param[in] IfList The pointer of IfList(interface list).

-/**
- Get all Nic's information through HII service.
+ @retval EFI_SUCCESS The get status processed successfully.
+ @retval others The get status process failed.

- @retval EFI_SUCCESS All the nic information is collected.
**/
EFI_STATUS
-EFIAPI
-IfconfigGetAllNicInfoByHii (
- VOID
+IfConfigGetInterfaceInfo (
+ IN EFI_HANDLE ImageHandle,
+ IN CHAR16 *IfName,
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- UINTN Index;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- UINTN BufferSize;
- NIC_INFO *NicInfo;
- NIC_IP4_CONFIG_INFO *NicConfigRequest;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfigRequest = NULL;
- NicInfo = NULL;
-
- InitializeListHead (&NicInfoList);
+ EFI_STATUS Status;
+ UINTN HandleIndex;
+ UINTN HandleNum;
+ EFI_HANDLE *HandleBuffer;
+ EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ UINTN DataSize;

- //
- // Check if HII Config Routing protocol available.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiConfigRoutingProtocolGuid,
- NULL,
- (VOID**)&mHiiConfigRouting
- );
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
+ HandleBuffer = NULL;
+ HandleNum = 0;
+
+ IfInfo = NULL;
+ IfCb = NULL;

//
- // Locate all network device handles
+ // Locate all the handles with ip4 service binding protocol.
//
Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
+ ByProtocol,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ NULL,
+ &HandleNum,
+ &HandleBuffer
);
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return EFI_NOT_FOUND;
+ if (EFI_ERROR (Status) || (HandleNum == 0)) {
+ return EFI_ABORTED;
}

- for (Index = 0; Index < HandleCount; Index++) {
- Status = GetChildHandle (Handles[Index], &ChildHandle);
+ //
+ // Enumerate all handles that installed with ip4 service binding protocol.
+ //
+ for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
+ IfCb = NULL;
+ IfInfo = NULL;
+ DataSize = 0;
+
+ //
+ // Ip4config protocol and ip4 service binding protocol are installed
+ // on the same handle.
+ //
+ ASSERT (HandleBuffer != NULL);
+ Status = gBS->HandleProtocol (
+ HandleBuffer[HandleIndex],
+ &gEfiIp4Config2ProtocolGuid,
+ (VOID **) &Ip4Cfg2
+ );
+
if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility.
- //
- ChildHandle = Handles[Index];
+ goto ON_ERROR;
}
+
//
- // Construct configuration request string header
+ // Get the interface information size.
//
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- Length = 0;
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ NULL
+ );
+
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
+
+ IfInfo = AllocateZeroPool (DataSize);
+
+ if (IfInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
-
+
//
- // Append OFFSET/WIDTH pair
+ // Get the interface info.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ IfInfo
+ );

- NicInfo = AllocateZeroPool (sizeof (NIC_INFO));
- if (NicInfo == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
goto ON_ERROR;
}
- NicInfo->Handle = Handles[Index];
-
+
//
- // Get network physical devcie MAC information
+ // Check the interface name if required.
//
- IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);
- if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);
- } else {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
+ FreePool (IfInfo);
+ continue;
}

+ DataSize = 0;
+
//
- // Get media status
+ // Get the size of dns server list.
//
- IfConfigGetNicMediaStatus (Handles[Index], &NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ NULL
+ );
+
+ if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfigRequest == NULL) {
+ IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);
+
+ if (IfCb == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}

+ IfCb->NicHandle = HandleBuffer[HandleIndex];
+ IfCb->IfInfo = IfInfo;
+ IfCb->IfCfg = Ip4Cfg2;
+ IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));
+
//
- // Get network parameters by HII service
+ // Get the dns server list if has.
//
- Status = mHiiConfigRouting->ExtractConfig (
- mHiiConfigRouting,
- ConfigResp,
- &AccessProgress,
- &AccessResults
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = NIC_ITEM_CONFIG_SIZE;
- Status = mHiiConfigRouting->ConfigToBlock (
- mHiiConfigRouting,
- AccessResults,
- (UINT8 *) NicConfigRequest,
- &BufferSize,
- &AccessProgress
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;
- NicConfig = AllocateZeroPool (BufferSize);
- if (NicConfig == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
- CopyMem (NicConfig, NicConfigRequest, BufferSize);
-
- //
- // If succeeds to get NIC configuration, fix up routetable pointer.
- //
- NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (&NicConfig->Ip4Info + 1);
- NicInfo->ConfigInfo = NicConfig;
-
- } else {
- NicInfo->ConfigInfo = NULL;
+ if (DataSize > 0) {
+
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ IfCb->DnsAddr
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
-
- FreePool (AccessResults);
-
- } else {
- NicInfo->ConfigInfo = NULL;
}

//
- // Add the Nic's info to the global NicInfoList.
+ // Get the config policy.
//
- InsertTailList (&NicInfoList, &NicInfo->Link);
+ DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypePolicy,
+ &DataSize,
+ &IfCb->Policy
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }

- FreePool (NicConfigRequest);
- FreePool (ConfigResp);
- FreePool (ConfigHdr);
+
+ InsertTailList (IfList, &IfCb->Link);
+
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
+ //
+ // Only need the appointed interface, keep the allocated buffer.
+ //
+ IfCb = NULL;
+ IfInfo = NULL;
+ break;
+ }
}

- FreePool (Handles);
+ if (HandleBuffer != NULL) {
+ FreePool (HandleBuffer);
+ }

return EFI_SUCCESS;
-
+
ON_ERROR:
- if (AccessResults != NULL) {
- FreePool (AccessResults);
- }
- if (NicConfigRequest != NULL) {
- FreePool (NicConfigRequest);
- }
- if (NicInfo != NULL) {
- FreePool (NicInfo);
- }
- if (ConfigResp != NULL) {
- FreePool (ConfigResp);
- }
- if (ConfigHdr != NULL) {
- FreePool (ConfigHdr);
+
+ if (IfInfo != NULL) {
+ FreePool (IfInfo);
}

- FreePool (Handles);
+ if (IfCb != NULL) {
+ FreePool (IfCb);
+ }

return Status;
}

/**
- Set the address for the specified nic by HII service.
+ The list process of the ifconfig command.

- @param[in] NicInfo A pointer to the NIC_INFO of the Nic to be configured.
- @param[in] Config The command line arguments for the set operation.
+ @param[in] IfList The pointer of IfList(interface list).
+
+ @retval EFI_SUCCESS The ifconfig command list processed successfully.
+ @retval others The ifconfig command list process failed.

- @retval EFI_SUCCESS The address set operation is done.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddrByHii (
- IN CONST NIC_INFO *NicInfo,
- IN CONST NIC_IP4_CONFIG_INFO *Config
+EFI_STATUS
+IfConfigShowInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- SHELL_STATUS ShellStatus;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfig = NULL;
- ShellStatus = SHELL_SUCCESS;
-
- Status = GetChildHandle (NicInfo->Handle, &ChildHandle);
- if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility
- //
- ChildHandle = NicInfo->Handle;
- }
- //
- // Construct config request string header
- //
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IPv4_ADDRESS Gateway;
+ UINT32 Index;

- NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfig == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- if (Config != NULL) {
- CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

//
- // Append OFFSET/WIDTH pair
+ // Go through the interface list.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ while (Entry != IfList) {
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

- //
- // Call HII helper function to generate configuration string
- //
- Status = mHiiConfigRouting->BlockToConfig (
- mHiiConfigRouting,
- ConfigResp,
- (UINT8 *) NicConfig,
- NIC_ITEM_CONFIG_SIZE,
- &AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);

- //
- // Set IP setting by HII servie
- //
- Status = mHiiConfigRouting->RouteConfig (
- mHiiConfigRouting,
- AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
- }
+ //
+ // Print interface name.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);

-ON_EXIT:
- SHELL_FREE_NON_NULL(AccessResults);
- SHELL_FREE_NON_NULL(NicConfig);
- SHELL_FREE_NON_NULL(ConfigResp);
- SHELL_FREE_NON_NULL(ConfigHdr);
+ //
+ // Print interface config policy.
+ //
+ if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_AUTO), gShellNetwork1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);
+ }

- return ShellStatus;
-}
+ //
+ // Print mac address of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);

-/**
- The callback function for the Arp address resolved event.
+ IfConfigPrintMacAddr (
+ IfCb->IfInfo->HwAddress.Addr,
+ IfCb->IfInfo->HwAddressSize
+ );

- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-IfconfigOnArpResolved (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- ARP_REQUEST *Request;
- UINT8 Index;
-
- Request = (ARP_REQUEST *) Context;
- ASSERT (Request != NULL);
+ //
+ // Print IPv4 address list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);

- Request->Duplicate = FALSE;
-
- if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, Request->MacLen)) {
ShellPrintHiiEx(
-1,
-1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Already Configured",
- (UINTN)Request->DestIp.v4.Addr[0],
- (UINTN)Request->DestIp.v4.Addr[1],
- (UINTN)Request->DestIp.v4.Addr[2],
- (UINTN)Request->DestIp.v4.Addr[3]
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[3]
);
- ArpResolved = TRUE;
- return;
- }
-
- for (Index = 0; Index < Request->MacLen; Index++) {
- if (Request->DestMac.Addr[Index] != 0) {
- Request->Duplicate = TRUE;
- }
- }

- if (Request->Duplicate) {
+ //
+ // Print subnet mask list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
+
ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)Request->DestMac.Addr[0],
- (UINTN)Request->DestMac.Addr[1],
- (UINTN)Request->DestMac.Addr[2],
- (UINTN)Request->DestMac.Addr[3],
- (UINTN)Request->DestMac.Addr[4],
- (UINTN)Request->DestMac.Addr[5]
- );
- }
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]
+ );

- ArpResolved = TRUE;
- return ;
-}
+ //
+ // Print default gateway of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);

-/**
- Check whether the address to be configured conflicts with other hosts.
+ ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
+
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
+ (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
+ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
+ }
+ }

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
- @param[in] IpAddr The IPv4 address to be configured to the Nic.
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)Gateway.Addr[0],
+ (UINTN)Gateway.Addr[1],
+ (UINTN)Gateway.Addr[2],
+ (UINTN)Gateway.Addr[3]
+ );
+
+ //
+ // Print route table entry.
+ //
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);

- @return TRUE Some other host already uses the IpAddr.
- @return FALSE The address is unused.
-**/
-BOOLEAN
-EFIAPI
-IfconfigIsIpDuplicate (
- IN NIC_INFO *NicInfo,
- IN IP4_ADDR IpAddr
- )
-{
- EFI_ARP_PROTOCOL *Arp;
- EFI_ARP_CONFIG_DATA ArpCfgData;
- EFI_HANDLE ArpHandle;
- ARP_REQUEST Request;
- EFI_STATUS Status;
-
- Arp = NULL;
- ArpHandle = NULL;
- ZeroMem (&Request, sizeof (ARP_REQUEST));
-
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- &ArpHandle
- );
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);

- if (EFI_ERROR (Status)) {
- return FALSE;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Subnet ",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]
+ );

- Status = gBS->OpenProtocol (
- ArpHandle,
- &gEfiArpProtocolGuid,
- (VOID**)&Arp,
- gImageHandle,
- ArpHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Netmask",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]
+ );

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Gateway",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]
+ );
+ }

- //
- // Set up the Arp requests
- //
- EFI_IP4_TO_U32 (Request.DestIp.v4) = IpAddr;
- EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;
- Request.LocalMac = NicInfo->NicAddress.MacAddr;
- Request.MacLen = NicInfo->NicAddress.Len;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- IfconfigOnArpResolved,
- (VOID *) &Request,
- &Request.OnResolved
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ArpCfgData.SwAddressType = 0x0800;
- ArpCfgData.SwAddressLength = 4;
- ArpCfgData.StationAddress = &Request.LocalIp;
- ArpCfgData.EntryTimeOut = 0;
- ArpCfgData.RetryCount = 3;
- ArpCfgData.RetryTimeOut = 0;
-
- Status = Arp->Configure (Arp, &ArpCfgData);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ //
+ // Print dns server addresses list of the interface if has.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);

- Status = Arp->Request (
- Arp,
- &Request.DestIp,
- Request.OnResolved,
- &Request.DestMac
- );
-
- if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
- goto ON_EXIT;
- }
+ for (Index = 0; Index < IfCb->DnsCnt; Index++) {
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN) IfCb->DnsAddr[Index].Addr[0],
+ (UINTN) IfCb->DnsAddr[Index].Addr[1],
+ (UINTN) IfCb->DnsAddr[Index].Addr[2],
+ (UINTN) IfCb->DnsAddr[Index].Addr[3]
+ );

- while (!ArpResolved) {
-
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+ }

-ON_EXIT:
- if (Request.OnResolved != NULL) {
- gBS->CloseEvent (Request.OnResolved);
- }
+ //
+ // Print route table of the interface if has.
+ //

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- ArpHandle
- );
+ Entry = Entry->ForwardLink;

- return Request.Duplicate;
+ }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
+ return EFI_SUCCESS;
}

/**
- The callback function for the timer event used to get map.
-
- @param[in] Event The event this function is registered to.
- @param[in] Context The context registered to the event.
-**/
-VOID
-EFIAPI
-TimeoutToGetMap (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- mTimeout = TRUE;
- return ;
-}
+ The clean process of the ifconfig command to clear interface info.

-/**
- Create an IP child, use it to start the auto configuration, then destroy it.
+ @param[in] IfList The pointer of IfList(interface list).

- @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
+ @retval EFI_SUCCESS The ifconfig command clean processed successfully.
+ @retval others The ifconfig command clean process failed.

- @retval EFI_SUCCESS The configuration is done.
**/
EFI_STATUS
-EFIAPI
-IfconfigStartIp4(
- IN NIC_INFO *NicInfo
+IfConfigClearInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_IP4_PROTOCOL *Ip4;
- EFI_HANDLE Ip4Handle;
- EFI_HANDLE TimerToGetMap;
- EFI_IP4_CONFIG_DATA Ip4ConfigData;
- EFI_IP4_MODE_DATA Ip4Mode;
- EFI_STATUS Status;
-
- //
- // Get the Ip4ServiceBinding Protocol
- //
- Ip4Handle = NULL;
- Ip4 = NULL;
- TimerToGetMap = NULL;
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IP4_CONFIG2_POLICY Policy;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), gShellNetwork1HiiHandle);
+ Policy = Ip4Config2PolicyDhcp;
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;

- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- &Ip4Handle
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}

- Status = gBS->OpenProtocol (
- Ip4Handle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- NicInfo->Handle,
- gImageHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ //
+ // Go through the interface list.
+ //
+ while (Entry != IfList) {

- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );

- Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
- Ip4ConfigData.AcceptAnyProtocol = FALSE;
- Ip4ConfigData.AcceptIcmpErrors = FALSE;
- Ip4ConfigData.AcceptBroadcast = FALSE;
- Ip4ConfigData.AcceptPromiscuous = FALSE;
- Ip4ConfigData.UseDefaultAddress = TRUE;
- ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
- ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- Ip4ConfigData.TypeOfService = 0;
- Ip4ConfigData.TimeToLive = 1;
- Ip4ConfigData.DoNotFragment = FALSE;
- Ip4ConfigData.RawData = FALSE;
- Ip4ConfigData.ReceiveTimeout = 0;
- Ip4ConfigData.TransmitTimeout = 0;
-
- Status = Ip4->Configure (Ip4, &Ip4ConfigData);
-
- if (Status == EFI_NO_MAPPING) {
- mTimeout = FALSE;
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL | EVT_TIMER,
- TPL_CALLBACK,
- TimeoutToGetMap,
- NULL,
- &TimerToGetMap
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->SetTimer (
- TimerToGetMap,
- TimerRelative,
- MultU64x32 (SecondsToNanoSeconds, 5)
- );
-
if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ break;
}

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), gShellNetwork1HiiHandle);
-
- while (!mTimeout) {
- Ip4->Poll (Ip4);
-
- if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) &&
- Ip4Mode.IsConfigured) {
- break;
- }
- }
- }
-
- Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);
-
- if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Default",
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]
- );
- }
-
-ON_EXIT:
-
- if (EFI_ERROR (Status)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);
- }
-
- if (TimerToGetMap != NULL) {
- gBS->SetTimer (TimerToGetMap, TimerCancel, 0);
- gBS->CloseEvent (TimerToGetMap);
+ Entry = Entry->ForwardLink;
}

- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Ip4Handle
- );
-
return Status;
}

/**
- Set the address for the nic specified by the params.
+ The set process of the ifconfig command.
+
+ @param[in] IfList The pointer of IfList(interface list).
+ @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).

- @param[in] Argc The count of the passed in Params.
- @param[in] Params The command line arguments for the set operation.
+ @retval EFI_SUCCESS The ifconfig command set processed successfully.
+ @retval others The ifconfig command set process failed.

- @retval EFI_SUCCESS The address set operation is done.
- @return Some error occurs.
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddr (
- IN UINTN Argc,
- IN CONST CHAR16 *Params
+EFI_STATUS
+IfConfigSetInterfaceInfo (
+ IN LIST_ENTRY *IfList,
+ IN ARG_LIST *VarArg
)
{
- NIC_IP4_CONFIG_INFO *Config;
- NIC_IP4_CONFIG_INFO *OldConfig;
- EFI_IP_ADDRESS Ip;
- EFI_IP_ADDRESS Mask;
- EFI_IP_ADDRESS Gateway;
- NIC_INFO *Info;
- BOOLEAN Permanent;
- SHELL_STATUS ShellStatus;
- CONST CHAR16 *Walker;
- CHAR16 *Temp;
- CONST CHAR16 *DhcpTemp;
- CONST CHAR16 *StaticTemp;
- CONST CHAR16 *PermTemp;
- UINT32 NetworkBytes1;
- UINT32 NetworkBytes2;
- EFI_STATUS Status;
-
- Walker = Params;
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- Info = IfconfigFindNicByName (Temp);
-
- if (Info == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);
- return SHELL_NOT_FOUND;
+
+ EFI_STATUS Status;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ VAR_CHECK_CODE CheckCode;
+ EFI_EVENT TimeOutEvt;
+ EFI_EVENT MappedEvt;
+ BOOLEAN IsAddressOk;
+
+ EFI_IP4_CONFIG2_POLICY Policy;
+ EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
+ UINTN DataSize;
+ EFI_IPv4_ADDRESS Gateway;
+ EFI_IPv4_ADDRESS *Dns;
+ ARG_LIST *Tmp;
+ UINTN Index;
+
+ CONST CHAR16* Temp1;
+ CONST CHAR16* Temp2;
+
+ Dns = NULL;
+
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
+ return EFI_INVALID_PARAMETER;
}
+
+ //
+ // Make sure to set only one interface each time.
+ //
+ IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
+ Status = EFI_SUCCESS;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")==NULL?0:StrStr(Walker, L" ")-Walker);
+ //
+ // Initialize check list mechanism.
+ //
+ CheckCode = IfConfigRetriveCheckListByName(
+ NULL,
+ NULL,
+ TRUE
+ );

- Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof (EFI_IP4_ROUTE_TABLE));
- if (Config == NULL) {
- return SHELL_OUT_OF_RESOURCES;
+ //
+ // Create events & timers for asynchronous settings.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &TimeOutEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
}

- Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);
-
- OldConfig = Info->ConfigInfo;
- Permanent = FALSE;
- ShellStatus = SHELL_INVALID_PARAMETER;
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ IfConfigManualAddressNotify,
+ &IsAddressOk,
+ &MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- DhcpTemp = DhcpString;
- StaticTemp = StaticString;
-
- if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {
+ //
+ // Parse the setting variables.
+ //
+ while (VarArg != NULL) {
//
- // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP permanent
+ // Check invalid parameters (duplication & unknown & conflict).
//
- if ((Argc != 2) && (Argc!= 3)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ CheckCode = IfConfigRetriveCheckListByName(
+ mSetCheckList,
+ VarArg->Arg,
+ FALSE
+ );

- if (Argc == 3) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ if (VarCheckOk != CheckCode) {
+ switch (CheckCode) {
+ case VarCheckDuplicate:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ case VarCheckConflict:
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- Permanent = TRUE;
- }
+ case VarCheckUnknown:
+ //
+ // To handle unsupported option.
+ //
+ Temp1 = VarArg->Arg;
+ Temp2 = PermanentString;
+ if (StringNoCaseCompare(&Temp1, &Temp2) == 0) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString);
+ goto ON_EXIT;
+ }

- if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&
- (OldConfig->Permanent == Permanent)) {
+ //
+ // To handle unknown option.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);
- ShellStatus = SHELL_ALREADY_STARTED;
- goto ON_EXIT;
+ default:
+ break;
+ }
+
+ VarArg = VarArg->Next;
+ continue;
}

- Config->Source = IP4_CONFIG_SOURCE_DHCP;
- } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {
//
- // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
- // eth0 static IP NETMASK GATEWAY permanent
+ // Process valid variables.
//
- if ((Argc != 5) && (Argc != 6)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
-
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
+ if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
+ //
+ // Set dhcp config policy
+ //
+ Policy = Ip4Config2PolicyDhcp;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ } else if (StrCmp (VarArg->Arg, L"static") == 0) {
+ //
+ // Set manual config policy.
+ //
+ Policy = Ip4Config2PolicyStatic;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- if (Argc == 6) {
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- } else {
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
- }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;

- if (Argc == 6) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ ZeroMem (&ManualAddress, sizeof (ManualAddress));
+
+ //
+ // Get manual IP address.
+ //
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }

- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp, PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+ //
+ // Get subnetmask.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
+ if (EFI_ERROR(Status)) {
goto ON_EXIT;
}

- Permanent = TRUE;
- }
+ //
+ // Get gateway.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+
+ IsAddressOk = FALSE;
+
+ Status = IfCb->IfCfg->RegisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- NetworkBytes1 = NTOHL (Ip.Addr[0]);
- NetworkBytes2 = NTOHL (Mask.Addr[0]);
- if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
+ DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ DataSize,
+ &ManualAddress
+ );

- NetworkBytes1 = NTOHL (Gateway.Addr[0]);
- if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
-
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ if (Status == EFI_NOT_READY) {
+ gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);

- //
- // Set the configuration up, two route table entries are added:
- // one for the direct connected network, and another for the
- // default gateway. Remember, some structure members are cleared
- // by AllocateZeroPool
- //
- Config->Source = IP4_CONFIG_SOURCE_STATIC;
- Config->Ip4Info.RouteTableSize = 2;
+ while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
+ if (IsAddressOk) {
+ Status = EFI_SUCCESS;
+ break;
+ }
+ }
+ }

- CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
+ IfCb->IfCfg->UnregisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );

- Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_MAN_HOST), gShellNetwork1HiiHandle, Status);
+ goto ON_EXIT;
+ }

- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));
- } else {
- // neither static or DHCP. error.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ //
+ // Set gateway.
+ //
+ DataSize = sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeGateway,
+ DataSize,
+ &Gateway
+ );
+ VarArg = VarArg->Next;
+
+ } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
+ //
+ // Get DNS addresses.
+ //
+ VarArg = VarArg->Next;
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Index ++;
+ Tmp = Tmp->Next;
+ }

- CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));
- Config->Permanent = Permanent;
+ Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+ Index ++;
+ Tmp = Tmp->Next;
+ }
+
+ VarArg = Tmp;

- //
- // Use HII service to set NIC address
- //
- ShellStatus = IfconfigSetNicAddrByHii (Info, Config);
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- goto ON_EXIT;
- }
+ //
+ // Set DNS addresses.
+ //
+ DataSize = Index * sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeDnsServer,
+ DataSize,
+ Dns
+ );
+
+ }

- Status = IfconfigStartIp4 (Info);
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
}

- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- }
-
ON_EXIT:
- SHELL_FREE_NON_NULL(Config);
+ if (Dns != NULL) {
+ FreePool (Dns);
+ }

- return ShellStatus;
+ return EFI_SUCCESS;
+
}

/**
- Show the address information for the nic specified.
+ The ifconfig command main process.
+
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.
+
+ @retval EFI_SUCCESS ifconfig command processed successfully.
+ @retval others The ifconfig command process failed.

- @param[in] Name A pointer to the string containg the nic's name, if NULL,
- all nics' information is shown.
**/
-VOID
-EFIAPI
-IfconfigShowNicInfo (
- IN CONST CHAR16 *Name
+EFI_STATUS
+IfConfig (
+ IN IFCONFIG_PRIVATE_DATA *Private
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *NicInfo;
- UINT32 Index;
- EFI_IP4_IPCONFIG_DATA *Ip4Config;
- EFI_IPv4_ADDRESS Gateway;
- CONST CHAR16 *TempString;
+ EFI_STATUS Status;

- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- NicInfo = BASE_CR (Entry, NIC_INFO, Link);
+ //
+ // Get configure information of all interfaces.
+ //
+ Status = IfConfigGetInterfaceInfo (
+ Private->ImageHandle,
+ Private->IfName,
+ &Private->IfList
+ );

- TempString = (CHAR16*)NicInfo->Name;
- if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {
- continue;
- }
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), gShellNetwork1HiiHandle, NicInfo->Name);
+ switch (Private->OpCode) {
+ case IfConfigOpList:
+ Status = IfConfigShowInterfaceInfo (&Private->IfList);
+ break;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[0],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[1],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[3],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[4],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]
- );
-
- Print (L" Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : L"Media disconnected");
-
- if (NicInfo->ConfigInfo == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);
- continue;
- }
+ case IfConfigOpClear:
+ Status = IfConfigClearInterfaceInfo (&Private->IfList);
+ break;

- if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"DHCP");
- } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"STATIC");
- } else {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"Unknown");
- }
+ case IfConfigOpSet:
+ Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+ break;

- ShellPrintHiiEx(-1, -1, NULL,
- STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),
- gShellNetwork1HiiHandle,
- (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")
- );
+ default:
+ Status = EFI_ABORTED;
+ }

- Ip4Config = &NicInfo->ConfigInfo->Ip4Info;
+ON_EXIT:

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"IP address",
- (UINTN)Ip4Config->StationAddress.Addr[0],
- (UINTN)Ip4Config->StationAddress.Addr[1],
- (UINTN)Ip4Config->StationAddress.Addr[2],
- (UINTN)Ip4Config->StationAddress.Addr[3]
- );
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Mask",
- (UINTN)Ip4Config->SubnetMask.Addr[0],
- (UINTN)Ip4Config->SubnetMask.Addr[1],
- (UINTN)Ip4Config->SubnetMask.Addr[2],
- (UINTN)Ip4Config->SubnetMask.Addr[3]
- );
+ return Status;
+}

- ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
- (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
- CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- }
-
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Gateway.Addr[0],
- (UINTN)Gateway.Addr[1],
- (UINTN)Gateway.Addr[2],
- (UINTN)Gateway.Addr[3]
- );
+/**
+ The ifconfig command cleanup process, free the allocated memory.

- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);
+ @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.

- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
+**/
+VOID
+IfConfigCleanup (
+ IN IFCONFIG_PRIVATE_DATA *Private
+ )
+{
+ LIST_ENTRY *Entry;
+ LIST_ENTRY *NextEntry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ ARG_LIST *ArgNode;
+ ARG_LIST *ArgHead;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Subnet",
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]
- );
+ ASSERT (Private != NULL);

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Netmask",
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]
- );
+ //
+ // Clean the list which save the set config Args.
+ //
+ if (Private->VarArg != NULL) {
+ ArgHead = Private->VarArg;

- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]
- );
+ while (ArgHead->Next != NULL) {
+ ArgNode = ArgHead->Next;
+ FreePool (ArgHead);
+ ArgHead = ArgNode;
}
+
+ FreePool (ArgHead);
}

- return ;
-}
+ if (Private->IfName != NULL)
+ FreePool (Private->IfName);

-/**
- Clear address configuration for the nic specified.

- @param[in] Name A pointer to the string containg the nic's name,
- if NULL, all nics address configurations are cleared.
+ //
+ // Clean the IFCONFIG_INTERFACE_CB list.
+ //
+ Entry = Private->IfList.ForwardLink;
+ NextEntry = Entry->ForwardLink;

- @retval EFI_SUCCESS The address configuration is cleared.
- @return Some error occurs.
-**/
-EFI_STATUS
-EFIAPI
-IfconfigClearNicAddr (
- IN CONST CHAR16 *Name
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- EFI_STATUS Status;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ while (Entry != &Private->IfList) {

- if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {
- continue;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);

-// if (Info->NicIp4Config == NULL) {
- Status = IfconfigSetNicAddrByHii (Info, NULL);
-// } else {
-// Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
-// }
+ RemoveEntryList (&IfCb->Link);

- if (EFI_ERROR (Status)) {
- return Status;
+ if (IfCb->IfInfo != NULL) {
+
+ FreePool (IfCb->IfInfo);
}
+
+ FreePool (IfCb);
+
+ Entry = NextEntry;
+ NextEntry = Entry->ForwardLink;
}

- return EFI_SUCCESS;
-
+ FreePool (Private);
}

/**
Function for 'ifconfig' command.

@param[in] ImageHandle Handle to the Image (NULL if Internal).
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
+
**/
SHELL_STATUS
EFIAPI
ShellCommandRunIfconfig (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- EFI_STATUS Status;
- LIST_ENTRY *Package;
- CHAR16 *ProblemParam;
- SHELL_STATUS ShellStatus;
- BOOLEAN ListOperation;
- BOOLEAN ClearOperation;
- BOOLEAN SetOperation;
- CONST CHAR16 *Item;
- LIST_ENTRY *Entry;
- NIC_INFO *Info;
-
- InitializeListHead (&NicInfoList);
- Status = EFI_INVALID_PARAMETER;
- ShellStatus = SHELL_SUCCESS;
+ EFI_STATUS Status;
+ IFCONFIG_PRIVATE_DATA *Private;
+ LIST_ENTRY *ParamPackage;
+ CONST CHAR16 *ValueStr;
+ ARG_LIST *ArgList;
+ CHAR16 *ProblemParam;
+ CHAR16 *Str;
+
+ Private = NULL;
+
+ Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_COMMAND), gShellNetwork1HiiHandle, ProblemParam);
+ goto ON_EXIT;
+ }

//
- // initialize the shell lib (we must be in non-auto-init...)
+ // To handle unsupported option.
//
- Status = ShellInitialize();
- ASSERT_EFI_ERROR(Status);
+ if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+ goto ON_EXIT;
+ }

//
- // parse the command line
+ // To handle no option.
//
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
- if (EFI_ERROR(Status)) {
- if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
- FreePool(ProblemParam);
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- ASSERT(FALSE);
- }
-
- goto Done;
+ if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
+ !ShellCommandLineGetFlag (ParamPackage, L"-h") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}

- ClearOperation = ShellCommandLineGetFlag(Package, L"-c");
- ListOperation = ShellCommandLineGetFlag(Package, L"-l");
- SetOperation = ShellCommandLineGetFlag(Package, L"-s");
-
- if ((ClearOperation && ListOperation)
- ||(SetOperation && ListOperation)
- ||(ClearOperation && SetOperation)
- ) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- } else if (!ClearOperation && !ListOperation && !SetOperation) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ //
+ // To handle conflict options.
+ //
+ if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-h")))) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_OPTIONS), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
+
+ //
+ // To show the help information of ifconfig command.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-h")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_HELP), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
-
- Status = IfconfigGetAllNicInfoByHii ();
- if (EFI_ERROR (Status)) {
- if (mIp4ConfigExist) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), gShellNetwork1HiiHandle, Status);
- } else {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellNetwork1HiiHandle, L"ifconfig", L"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid);
- }

- return SHELL_NOT_FOUND;
+ Status = EFI_INVALID_PARAMETER;
+
+ Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
+
+ if (Private == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
}

- if (ListOperation) {
- Item = ShellCommandLineGetValue (Package, L"-l");
+ InitializeListHead (&Private->IfList);
+
+ //
+ // To get interface name for the list option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ Private->OpCode = IfConfigOpList;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name for the clear option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
+ Private->OpCode = IfConfigOpClear;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name and corresponding Args for the set option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-l");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
+ if (ValueStr == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_INTERFACE), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }

//
- // Show the configuration.
+ // To split the configuration into multi-section.
//
- IfconfigShowNicInfo (Item);
- } else if (SetOperation) {
- Item = ShellCommandLineGetValue (Package, L"-s");
+ ArgList = SplitStrToList (ValueStr, L' ');
+ ASSERT (ArgList != NULL);

- //
- // The correct command line arguments for setting address are:
- // IfConfig -s eth0 DHCP [permanent]
- // IfConfig -s eth0 static ip netmask gateway [permanent]
- //
- if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) || (CountSubItems(Item) == 4)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_NO_VALUE), gShellNetwork1HiiHandle, L"ifconfig", L"-s");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ Private->OpCode = IfConfigOpSet;
+ Private->IfName = ArgList->Arg;

- ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);
- } else if (ClearOperation) {
- Item = ShellCommandLineGetValue (Package, L"-c");
+ Private->VarArg = ArgList->Next;

- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-c");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ if (Private->IfName == NULL || Private->VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_COMMAND), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
- IfconfigClearNicAddr (Item);
- } else {
- ASSERT(FALSE);
}
+
+ //
+ // Main process of ifconfig.
+ //
+ Status = IfConfig (Private);

-Done:
- while (!IsListEmpty (&NicInfoList)) {
- Entry = NicInfoList.ForwardLink;
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ON_EXIT:

- RemoveEntryList (Entry);
+ ShellCommandLineFreeVarList (ParamPackage);
+ if (Private != NULL)
+ IfConfigCleanup (Private);

- if (Info->ConfigInfo != NULL) {
- FreePool (Info->ConfigInfo);
- }
+ return Status;
+}

- FreePool (Info);
- }

- if (Package != NULL) {
- ShellCommandLineFreeVarList(Package);
- }

- return (ShellStatus);
-}
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index e23588a..af96379 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -909,20 +909,20 @@ PingCreateIpInstance (
//
if (Private->IpChoice == PING_IP_CHOICE_IP6) {
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
} else {
ASSERT(Private->IpChoice == PING_IP_CHOICE_IP4);
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
}
//
@@ -953,11 +953,11 @@ PingCreateIpInstance (
// Ip6config protocol and ip6 service binding protocol are installed
// on the same handle.
//
Status = gBS->HandleProtocol (
HandleBuffer[HandleIndex],
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
(VOID **) &IpXCfg
);

if (EFI_ERROR (Status)) {
goto ON_ERROR;
@@ -971,12 +971,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
}

@@ -1007,12 +1008,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
}

@@ -1043,11 +1045,11 @@ PingCreateIpInstance (
}
} else {
//
// IP4 address check
//
- if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {
+ if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {
//
// Match a certain interface address.
//
break;
}
@@ -1135,15 +1137,10 @@ PingCreateIpInstance (
ZeroMem (&Ip4Config, sizeof (EFI_IP4_CONFIG_DATA));

//
// Configure the ip4 instance for icmp4 packet exchange.
//
-// PING_IP4_COPY_ADDRESS (&Ip4Config.StationAddress, &Private->SrcAddress);
-// Ip4Config.SubnetMask.Addr[0] = 0xFF;
-// Ip4Config.SubnetMask.Addr[1] = 0xFF;
-// Ip4Config.SubnetMask.Addr[2] = 0xFF;
-// Ip4Config.SubnetMask.Addr[3] = 0x00;
Ip4Config.DefaultProtocol = 1;
Ip4Config.AcceptAnyProtocol = FALSE;
Ip4Config.AcceptBroadcast = FALSE;
Ip4Config.AcceptIcmpErrors = TRUE;
Ip4Config.AcceptPromiscuous = FALSE;
@@ -1461,11 +1458,11 @@ ShellCommandRunPing (
ShellStatus = SHELL_SUCCESS;
ProblemParam = NULL;

Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}

if (ShellCommandLineGetFlag (ParamPackage, L"-_ip6")) {
@@ -1481,11 +1478,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
SendNumber = DEFAULT_SEND_COUNT;
@@ -1499,11 +1496,11 @@ ShellCommandRunPing (

//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
BufferSize = DEFAULT_BUFFER_SIZE;
@@ -1522,26 +1519,26 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &SrcAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
// Parse the paramter of destination ip address.
//
NonOptionCount = ShellCommandLineGetCount(ParamPackage);
if (NonOptionCount < 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (NonOptionCount > 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
ValueStr = ShellCommandLineGetRawValue (ParamPackage, 1);
if (ValueStr != NULL) {
@@ -1550,11 +1547,11 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &DstAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
index 49849a6..5151179 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
@@ -1,9 +1,9 @@
/** @file
Main file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

@@ -63,11 +63,11 @@ ShellNetwork1CommandsLibConstructor (
}
//
// install our shell command handlers
//
ShellCommandRegisterCommandName(L"ping", ShellCommandRunPing , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_PING));
- ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_IFCONFIG));
+ ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0, L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_IFCONFIG_HELP));

return (EFI_SUCCESS);
}

/**
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
index 68a7c93..98b40df 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
@@ -1,9 +1,9 @@
/** @file
header file for NULL named library for network1 shell command functions.

- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>

This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -24,13 +24,11 @@
#include <Protocol/Cpu.h>
#include <Protocol/ServiceBinding.h>
#include <Protocol/Ip6.h>
#include <Protocol/Ip6Config.h>
#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/Ip4Config2.h>
#include <Protocol/Arp.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
@@ -45,12 +43,10 @@
#include <Library/HiiLib.h>
#include <Library/NetLib.h>
#include <Library/DevicePathLib.h>
#include <Library/PrintLib.h>

-#include <Guid/NicIp4ConfigNvData.h>
-
extern EFI_HANDLE gShellNetwork1HiiHandle;

/**
Function for 'ping' command.

diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
index 527d2ef..6dfbbe5 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
@@ -57,11 +57,11 @@
gEfiCpuArchProtocolGuid ## CONSUMES
gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES

- gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES

[Guids]
gShellNetwork1HiiGuid ## SOMETIMES_CONSUMES ## HII
\ No newline at end of file
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index aa27c678339c5e94c9c936d9a7ea74b6b043c200..65edb0a407754247e91009929a3525b2ad5dd96e 100644
GIT binary patch
literal 21554
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
NnXgL}rJk4f{{V5RRI&g7

literal 20112
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

--
1.9.5.msysgit.1



------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------

------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/

------------------------------

_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel


End of edk2-devel Digest, Vol 66, Issue 424
*******************************************

Wu, Jiaxin
2015-07-02 01:15:06 UTC
Permalink
Jaben, attachment .patch and UNI files have been sent to Tapan.

Thanks.

-----Original Message-----
From: edk2-devel-***@lists.sourceforge.net [mailto:edk2-devel-***@lists.sourceforge.net]
Sent: Thursday, July 2, 2015 9:02 AM
To: edk2-***@lists.sourceforge.net
Subject: edk2-devel Digest, Vol 67, Issue 23

Send edk2-devel mailing list submissions to
edk2-***@lists.sourceforge.net

To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/edk2-devel
or, via email, send a message with subject or body 'help' to
edk2-devel-***@lists.sourceforge.net

You can reach the person managing the list at
edk2-devel-***@lists.sourceforge.net

When replying, please edit your Subject line so it is more specific
than "Re: Contents of edk2-devel digest..."


Today's Topics:

1. Re: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU
ld linker script (Gao, Liming)
2. Re: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU
ld linker script (Jordan Justen)
3. Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library
(Carsey, Jaben)


----------------------------------------------------------------------

Message: 1
Date: Thu, 2 Jul 2015 00:41:11 +0000
From: "Gao, Liming" <***@intel.com>
Subject: Re: [edk2] [PATCH] BaseTools: fix a syntax error in 4 KB
aligned GNU ld linker script
To: "Justen, Jordan L" <***@intel.com>, "Liu, Yingke D"
<***@intel.com>, Ard Biesheuvel <***@linaro.org>
Cc: "edk2-***@lists.sourceforge.net"
<edk2-***@lists.sourceforge.net>
Message-ID:
<***@shsmsx102.ccr.corp.intel.com>

Content-Type: text/plain; charset="utf-8"

Jordan:
Agree. We will follow this rule, apply the patch and push it without any modification.

gcc-4k is added for new UEFI2.5 Properties Table. When enable this feature, gcc-4k script will be required for RUNTIME driver. It can be configured in [BuildOptions] of DSC file for RUNTIME driver only. We could update Ovmf to enable this feature, which can be turned on/off by build flag. Is it OK to you?

Thanks
Liming
-----Original Message-----
From: Justen, Jordan L
Sent: Thursday, July 2, 2015 6:42 AM
To: Liu, Yingke D; Ard Biesheuvel
Cc: edk2-***@lists.sourceforge.net; Gao, Liming
Subject: RE: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU ld linker script
Hi Ard,
Thanks for the comments, I have updated the log message.
For future reference, I think you should not bother to update the log message. It is a bad practice, and the git archive will not see the updated log message anyhow. It should also be noted that it will not be possible to update the commit message when git is the main upstream repo.

I think it is best just to acknowledge the mistake, and remember it for next time.

I have a question. Where is the 4K script used? git grep gcc-4K shows no references to it.

-Jordan
-----Original Message-----
Sent: Wednesday, July 01, 2015 16:12
To: Liu, Yingke D
Subject: Re: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU
ld linker script
Hello Dennis,
Thanks for merging this.
Next time, could you please keep the subject line as well?
Subject: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU
ld linker script
There needs to be a space between the output section name and the
colon, i.e.,
as the subject line which looks a little silly imo
Thanks,
Ard.
-----Original Message-----
Sent: Tuesday, June 30, 2015 7:00 PM
Cc: Ard Biesheuvel
Subject: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU
ld linker script
There needs to be a space between the output section name and the
colon, i.e.,
.text : ALIGN(0x1000)
^
Fix this for all output sections
Contributed-under: TianoCore Contribution Agreement 1.0
---
BaseTools/Scripts/gcc-4K-align-ld-script | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/BaseTools/Scripts/gcc-4K-align-ld-script
b/BaseTools/Scripts/gcc-4K-align-ld-script
index 1f23079023a6..16cf623a3362 100644
--- a/BaseTools/Scripts/gcc-4K-align-ld-script
+++ b/BaseTools/Scripts/gcc-4K-align-ld-script
@@ -3,12 +3,12 @@ SECTIONS
{
/* . = 0 + SIZEOF_HEADERS; */
. = 0x280;
- .text: ALIGN(0x1000)
+ .text : ALIGN(0x1000)
{
*(.text .stub .text.* .gnu.linkonce.t.*)
. = ALIGN(0x20);
}
- .data: ALIGN(0x1000)
+ .data : ALIGN(0x1000)
{
*(
)
. = ALIGN(0x20);
}
- .eh_frame: ALIGN(0x1000)
+ .eh_frame : ALIGN(0x1000)
{
KEEP (*(.eh_frame))
}
- .got: ALIGN(0x1000)
+ .got : ALIGN(0x1000)
{
*(.got .got.*)
. = ALIGN(0x20);
}
- .rela: ALIGN(0x1000)
+ .rela : ALIGN(0x1000)
{
*(.rela .rela.*)
}
--
1.9.1
------------------------------

Message: 2
Date: Wed, 01 Jul 2015 17:54:29 -0700
From: Jordan Justen <***@intel.com>
Subject: Re: [edk2] [PATCH] BaseTools: fix a syntax error in 4 KB
aligned GNU ld linker script
To: "Gao, Liming" <***@intel.com>, "Liu, Yingke D"
<***@intel.com>, "Ard Biesheuvel" <***@linaro.org>
Cc: "edk2-***@lists.sourceforge.net"
<edk2-***@lists.sourceforge.net>
Message-ID: <***@jljusten-ivb>
Content-Type: text/plain; charset="utf-8"
Agree. We will follow this rule, apply the patch and push it
without any modification.
My point is that if there is a mistake, we should not bother to update
the log message to fix that mistake. Hopefully we can just be more
careful with the patch message if we stop thinking that we can go back
and fix it later. :)
gcc-4k is added for new UEFI2.5 Properties Table. When enable this
feature, gcc-4k script will be required for RUNTIME driver. It can
be configured in [BuildOptions] of DSC file for RUNTIME driver
only. We could update Ovmf to enable this feature, which can be
turned on/off by build flag. Is it OK to you?
Is there an example of how to enable it for a platform? Or, the
feature is still is not fully complete?

-Jordan
-----Original Message-----
From: Justen, Jordan L
Sent: Thursday, July 2, 2015 6:42 AM
To: Liu, Yingke D; Ard Biesheuvel
Subject: RE: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU ld linker script
Hi Ard,
Thanks for the comments, I have updated the log message.
For future reference, I think you should not bother to update the
log message. It is a bad practice, and the git archive will not see
the updated log message anyhow. It should also be noted that it will
not be possible to update the commit message when git is the main
upstream repo.
I think it is best just to acknowledge the mistake, and remember it
for next time.
I have a question. Where is the 4K script used? git grep gcc-4K
shows no references to it.
-Jordan
-----Original Message-----
Sent: Wednesday, July 01, 2015 16:12
To: Liu, Yingke D
Subject: Re: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU
ld linker script
Hello Dennis,
Thanks for merging this.
Next time, could you please keep the subject line as well?
Subject: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU
ld linker script
There needs to be a space between the output section name and the
colon, i.e.,
as the subject line which looks a little silly imo
Thanks,
Ard.
-----Original Message-----
Sent: Tuesday, June 30, 2015 7:00 PM
Cc: Ard Biesheuvel
Subject: [PATCH] BaseTools: fix a syntax error in 4 KB aligned GNU
ld linker script
There needs to be a space between the output section name and the
colon, i.e.,
.text : ALIGN(0x1000)
^
Fix this for all output sections
Contributed-under: TianoCore Contribution Agreement 1.0
---
BaseTools/Scripts/gcc-4K-align-ld-script | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/BaseTools/Scripts/gcc-4K-align-ld-script
b/BaseTools/Scripts/gcc-4K-align-ld-script
index 1f23079023a6..16cf623a3362 100644
--- a/BaseTools/Scripts/gcc-4K-align-ld-script
+++ b/BaseTools/Scripts/gcc-4K-align-ld-script
@@ -3,12 +3,12 @@ SECTIONS
{
/* . = 0 + SIZEOF_HEADERS; */
. = 0x280;
- .text: ALIGN(0x1000)
+ .text : ALIGN(0x1000)
{
*(.text .stub .text.* .gnu.linkonce.t.*)
. = ALIGN(0x20);
}
- .data: ALIGN(0x1000)
+ .data : ALIGN(0x1000)
{
*(
)
. = ALIGN(0x20);
}
- .eh_frame: ALIGN(0x1000)
+ .eh_frame : ALIGN(0x1000)
{
KEEP (*(.eh_frame))
}
- .got: ALIGN(0x1000)
+ .got : ALIGN(0x1000)
{
*(.got .got.*)
. = ALIGN(0x20);
}
- .rela: ALIGN(0x1000)
+ .rela : ALIGN(0x1000)
{
*(.rela .rela.*)
}
--
1.9.1
------------------------------

Message: 3
Date: Thu, 2 Jul 2015 01:00:58 +0000
From: "Carsey, Jaben" <***@intel.com>
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig
library
To: "edk2-***@lists.sourceforge.net"
<edk2-***@lists.sourceforge.net>
Message-ID:
<***@FMSMSX103.amr.corp.intel.com>

Content-Type: text/plain; charset="us-ascii"

Jiaxin, I think he meant to ask for the attachment .patch file.
-----Original Message-----
Sent: Wednesday, July 01, 2015 5:42 PM
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library
Importance: High
Hi Tapan,
I have already sent out the patch to edk2-devel.
Thanks.
Jiaxin
-----Original Message-----
Sent: Thursday, July 2, 2015 1:00 AM
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library
Jiaxin,
Can you send out an updated patch file for review?
Thanks,
Tapan
-----Original Message-----
Sent: Wednesday, July 01, 2015 10:55 AM
Subject: RE: Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library
Hi Tapan,
Thank you for your comments, I have updated patch according below and other reviewers comments.
For the copyright, I have confirm that HP's copyright should be kept, I have recovered it and just update Intel copyright year.
Best Regards!
Jiaxin
-----Original Message-----
Sent: Wednesday, July 1, 2015 12:55 AM
Subject: edk2-devel Digest, Vol 66, Issue 424
Send edk2-devel mailing list submissions to
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/edk2-devel
or, via email, send a message with subject or body 'help' to
You can reach the person managing the list at
When replying, please edit your Subject line so it is more specific
than "Re: Contents of edk2-devel digest..."
1. Re: [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
(Shah, Tapan)
----------------------------------------------------------------------
Message: 1
Date: Tue, 30 Jun 2015 16:54:24 +0000
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig
library.
Content-Type: text/plain; charset="utf-8"
Jiaxin,
I see that ifconfig is completely re-written and also removed HP's copyright. I am not sure if it's acceptable to remove HP's copyright
from the file. I am assuming that you have done adequate testing for this major change, can you confirm what type of testing is
performed to verify this change?
1. No need to rename below three string tokens.
STR_GEN_TOO_MANY -> STR_PING_ERR_TOO_MANY
STR_GEN_TOO_FEW -> STR_PING_ERR_TOO_FEW
STR_GEN_PARAM_INV -> STR_PING_ERR_PARAM_INV
2. All other STR_GEN_* string tokens are removed from .uni file. I suspect it may break other command. They should remain as-is and
no need to remove. We also keep it at the profile level .uni file to keep track of same generic token name and strings across all
commands.
3. STR_IFCONFIG_HELP help output of new ifconfig is not following the help output format. Need to fix it. Existing ifconfig help output
is a good example as a reference.
4. Below token shows message Ip4Config2->GetData which is not something we customer friendly. Make it a customer friendly
message.
#string STR_IFCONFIG_ERR_IP4CFG_GETDATA #language en-US "Ip4Config2->GetData return %hr\n"
Thanks,
Tapan
-----Original Message-----
Sent: Monday, June 29, 2015 8:12 PM
Subject: Re: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
Hi Jiaxin,
Can I have the patch file?
-Shumin
-----Original Message-----
Sent: Monday, June 29, 2015 10:50 PM
Subject: [edk2] [Patch] ShellPkg: Update ShellPkg ping/ifconfig library.
Make the command options to be Shell2.1 compliant(For the unsupported option, display ?not supported?);
Safe string fix;
Coding style change.
This patch update ShellPkg ping/ifconfig library source code to consume Ip4Config2 protocol.
Contributed-under: TianoCore Contribution Agreement 1.0
---
.../UefiShellNetwork1CommandsLib/Ifconfig.c | 2462 ++++++++------------
.../Library/UefiShellNetwork1CommandsLib/Ping.c | 33 +-
.../UefiShellNetwork1CommandsLib.c | 4 +-
.../UefiShellNetwork1CommandsLib.h | 8 +-
.../UefiShellNetwork1CommandsLib.inf | 6 +-
.../UefiShellNetwork1CommandsLib.uni | Bin 20112 -> 21554 bytes
6 files changed, 1040 insertions(+), 1473 deletions(-)
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index 7c3f809..61328a3 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -1,1763 +1,1337 @@
- The implementation for ifcommand shell command.
+ The implementation for Shell command ifconfig based on IP4Config2 protocol.
- (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
**/
#include "UefiShellNetwork1CommandsLib.h"
-#define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) *
MAX_IP4_CONFIG_IN_VARIABLE)
-#define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))
-
-BOOLEAN mIp4ConfigExist = FALSE;
-STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL;
+enum {
+ IfConfigOpList = 1,
+ IfConfigOpSet = 2,
+ IfConfigOpClear = 3
+};
+
+typedef enum {
+ VarCheckReserved = -1,
+ VarCheckOk = 0,
+ VarCheckDuplicate,
+ VarCheckConflict,
+ VarCheckUnknown,
+ VarCheckLackValue,
+ VarCheckOutOfMem
+} VAR_CHECK_CODE;
+
+typedef enum {
+ FlagTypeSingle = 0,
+ FlagTypeNeedVar,
+ FlagTypeNeedSet,
+ FlagTypeSkipUnknown
+} VAR_CHECK_FLAG_TYPE;
+
+#define MACADDRMAXSIZE 32
+
+typedef struct _IFCONFIG_INTERFACE_CB {
+ EFI_HANDLE NicHandle;
+ LIST_ENTRY Link;
+ EFI_IP4_CONFIG2_PROTOCOL *IfCfg;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ EFI_IP4_CONFIG2_POLICY Policy;
+ UINT32 DnsCnt;
+ EFI_IPv4_ADDRESS DnsAddr[1];
+} IFCONFIG_INTERFACE_CB;
+
+typedef struct _ARG_LIST ARG_LIST;
+
+struct _ARG_LIST {
+ ARG_LIST *Next;
+ CHAR16 *Arg;
+};
+
+typedef struct _IFCONFIG4_PRIVATE_DATA {
+ EFI_HANDLE ImageHandle;
+ LIST_ENTRY IfList;
+
+ UINT32 OpCode;
+ CHAR16 *IfName;
+ ARG_LIST *VarArg;
+} IFCONFIG_PRIVATE_DATA;
+
+typedef struct _VAR_CHECK_ITEM{
+ CHAR16 *FlagStr;
+ UINT32 FlagID;
+ UINT32 ConflictMask;
+ VAR_CHECK_FLAG_TYPE FlagType;
+} VAR_CHECK_ITEM;
+
+SHELL_PARAM_ITEM mIfConfigCheckList[] = {
+ {
+ L"-b",
+ TypeFlag
+ },
+ {
+ L"-h",
+ TypeFlag
+ },
+ {
+ L"-l",
+ TypeValue
+ },
+ {
+ L"-r",
+ TypeValue
+ },
+ {
+ L"-c",
+ TypeValue
+ },
+ {
+ L"-s",
+ TypeMaxValue
+ },
+ {
+ NULL,
+ TypeMax
+ },
+};
+
+VAR_CHECK_ITEM mSetCheckList[] = {
+ {
+ L"static",
+ 0x00000001,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dhcp",
+ 0x00000002,
+ 0x00000001,
+ FlagTypeSingle
+ },
+ {
+ L"dns",
+ 0x00000008,
+ 0x00000004,
+ FlagTypeSingle
+ },
+ {
+ NULL,
+ 0x0,
+ 0x0,
+ FlagTypeSkipUnknown
+ },
+};
-STATIC CONST UINTN SecondsToNanoSeconds = 10000000;
-STATIC CONST CHAR16 DhcpString[5] = L"DHCP";
-STATIC CONST CHAR16 StaticString[7] = L"STATIC";
STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";
-typedef struct {
- LIST_ENTRY Link;
- EFI_HANDLE Handle;
- NIC_ADDR NicAddress;
- CHAR16 Name[IP4_NIC_NAME_LENGTH];
- BOOLEAN MediaPresentSupported;
- BOOLEAN MediaPresent;
- EFI_IP4_CONFIG_PROTOCOL *Ip4Config;
- NIC_IP4_CONFIG_INFO *ConfigInfo;
-} NIC_INFO;
-
-typedef struct {
- EFI_IP_ADDRESS DestIp;
- EFI_MAC_ADDRESS DestMac;
- EFI_IP_ADDRESS LocalIp;
- EFI_MAC_ADDRESS LocalMac;
- UINT8 MacLen;
- EFI_EVENT OnResolved;
- BOOLEAN Duplicate;
-} ARP_REQUEST;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- {L"-c", TypeValue},
- {L"-l", TypeValue},
- {L"-s", TypeMaxValue},
- {NULL, TypeMax}
- };
-
-STATIC LIST_ENTRY NicInfoList;
-STATIC BOOLEAN ArpResolved;
-STATIC BOOLEAN mTimeout;
-
/**
- Count the space delimited items in a string.
-
-
-**/
-UINT8
-EFIAPI
-CountSubItems (
- IN CONST CHAR16 *String
- )
-{
- CONST CHAR16 *Walker;
- UINT8 Count;
-
- if (String == NULL || *String == CHAR_NULL) {
- return (0xFF);
- }
+ Split a string with specified separator and save the substring to a list.
- for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; Walker = (StrStr(Walker, L"
")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);
- return (Count);
-}
-/**
- Find the NIC_INFO by the specified nic name.
-
**/
-NIC_INFO*
-EFIAPI
-IfconfigFindNicByName (
- IN CONST CHAR16 *Name
+ARG_LIST *
+SplitStrToList (
+ IN CONST CHAR16 *String,
+ IN CHAR16 Separator
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- CHAR16 *TempString;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
- TempString = (CHAR16*)Info->Name;
+ CHAR16 *Str;
+ CHAR16 *ArgStr;
+ ARG_LIST *ArgList;
+ ARG_LIST *ArgNode;
- if (StringNoCaseCompare (&Name, &TempString) == 0) {
- return Info;
- }
+ if (*String == L'\0') {
+ return NULL;
}
- return NULL;
-}
-
-/**
- Tests whether a child handle is a child device of the controller.
-
- opens on its parent controller.
-
-**/
-EFI_STATUS
-EFIAPI
-TestChildHandle (
- IN CONST EFI_HANDLE ControllerHandle,
- IN CONST EFI_HANDLE ChildHandle,
- IN CONST EFI_GUID *ProtocolGuid
- )
-{
- EFI_STATUS Status;
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
- UINTN EntryCount;
- UINTN Index;
-
- ASSERT (ProtocolGuid != NULL);
-
//
- // Retrieve the list of agents that are consuming the specific protocol
- // on ControllerHandle.
+ // Copy the CONST string to a local copy.
//
- Status = gBS->OpenProtocolInformation (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- &OpenInfoBuffer,
- &EntryCount
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (String));
+ ASSERT (Str != NULL);
+ StrCpyS (Str, StrSize (String)/sizeof (CHAR16), String);
+ ArgStr = Str;
//
- // Inspect if ChildHandle is one of the agents.
+ // init a node for the list head.
//
- Status = EFI_UNSUPPORTED;
- for (Index = 0; Index < EntryCount; Index++) {
- if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&
- (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
- Status = EFI_SUCCESS;
- break;
- }
- }
-
- FreePool (OpenInfoBuffer);
- return Status;
-}
-
-/**
- Get the child handle of the NIC handle.
-
-
-**/
-EFI_STATUS
-GetChildHandle (
- IN EFI_HANDLE Controller,
- OUT EFI_HANDLE *ChildHandle
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- UINTN Index;
- EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;
- VENDOR_DEVICE_PATH *VendorDeviceNode;
+ ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode != NULL);
+ ArgList = ArgNode;
//
- // Locate all EFI Hii Config Access protocols
+ // Split the local copy and save in the list node.
//
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiHiiConfigAccessProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
- );
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return Status;
- }
-
- Status = EFI_NOT_FOUND;
-
- for (Index = 0; Index < HandleCount; Index++) {
-
- Status = TestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);
- if (!EFI_ERROR (Status)) {
- //
- // Get device path on the child handle
- //
- Status = gBS->HandleProtocol (
- Handles[Index],
- &gEfiDevicePathProtocolGuid,
- (VOID **) &ChildDeviceDevicePath
- );
-
- if (!EFI_ERROR (Status)) {
- while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
- ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
- //
- // Parse one instance
- //
- if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&
- ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
- VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
- if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
- //
- // Found item matched gEfiNicIp4ConfigVariableGuid
- //
- *ChildHandle = Handles[Index];
- FreePool (Handles);
- return EFI_SUCCESS;
- }
- }
- }
- }
+ while (*Str != L'\0') {
+ if (*Str == Separator) {
+ *Str = L'\0';
+ ArgNode->Arg = ArgStr;
+ ArgStr = Str + 1;
+ ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));
+ ASSERT (ArgNode->Next != NULL);
+ ArgNode = ArgNode->Next;
}
+
+ Str++;
}
- FreePool (Handles);
- return Status;
+ ArgNode->Arg = ArgStr;
+ ArgNode->Next = NULL;
+
+ return ArgList;
}
/**
- Append OFFSET/WIDTH/VALUE items at the beginning of string.
-
-
-**/
-UINTN
-EFIAPI
-AppendOffsetWidthValue (
- IN OUT CHAR16 *String,
- IN UINTN Offset,
- IN UINTN Width,
- IN CONST UINT8 *Block
- )
-
-{
- CHAR16 *OriString;
-
- OriString = String;
-
- StrnCpy (String, L"&OFFSET=", 9);
- String += StrLen (L"&OFFSET=");
- String += UnicodeSPrint (String, 20, L"%x", Offset);
-
- StrnCpy (String,L"&WIDTH=", 8);
- String += StrLen (L"&WIDTH=");
- String += UnicodeSPrint (String, 20, L"%x", Width);
+ Check the correctness of input Args with '-s' option.
- if (Block != NULL) {
- StrnCpy (String,L"&VALUE=", 8);
- String += StrLen (L"&VALUE=");
- while ((Width--) != 0) {
- String += UnicodeSPrint (String, 20, L"%x", Block[Width]);
- }
- }
-
- return String - OriString;
-}
-/**
- Converts the unicode character of the string from uppercase to lowercase.
- This is a internal function.
**/
-CHAR16*
-EFIAPI
-HiiToLower (
- IN CHAR16 *ConfigString
- )
+VAR_CHECK_CODE
+IfConfigRetriveCheckListByName(
+ IN VAR_CHECK_ITEM *CheckList,
+ IN CHAR16 *Name,
+ IN BOOLEAN Init
+)
{
- CHAR16 *String;
- BOOLEAN Lower;
-
- //
- // Convert all hex digits in range [A-F] in the configuration header to [a-f]
- //
- for (String = ConfigString, Lower = FALSE; String != NULL && *String != L'\0'; String++) {
- if (*String == L'=') {
- Lower = TRUE;
- } else if (*String == L'&') {
- Lower = FALSE;
- } else if (Lower && *String >= L'A' && *String <= L'F') {
- *String = (CHAR16) (*String - L'A' + L'a');
- }
+ STATIC UINT32 CheckDuplicate;
+ STATIC UINT32 CheckConflict;
+ VAR_CHECK_CODE RtCode;
+ UINT32 Index;
+ VAR_CHECK_ITEM Arg;
+
+ if (Init) {
+ CheckDuplicate = 0;
+ CheckConflict = 0;
+ return VarCheckOk;
}
- return (ConfigString);
-}
-
-
-/**
- Construct <ConfigHdr> using routing information GUID/NAME/PATH.
-
-
-**/
-CHAR16 *
-EFIAPI
-ConstructConfigHdr (
- IN CONST EFI_GUID *Guid,
- IN CONST CHAR16 *Name,
- IN EFI_HANDLE DriverHandle
- )
-{
- EFI_STATUS Status;
- CHAR16 *ConfigHdr;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- CHAR16 *String;
- UINTN Index;
- UINT8 *Buffer;
- UINTN DevicePathLength;
- UINTN NameLength;
+ RtCode = VarCheckOk;
+ Index = 0;
+ Arg = CheckList[Index];
//
- // Get the device path from handle installed EFI HII Config Access protocol
+ // Check the Duplicated/Conflicted/Unknown input Args.
//
- Status = gBS->HandleProtocol (
- DriverHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &DevicePath
- );
- if (EFI_ERROR (Status)) {
- return NULL;
- }
+ while (Arg.FlagStr != NULL) {
+ if (StrCmp (Arg.FlagStr, Name) == 0) {
- DevicePathLength = GetDevicePathSize (DevicePath);
- NameLength = StrLen (Name);
- ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));
- if (ConfigHdr == NULL) {
- return NULL;
- }
+ if (CheckDuplicate & Arg.FlagID) {
+ RtCode = VarCheckDuplicate;
+ break;
+ }
- String = ConfigHdr;
- StrnCpy (String, L"GUID=", 6);
- String += StrLen (L"GUID=");
+ if (CheckConflict & Arg.ConflictMask) {
+ RtCode = VarCheckConflict;
+ break;
+ }
- //
- // Append Guid converted to <HexCh>32
- //
- for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
- }
+ CheckDuplicate |= Arg.FlagID;
+ CheckConflict |= Arg.ConflictMask;
+ break;
+ }
- //
- // Append L"&NAME="
- //
- StrnCpy (String, L"&NAME=", 7);
- String += StrLen (L"&NAME=");
- for (Index = 0; Index < NameLength ; Index++) {
- String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);
+ Arg = CheckList[++Index];
}
-
- //
- // Append L"&PATH="
- //
- StrnCpy (String, L"&PATH=", 7);
- String += StrLen (L"&PATH=");
- for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; Index++) {
- String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);
+
+ if (Arg.FlagStr == NULL) {
+ RtCode = VarCheckUnknown;
}
- return (HiiToLower(ConfigHdr));
+ return RtCode;
}
/**
- Get network physical device NIC information.
+ The notify function of create event when performing a manual config.
-**/
-EFI_STATUS
+**/
+VOID
EFIAPI
-IfConfigGetNicMacInfo (
- IN EFI_HANDLE Handle,
- OUT NIC_ADDR *NicAddr
- )
+IfConfigManualAddressNotify (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
- }
-
- NicAddr->Type = (UINT16) SnpMode.IfType;
- NicAddr->Len = (UINT8) SnpMode.HwAddressSize;
- CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);
-
-
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
-
- return Status;
-
+ *((BOOLEAN *) Context) = TRUE;
}
+
/**
- Get network physical device NIC information.
+ Print MAC address.
- Upon successful return, TRUE is media present
- is supported. FALSE otherwise.
- is enabled. FALSE otherwise.
**/
-EFI_STATUS
-EFIAPI
-IfConfigGetNicMediaStatus (
- IN EFI_HANDLE Handle,
- OUT BOOLEAN *MediaPresentSupported,
- OUT BOOLEAN *MediaPresent
- )
-
+VOID
+IfConfigPrintMacAddr (
+ IN UINT8 *Node,
+ IN UINT32 Size
+ )
{
- EFI_STATUS Status;
- EFI_HANDLE MnpHandle;
- EFI_SIMPLE_NETWORK_MODE SnpMode;
- EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
-
- MnpHandle = NULL;
- Mnp = NULL;
-
- Status = NetLibCreateServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- &MnpHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
+ UINTN Index;
- Status = gBS->HandleProtocol (
- MnpHandle,
- &gEfiManagedNetworkProtocolGuid,
- (VOID **) &Mnp
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
+ ASSERT (Size <= MACADDRMAXSIZE);
- Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
- if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
- goto ON_ERROR;
+ for (Index = 0; Index < Size; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);
+ if (Index + 1 < Size) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle);
+ }
}
-
- *MediaPresentSupported = SnpMode.MediaPresentSupported;
- *MediaPresent = SnpMode.MediaPresent;
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+}
- NetLibDestroyServiceChild (
- Handle,
- gImageHandle,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- MnpHandle
- );
- return Status;
+/**
+ The get current status of all handles.
-}
-/**
- Get all Nic's information through HII service.
**/
EFI_STATUS
-EFIAPI
-IfconfigGetAllNicInfoByHii (
- VOID
+IfConfigGetInterfaceInfo (
+ IN EFI_HANDLE ImageHandle,
+ IN CHAR16 *IfName,
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- EFI_HANDLE *Handles;
- UINTN HandleCount;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- UINTN Index;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- UINTN BufferSize;
- NIC_INFO *NicInfo;
- NIC_IP4_CONFIG_INFO *NicConfigRequest;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfigRequest = NULL;
- NicInfo = NULL;
-
- InitializeListHead (&NicInfoList);
+ EFI_STATUS Status;
+ UINTN HandleIndex;
+ UINTN HandleNum;
+ EFI_HANDLE *HandleBuffer;
+ EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;
+ EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ UINTN DataSize;
- //
- // Check if HII Config Routing protocol available.
- //
- Status = gBS->LocateProtocol (
- &gEfiHiiConfigRoutingProtocolGuid,
- NULL,
- (VOID**)&mHiiConfigRouting
- );
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
+ HandleBuffer = NULL;
+ HandleNum = 0;
+
+ IfInfo = NULL;
+ IfCb = NULL;
//
- // Locate all network device handles
+ // Locate all the handles with ip4 service binding protocol.
//
Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- NULL,
- &HandleCount,
- &Handles
+ ByProtocol,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ NULL,
+ &HandleNum,
+ &HandleBuffer
);
- if (EFI_ERROR (Status) || (HandleCount == 0)) {
- return EFI_NOT_FOUND;
+ if (EFI_ERROR (Status) || (HandleNum == 0)) {
+ return EFI_ABORTED;
}
- for (Index = 0; Index < HandleCount; Index++) {
- Status = GetChildHandle (Handles[Index], &ChildHandle);
+ //
+ // Enumerate all handles that installed with ip4 service binding protocol.
+ //
+ for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
+ IfCb = NULL;
+ IfInfo = NULL;
+ DataSize = 0;
+
+ //
+ // Ip4config protocol and ip4 service binding protocol are installed
+ // on the same handle.
+ //
+ ASSERT (HandleBuffer != NULL);
+ Status = gBS->HandleProtocol (
+ HandleBuffer[HandleIndex],
+ &gEfiIp4Config2ProtocolGuid,
+ (VOID **) &Ip4Cfg2
+ );
+
if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility.
- //
- ChildHandle = Handles[Index];
+ goto ON_ERROR;
}
+
//
- // Construct configuration request string header
+ // Get the interface information size.
//
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- Length = 0;
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ NULL
+ );
+
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
+
+ IfInfo = AllocateZeroPool (DataSize);
+
+ if (IfInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
-
+
//
- // Append OFFSET/WIDTH pair
+ // Get the interface info.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeInterfaceInfo,
+ &DataSize,
+ IfInfo
+ );
- NicInfo = AllocateZeroPool (sizeof (NIC_INFO));
- if (NicInfo == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
goto ON_ERROR;
}
- NicInfo->Handle = Handles[Index];
-
+
//
- // Get network physical devcie MAC information
+ // Check the interface name if required.
//
- IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);
- if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);
- } else {
- UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {
+ FreePool (IfInfo);
+ continue;
}
+ DataSize = 0;
+
//
- // Get media status
+ // Get the size of dns server list.
//
- IfConfigGetNicMediaStatus (Handles[Index], &NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ NULL
+ );
+
+ if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }
- NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfigRequest == NULL) {
+ IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);
+
+ if (IfCb == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_ERROR;
}
+ IfCb->NicHandle = HandleBuffer[HandleIndex];
+ IfCb->IfInfo = IfInfo;
+ IfCb->IfCfg = Ip4Cfg2;
+ IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));
+
//
- // Get network parameters by HII service
+ // Get the dns server list if has.
//
- Status = mHiiConfigRouting->ExtractConfig (
- mHiiConfigRouting,
- ConfigResp,
- &AccessProgress,
- &AccessResults
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = NIC_ITEM_CONFIG_SIZE;
- Status = mHiiConfigRouting->ConfigToBlock (
- mHiiConfigRouting,
- AccessResults,
- (UINT8 *) NicConfigRequest,
- &BufferSize,
- &AccessProgress
- );
- if (!EFI_ERROR (Status)) {
- BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;
- NicConfig = AllocateZeroPool (BufferSize);
- if (NicConfig == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
- CopyMem (NicConfig, NicConfigRequest, BufferSize);
-
- //
- // If succeeds to get NIC configuration, fix up routetable pointer.
- //
- NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (&NicConfig->Ip4Info + 1);
- NicInfo->ConfigInfo = NicConfig;
-
- } else {
- NicInfo->ConfigInfo = NULL;
+ if (DataSize > 0) {
+
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypeDnsServer,
+ &DataSize,
+ IfCb->DnsAddr
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
}
-
- FreePool (AccessResults);
-
- } else {
- NicInfo->ConfigInfo = NULL;
}
//
- // Add the Nic's info to the global NicInfoList.
+ // Get the config policy.
//
- InsertTailList (&NicInfoList, &NicInfo->Link);
+ DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+ Status = Ip4Cfg2->GetData (
+ Ip4Cfg2,
+ Ip4Config2DataTypePolicy,
+ &DataSize,
+ &IfCb->Policy
+ );
+
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_IP4CFG_GETDATA), gShellNetwork1HiiHandle, Status);
+ goto ON_ERROR;
+ }
- FreePool (NicConfigRequest);
- FreePool (ConfigResp);
- FreePool (ConfigHdr);
+
+ InsertTailList (IfList, &IfCb->Link);
+
+ if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {
+ //
+ // Only need the appointed interface, keep the allocated buffer.
+ //
+ IfCb = NULL;
+ IfInfo = NULL;
+ break;
+ }
}
- FreePool (Handles);
+ if (HandleBuffer != NULL) {
+ FreePool (HandleBuffer);
+ }
return EFI_SUCCESS;
-
+
- if (AccessResults != NULL) {
- FreePool (AccessResults);
- }
- if (NicConfigRequest != NULL) {
- FreePool (NicConfigRequest);
- }
- if (NicInfo != NULL) {
- FreePool (NicInfo);
- }
- if (ConfigResp != NULL) {
- FreePool (ConfigResp);
- }
- if (ConfigHdr != NULL) {
- FreePool (ConfigHdr);
+
+ if (IfInfo != NULL) {
+ FreePool (IfInfo);
}
- FreePool (Handles);
+ if (IfCb != NULL) {
+ FreePool (IfCb);
+ }
return Status;
}
/**
- Set the address for the specified nic by HII service.
+ The list process of the ifconfig command.
+
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddrByHii (
- IN CONST NIC_INFO *NicInfo,
- IN CONST NIC_IP4_CONFIG_INFO *Config
+EFI_STATUS
+IfConfigShowInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_STATUS Status;
- SHELL_STATUS ShellStatus;
- NIC_IP4_CONFIG_INFO *NicConfig;
- CHAR16 *ConfigResp;
- CHAR16 *ConfigHdr;
- CHAR16 *AccessProgress;
- CHAR16 *AccessResults;
- CHAR16 *String;
- UINTN Length;
- UINTN Offset;
- EFI_HANDLE ChildHandle;
-
- AccessResults = NULL;
- ConfigHdr = NULL;
- ConfigResp = NULL;
- NicConfig = NULL;
- ShellStatus = SHELL_SUCCESS;
-
- Status = GetChildHandle (NicInfo->Handle, &ChildHandle);
- if (EFI_ERROR (Status)) {
- //
- // If failed to get Child handle, try NIC controller handle for back-compatibility
- //
- ChildHandle = NicInfo->Handle;
- }
- //
- // Construct config request string header
- //
- ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
- if (ConfigHdr != NULL) {
- Length = StrLen (ConfigHdr);
- } else {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
- if (ConfigResp == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- if (ConfigHdr != NULL) {
- StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);
- }
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IPv4_ADDRESS Gateway;
+ UINT32 Index;
- NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
- if (NicConfig == NULL) {
- ShellStatus = SHELL_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;
- if (Config != NULL) {
- CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}
//
- // Append OFFSET/WIDTH pair
+ // Go through the interface list.
//
- String = ConfigResp + Length;
- Offset = 0;
- AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);
+ while (Entry != IfList) {
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
- //
- // Call HII helper function to generate configuration string
- //
- Status = mHiiConfigRouting->BlockToConfig (
- mHiiConfigRouting,
- ConfigResp,
- (UINT8 *) NicConfig,
- NIC_ITEM_CONFIG_SIZE,
- &AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
- //
- // Set IP setting by HII servie
- //
- Status = mHiiConfigRouting->RouteConfig (
- mHiiConfigRouting,
- AccessResults,
- &AccessProgress
- );
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
- }
+ //
+ // Print interface name.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);
- SHELL_FREE_NON_NULL(AccessResults);
- SHELL_FREE_NON_NULL(NicConfig);
- SHELL_FREE_NON_NULL(ConfigResp);
- SHELL_FREE_NON_NULL(ConfigHdr);
+ //
+ // Print interface config policy.
+ //
+ if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_AUTO), gShellNetwork1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);
+ }
- return ShellStatus;
-}
+ //
+ // Print mac address of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);
-/**
- The callback function for the Arp address resolved event.
+ IfConfigPrintMacAddr (
+ IfCb->IfInfo->HwAddress.Addr,
+ IfCb->IfInfo->HwAddressSize
+ );
-**/
-VOID
-EFIAPI
-IfconfigOnArpResolved (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- ARP_REQUEST *Request;
- UINT8 Index;
-
- Request = (ARP_REQUEST *) Context;
- ASSERT (Request != NULL);
+ //
+ // Print IPv4 address list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);
- Request->Duplicate = FALSE;
-
- if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, Request->MacLen)) {
ShellPrintHiiEx(
-1,
-1,
NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Already Configured",
- (UINTN)Request->DestIp.v4.Addr[0],
- (UINTN)Request->DestIp.v4.Addr[1],
- (UINTN)Request->DestIp.v4.Addr[2],
- (UINTN)Request->DestIp.v4.Addr[3]
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->StationAddress.Addr[3]
);
- ArpResolved = TRUE;
- return;
- }
-
- for (Index = 0; Index < Request->MacLen; Index++) {
- if (Request->DestMac.Addr[Index] != 0) {
- Request->Duplicate = TRUE;
- }
- }
- if (Request->Duplicate) {
+ //
+ // Print subnet mask list of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);
+
ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)Request->DestMac.Addr[0],
- (UINTN)Request->DestMac.Addr[1],
- (UINTN)Request->DestMac.Addr[2],
- (UINTN)Request->DestMac.Addr[3],
- (UINTN)Request->DestMac.Addr[4],
- (UINTN)Request->DestMac.Addr[5]
- );
- }
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]
+ );
- ArpResolved = TRUE;
- return ;
-}
+ //
+ // Print default gateway of the interface.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);
-/**
- Check whether the address to be configured conflicts with other hosts.
+ ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
+
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
+ (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
+ CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
+ }
+ }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN)Gateway.Addr[0],
+ (UINTN)Gateway.Addr[1],
+ (UINTN)Gateway.Addr[2],
+ (UINTN)Gateway.Addr[3]
+ );
+
+ //
+ // Print route table entry.
+ //
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo-
RouteTableSize);
-**/
-BOOLEAN
-EFIAPI
-IfconfigIsIpDuplicate (
- IN NIC_INFO *NicInfo,
- IN IP4_ADDR IpAddr
- )
-{
- EFI_ARP_PROTOCOL *Arp;
- EFI_ARP_CONFIG_DATA ArpCfgData;
- EFI_HANDLE ArpHandle;
- ARP_REQUEST Request;
- EFI_STATUS Status;
-
- Arp = NULL;
- ArpHandle = NULL;
- ZeroMem (&Request, sizeof (ARP_REQUEST));
-
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- &ArpHandle
- );
+ for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
- if (EFI_ERROR (Status)) {
- return FALSE;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Subnet ",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]
+ );
- Status = gBS->OpenProtocol (
- ArpHandle,
- &gEfiArpProtocolGuid,
- (VOID**)&Arp,
- gImageHandle,
- ArpHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Netmask",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]
+ );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
+ gShellNetwork1HiiHandle,
+ L"Gateway",
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],
+ (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]
+ );
+ }
- //
- // Set up the Arp requests
- //
- EFI_IP4_TO_U32 (Request.DestIp.v4) = IpAddr;
- EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;
- Request.LocalMac = NicInfo->NicAddress.MacAddr;
- Request.MacLen = NicInfo->NicAddress.Len;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- IfconfigOnArpResolved,
- (VOID *) &Request,
- &Request.OnResolved
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ArpCfgData.SwAddressType = 0x0800;
- ArpCfgData.SwAddressLength = 4;
- ArpCfgData.StationAddress = &Request.LocalIp;
- ArpCfgData.EntryTimeOut = 0;
- ArpCfgData.RetryCount = 3;
- ArpCfgData.RetryTimeOut = 0;
-
- Status = Arp->Configure (Arp, &ArpCfgData);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ //
+ // Print dns server addresses list of the interface if has.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);
- Status = Arp->Request (
- Arp,
- &Request.DestIp,
- Request.OnResolved,
- &Request.DestMac
- );
-
- if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
- goto ON_EXIT;
- }
+ for (Index = 0; Index < IfCb->DnsCnt; Index++) {
+ ShellPrintHiiEx(
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY),
+ gShellNetwork1HiiHandle,
+ (UINTN) IfCb->DnsAddr[Index].Addr[0],
+ (UINTN) IfCb->DnsAddr[Index].Addr[1],
+ (UINTN) IfCb->DnsAddr[Index].Addr[2],
+ (UINTN) IfCb->DnsAddr[Index].Addr[3]
+ );
- while (!ArpResolved) {
-
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);
+ }
- if (Request.OnResolved != NULL) {
- gBS->CloseEvent (Request.OnResolved);
- }
+ //
+ // Print route table of the interface if has.
+ //
- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiArpServiceBindingProtocolGuid,
- ArpHandle
- );
+ Entry = Entry->ForwardLink;
- return Request.Duplicate;
+ }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);
+ return EFI_SUCCESS;
}
/**
- The callback function for the timer event used to get map.
-
-**/
-VOID
-EFIAPI
-TimeoutToGetMap (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- mTimeout = TRUE;
- return ;
-}
+ The clean process of the ifconfig command to clear interface info.
-/**
- Create an IP child, use it to start the auto configuration, then destroy it.
**/
EFI_STATUS
-EFIAPI
-IfconfigStartIp4(
- IN NIC_INFO *NicInfo
+IfConfigClearInterfaceInfo (
+ IN LIST_ENTRY *IfList
)
{
- EFI_IP4_PROTOCOL *Ip4;
- EFI_HANDLE Ip4Handle;
- EFI_HANDLE TimerToGetMap;
- EFI_IP4_CONFIG_DATA Ip4ConfigData;
- EFI_IP4_MODE_DATA Ip4Mode;
- EFI_STATUS Status;
-
- //
- // Get the Ip4ServiceBinding Protocol
- //
- Ip4Handle = NULL;
- Ip4 = NULL;
- TimerToGetMap = NULL;
+ EFI_STATUS Status;
+ LIST_ENTRY *Entry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ EFI_IP4_CONFIG2_POLICY Policy;
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), gShellNetwork1HiiHandle);
+ Policy = Ip4Config2PolicyDhcp;
+ Entry = IfList->ForwardLink;
+ Status = EFI_SUCCESS;
- Status = NetLibCreateServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- &Ip4Handle
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
}
- Status = gBS->OpenProtocol (
- Ip4Handle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- NicInfo->Handle,
- gImageHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
+ //
+ // Go through the interface list.
+ //
+ while (Entry != IfList) {
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
- Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
- Ip4ConfigData.AcceptAnyProtocol = FALSE;
- Ip4ConfigData.AcceptIcmpErrors = FALSE;
- Ip4ConfigData.AcceptBroadcast = FALSE;
- Ip4ConfigData.AcceptPromiscuous = FALSE;
- Ip4ConfigData.UseDefaultAddress = TRUE;
- ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
- ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- Ip4ConfigData.TypeOfService = 0;
- Ip4ConfigData.TimeToLive = 1;
- Ip4ConfigData.DoNotFragment = FALSE;
- Ip4ConfigData.RawData = FALSE;
- Ip4ConfigData.ReceiveTimeout = 0;
- Ip4ConfigData.TransmitTimeout = 0;
-
- Status = Ip4->Configure (Ip4, &Ip4ConfigData);
-
- if (Status == EFI_NO_MAPPING) {
- mTimeout = FALSE;
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL | EVT_TIMER,
- TPL_CALLBACK,
- TimeoutToGetMap,
- NULL,
- &TimerToGetMap
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->SetTimer (
- TimerToGetMap,
- TimerRelative,
- MultU64x32 (SecondsToNanoSeconds, 5)
- );
-
if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ break;
}
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), gShellNetwork1HiiHandle);
-
- while (!mTimeout) {
- Ip4->Poll (Ip4);
-
- if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) &&
- Ip4Mode.IsConfigured) {
- break;
- }
- }
- }
-
- Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);
-
- if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Default",
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],
- (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]
- );
- }
-
-
- if (EFI_ERROR (Status)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);
- }
-
- if (TimerToGetMap != NULL) {
- gBS->SetTimer (TimerToGetMap, TimerCancel, 0);
- gBS->CloseEvent (TimerToGetMap);
+ Entry = Entry->ForwardLink;
}
- NetLibDestroyServiceChild (
- NicInfo->Handle,
- gImageHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Ip4Handle
- );
-
return Status;
}
/**
- Set the address for the nic specified by the params.
+ The set process of the ifconfig command.
+
**/
-SHELL_STATUS
-EFIAPI
-IfconfigSetNicAddr (
- IN UINTN Argc,
- IN CONST CHAR16 *Params
+EFI_STATUS
+IfConfigSetInterfaceInfo (
+ IN LIST_ENTRY *IfList,
+ IN ARG_LIST *VarArg
)
{
- NIC_IP4_CONFIG_INFO *Config;
- NIC_IP4_CONFIG_INFO *OldConfig;
- EFI_IP_ADDRESS Ip;
- EFI_IP_ADDRESS Mask;
- EFI_IP_ADDRESS Gateway;
- NIC_INFO *Info;
- BOOLEAN Permanent;
- SHELL_STATUS ShellStatus;
- CONST CHAR16 *Walker;
- CHAR16 *Temp;
- CONST CHAR16 *DhcpTemp;
- CONST CHAR16 *StaticTemp;
- CONST CHAR16 *PermTemp;
- UINT32 NetworkBytes1;
- UINT32 NetworkBytes2;
- EFI_STATUS Status;
-
- Walker = Params;
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- Info = IfconfigFindNicByName (Temp);
-
- if (Info == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);
- return SHELL_NOT_FOUND;
+
+ EFI_STATUS Status;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ VAR_CHECK_CODE CheckCode;
+ EFI_EVENT TimeOutEvt;
+ EFI_EVENT MappedEvt;
+ BOOLEAN IsAddressOk;
+
+ EFI_IP4_CONFIG2_POLICY Policy;
+ EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
+ UINTN DataSize;
+ EFI_IPv4_ADDRESS Gateway;
+ EFI_IPv4_ADDRESS *Dns;
+ ARG_LIST *Tmp;
+ UINTN Index;
+
+ CONST CHAR16* Temp1;
+ CONST CHAR16* Temp2;
+
+ Dns = NULL;
+
+ if (IsListEmpty (IfList)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_INTERFACE), gShellNetwork1HiiHandle);
+ return EFI_INVALID_PARAMETER;
}
+
+ //
+ // Make sure to set only one interface each time.
+ //
+ IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);
+ Status = EFI_SUCCESS;
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")==NULL?0:StrStr(Walker, L" ")-Walker);
+ //
+ // Initialize check list mechanism.
+ //
+ CheckCode = IfConfigRetriveCheckListByName(
+ NULL,
+ NULL,
+ TRUE
+ );
- Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof (EFI_IP4_ROUTE_TABLE));
- if (Config == NULL) {
- return SHELL_OUT_OF_RESOURCES;
+ //
+ // Create events & timers for asynchronous settings.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &TimeOutEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
}
- Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);
-
- OldConfig = Info->ConfigInfo;
- Permanent = FALSE;
- ShellStatus = SHELL_INVALID_PARAMETER;
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ IfConfigManualAddressNotify,
+ &IsAddressOk,
+ &MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
- DhcpTemp = DhcpString;
- StaticTemp = StaticString;
-
- if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {
+ //
+ // Parse the setting variables.
+ //
+ while (VarArg != NULL) {
//
- // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP permanent
+ // Check invalid parameters (duplication & unknown & conflict).
//
- if ((Argc != 2) && (Argc!= 3)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ CheckCode = IfConfigRetriveCheckListByName(
+ mSetCheckList,
+ VarArg->Arg,
+ FALSE
+ );
- if (Argc == 3) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ if (VarCheckOk != CheckCode) {
+ switch (CheckCode) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg-
Arg);
+ break;
- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp,
PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg-
Arg);
+ break;
- Permanent = TRUE;
- }
+ //
+ // To handle unsupported option.
+ //
+ Temp1 = VarArg->Arg;
+ Temp2 = PermanentString;
+ if (StringNoCaseCompare(&Temp1, &Temp2) == 0) {
+ ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,
PermanentString);
+ goto ON_EXIT;
+ }
- if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&
- (OldConfig->Permanent == Permanent)) {
+ //
+ // To handle unknown option.
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg-
Arg);
+ break;
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);
- ShellStatus = SHELL_ALREADY_STARTED;
- goto ON_EXIT;
+ break;
+ }
+
+ VarArg = VarArg->Next;
+ continue;
}
- Config->Source = IP4_CONFIG_SOURCE_DHCP;
- } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {
//
- // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
- // eth0 static IP NETMASK GATEWAY permanent
+ // Process valid variables.
//
- if ((Argc != 5) && (Argc != 6)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
-
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
+ if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
+ //
+ // Set dhcp config policy
+ //
+ Policy = Ip4Config2PolicyDhcp;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ } else if (StrCmp (VarArg->Arg, L"static") == 0) {
+ //
+ // Set manual config policy.
+ //
+ Policy = Ip4Config2PolicyStatic;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- if (Argc == 6) {
- Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);
- } else {
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
- }
- if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ VarArg= VarArg->Next;
- if (Argc == 6) {
- Walker += StrLen(Temp) + 1;
- FreePool(Temp);
- Temp = NULL;
- Temp = StrnCatGrow(&Temp, NULL, Walker, 0);
+ ZeroMem (&ManualAddress, sizeof (ManualAddress));
+
+ //
+ // Get manual IP address.
+ //
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
- PermTemp = PermanentString;
- if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, L"ifconfig", Temp,
PermanentString, L"Nothing");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
+ //
+ // Get subnetmask.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);
+ if (EFI_ERROR(Status)) {
goto ON_EXIT;
}
- Permanent = TRUE;
- }
+ //
+ // Get gateway.
+ //
+ VarArg = VarArg->Next;
+ Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+
+ IsAddressOk = FALSE;
+
+ Status = IfCb->IfCfg->RegisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
- NetworkBytes1 = NTOHL (Ip.Addr[0]);
- NetworkBytes2 = NTOHL (Mask.Addr[0]);
- if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
+ DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ DataSize,
+ &ManualAddress
+ );
- NetworkBytes1 = NTOHL (Gateway.Addr[0]);
- if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||
- !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {
-
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ if (Status == EFI_NOT_READY) {
+ gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);
- //
- // one for the direct connected network, and another for the
- // default gateway. Remember, some structure members are cleared
- // by AllocateZeroPool
- //
- Config->Source = IP4_CONFIG_SOURCE_STATIC;
- Config->Ip4Info.RouteTableSize = 2;
+ while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
+ if (IsAddressOk) {
+ Status = EFI_SUCCESS;
+ break;
+ }
+ }
+ }
- CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
+ IfCb->IfCfg->UnregisterDataNotify (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeManualAddress,
+ MappedEvt
+ );
- Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_MAN_HOST), gShellNetwork1HiiHandle, Status);
+ goto ON_EXIT;
+ }
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));
- } else {
- // neither static or DHCP. error.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);
- goto ON_EXIT;
- }
+ //
+ // Set gateway.
+ //
+ DataSize = sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeGateway,
+ DataSize,
+ &Gateway
+ );
+ VarArg = VarArg->Next;
+
+ } else if (StrCmp (VarArg->Arg, L"dns") == 0) {
+ //
+ // Get DNS addresses.
+ //
+ VarArg = VarArg->Next;
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Index ++;
+ Tmp = Tmp->Next;
+ }
- CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));
- Config->Permanent = Permanent;
+ Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));
+ Tmp = VarArg;
+ Index = 0;
+ while (Tmp != NULL) {
+ Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+ Index ++;
+ Tmp = Tmp->Next;
+ }
+
+ VarArg = Tmp;
- //
- // Use HII service to set NIC address
- //
- ShellStatus = IfconfigSetNicAddrByHii (Info, Config);
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- goto ON_EXIT;
- }
+ //
+ // Set DNS addresses.
+ //
+ DataSize = Index * sizeof (EFI_IPv4_ADDRESS);
+
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypeDnsServer,
+ DataSize,
+ Dns
+ );
+
+ }
- Status = IfconfigStartIp4 (Info);
- if (EFI_ERROR(Status)) {
- ShellStatus = SHELL_ACCESS_DENIED;
}
- if (ShellStatus != SHELL_SUCCESS) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);
- }
-
- SHELL_FREE_NON_NULL(Config);
+ if (Dns != NULL) {
+ FreePool (Dns);
+ }
- return ShellStatus;
+ return EFI_SUCCESS;
+
}
/**
- Show the address information for the nic specified.
+ The ifconfig command main process.
+
+
- all nics' information is shown.
**/
-VOID
-EFIAPI
-IfconfigShowNicInfo (
- IN CONST CHAR16 *Name
+EFI_STATUS
+IfConfig (
+ IN IFCONFIG_PRIVATE_DATA *Private
)
{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *NicInfo;
- UINT32 Index;
- EFI_IP4_IPCONFIG_DATA *Ip4Config;
- EFI_IPv4_ADDRESS Gateway;
- CONST CHAR16 *TempString;
+ EFI_STATUS Status;
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- NicInfo = BASE_CR (Entry, NIC_INFO, Link);
+ //
+ // Get configure information of all interfaces.
+ //
+ Status = IfConfigGetInterfaceInfo (
+ Private->ImageHandle,
+ Private->IfName,
+ &Private->IfList
+ );
- TempString = (CHAR16*)NicInfo->Name;
- if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {
- continue;
- }
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), gShellNetwork1HiiHandle, NicInfo->Name);
+ switch (Private->OpCode) {
+ Status = IfConfigShowInterfaceInfo (&Private->IfList);
+ break;
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR),
- gShellNetwork1HiiHandle,
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[0],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[1],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[3],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[4],
- (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]
- );
-
- Print (L" Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : L"Media disconnected");
-
- if (NicInfo->ConfigInfo == NULL) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);
- continue;
- }
+ Status = IfConfigClearInterfaceInfo (&Private->IfList);
+ break;
- if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"DHCP");
- } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"STATIC");
- } else {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"Unknown");
- }
+ Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);
+ break;
- ShellPrintHiiEx(-1, -1, NULL,
- STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),
- gShellNetwork1HiiHandle,
- (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")
- );
+ Status = EFI_ABORTED;
+ }
- Ip4Config = &NicInfo->ConfigInfo->Ip4Info;
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"IP address",
- (UINTN)Ip4Config->StationAddress.Addr[0],
- (UINTN)Ip4Config->StationAddress.Addr[1],
- (UINTN)Ip4Config->StationAddress.Addr[2],
- (UINTN)Ip4Config->StationAddress.Addr[3]
- );
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Mask",
- (UINTN)Ip4Config->SubnetMask.Addr[0],
- (UINTN)Ip4Config->SubnetMask.Addr[1],
- (UINTN)Ip4Config->SubnetMask.Addr[2],
- (UINTN)Ip4Config->SubnetMask.Addr[3]
- );
+ return Status;
+}
- ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));
-
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&
- (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){
- CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- }
-
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Gateway.Addr[0],
- (UINTN)Gateway.Addr[1],
- (UINTN)Gateway.Addr[2],
- (UINTN)Gateway.Addr[3]
- );
+/**
+ The ifconfig command cleanup process, free the allocated memory.
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);
- for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);
+**/
+VOID
+IfConfigCleanup (
+ IN IFCONFIG_PRIVATE_DATA *Private
+ )
+{
+ LIST_ENTRY *Entry;
+ LIST_ENTRY *NextEntry;
+ IFCONFIG_INTERFACE_CB *IfCb;
+ ARG_LIST *ArgNode;
+ ARG_LIST *ArgHead;
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Subnet",
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]
- );
+ ASSERT (Private != NULL);
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Netmask",
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]
- );
+ //
+ // Clean the list which save the set config Args.
+ //
+ if (Private->VarArg != NULL) {
+ ArgHead = Private->VarArg;
- ShellPrintHiiEx(
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR),
- gShellNetwork1HiiHandle,
- L"Gateway",
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],
- (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]
- );
+ while (ArgHead->Next != NULL) {
+ ArgNode = ArgHead->Next;
+ FreePool (ArgHead);
+ ArgHead = ArgNode;
}
+
+ FreePool (ArgHead);
}
- return ;
-}
+ if (Private->IfName != NULL)
+ FreePool (Private->IfName);
-/**
- Clear address configuration for the nic specified.
- if NULL, all nics address configurations are cleared.
+ //
+ // Clean the IFCONFIG_INTERFACE_CB list.
+ //
+ Entry = Private->IfList.ForwardLink;
+ NextEntry = Entry->ForwardLink;
-**/
-EFI_STATUS
-EFIAPI
-IfconfigClearNicAddr (
- IN CONST CHAR16 *Name
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *NextEntry;
- NIC_INFO *Info;
- EFI_STATUS Status;
-
- NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {
- Info = BASE_CR (Entry, NIC_INFO, Link);
+ while (Entry != &Private->IfList) {
- if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {
- continue;
- }
+ IfCb = BASE_CR (Entry, IFCONFIG_INTERFACE_CB, Link);
-// if (Info->NicIp4Config == NULL) {
- Status = IfconfigSetNicAddrByHii (Info, NULL);
-// } else {
-// Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
-// }
+ RemoveEntryList (&IfCb->Link);
- if (EFI_ERROR (Status)) {
- return Status;
+ if (IfCb->IfInfo != NULL) {
+
+ FreePool (IfCb->IfInfo);
}
+
+ FreePool (IfCb);
+
+ Entry = NextEntry;
+ NextEntry = Entry->ForwardLink;
}
- return EFI_SUCCESS;
-
+ FreePool (Private);
}
/**
Function for 'ifconfig' command.
@param[in] ImageHandle Handle to the Image (NULL if Internal).
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
+
**/
SHELL_STATUS
EFIAPI
ShellCommandRunIfconfig (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- EFI_STATUS Status;
- LIST_ENTRY *Package;
- CHAR16 *ProblemParam;
- SHELL_STATUS ShellStatus;
- BOOLEAN ListOperation;
- BOOLEAN ClearOperation;
- BOOLEAN SetOperation;
- CONST CHAR16 *Item;
- LIST_ENTRY *Entry;
- NIC_INFO *Info;
-
- InitializeListHead (&NicInfoList);
- Status = EFI_INVALID_PARAMETER;
- ShellStatus = SHELL_SUCCESS;
+ EFI_STATUS Status;
+ IFCONFIG_PRIVATE_DATA *Private;
+ LIST_ENTRY *ParamPackage;
+ CONST CHAR16 *ValueStr;
+ ARG_LIST *ArgList;
+ CHAR16 *ProblemParam;
+ CHAR16 *Str;
+
+ Private = NULL;
+
+ Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);
+ if (EFI_ERROR (Status)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_INVALID_COMMAND), gShellNetwork1HiiHandle,
ProblemParam);
+ goto ON_EXIT;
+ }
//
- // initialize the shell lib (we must be in non-auto-init...)
+ // To handle unsupported option.
//
- Status = ShellInitialize();
- ASSERT_EFI_ERROR(Status);
+ if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");
+ goto ON_EXIT;
+ }
//
- // parse the command line
+ // To handle no option.
//
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
- if (EFI_ERROR(Status)) {
- if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);
- FreePool(ProblemParam);
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- ASSERT(FALSE);
- }
-
- goto Done;
+ if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&
+ !ShellCommandLineGetFlag (ParamPackage, L"-h") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
- ClearOperation = ShellCommandLineGetFlag(Package, L"-c");
- ListOperation = ShellCommandLineGetFlag(Package, L"-l");
- SetOperation = ShellCommandLineGetFlag(Package, L"-s");
-
- if ((ClearOperation && ListOperation)
- ||(SetOperation && ListOperation)
- ||(ClearOperation && SetOperation)
- ) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- } else if (!ClearOperation && !ListOperation && !SetOperation) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ifconfig");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ //
+ // To handle conflict options.
+ //
+ if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-h"))) ||
+ ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-h")))) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_OPTIONS), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
+
+ //
+ // To show the help information of ifconfig command.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-h")) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_HELP), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
-
- Status = IfconfigGetAllNicInfoByHii ();
- if (EFI_ERROR (Status)) {
- if (mIp4ConfigExist) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), gShellNetwork1HiiHandle, Status);
- } else {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellNetwork1HiiHandle, L"ifconfig",
L"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid);
- }
- return SHELL_NOT_FOUND;
+ Status = EFI_INVALID_PARAMETER;
+
+ Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));
+
+ if (Private == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
}
- if (ListOperation) {
- Item = ShellCommandLineGetValue (Package, L"-l");
+ InitializeListHead (&Private->IfList);
+
+ //
+ // To get interface name for the list option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {
+ Private->OpCode = IfConfigOpList;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name for the clear option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
+ Private->OpCode = IfConfigOpClear;
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");
+ if (ValueStr != NULL) {
+ Str = (CHAR16 *) AllocateZeroPool (StrSize (ValueStr));
+ ASSERT (Str != NULL);
+
+ StrCpyS (Str, StrSize (ValueStr)/sizeof (CHAR16), ValueStr);
+ Private->IfName = Str;
+ }
+ }
+
+ //
+ // To get interface name and corresponding Args for the set option.
+ //
+ if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {
- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-l");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
+ if (ValueStr == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_INTERFACE), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
+ }
//
- // Show the configuration.
+ // To split the configuration into multi-section.
//
- IfconfigShowNicInfo (Item);
- } else if (SetOperation) {
- Item = ShellCommandLineGetValue (Package, L"-s");
+ ArgList = SplitStrToList (ValueStr, L' ');
+ ASSERT (ArgList != NULL);
- //
- // IfConfig -s eth0 DHCP [permanent]
- // IfConfig -s eth0 static ip netmask gateway [permanent]
- //
- if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) || (CountSubItems(Item) == 4)) {
- ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_NO_VALUE), gShellNetwork1HiiHandle, L"ifconfig", L"-s");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
- }
+ Private->OpCode = IfConfigOpSet;
+ Private->IfName = ArgList->Arg;
- ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);
- } else if (ClearOperation) {
- Item = ShellCommandLineGetValue (Package, L"-c");
+ Private->VarArg = ArgList->Next;
- if (Item != NULL && CountSubItems(Item) > 1) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"ifconfig", Item, L"-c");
- ShellStatus = SHELL_INVALID_PARAMETER;
- goto Done;
+ if (Private->IfName == NULL || Private->VarArg == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ERR_LACK_COMMAND), gShellNetwork1HiiHandle);
+ goto ON_EXIT;
}
-
- IfconfigClearNicAddr (Item);
- } else {
- ASSERT(FALSE);
}
+
+ //
+ // Main process of ifconfig.
+ //
+ Status = IfConfig (Private);
- while (!IsListEmpty (&NicInfoList)) {
- Entry = NicInfoList.ForwardLink;
- Info = BASE_CR (Entry, NIC_INFO, Link);
- RemoveEntryList (Entry);
+ ShellCommandLineFreeVarList (ParamPackage);
+ if (Private != NULL)
+ IfConfigCleanup (Private);
- if (Info->ConfigInfo != NULL) {
- FreePool (Info->ConfigInfo);
- }
+ return Status;
+}
- FreePool (Info);
- }
- if (Package != NULL) {
- ShellCommandLineFreeVarList(Package);
- }
- return (ShellStatus);
-}
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index e23588a..af96379 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -909,20 +909,20 @@ PingCreateIpInstance (
//
if (Private->IpChoice == PING_IP_CHOICE_IP6) {
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
} else {
ASSERT(Private->IpChoice == PING_IP_CHOICE_IP4);
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
}
//
@@ -953,11 +953,11 @@ PingCreateIpInstance (
// Ip6config protocol and ip6 service binding protocol are installed
// on the same handle.
//
Status = gBS->HandleProtocol (
HandleBuffer[HandleIndex],
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
(VOID **) &IpXCfg
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
@@ -971,12 +971,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
}
@@ -1007,12 +1008,13 @@ PingCreateIpInstance (
Ip6ConfigDataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
}
@@ -1043,11 +1045,11 @@ PingCreateIpInstance (
}
} else {
//
// IP4 address check
//
- if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {
+ if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {
//
// Match a certain interface address.
//
break;
}
@@ -1135,15 +1137,10 @@ PingCreateIpInstance (
ZeroMem (&Ip4Config, sizeof (EFI_IP4_CONFIG_DATA));
//
// Configure the ip4 instance for icmp4 packet exchange.
//
-// PING_IP4_COPY_ADDRESS (&Ip4Config.StationAddress, &Private->SrcAddress);
-// Ip4Config.SubnetMask.Addr[0] = 0xFF;
-// Ip4Config.SubnetMask.Addr[1] = 0xFF;
-// Ip4Config.SubnetMask.Addr[2] = 0xFF;
-// Ip4Config.SubnetMask.Addr[3] = 0x00;
Ip4Config.DefaultProtocol = 1;
Ip4Config.AcceptAnyProtocol = FALSE;
Ip4Config.AcceptBroadcast = FALSE;
Ip4Config.AcceptIcmpErrors = TRUE;
Ip4Config.AcceptPromiscuous = FALSE;
@@ -1461,11 +1458,11 @@ ShellCommandRunPing (
ShellStatus = SHELL_SUCCESS;
ProblemParam = NULL;
Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (ShellCommandLineGetFlag (ParamPackage, L"-_ip6")) {
@@ -1481,11 +1478,11 @@ ShellCommandRunPing (
//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
SendNumber = DEFAULT_SEND_COUNT;
@@ -1499,11 +1496,11 @@ ShellCommandRunPing (
//
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.
//
if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
} else {
BufferSize = DEFAULT_BUFFER_SIZE;
@@ -1522,26 +1519,26 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &SrcAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
// Parse the paramter of destination ip address.
//
NonOptionCount = ShellCommandLineGetCount(ParamPackage);
if (NonOptionCount < 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_FEW), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
if (NonOptionCount > 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
ValueStr = ShellCommandLineGetRawValue (ParamPackage, 1);
if (ValueStr != NULL) {
@@ -1550,11 +1547,11 @@ ShellCommandRunPing (
Status = NetLibStrToIp6 (ValueStr, &DstAddress);
} else {
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_ERR_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
}
//
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
index 49849a6..5151179 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.c
@@ -1,9 +1,9 @@
Main file for NULL named library for network1 shell command functions.
- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -63,11 +63,11 @@ ShellNetwork1CommandsLibConstructor (
}
//
// install our shell command handlers
//
ShellCommandRegisterCommandName(L"ping", ShellCommandRunPing , ShellCommandGetManFileNameNetwork1, 0,
L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_PING));
- ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0,
L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_GET_HELP_IFCONFIG));
+ ShellCommandRegisterCommandName(L"ifconfig",ShellCommandRunIfconfig , ShellCommandGetManFileNameNetwork1, 0,
L"network1", TRUE , gShellNetwork1HiiHandle, STRING_TOKEN(STR_IFCONFIG_HELP));
return (EFI_SUCCESS);
}
/**
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
index 68a7c93..98b40df 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.h
@@ -1,9 +1,9 @@
header file for NULL named library for network1 shell command functions.
- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
+ Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
@@ -24,13 +24,11 @@
#include <Protocol/Cpu.h>
#include <Protocol/ServiceBinding.h>
#include <Protocol/Ip6.h>
#include <Protocol/Ip6Config.h>
#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiConfigRouting.h>
+#include <Protocol/Ip4Config2.h>
#include <Protocol/Arp.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
@@ -45,12 +43,10 @@
#include <Library/HiiLib.h>
#include <Library/NetLib.h>
#include <Library/DevicePathLib.h>
#include <Library/PrintLib.h>
-#include <Guid/NicIp4ConfigNvData.h>
-
extern EFI_HANDLE gShellNetwork1HiiHandle;
/**
Function for 'ping' command.
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
index 527d2ef..6dfbbe5 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
@@ -57,11 +57,11 @@
gEfiCpuArchProtocolGuid ## CONSUMES
gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
- gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES
[Guids]
gShellNetwork1HiiGuid ## SOMETIMES_CONSUMES ## HII
\ No newline at end of file
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.uni
index aa27c678339c5e94c9c936d9a7ea74b6b043c200..65edb0a407754247e91009929a3525b2ad5dd96e 100644
GIT binary patch
literal 21554
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
NnXgL}rJk4f{{V5RRI&g7
literal 20112
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
--
1.9.5.msysgit.1
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
------------------------------
_______________________________________________
edk2-devel mailing list
https://lists.sourceforge.net/lists/listinfo/edk2-devel
End of edk2-devel Digest, Vol 66, Issue 424
*******************************************
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------

------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/

------------------------------

_______________________________________________
edk2-devel mailing list
edk2-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel


End of edk2-devel Digest, Vol 67, Issue 23
******************************************
Loading...