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; }