From 80f7a8f5f9d21f8315d39be0f5651ce7160594fc Mon Sep 17 00:00:00 2001 From: "Subramanian, Sriram (EG Servers Platform SW)" Date: Thu, 7 Jul 2016 01:13:54 -0700 Subject: [PATCH] ShellPkg:Ping: Ping command hangs with intermittent packet losses When we have intermittent loss of packets, ping command doesnt return to Shell prompt. It keeps looping in the while (Status ==EFI_NOT_READY) since Private->RxCount will never reach Private->SendNum. Addresses the issue with the use of a new varibale in the PRIVATE structure. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hegde, Nagaraj P Reviewed-by: Sriram Subramanian Reviewed-by: Jaben Carsey --- .../Library/UefiShellNetwork1CommandsLib/Ping.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c index abd2f6b04e..e2dc76570a 100644 --- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c +++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c @@ -3,6 +3,7 @@ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.
Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
+ (C) Copyright 2016 Hewlett Packard Enterprise Development LP
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -134,6 +135,7 @@ typedef struct _PING_PRIVATE_DATA { UINT8 SrcAddress[MAX(sizeof(EFI_IPv6_ADDRESS) , sizeof(EFI_IPv4_ADDRESS) )]; UINT8 DstAddress[MAX(sizeof(EFI_IPv6_ADDRESS) , sizeof(EFI_IPv4_ADDRESS) )]; PING_IPX_COMPLETION_TOKEN RxToken; + UINT16 FailedCount; } PING_PRIVATE_DATA; /** @@ -809,6 +811,9 @@ Ping6OnTimerRoutine ( RemoveEntryList (&TxInfo->Link); PingDestroyTxInfo (TxInfo, Private->IpChoice); + Private->RxCount++; + Private->FailedCount++; + if (IsListEmpty (&Private->TxList) && (Private->TxCount == Private->SendNum)) { // // All the left icmp6 echo request in the list timeout. @@ -1392,13 +1397,13 @@ ON_STAT: STRING_TOKEN (STR_PING_STAT), gShellNetwork1HiiHandle, Private->TxCount, - Private->RxCount, - (100 * (Private->TxCount - Private->RxCount)) / Private->TxCount, + (Private->RxCount - Private->FailedCount), + (100 - ((100 * (Private->RxCount - Private->FailedCount)) / Private->TxCount)), Private->RttSum ); } - if (Private->RxCount != 0) { + if (Private->RxCount > Private->FailedCount) { ShellPrintHiiEx ( -1, -1, @@ -1407,7 +1412,7 @@ ON_STAT: gShellNetwork1HiiHandle, Private->RttMin, Private->RttMax, - DivU64x64Remainder (Private->RttSum, Private->RxCount, NULL) + DivU64x64Remainder (Private->RttSum, (Private->RxCount - Private->FailedCount), NULL) ); } -- 2.39.2