X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=ShellPkg%2FLibrary%2FUefiShellNetwork1CommandsLib%2FPing.c;h=fda062de1d73c7d11019a239b563349881a442a8;hp=ab7658c45bbc0cacd5401139b36002a9771a28cc;hb=7c25b7ea5b2c029a9e7a0be57f7c20f31d720c7d;hpb=a1d4bfcc3f58a9ed0ce6118556016c7c058d01b1
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
index ab7658c45b..fda062de1d 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
@@ -1,7 +1,8 @@
/** @file
The implementation for Ping shell command.
- Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.
+ Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
@@ -17,6 +18,7 @@
#define PING_IP4_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv4_ADDRESS)))
+UINT64 CurrentTick = 0;
//
// Function templates to match the IPv4 and IPv6 commands that we use.
@@ -185,11 +187,6 @@ NetChecksum (
@return The current value of the register.
**/
-UINT64
-EFIAPI
-ReadTime (
- VOID
- );
STATIC CONST SHELL_PARAM_ITEM PingParamList[] = {
{
@@ -220,13 +217,43 @@ STATIC CONST SHELL_PARAM_ITEM PingParamList[] = {
STATIC CONST CHAR16 *mDstString;
STATIC CONST CHAR16 *mSrcString;
STATIC UINT64 mFrequency = 0;
+EFI_CPU_ARCH_PROTOCOL *gCpu = NULL;
+
+/**
+ Read the current time.
+
+ @retval the current tick value.
+**/
+UINT64
+EFIAPI
+ReadTime (
+ VOID
+ )
+{
+ UINT64 TimerPeriod;
+ EFI_STATUS Status;
+
+ ASSERT (gCpu != NULL);
+
+ Status = gCpu->GetTimerValue (gCpu, 0, &CurrentTick, &TimerPeriod);
+ if (EFI_ERROR (Status)) {
+ //
+ // The WinntGetTimerValue will return EFI_UNSUPPORTED. Set the
+ // TimerPeriod by ourselves.
+ //
+ CurrentTick += 1000000;
+ }
+
+ return CurrentTick;
+}
+
/**
- Get and caculate the frequency in tick/ms.
- The result is saved in the globle variable mFrequency
+ Get and calculate the frequency in ticks/ms.
+ The result is saved in the global variable mFrequency
- @retval EFI_SUCCESS Caculated the frequency successfully.
- @retval Others Failed to caculate the frequency.
+ @retval EFI_SUCCESS Calculated the frequency successfully.
+ @retval Others Failed to calculate the frequency.
**/
EFI_STATUS
@@ -236,17 +263,15 @@ GetFrequency (
)
{
EFI_STATUS Status;
- EFI_CPU_ARCH_PROTOCOL *Cpu;
UINT64 CurrentTick;
UINT64 TimerPeriod;
- Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **) &Cpu);
-
+ Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **) &gCpu);
if (EFI_ERROR (Status)) {
return Status;
}
- Status = Cpu->GetTimerValue (Cpu, 0, &CurrentTick, &TimerPeriod);
+ Status = gCpu->GetTimerValue (gCpu, 0, &CurrentTick, &TimerPeriod);
if (EFI_ERROR (Status)) {
TimerPeriod = DEFAULT_TIMER_PERIOD;
@@ -254,7 +279,7 @@ GetFrequency (
//
// The timer period is in femtosecond (1 femtosecond is 1e-15 second).
- // So 1e+12 is divided by timer period to produce the freq in tick/ms.
+ // So 1e+12 is divided by timer period to produce the freq in ticks/ms.
//
mFrequency = DivU64x64Remainder (1000000000000ULL, TimerPeriod, NULL);
@@ -262,7 +287,7 @@ GetFrequency (
}
/**
- Caculate a duration in ms.
+ Calculate a duration in ms.
@param[in] Begin The start point of time.
@param[in] End The end point of time.
@@ -886,7 +911,7 @@ PingCreateIpInstance (
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
@@ -895,7 +920,7 @@ PingCreateIpInstance (
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&
(HandleNum > 1)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
Status = EFI_INVALID_PARAMETER;
goto ON_ERROR;
}
@@ -930,7 +955,7 @@ PingCreateIpInstance (
//
Status = gBS->HandleProtocol (
HandleBuffer[HandleIndex],
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,
(VOID **) &IpXCfg
);
@@ -948,8 +973,9 @@ PingCreateIpInstance (
NULL
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
NULL
);
@@ -984,8 +1010,9 @@ PingCreateIpInstance (
IpXInterfaceInfo
);
} else {
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
IpXCfg,
+ Ip4Config2DataTypeInterfaceInfo,
&IfInfoSize,
IpXInterfaceInfo
);
@@ -1020,7 +1047,7 @@ PingCreateIpInstance (
//
// 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.
//
@@ -1037,7 +1064,7 @@ PingCreateIpInstance (
//
if (HandleIndex == HandleNum) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, mSrcString);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_CONFIGD_NIC_NF), gShellNetwork1HiiHandle, L"ping");
Status = EFI_NOT_FOUND;
goto ON_ERROR;
}
@@ -1112,11 +1139,6 @@ PingCreateIpInstance (
//
// 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;
@@ -1166,14 +1188,14 @@ ON_ERROR:
}
/**
- Destory the IP instance.
+ Destroy the IP instance.
@param[in] Private The pointer of PING_PRIVATE_DATA.
**/
VOID
EFIAPI
-Ping6DestoryIp6Instance (
+Ping6DestroyIp6Instance (
IN PING_PRIVATE_DATA *Private
)
{
@@ -1297,7 +1319,7 @@ ShellPing (
} else if (Status == RETURN_NO_MAPPING) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NOROUTE_FOUND), gShellNetwork1HiiHandle, mDstString, mSrcString);
} else {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NETWORK_ERROR), gShellNetwork1HiiHandle, Status);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NETWORK_ERROR), gShellNetwork1HiiHandle, L"ping", Status);
}
goto ON_EXIT;
@@ -1390,7 +1412,7 @@ ON_EXIT:
}
if (Private->IpChildHandle != NULL) {
- Ping6DestoryIp6Instance (Private);
+ Ping6DestroyIp6Instance (Private);
}
FreePool (Private);
@@ -1404,6 +1426,10 @@ ON_EXIT:
@param[in] ImageHandle Handle to the Image (NULL if Internal).
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
+
+ @retval SHELL_SUCCESS The ping processed successfullly.
+ @retval others The ping processed unsuccessfully.
+
**/
SHELL_STATUS
EFIAPI
@@ -1422,6 +1448,7 @@ ShellCommandRunPing (
CONST CHAR16 *ValueStr;
UINTN NonOptionCount;
UINT32 IpChoice;
+ CHAR16 *ProblemParam;
//
// we use IPv6 buffers to hold items...
@@ -1433,10 +1460,11 @@ ShellCommandRunPing (
IpChoice = PING_IP_CHOICE_IP4;
ShellStatus = SHELL_SUCCESS;
+ ProblemParam = NULL;
- Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, NULL, TRUE, FALSE);
+ Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
@@ -1456,7 +1484,7 @@ 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_PROBLEM), gShellNetwork1HiiHandle, ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
@@ -1474,7 +1502,7 @@ 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_PROBLEM), gShellNetwork1HiiHandle, ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
@@ -1497,7 +1525,7 @@ ShellCommandRunPing (
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
@@ -1507,12 +1535,12 @@ ShellCommandRunPing (
//
NonOptionCount = ShellCommandLineGetCount(ParamPackage);
if (NonOptionCount < 2) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_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);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping");
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}
@@ -1525,7 +1553,7 @@ ShellCommandRunPing (
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);
}
if (EFI_ERROR (Status)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, ValueStr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr);
ShellStatus = SHELL_INVALID_PARAMETER;
goto ON_EXIT;
}