summaryrefslogtreecommitdiffstats
path: root/ShellPkg/Library
diff options
context:
space:
mode:
authorSubramanian, Sriram (EG Servers Platform SW) <sriram-s@hpe.com>2016-07-07 01:13:54 -0700
committerHao Wu <hao.a.wu@intel.com>2016-07-13 20:43:54 +0800
commit5b53982ba88cd31a72903930dac5ef6abc76beeb (patch)
tree872ee3538c8c04d90b1ca5addabda03be2345214 /ShellPkg/Library
parent6751d20006eb628faf96550e203e6a122c20e665 (diff)
downloadedk2-5b53982ba88cd31a72903930dac5ef6abc76beeb.tar.gz
edk2-5b53982ba88cd31a72903930dac5ef6abc76beeb.tar.bz2
edk2-5b53982ba88cd31a72903930dac5ef6abc76beeb.zip
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 <nagaraj-p.hegde@hpe.com> Reviewed-by: Sriram Subramanian <sriram-s@hpe.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com> (cherry picked from commit 80f7a8f5f9d21f8315d39be0f5651ce7160594fc)
Diffstat (limited to 'ShellPkg/Library')
-rw-r--r--ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c13
1 files 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.<BR>
Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
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)
);
}