From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A057A1A1E57 for ; Tue, 25 Oct 2016 00:05:24 -0700 (PDT) Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga103.fm.intel.com with ESMTP; 25 Oct 2016 00:05:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,545,1473145200"; d="scan'208";a="23377415" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga005.jf.intel.com with ESMTP; 25 Oct 2016 00:05:12 -0700 Received: from fmsmsx120.amr.corp.intel.com (10.18.124.208) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 25 Oct 2016 00:05:11 -0700 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by fmsmsx120.amr.corp.intel.com (10.18.124.208) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 25 Oct 2016 00:05:11 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.209]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.2]) with mapi id 14.03.0248.002; Tue, 25 Oct 2016 15:05:09 +0800 From: "Ni, Ruiyu" To: "edk2-devel@lists.01.org" CC: "Fu, Siyuan" Thread-Topic: [edk2] [Patch] ShellPkg: update ping to use timer service instead of timer arch protocol . Thread-Index: AQHSKD63Btqg1C6eMUy3EmMWplibdaC4BGYAgADHOWA= Date: Tue, 25 Oct 2016 07:05:08 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D58E3F86E@SHSMSX104.ccr.corp.intel.com> References: <1476685290-11536-1-git-send-email-siyuan.fu@intel.com> In-Reply-To: Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZDdjYWEzM2ItM2MxYi00YTUzLThlMGItNDBkYjhhMGJhMzlmIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6IjlcL3FBWHZzZEU5bm9LbFltbDFndTJsVnNaUjF2VmlBMHI3bWpqcDhyMVJZPSJ9 x-ctpclassification: CTP_IC x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [Patch] ShellPkg: update ping to use timer service instead of timer arch protocol . X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Oct 2016 07:05:24 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Ruiyu Ni > >-----Original Message----- >From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Fu = Siyuan >Sent: Monday, October 17, 2016 2:22 PM >To: edk2-devel@lists.01.org >Cc: Ni, Ruiyu ; Ye, Ting ; Zhang, L= ubo >Subject: [edk2] [Patch] ShellPkg: update ping to use timer service instead= of timer arch protocol . > >This patch update the shell ping command to use timer service to calculate= the >RTT time, instead of using the timer arch protocol. > >Contributed-under: TianoCore Contribution Agreement 1.0 >Signed-off-by: Fu Siyuan >Cc: Ni Ruiyu >Cc: Ye Ting >Cc: Zhang Lubo >--- > .../Library/UefiShellNetwork1CommandsLib/Ping.c | 233 +++++++++++++++-= ----- > .../UefiShellNetwork1CommandsLib.inf | 3 +- > .../UefiShellNetwork1CommandsLib.uni | 4 +- > 3 files changed, 171 insertions(+), 69 deletions(-) > >diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c >b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c >index 38625fe..2e1e878 100644 >--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c >+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c >@@ -86,7 +86,7 @@ typedef struct _ICMPX_ECHO_REQUEST_REPLY { > UINT16 Checksum; > UINT16 Identifier; > UINT16 SequenceNum; >- UINT64 TimeStamp; >+ UINT32 TimeStamp; > UINT8 Data[1]; > } ICMPX_ECHO_REQUEST_REPLY; > #pragma pack() >@@ -94,7 +94,7 @@ typedef struct _ICMPX_ECHO_REQUEST_REPLY { > typedef struct _PING_ICMP_TX_INFO { > LIST_ENTRY Link; > UINT16 SequenceNum; >- UINT64 TimeStamp; >+ UINT32 TimeStamp; > PING_IPX_COMPLETION_TOKEN *Token; > } PING_ICMPX_TX_INFO; > >@@ -109,6 +109,7 @@ typedef struct _PING_ICMP_TX_INFO { > #define DEFAULT_BUFFER_SIZE 16 > #define ICMP_V4_ECHO_REQUEST 0x8 > #define ICMP_V4_ECHO_REPLY 0x0 >+#define STALL_1_MILLI_SECOND 1000 > > #define PING_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'i', 'n', 'g') > typedef struct _PING_PRIVATE_DATA { >@@ -117,6 +118,10 @@ typedef struct _PING_PRIVATE_DATA { > EFI_HANDLE IpChildHandle; > EFI_EVENT Timer; > >+ UINT32 TimerPeriod; >+ UINT32 RttTimerTick; >+ EFI_EVENT RttTimer; >+ > EFI_STATUS Status; > LIST_ENTRY TxList; > UINT16 RxCount; >@@ -221,93 +226,186 @@ STATIC CONST SHELL_PARAM_ITEM PingParamList[] = =3D { > // > STATIC CONST CHAR16 *mDstString; > STATIC CONST CHAR16 *mSrcString; >-STATIC UINT64 mFrequency =3D 0; > EFI_CPU_ARCH_PROTOCOL *gCpu =3D NULL; > > /** >- Read the current time. >+ RTT timer tick routine. >+ >+ @param[in] Event A EFI_EVENT type event. >+ @param[in] Context The pointer to Context. > >- @retval the current tick value. > **/ >-UINT64 >-ReadTime ( >+VOID >+EFIAPI >+RttTimerTickRoutine ( >+ IN EFI_EVENT Event, >+ IN VOID *Context >+ ) >+{ >+ UINT32 *RttTimerTick; >+ >+ RttTimerTick =3D (UINT32*) Context; >+ (*RttTimerTick)++; >+} >+ >+/** >+ Get the timer period of the system. >+ >+ This function tries to get the system timer period by creating >+ an 1ms period timer. >+ >+ @return System timer period in MS, or 0 if operation failed. >+ >+**/ >+UINT32 >+GetTimerPeriod( > VOID > ) > { >- UINT64 TimerPeriod; >- EFI_STATUS Status; >+ EFI_STATUS Status; >+ UINT32 RttTimerTick; >+ EFI_EVENT TimerEvent; >+ UINT32 StallCounter; >+ EFI_TPL OldTpl; > >- ASSERT (gCpu !=3D NULL); >+ RttTimerTick =3D 0; >+ StallCounter =3D 0; > >- Status =3D gCpu->GetTimerValue (gCpu, 0, &mCurrentTick, &TimerPeriod); >+ Status =3D gBS->CreateEvent ( >+ EVT_TIMER | EVT_NOTIFY_SIGNAL, >+ TPL_NOTIFY, >+ RttTimerTickRoutine, >+ &RttTimerTick, >+ &TimerEvent >+ ); > if (EFI_ERROR (Status)) { >- // >- // The WinntGetTimerValue will return EFI_UNSUPPORTED. Set the >- // TimerPeriod by ourselves. >- // >- mCurrentTick +=3D 1000000; >+ return 0; >+ } >+ >+ OldTpl =3D gBS->RaiseTPL (TPL_CALLBACK); >+ Status =3D gBS->SetTimer ( >+ TimerEvent, >+ TimerPeriodic, >+ TICKS_PER_MS >+ ); >+ if (EFI_ERROR (Status)) { >+ gBS->CloseEvent (TimerEvent); >+ return 0; >+ } >+ >+ while (RttTimerTick < 10) { >+ gBS->Stall (STALL_1_MILLI_SECOND); >+ ++StallCounter; > } >- >- return mCurrentTick; >-} > >+ gBS->RestoreTPL (OldTpl); >+ >+ gBS->SetTimer (TimerEvent, TimerCancel, 0); >+ gBS->CloseEvent (TimerEvent); >+ >+ return StallCounter / RttTimerTick; >+} > > /** >- Get and calculate the frequency in ticks/ms. >- The result is saved in the global variable mFrequency >+ Initialize the timer event for RTT (round trip time). > >- @retval EFI_SUCCESS Calculated the frequency successfully. >- @retval Others Failed to calculate the frequency. >+ @param[in] Private The pointer to PING_PRIVATE_DATA. >+ >+ @retval EFI_SUCCESS RTT timer is started. >+ @retval Others Failed to start the RTT timer. > > **/ > EFI_STATUS >-GetFrequency ( >- VOID >+PingInitRttTimer ( >+ PING_PRIVATE_DATA *Private > ) > { >- EFI_STATUS Status; >- UINT64 CurrentTick; >- UINT64 TimerPeriod; >+ EFI_STATUS Status; >+ >+ Private->TimerPeriod =3D GetTimerPeriod (); >+ if (Private->TimerPeriod =3D=3D 0) { >+ return EFI_ABORTED; >+ } >+ >+ Private->RttTimerTick =3D 0; >+ Status =3D gBS->CreateEvent ( >+ EVT_TIMER | EVT_NOTIFY_SIGNAL, >+ TPL_NOTIFY, >+ RttTimerTickRoutine, >+ &Private->RttTimerTick, >+ &Private->RttTimer >+ ); >+ if (EFI_ERROR (Status)) { >+ return Status; >+ } > >- Status =3D gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID *= *) &gCpu); >+ Status =3D gBS->SetTimer ( >+ Private->RttTimer, >+ TimerPeriodic, >+ TICKS_PER_MS >+ ); > if (EFI_ERROR (Status)) { >+ gBS->CloseEvent (Private->RttTimer); > return Status; > } > >- Status =3D gCpu->GetTimerValue (gCpu, 0, &CurrentTick, &TimerPeriod); >+ return EFI_SUCCESS; >+} > >- if (EFI_ERROR (Status)) { >- TimerPeriod =3D DEFAULT_TIMER_PERIOD; >+/** >+ Free RTT timer event resource. >+ >+ @param[in] Private The pointer to PING_PRIVATE_DATA. >+ >+**/ >+VOID >+PingFreeRttTimer ( >+ PING_PRIVATE_DATA *Private >+ ) >+{ >+ if (Private->RttTimer !=3D NULL) { >+ gBS->SetTimer (Private->RttTimer, TimerCancel, 0); >+ gBS->CloseEvent (Private->RttTimer); > } >+} > >- // >- // 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 ticks/ms. >- // >- mFrequency =3D DivU64x64Remainder (1000000000000ULL, TimerPeriod, NULL)= ; >+/** >+ Read the current time. >+ >+ @param[in] Private The pointer to PING_PRIVATE_DATA. > >- return EFI_SUCCESS; >+ @retval the current tick value. >+**/ >+UINT32 >+ReadTime ( >+ PING_PRIVATE_DATA *Private >+ ) >+{ >+ return Private->RttTimerTick; > } > > /** > Calculate a duration in ms. > >- @param[in] Begin The start point of time. >- @param[in] End The end point of time. >+ @param[in] Private The pointer to PING_PRIVATE_DATA. >+ @param[in] Begin The start point of time. >+ @param[in] End The end point of time. > > @return The duration in ms. > @retval 0 The parameters were not valid. > **/ >-UINT64 >+UINT32 > CalculateTick ( >- IN UINT64 Begin, >- IN UINT64 End >+ PING_PRIVATE_DATA *Private, >+ IN UINT32 Begin, >+ IN UINT32 End > ) > { >- if (End <=3D Begin) { >+ if (End < Begin) { > return (0); > } >- return DivU64x64Remainder (End - Begin, mFrequency, NULL); >+ >+ return (End - Begin) * Private->TimerPeriod; > } > > /** >@@ -448,8 +546,7 @@ Ping6OnEchoReplyReceived ( > PING_PRIVATE_DATA *Private; > ICMPX_ECHO_REQUEST_REPLY *Reply; > UINT32 PayLoad; >- UINT64 Rtt; >- CHAR8 Near; >+ UINT32 Rtt; > > Private =3D (PING_PRIVATE_DATA *) Context; > >@@ -502,12 +599,7 @@ Ping6OnEchoReplyReceived ( > // > // Display statistics on this icmp6 echo reply packet. > // >- Rtt =3D CalculateTick (Reply->TimeStamp, ReadTime ()); >- if (Rtt !=3D 0) { >- Near =3D (CHAR8) '=3D'; >- } else { >- Near =3D (CHAR8) '<'; >- } >+ Rtt =3D CalculateTick (Private, Reply->TimeStamp, ReadTime (Private)); > > Private->RttSum +=3D Rtt; > Private->RttMin =3D Private->RttMin > Rtt ? Rtt : Private->RttMin; >@@ -523,8 +615,8 @@ Ping6OnEchoReplyReceived ( > mDstString, > Reply->SequenceNum, > Private->IpChoice =3D=3D >PING_IP_CHOICE_IP6?((EFI_IP6_RECEIVE_DATA*)Private->RxToken.Packet.RxData)= ->Header->HopLimit:0, >- Near, >- Rtt >+ Rtt, >+ Rtt + Private->TimerPeriod > ); > > ON_EXIT: >@@ -565,7 +657,7 @@ ON_EXIT: > PING_IPX_COMPLETION_TOKEN * > PingGenerateToken ( > IN PING_PRIVATE_DATA *Private, >- IN UINT64 TimeStamp, >+ IN UINT32 TimeStamp, > IN UINT16 SequenceNum > ) > { >@@ -678,7 +770,7 @@ PingSendEchoRequest ( > return EFI_OUT_OF_RESOURCES; > } > >- TxInfo->TimeStamp =3D ReadTime (); >+ TxInfo->TimeStamp =3D ReadTime (Private); > TxInfo->SequenceNum =3D (UINT16) (Private->TxCount + 1); > TxInfo->Token =3D PingGenerateToken ( > Private, >@@ -784,7 +876,7 @@ Ping6OnTimerRoutine ( > // > NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->TxList) { > TxInfo =3D BASE_CR (Entry, PING_ICMPX_TX_INFO, Link); >- Time =3D CalculateTick (TxInfo->TimeStamp, ReadTime ()); >+ Time =3D CalculateTick (Private, TxInfo->TimeStamp, ReadTime (Priva= te)); > > // > // Remove the timeout echo request from txlist. >@@ -1239,6 +1331,7 @@ Ping6DestroyIp6Instance ( > } > } > >+ > /** > The Ping Process. > >@@ -1323,6 +1416,16 @@ ShellPing ( > ShellStatus =3D SHELL_ACCESS_DENIED; > goto ON_EXIT; > } >+ >+ // >+ // Start a timer to calculate the RTT. >+ // >+ Status =3D PingInitRttTimer (Private); >+ if (EFI_ERROR (Status)) { >+ ShellStatus =3D SHELL_ACCESS_DENIED; >+ goto ON_EXIT; >+ } >+ > // > // Create a ipv6 token to send the first icmp6 echo request packet. > // >@@ -1397,8 +1500,11 @@ ON_STAT: > STRING_TOKEN (STR_PING_RTT), > gShellNetwork1HiiHandle, > Private->RttMin, >+ Private->RttMin + Private->TimerPeriod, > Private->RttMax, >- DivU64x64Remainder (Private->RttSum, (Private->RxCount - Private->F= ailedCount), NULL) >+ Private->RttMax + Private->TimerPeriod, >+ DivU64x64Remainder (Private->RttSum, (Private->RxCount - Private->F= ailedCount), NULL), >+ DivU64x64Remainder (Private->RttSum, (Private->RxCount - Private->F= ailedCount), NULL) + Private->TimerPeriod > ); > } > >@@ -1417,6 +1523,8 @@ ON_EXIT: > PingDestroyTxInfo (TxInfo, Private->IpChoice); > } > >+ PingFreeRttTimer (Private); >+ > if (Private->Timer !=3D NULL) { > gBS->CloseEvent (Private->Timer); > } >@@ -1580,14 +1688,7 @@ ShellCommandRunPing ( > goto ON_EXIT; > } > } >- // >- // Get frequency to calculate the time from ticks. >- // >- Status =3D GetFrequency (); > >- if (EFI_ERROR(Status)) { >- goto ON_EXIT; >- } > // > // Enter into ping process. > // >diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwor= k1CommandsLib.inf >b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsL= ib.inf >index 92d47d1..25b2e14 100644 >--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1Comma= ndsLib.inf >+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1Comma= ndsLib.inf >@@ -1,7 +1,7 @@ > ## @file > # Provides shell network1 functions > # >-# Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.
>+# Copyright (c) 2010 - 2016, 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 >@@ -55,6 +55,7 @@ > > [Protocols] > gEfiCpuArchProtocolGuid ## CONSUMES >+ gEfiTimerArchProtocolGuid > gEfiIp6ProtocolGuid ## SOMETIMES_CONSUMES > gEfiIp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES > gEfiIp6ConfigProtocolGuid ## SOMETIMES_CONSUMES >diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwor= k1CommandsLib.uni >b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsL= ib.uni >index c8ab64f..76b6188 100644 >--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1Comma= ndsLib.uni >+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1Comma= ndsLib.uni >@@ -56,9 +56,9 @@ > #string STR_PING_NOROUTE_FOUND #language en-US "There is no route t= o the destination '%B%s%N' from the >source '%B%s%N' was found.\r\n" > #string STR_PING_START #language en-US "Ping %s %d data byt= es.\r\n" > #string STR_PING_TIMEOUT #language en-US "Echo request sequen= ce %d timeout.\r\n" >-#string STR_PING_REPLY_INFO #language en-US "%d bytes from %s : = icmp_seq=3D%d ttl=3D%d time%c%dms\r\n" >+#string STR_PING_REPLY_INFO #language en-US "%d bytes from %s : = icmp_seq=3D%d ttl=3D%d time%d~%dms\r\n" > #string STR_PING_STAT #language en-US "\n%d packets transm= itted, %d received, %d%% packet loss, >time %dms\r\n" >-#string STR_PING_RTT #language en-US "\nRtt(round trip ti= me) min=3D%dms max=3D%dms avg=3D%dms\r\n" >+#string STR_PING_RTT #language en-US "\nRtt(round trip ti= me) min=3D%d~%dms max=3D%d~%dms >avg=3D%d~%dms\r\n" > > #string STR_IFCONFIG_UNSUPPORTED_OPTION #language en-US "The opt= ion '%H%s%N' is unsupported >now.\n" > #string STR_IFCONFIG_LACK_OPTION #language en-US "Flags l= ack.\n" >-- >2.7.4.windows.1 > >_______________________________________________ >edk2-devel mailing list >edk2-devel@lists.01.org >https://lists.01.org/mailman/listinfo/edk2-devel