/** @file\r
The implementation for Ping shell command.\r
\r
- Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+ Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
\r
#define PING_IP4_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv4_ADDRESS)))\r
\r
+UINT64 mCurrentTick = 0;\r
\r
//\r
// Function templates to match the IPv4 and IPv6 commands that we use.\r
PING_IPX_COMPLETION_TOKEN RxToken;\r
} PING_PRIVATE_DATA;\r
\r
+/**\r
+ Calculate the internet checksum (see RFC 1071).\r
+\r
+ @param[in] Packet Buffer which contains the data to be checksummed.\r
+ @param[in] Length Length to be checksummed.\r
+\r
+ @retval Checksum Returns the 16 bit ones complement of \r
+ ones complement sum of 16 bit words\r
+**/\r
UINT16\r
EFIAPI\r
NetChecksum (\r
IN UINT8 *Buffer,\r
IN UINT32 Length\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Calculate the internet checksum (see RFC 1071)\r
-\r
-Arguments:\r
-\r
- Packet - Buffer which contains the data to be checksummed\r
- Length - Length to be checksummed\r
-\r
-Returns:\r
-\r
- Checksum - Returns the 16 bit ones complement of \r
- ones complement sum of 16 bit words\r
-\r
---*/\r
{\r
UINT32 Sum;\r
UINT8 Odd;\r
Sum = 0;\r
Odd = (UINT8) (Length & 1);\r
Length >>= 1;\r
- while (Length--) {\r
+ while ((Length--) != 0) {\r
Sum += *Packet++;\r
}\r
\r
- if (Odd) {\r
+ if (Odd != 0) {\r
Sum += *(UINT8 *) Packet;\r
}\r
\r
@return The current value of the register.\r
\r
**/\r
-UINT64\r
-EFIAPI\r
-ReadTime (\r
- VOID\r
- );\r
\r
STATIC CONST SHELL_PARAM_ITEM PingParamList[] = {\r
{\r
STATIC CONST CHAR16 *mDstString;\r
STATIC CONST CHAR16 *mSrcString;\r
STATIC UINT64 mFrequency = 0;\r
+EFI_CPU_ARCH_PROTOCOL *gCpu = NULL;\r
+\r
+/**\r
+ Read the current time.\r
+\r
+ @retval the current tick value.\r
+**/\r
+UINT64\r
+EFIAPI\r
+ReadTime (\r
+ VOID\r
+ )\r
+{\r
+ UINT64 TimerPeriod;\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (gCpu != NULL);\r
+\r
+ Status = gCpu->GetTimerValue (gCpu, 0, &mCurrentTick, &TimerPeriod);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // The WinntGetTimerValue will return EFI_UNSUPPORTED. Set the\r
+ // TimerPeriod by ourselves.\r
+ //\r
+ mCurrentTick += 1000000;\r
+ }\r
+ \r
+ return mCurrentTick;\r
+}\r
+\r
\r
/**\r
- Get and caculate the frequency in tick/ms.\r
- The result is saved in the globle variable mFrequency\r
+ Get and calculate the frequency in ticks/ms.\r
+ The result is saved in the global variable mFrequency\r
\r
- @retval EFI_SUCCESS Caculated the frequency successfully.\r
- @retval Others Failed to caculate the frequency.\r
+ @retval EFI_SUCCESS Calculated the frequency successfully.\r
+ @retval Others Failed to calculate the frequency.\r
\r
**/\r
EFI_STATUS\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_CPU_ARCH_PROTOCOL *Cpu;\r
UINT64 CurrentTick;\r
UINT64 TimerPeriod;\r
\r
- Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **) &Cpu);\r
-\r
+ Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **) &gCpu);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- Status = Cpu->GetTimerValue (Cpu, 0, &CurrentTick, &TimerPeriod);\r
+ Status = gCpu->GetTimerValue (gCpu, 0, &CurrentTick, &TimerPeriod);\r
\r
if (EFI_ERROR (Status)) {\r
TimerPeriod = DEFAULT_TIMER_PERIOD;\r
\r
//\r
// The timer period is in femtosecond (1 femtosecond is 1e-15 second).\r
- // So 1e+12 is divided by timer period to produce the freq in tick/ms.\r
+ // So 1e+12 is divided by timer period to produce the freq in ticks/ms.\r
//\r
mFrequency = DivU64x64Remainder (1000000000000ULL, TimerPeriod, NULL);\r
\r
}\r
\r
/**\r
- Caculate a duration in ms.\r
+ Calculate a duration in ms.\r
\r
@param[in] Begin The start point of time.\r
@param[in] End The end point of time.\r
//\r
Request->Type = (UINT8)(Private->IpChoice==PING_IP_CHOICE_IP6?ICMP_V6_ECHO_REQUEST:ICMP_V4_ECHO_REQUEST);\r
Request->Code = 0;\r
- Request->SequenceNum = SequenceNum;\r
+ Request->SequenceNum = SequenceNum; \r
Request->Identifier = 0;\r
Request->Checksum = 0;\r
\r
// Assembly token for transmit.\r
//\r
if (Private->IpChoice==PING_IP_CHOICE_IP6) {\r
+ Request->TimeStamp = TimeStamp;\r
((EFI_IP6_TRANSMIT_DATA*)TxData)->ExtHdrsLength = 0;\r
((EFI_IP6_TRANSMIT_DATA*)TxData)->ExtHdrs = NULL;\r
((EFI_IP6_TRANSMIT_DATA*)TxData)->OverrideData = 0;\r
RemoveEntryList (&TxInfo->Link);\r
PingDestroyTxInfo (TxInfo, Private->IpChoice);\r
\r
- //\r
- // We dont need to wait for this some other time...\r
- //\r
- Private->RxCount++;\r
-\r
if (IsListEmpty (&Private->TxList) && (Private->TxCount == Private->SendNum)) {\r
//\r
// All the left icmp6 echo request in the list timeout.\r
&HandleNum,\r
&HandleBuffer\r
);\r
- if (EFI_ERROR (Status) || (HandleNum == 0)) {\r
+ if (EFI_ERROR (Status) || (HandleNum == 0) || (HandleBuffer == NULL)) {\r
return EFI_ABORTED;\r
}\r
//\r
if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS*)&Private->DstAddress) &&\r
NetIp6IsUnspecifiedAddr ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) &&\r
(HandleNum > 1)) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, mSrcString);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString); \r
Status = EFI_INVALID_PARAMETER;\r
goto ON_ERROR;\r
}\r
if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS*)&Private->DstAddress) &&\r
PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private->SrcAddress) &&\r
(HandleNum > 1)) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, mSrcString);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString); \r
Status = EFI_INVALID_PARAMETER;\r
goto ON_ERROR;\r
}\r
//\r
Status = gBS->HandleProtocol (\r
HandleBuffer[HandleIndex],\r
- Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4ConfigProtocolGuid,\r
+ Private->IpChoice == PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2ProtocolGuid,\r
(VOID **) &IpXCfg\r
);\r
\r
NULL\r
);\r
} else {\r
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (\r
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (\r
IpXCfg,\r
+ Ip4Config2DataTypeInterfaceInfo,\r
&IfInfoSize,\r
NULL\r
);\r
IpXInterfaceInfo\r
);\r
} else {\r
- Status = ((EFI_IP4_CONFIG_PROTOCOL*)IpXCfg)->GetData (\r
+ Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (\r
IpXCfg,\r
+ Ip4Config2DataTypeInterfaceInfo,\r
&IfInfoSize,\r
IpXInterfaceInfo\r
);\r
//\r
// IP4 address check\r
//\r
- if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_IPCONFIG_DATA*)IpXInterfaceInfo)->StationAddress)) {\r
+ if (EFI_IP4_EQUAL (&Private->SrcAddress, &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)->StationAddress)) {\r
//\r
// Match a certain interface address.\r
//\r
//\r
\r
if (HandleIndex == HandleNum) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, mSrcString);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_CONFIGD_NIC_NF), gShellNetwork1HiiHandle, L"ping"); \r
Status = EFI_NOT_FOUND;\r
goto ON_ERROR;\r
}\r
//\r
// Configure the ip4 instance for icmp4 packet exchange.\r
//\r
-// PING_IP4_COPY_ADDRESS (&Ip4Config.StationAddress, &Private->SrcAddress);\r
-// Ip4Config.SubnetMask.Addr[0] = 0xFF;\r
-// Ip4Config.SubnetMask.Addr[1] = 0xFF;\r
-// Ip4Config.SubnetMask.Addr[2] = 0xFF;\r
-// Ip4Config.SubnetMask.Addr[3] = 0x00;\r
Ip4Config.DefaultProtocol = 1;\r
Ip4Config.AcceptAnyProtocol = FALSE;\r
Ip4Config.AcceptBroadcast = FALSE;\r
}\r
\r
/**\r
- Destory the IP instance.\r
+ Destroy the IP instance.\r
\r
@param[in] Private The pointer of PING_PRIVATE_DATA.\r
\r
**/\r
VOID\r
EFIAPI\r
-Ping6DestoryIp6Instance (\r
+Ping6DestroyIp6Instance (\r
IN PING_PRIVATE_DATA *Private\r
)\r
{\r
} else if (Status == RETURN_NO_MAPPING) {\r
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NOROUTE_FOUND), gShellNetwork1HiiHandle, mDstString, mSrcString);\r
} else {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NETWORK_ERROR), gShellNetwork1HiiHandle, Status);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NETWORK_ERROR), gShellNetwork1HiiHandle, L"ping", Status); \r
}\r
\r
goto ON_EXIT;\r
}\r
\r
if (Private->IpChildHandle != NULL) {\r
- Ping6DestoryIp6Instance (Private);\r
+ Ping6DestroyIp6Instance (Private);\r
}\r
\r
FreePool (Private);\r
\r
@param[in] ImageHandle Handle to the Image (NULL if Internal).\r
@param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
+\r
+ @retval SHELL_SUCCESS The ping processed successfullly.\r
+ @retval others The ping processed unsuccessfully.\r
+ \r
**/\r
SHELL_STATUS\r
EFIAPI\r
CONST CHAR16 *ValueStr;\r
UINTN NonOptionCount;\r
UINT32 IpChoice;\r
+ CHAR16 *ProblemParam;\r
\r
//\r
// we use IPv6 buffers to hold items... \r
IpChoice = PING_IP_CHOICE_IP4;\r
\r
ShellStatus = SHELL_SUCCESS;\r
+ ProblemParam = NULL;\r
\r
- Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, NULL, TRUE, FALSE);\r
+ Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);\r
if (EFI_ERROR(Status)) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam);\r
ShellStatus = SHELL_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.\r
//\r
if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, ValueStr);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
// ShellStrToUintn will return 0 when input is 0 or an invalid input string.\r
//\r
if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, ValueStr);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&SrcAddress);\r
}\r
if (EFI_ERROR (Status)) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, ValueStr);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
//\r
NonOptionCount = ShellCommandLineGetCount(ParamPackage);\r
if (NonOptionCount < 2) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping"); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
if (NonOptionCount > 2) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping"); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
Status = NetLibStrToIp4 (ValueStr, (EFI_IPv4_ADDRESS*)&DstAddress);\r
}\r
if (EFI_ERROR (Status)) {\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, ValueStr);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r