]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellNetwork2CommandsLib/Ping6.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellNetwork2CommandsLib / Ping6.c
index 2961fd7e2c5bec8fdf3bda81d54cf3dd8e0798a2..e0b58d4b8513724d2e15b2e4fd429b223b9651f6 100644 (file)
@@ -1,36 +1,30 @@
 /** @file\r
   The implementation for Ping6 application.\r
 \r
-  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2016 - 2018, 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
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "UefiShellNetwork2CommandsLib.h"\r
 \r
-#define PING6_DEFAULT_TIMEOUT      5000\r
-#define PING6_MAX_SEND_NUMBER      10000\r
-#define PING6_MAX_BUFFER_SIZE      32768\r
-#define PING6_ONE_SECOND           10000000\r
-#define STALL_1_MILLI_SECOND  1000\r
+#define PING6_DEFAULT_TIMEOUT  5000\r
+#define PING6_MAX_SEND_NUMBER  10000\r
+#define PING6_MAX_BUFFER_SIZE  32768\r
+#define PING6_ONE_SECOND       10000000\r
+#define STALL_1_MILLI_SECOND   1000\r
 \r
 #pragma pack(1)\r
 \r
 typedef struct _ICMP6_ECHO_REQUEST_REPLY {\r
-  UINT8                       Type;\r
-  UINT8                       Code;\r
-  UINT16                      Checksum;\r
-  UINT16                      Identifier;\r
-  UINT16                      SequenceNum;\r
-  UINT32                      TimeStamp;\r
-  UINT8                       Data[1];\r
+  UINT8     Type;\r
+  UINT8     Code;\r
+  UINT16    Checksum;\r
+  UINT16    Identifier;\r
+  UINT16    SequenceNum;\r
+  UINT32    TimeStamp;\r
+  UINT8     Data[1];\r
 } ICMP6_ECHO_REQUEST_REPLY;\r
 \r
 #pragma pack()\r
@@ -50,7 +44,7 @@ typedef struct _PING6_PRIVATE_DATA {
   EFI_EVENT                   Timer;\r
 \r
   UINT32                      TimerPeriod;\r
-  UINT32                      RttTimerTick;   \r
+  UINT32                      RttTimerTick;\r
   EFI_EVENT                   RttTimer;\r
 \r
   EFI_STATUS                  Status;\r
@@ -69,8 +63,7 @@ typedef struct _PING6_PRIVATE_DATA {
   UINT32                      BufferSize;\r
 } PING6_PRIVATE_DATA;\r
 \r
-\r
-SHELL_PARAM_ITEM    Ping6ParamList[] = {\r
+SHELL_PARAM_ITEM  Ping6ParamList[] = {\r
   {\r
     L"-l",\r
     TypeValue\r
@@ -96,9 +89,9 @@ SHELL_PARAM_ITEM    Ping6ParamList[] = {
 //\r
 // Global Variables in Ping6 application.\r
 //\r
-CONST CHAR16            *mIp6DstString;\r
-CONST CHAR16            *mIp6SrcString;\r
-EFI_CPU_ARCH_PROTOCOL   *Cpu = NULL;\r
+CONST CHAR16           *mIp6DstString;\r
+CONST CHAR16           *mIp6SrcString;\r
+EFI_CPU_ARCH_PROTOCOL  *Cpu = NULL;\r
 \r
 /**\r
   RTT timer tick routine.\r
@@ -110,13 +103,13 @@ EFI_CPU_ARCH_PROTOCOL   *Cpu = NULL;
 VOID\r
 EFIAPI\r
 Ping6RttTimerTickRoutine (\r
-  IN EFI_EVENT    Event,\r
-  IN VOID         *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
-  UINT32     *RttTimerTick;\r
+  UINT32  *RttTimerTick;\r
 \r
-  RttTimerTick = (UINT32*) Context;\r
+  RttTimerTick = (UINT32 *)Context;\r
   (*RttTimerTick)++;\r
 }\r
 \r
@@ -130,18 +123,18 @@ Ping6RttTimerTickRoutine (
 \r
 **/\r
 UINT32\r
-Ping6GetTimerPeriod(\r
+Ping6GetTimerPeriod (\r
   VOID\r
   )\r
 {\r
-  EFI_STATUS                 Status;\r
-  UINT32                     RttTimerTick;\r
-  EFI_EVENT                  TimerEvent;\r
-  UINT32                     StallCounter;\r
-  EFI_TPL                    OldTpl;\r
+  EFI_STATUS  Status;\r
+  UINT32      RttTimerTick;\r
+  EFI_EVENT   TimerEvent;\r
+  UINT32      StallCounter;\r
+  EFI_TPL     OldTpl;\r
 \r
   RttTimerTick = 0;\r
-  StallCounter   = 0;\r
+  StallCounter = 0;\r
 \r
   Status = gBS->CreateEvent (\r
                   EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
@@ -178,7 +171,6 @@ Ping6GetTimerPeriod(
   return StallCounter / RttTimerTick;\r
 }\r
 \r
-\r
 /**\r
   Initialize the timer event for RTT (round trip time).\r
 \r
@@ -190,24 +182,24 @@ Ping6GetTimerPeriod(
 **/\r
 EFI_STATUS\r
 Ping6InitRttTimer (\r
-  IN  PING6_PRIVATE_DATA      *Private\r
+  IN  PING6_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_STATUS                 Status;\r
+  EFI_STATUS  Status;\r
 \r
   Private->TimerPeriod = Ping6GetTimerPeriod ();\r
   if (Private->TimerPeriod == 0) {\r
     return EFI_ABORTED;\r
   }\r
-  \r
+\r
   Private->RttTimerTick = 0;\r
-  Status = gBS->CreateEvent (\r
-                  EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
-                  TPL_NOTIFY,\r
-                  Ping6RttTimerTickRoutine,\r
-                  &Private->RttTimerTick,\r
-                  &Private->RttTimer\r
-                  );\r
+  Status                = gBS->CreateEvent (\r
+                                 EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
+                                 TPL_NOTIFY,\r
+                                 Ping6RttTimerTickRoutine,\r
+                                 &Private->RttTimerTick,\r
+                                 &Private->RttTimer\r
+                                 );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -223,7 +215,6 @@ Ping6InitRttTimer (
   }\r
 \r
   return EFI_SUCCESS;\r
-\r
 }\r
 \r
 /**\r
@@ -234,7 +225,7 @@ Ping6InitRttTimer (
 **/\r
 VOID\r
 Ping6FreeRttTimer (\r
-  IN  PING6_PRIVATE_DATA      *Private\r
+  IN  PING6_PRIVATE_DATA  *Private\r
   )\r
 {\r
   if (Private->RttTimer != NULL) {\r
@@ -245,14 +236,14 @@ Ping6FreeRttTimer (
 \r
 /**\r
   Read the current time.\r
-  \r
+\r
   @param[in]    Private    The pointer to PING6_PRIVATE_DATA.\r
 \r
   @retval the current tick value.\r
 **/\r
 UINT32\r
 Ping6ReadTime (\r
-  IN  PING6_PRIVATE_DATA      *Private\r
+  IN  PING6_PRIVATE_DATA  *Private\r
   )\r
 {\r
   return Private->RttTimerTick;\r
@@ -270,9 +261,9 @@ Ping6ReadTime (
 **/\r
 UINT32\r
 Ping6CalculateTick (\r
-  IN PING6_PRIVATE_DATA      *Private,\r
-  IN UINT32    Begin,\r
-  IN UINT32    End\r
+  IN PING6_PRIVATE_DATA  *Private,\r
+  IN UINT32              Begin,\r
+  IN UINT32              End\r
   )\r
 {\r
   if (End < Begin) {\r
@@ -280,7 +271,6 @@ Ping6CalculateTick (
   }\r
 \r
   return (End - Begin) * Private->TimerPeriod;\r
-\r
 }\r
 \r
 /**\r
@@ -291,24 +281,22 @@ Ping6CalculateTick (
 **/\r
 VOID\r
 Ping6DestroyTxInfo (\r
-  IN PING6_ICMP6_TX_INFO    *TxInfo\r
+  IN PING6_ICMP6_TX_INFO  *TxInfo\r
   )\r
 {\r
-  EFI_IP6_TRANSMIT_DATA    *TxData;\r
-  EFI_IP6_FRAGMENT_DATA    *FragData;\r
-  UINTN                    Index;\r
+  EFI_IP6_TRANSMIT_DATA  *TxData;\r
+  EFI_IP6_FRAGMENT_DATA  *FragData;\r
+  UINTN                  Index;\r
 \r
   ASSERT (TxInfo != NULL);\r
 \r
   if (TxInfo->Token != NULL) {\r
-\r
     if (TxInfo->Token->Event != NULL) {\r
       gBS->CloseEvent (TxInfo->Token->Event);\r
     }\r
 \r
     TxData = TxInfo->Token->Packet.TxData;\r
     if (TxData != NULL) {\r
-\r
       if (TxData->OverrideData != NULL) {\r
         FreePool (TxData->OverrideData);\r
       }\r
@@ -343,13 +331,13 @@ Ping6DestroyTxInfo (
 **/\r
 EFI_STATUS\r
 Ping6OnMatchEchoReply (\r
-  IN PING6_PRIVATE_DATA          *Private,\r
-  IN ICMP6_ECHO_REQUEST_REPLY    *Packet\r
+  IN PING6_PRIVATE_DATA        *Private,\r
+  IN ICMP6_ECHO_REQUEST_REPLY  *Packet\r
   )\r
 {\r
-  PING6_ICMP6_TX_INFO    *TxInfo;\r
-  LIST_ENTRY             *Entry;\r
-  LIST_ENTRY             *NextEntry;\r
+  PING6_ICMP6_TX_INFO  *TxInfo;\r
+  LIST_ENTRY           *Entry;\r
+  LIST_ENTRY           *NextEntry;\r
 \r
   NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->TxList) {\r
     TxInfo = BASE_CR (Entry, PING6_ICMP6_TX_INFO, Link);\r
@@ -378,8 +366,8 @@ Ping6OnMatchEchoReply (
 VOID\r
 EFIAPI\r
 Ping6OnEchoRequestSent6 (\r
-  IN EFI_EVENT    Event,\r
-  IN VOID         *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
 }\r
@@ -394,19 +382,19 @@ Ping6OnEchoRequestSent6 (
 VOID\r
 EFIAPI\r
 Ping6OnEchoReplyReceived6 (\r
-  IN EFI_EVENT    Event,\r
-  IN VOID         *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  PING6_PRIVATE_DATA          *Private;\r
-  EFI_IP6_COMPLETION_TOKEN    *RxToken;\r
-  EFI_IP6_RECEIVE_DATA        *RxData;\r
-  ICMP6_ECHO_REQUEST_REPLY    *Reply;\r
-  UINT32                      PayLoad;\r
-  UINT32                      Rtt;\r
+  EFI_STATUS                Status;\r
+  PING6_PRIVATE_DATA        *Private;\r
+  EFI_IP6_COMPLETION_TOKEN  *RxToken;\r
+  EFI_IP6_RECEIVE_DATA      *RxData;\r
+  ICMP6_ECHO_REQUEST_REPLY  *Reply;\r
+  UINT32                    PayLoad;\r
+  UINT32                    Rtt;\r
 \r
-  Private = (PING6_PRIVATE_DATA *) Context;\r
+  Private = (PING6_PRIVATE_DATA *)Context;\r
 \r
   if (Private->Status == EFI_ABORTED) {\r
     return;\r
@@ -422,7 +410,8 @@ Ping6OnEchoReplyReceived6 (
   }\r
 \r
   if (!IP6_IS_MULTICAST (&Private->DstAddress) &&\r
-      !EFI_IP6_EQUAL (&RxData->Header->SourceAddress, &Private->DstAddress)) {\r
+      !EFI_IP6_EQUAL (&RxData->Header->SourceAddress, &Private->DstAddress))\r
+  {\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -433,17 +422,19 @@ Ping6OnEchoReplyReceived6 (
   if (PayLoad != Private->BufferSize) {\r
     goto ON_EXIT;\r
   }\r
+\r
   //\r
   // Check whether the reply matches the sent request before.\r
   //\r
   Status = Ping6OnMatchEchoReply (Private, Reply);\r
-  if (EFI_ERROR(Status)) {\r
+  if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
   }\r
+\r
   //\r
   // Display statistics on this icmp6 echo reply packet.\r
   //\r
-  Rtt  = Ping6CalculateTick (Private, Reply->TimeStamp, Ping6ReadTime (Private));\r
+  Rtt = Ping6CalculateTick (Private, Reply->TimeStamp, Ping6ReadTime (Private));\r
 \r
   Private->RttSum += Rtt;\r
   Private->RttMin  = Private->RttMin > Rtt ? Rtt : Private->RttMin;\r
@@ -474,6 +465,7 @@ ON_EXIT:
     Status = Private->Ip6->Receive (Private->Ip6, RxToken);\r
 \r
     if (EFI_ERROR (Status)) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_IP6_RECEIVE), gShellNetwork2HiiHandle, Status);\r
       Private->Status = EFI_ABORTED;\r
     }\r
   } else {\r
@@ -482,6 +474,7 @@ ON_EXIT:
     //\r
     Private->Status = EFI_SUCCESS;\r
   }\r
+\r
   //\r
   // Singal to recycle the each rxdata here, not at the end of process.\r
   //\r
@@ -500,21 +493,22 @@ ON_EXIT:
 **/\r
 EFI_IP6_COMPLETION_TOKEN *\r
 Ping6GenerateToken (\r
-  IN PING6_PRIVATE_DATA    *Private,\r
-  IN UINT32                TimeStamp,\r
-  IN UINT16                SequenceNum\r
+  IN PING6_PRIVATE_DATA  *Private,\r
+  IN UINT32              TimeStamp,\r
+  IN UINT16              SequenceNum\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  EFI_IP6_COMPLETION_TOKEN    *Token;\r
-  EFI_IP6_TRANSMIT_DATA       *TxData;\r
-  ICMP6_ECHO_REQUEST_REPLY    *Request;\r
+  EFI_STATUS                Status;\r
+  EFI_IP6_COMPLETION_TOKEN  *Token;\r
+  EFI_IP6_TRANSMIT_DATA     *TxData;\r
+  ICMP6_ECHO_REQUEST_REPLY  *Request;\r
 \r
   Request = AllocateZeroPool (Private->BufferSize);\r
 \r
   if (Request == NULL) {\r
     return NULL;\r
   }\r
+\r
   //\r
   // Assembly icmp6 echo request packet.\r
   //\r
@@ -527,7 +521,7 @@ Ping6GenerateToken (
   // Leave check sum to ip6 layer, since it has no idea of source address\r
   // selection.\r
   //\r
-  Request->Checksum    = 0;\r
+  Request->Checksum = 0;\r
 \r
   TxData = AllocateZeroPool (sizeof (EFI_IP6_TRANSMIT_DATA));\r
 \r
@@ -535,15 +529,16 @@ Ping6GenerateToken (
     FreePool (Request);\r
     return NULL;\r
   }\r
+\r
   //\r
   // Assembly ipv6 token for transmit.\r
   //\r
-  TxData->OverrideData       = 0;\r
-  TxData->ExtHdrsLength      = 0;\r
-  TxData->ExtHdrs            = NULL;\r
-  TxData->DataLength         = Private->BufferSize;\r
-  TxData->FragmentCount      = 1;\r
-  TxData->FragmentTable[0].FragmentBuffer = (VOID *) Request;\r
+  TxData->OverrideData                    = 0;\r
+  TxData->ExtHdrsLength                   = 0;\r
+  TxData->ExtHdrs                         = NULL;\r
+  TxData->DataLength                      = Private->BufferSize;\r
+  TxData->FragmentCount                   = 1;\r
+  TxData->FragmentTable[0].FragmentBuffer = (VOID *)Request;\r
   TxData->FragmentTable[0].FragmentLength = Private->BufferSize;\r
 \r
   Token = AllocateZeroPool (sizeof (EFI_IP6_COMPLETION_TOKEN));\r
@@ -554,8 +549,8 @@ Ping6GenerateToken (
     return NULL;\r
   }\r
 \r
-  Token->Status         = EFI_ABORTED;\r
-  Token->Packet.TxData  = TxData;\r
+  Token->Status        = EFI_ABORTED;\r
+  Token->Packet.TxData = TxData;\r
 \r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL,\r
@@ -587,11 +582,11 @@ Ping6GenerateToken (
 **/\r
 EFI_STATUS\r
 Ping6SendEchoRequest (\r
-  IN PING6_PRIVATE_DATA    *Private\r
+  IN PING6_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_STATUS             Status;\r
-  PING6_ICMP6_TX_INFO    *TxInfo;\r
+  EFI_STATUS           Status;\r
+  PING6_ICMP6_TX_INFO  *TxInfo;\r
 \r
   TxInfo = AllocateZeroPool (sizeof (PING6_ICMP6_TX_INFO));\r
 \r
@@ -600,13 +595,13 @@ Ping6SendEchoRequest (
   }\r
 \r
   TxInfo->TimeStamp   = Ping6ReadTime (Private);\r
-  TxInfo->SequenceNum = (UINT16) (Private->TxCount + 1);\r
+  TxInfo->SequenceNum = (UINT16)(Private->TxCount + 1);\r
 \r
-  TxInfo->Token       = Ping6GenerateToken (\r
-                          Private,\r
-                          TxInfo->TimeStamp,\r
-                          TxInfo->SequenceNum\r
-                          );\r
+  TxInfo->Token = Ping6GenerateToken (\r
+                    Private,\r
+                    TxInfo->TimeStamp,\r
+                    TxInfo->SequenceNum\r
+                    );\r
 \r
   if (TxInfo->Token == NULL) {\r
     Ping6DestroyTxInfo (TxInfo);\r
@@ -637,10 +632,10 @@ Ping6SendEchoRequest (
 **/\r
 EFI_STATUS\r
 Ping6OnReceiveEchoReply (\r
-  IN PING6_PRIVATE_DATA    *Private\r
+  IN PING6_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_STATUS    Status;\r
+  EFI_STATUS  Status;\r
 \r
   ZeroMem (&Private->RxToken, sizeof (EFI_IP6_COMPLETION_TOKEN));\r
 \r
@@ -658,7 +653,12 @@ Ping6OnReceiveEchoReply (
 \r
   Private->RxToken.Status = EFI_NOT_READY;\r
 \r
-  return Private->Ip6->Receive (Private->Ip6, &Private->RxToken);\r
+  Status = Private->Ip6->Receive (Private->Ip6, &Private->RxToken);\r
+  if (EFI_ERROR (Status)) {\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_IP6_RECEIVE), gShellNetwork2HiiHandle, Status);\r
+  }\r
+\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -671,31 +671,31 @@ Ping6OnReceiveEchoReply (
 VOID\r
 EFIAPI\r
 Ping6OnTimerRoutine6 (\r
-  IN EFI_EVENT    Event,\r
-  IN VOID         *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
-  EFI_STATUS             Status;\r
-  PING6_PRIVATE_DATA     *Private;\r
-  PING6_ICMP6_TX_INFO    *TxInfo;\r
-  LIST_ENTRY             *Entry;\r
-  LIST_ENTRY             *NextEntry;\r
-  UINT64                 Time;\r
+  EFI_STATUS           Status;\r
+  PING6_PRIVATE_DATA   *Private;\r
+  PING6_ICMP6_TX_INFO  *TxInfo;\r
+  LIST_ENTRY           *Entry;\r
+  LIST_ENTRY           *NextEntry;\r
+  UINT64               Time;\r
 \r
-  Private = (PING6_PRIVATE_DATA *) Context;\r
+  Private = (PING6_PRIVATE_DATA *)Context;\r
 \r
   //\r
   // Retransmit icmp6 echo request packets per second in sendnumber times.\r
   //\r
   if (Private->TxCount < Private->SendNum) {\r
-\r
     Status = Ping6SendEchoRequest (Private);\r
-    if (Private->TxCount != 0){\r
+    if (Private->TxCount != 0) {\r
       if (EFI_ERROR (Status)) {\r
         ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_SEND_REQUEST), gShellNetwork2HiiHandle, Private->TxCount + 1);\r
       }\r
     }\r
   }\r
+\r
   //\r
   // Check whether any icmp6 echo request in the list timeout.\r
   //\r
@@ -707,10 +707,10 @@ Ping6OnTimerRoutine6 (
     // Remove the timeout echo request from txlist.\r
     //\r
     if (Time > PING6_DEFAULT_TIMEOUT) {\r
-\r
       if (EFI_ERROR (TxInfo->Token->Status)) {\r
         Private->Ip6->Cancel (Private->Ip6, TxInfo->Token);\r
       }\r
+\r
       //\r
       // Remove the timeout icmp6 echo request from list.\r
       //\r
@@ -742,29 +742,29 @@ Ping6OnTimerRoutine6 (
 **/\r
 EFI_STATUS\r
 Ping6CreateIpInstance (\r
-  IN  PING6_PRIVATE_DATA    *Private\r
+  IN  PING6_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  UINTN                            HandleIndex;\r
-  UINTN                            HandleNum;\r
-  EFI_HANDLE                       *HandleBuffer;\r
-  BOOLEAN                          UnspecifiedSrc;\r
-  BOOLEAN                          MediaPresent;\r
-  EFI_SERVICE_BINDING_PROTOCOL     *Ip6Sb;\r
-  EFI_IP6_CONFIG_PROTOCOL          *Ip6Cfg;\r
-  EFI_IP6_CONFIG_DATA              Ip6Config;\r
-  EFI_IP6_CONFIG_INTERFACE_INFO    *IfInfo;\r
-  UINTN                            IfInfoSize;\r
-  EFI_IPv6_ADDRESS                 *Addr;\r
-  UINTN                            AddrIndex;\r
-\r
-  HandleBuffer      = NULL;\r
-  UnspecifiedSrc    = FALSE;\r
-  MediaPresent      = TRUE;\r
-  Ip6Sb             = NULL;\r
-  IfInfo            = NULL;\r
-  IfInfoSize        = 0;\r
+  EFI_STATUS                     Status;\r
+  UINTN                          HandleIndex;\r
+  UINTN                          HandleNum;\r
+  EFI_HANDLE                     *HandleBuffer;\r
+  BOOLEAN                        UnspecifiedSrc;\r
+  EFI_STATUS                     MediaStatus;\r
+  EFI_SERVICE_BINDING_PROTOCOL   *Ip6Sb;\r
+  EFI_IP6_CONFIG_PROTOCOL        *Ip6Cfg;\r
+  EFI_IP6_CONFIG_DATA            Ip6Config;\r
+  EFI_IP6_CONFIG_INTERFACE_INFO  *IfInfo;\r
+  UINTN                          IfInfoSize;\r
+  EFI_IPv6_ADDRESS               *Addr;\r
+  UINTN                          AddrIndex;\r
+\r
+  HandleBuffer   = NULL;\r
+  UnspecifiedSrc = FALSE;\r
+  MediaStatus    = EFI_SUCCESS;\r
+  Ip6Sb          = NULL;\r
+  IfInfo         = NULL;\r
+  IfInfoSize     = 0;\r
 \r
   //\r
   // Locate all the handles with ip6 service binding protocol.\r
@@ -782,11 +782,11 @@ Ping6CreateIpInstance (
 \r
   if (NetIp6IsUnspecifiedAddr (&Private->SrcAddress)) {\r
     //\r
-    // SrcAddress is unspecified. So, both connected and configured interface will be automatic selected. \r
+    // SrcAddress is unspecified. So, both connected and configured interface will be automatic selected.\r
     //\r
     UnspecifiedSrc = TRUE;\r
   }\r
-  \r
+\r
   //\r
   // Source address is required when pinging a link-local address.\r
   //\r
@@ -795,12 +795,11 @@ Ping6CreateIpInstance (
     Status = EFI_INVALID_PARAMETER;\r
     goto ON_ERROR;\r
   }\r
-  \r
+\r
   //\r
   // For each ip6 protocol, check interface addresses list.\r
   //\r
   for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {\r
-\r
     Ip6Sb      = NULL;\r
     IfInfo     = NULL;\r
     IfInfoSize = 0;\r
@@ -809,8 +808,8 @@ Ping6CreateIpInstance (
       //\r
       // Check media.\r
       //\r
-      NetLibDetectMedia (HandleBuffer[HandleIndex], &MediaPresent);\r
-      if (!MediaPresent) {\r
+      NetLibDetectMediaWaitTimeout (HandleBuffer[HandleIndex], 0, &MediaStatus);\r
+      if (MediaStatus != EFI_SUCCESS) {\r
         //\r
         // Skip this one.\r
         //\r
@@ -821,7 +820,7 @@ Ping6CreateIpInstance (
     Status = gBS->HandleProtocol (\r
                     HandleBuffer[HandleIndex],\r
                     &gEfiIp6ServiceBindingProtocolGuid,\r
-                    (VOID **) &Ip6Sb\r
+                    (VOID **)&Ip6Sb\r
                     );\r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
@@ -834,12 +833,13 @@ Ping6CreateIpInstance (
     Status = gBS->HandleProtocol (\r
                     HandleBuffer[HandleIndex],\r
                     &gEfiIp6ConfigProtocolGuid,\r
-                    (VOID **) &Ip6Cfg\r
+                    (VOID **)&Ip6Cfg\r
                     );\r
 \r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
+\r
     //\r
     // Get the interface information size.\r
     //\r
@@ -861,6 +861,7 @@ Ping6CreateIpInstance (
       Status = EFI_OUT_OF_RESOURCES;\r
       goto ON_ERROR;\r
     }\r
+\r
     //\r
     // Get the interface info.\r
     //\r
@@ -875,6 +876,7 @@ Ping6CreateIpInstance (
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
       goto ON_ERROR;\r
     }\r
+\r
     //\r
     // Check whether the source address is one of the interface addresses.\r
     //\r
@@ -886,7 +888,7 @@ Ping6CreateIpInstance (
           //\r
           // Select the interface automatically.\r
           //\r
-          CopyMem(&Private->SrcAddress, Addr, sizeof(Private->SrcAddress));\r
+          CopyMem (&Private->SrcAddress, Addr, sizeof (Private->SrcAddress));\r
           break;\r
         }\r
       } else if (EFI_IP6_EQUAL (&Private->SrcAddress, Addr)) {\r
@@ -894,7 +896,7 @@ Ping6CreateIpInstance (
         // Match a certain interface address.\r
         //\r
         break;\r
-      } \r
+      }\r
     }\r
 \r
     if (AddrIndex < IfInfo->AddressInfoCount) {\r
@@ -907,6 +909,7 @@ Ping6CreateIpInstance (
     FreePool (IfInfo);\r
     IfInfo = NULL;\r
   }\r
+\r
   //\r
   // No exact interface address matched.\r
   //\r
@@ -929,7 +932,7 @@ Ping6CreateIpInstance (
   Status = gBS->OpenProtocol (\r
                   Private->Ip6ChildHandle,\r
                   &gEfiIp6ProtocolGuid,\r
-                  (VOID **) &Private->Ip6,\r
+                  (VOID **)&Private->Ip6,\r
                   Private->ImageHandle,\r
                   Private->Ip6ChildHandle,\r
                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -990,11 +993,11 @@ ON_ERROR:
 **/\r
 VOID\r
 Ping6DestroyIpInstance (\r
-  IN PING6_PRIVATE_DATA    *Private\r
+  IN PING6_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  EFI_SERVICE_BINDING_PROTOCOL    *Ip6Sb;\r
+  EFI_STATUS                    Status;\r
+  EFI_SERVICE_BINDING_PROTOCOL  *Ip6Sb;\r
 \r
   gBS->CloseProtocol (\r
          Private->Ip6ChildHandle,\r
@@ -1006,10 +1009,10 @@ Ping6DestroyIpInstance (
   Status = gBS->HandleProtocol (\r
                   Private->NicHandle,\r
                   &gEfiIp6ServiceBindingProtocolGuid,\r
-                  (VOID **) &Ip6Sb\r
+                  (VOID **)&Ip6Sb\r
                   );\r
 \r
-  if (!EFI_ERROR(Status)) {\r
+  if (!EFI_ERROR (Status)) {\r
     Ip6Sb->DestroyChild (Ip6Sb, Private->Ip6ChildHandle);\r
   }\r
 }\r
@@ -1029,23 +1032,23 @@ Ping6DestroyIpInstance (
 **/\r
 SHELL_STATUS\r
 ShellPing6 (\r
-  IN EFI_HANDLE          ImageHandle,\r
-  IN UINT32              SendNumber,\r
-  IN UINT32              BufferSize,\r
-  IN EFI_IPv6_ADDRESS    *SrcAddress,\r
-  IN EFI_IPv6_ADDRESS    *DstAddress\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN UINT32            SendNumber,\r
+  IN UINT32            BufferSize,\r
+  IN EFI_IPv6_ADDRESS  *SrcAddress,\r
+  IN EFI_IPv6_ADDRESS  *DstAddress\r
   )\r
 {\r
-  EFI_STATUS             Status;\r
-  EFI_INPUT_KEY          Key;\r
-  PING6_PRIVATE_DATA     *Private;\r
-  PING6_ICMP6_TX_INFO    *TxInfo;\r
-  LIST_ENTRY             *Entry;\r
-  LIST_ENTRY             *NextEntry;\r
-  SHELL_STATUS           ShellStatus;\r
+  EFI_STATUS           Status;\r
+  EFI_INPUT_KEY        Key;\r
+  PING6_PRIVATE_DATA   *Private;\r
+  PING6_ICMP6_TX_INFO  *TxInfo;\r
+  LIST_ENTRY           *Entry;\r
+  LIST_ENTRY           *NextEntry;\r
+  SHELL_STATUS         ShellStatus;\r
 \r
   ShellStatus = SHELL_SUCCESS;\r
-  Private = AllocateZeroPool (sizeof (PING6_PRIVATE_DATA));\r
+  Private     = AllocateZeroPool (sizeof (PING6_PRIVATE_DATA));\r
 \r
   if (Private == NULL) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"Ping6");\r
@@ -1056,7 +1059,7 @@ ShellPing6 (
   Private->ImageHandle = ImageHandle;\r
   Private->SendNum     = SendNumber;\r
   Private->BufferSize  = BufferSize;\r
-  Private->RttMin      = ~((UINT64 )(0x0));\r
+  Private->RttMin      = ~((UINT64)(0x0));\r
   Private->Status      = EFI_NOT_READY;\r
 \r
   InitializeListHead (&Private->TxList);\r
@@ -1073,6 +1076,7 @@ ShellPing6 (
     ShellStatus = SHELL_ACCESS_DENIED;\r
     goto ON_EXIT;\r
   }\r
+\r
   //\r
   // Print the command line itself.\r
   //\r
@@ -1086,6 +1090,7 @@ ShellPing6 (
     ShellStatus = SHELL_ACCESS_DENIED;\r
     goto ON_EXIT;\r
   }\r
+\r
   //\r
   // Create and start timer to send icmp6 echo request packet per second.\r
   //\r
@@ -1120,7 +1125,7 @@ ShellPing6 (
   //\r
   if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {\r
     ShellStatus = SHELL_ACCESS_DENIED;\r
-    if(Status == EFI_NOT_FOUND) {\r
+    if (Status == EFI_NOT_FOUND) {\r
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_NOSOURCE_INDOMAIN), gShellNetwork2HiiHandle, mIp6DstString);\r
     }\r
 \r
@@ -1137,6 +1142,7 @@ ShellPing6 (
     ShellStatus = SHELL_ACCESS_DENIED;\r
     goto ON_EXIT;\r
   }\r
+\r
   //\r
   // Control the ping6 process by two factors:\r
   // 1. Hot key\r
@@ -1153,9 +1159,10 @@ ShellPing6 (
     //\r
     Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
 \r
-    if (!EFI_ERROR(Status)) {\r
+    if (!EFI_ERROR (Status)) {\r
       if ((Key.UnicodeChar == 0x1b) || (Key.UnicodeChar == 0x03) ||\r
-         ((Key.UnicodeChar == 0) && (Key.ScanCode == SCAN_ESC))) {\r
+          ((Key.UnicodeChar == 0) && (Key.ScanCode == SCAN_ESC)))\r
+      {\r
         goto ON_STAT;\r
       }\r
     }\r
@@ -1252,23 +1259,23 @@ ShellCommandRunPing6 (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS          Status;\r
-  SHELL_STATUS        ShellStatus;\r
-  EFI_IPv6_ADDRESS    DstAddress;\r
-  EFI_IPv6_ADDRESS    SrcAddress;\r
-  UINT64              BufferSize;\r
-  UINTN               SendNumber;\r
-  LIST_ENTRY          *ParamPackage;\r
-  CONST CHAR16        *ValueStr;\r
-  CONST CHAR16        *ValueStrPtr;\r
-  UINTN               NonOptionCount;\r
-  CHAR16              *ProblemParam;\r
+  EFI_STATUS        Status;\r
+  SHELL_STATUS      ShellStatus;\r
+  EFI_IPv6_ADDRESS  DstAddress;\r
+  EFI_IPv6_ADDRESS  SrcAddress;\r
+  UINT64            BufferSize;\r
+  UINTN             SendNumber;\r
+  LIST_ENTRY        *ParamPackage;\r
+  CONST CHAR16      *ValueStr;\r
+  CONST CHAR16      *ValueStrPtr;\r
+  UINTN             NonOptionCount;\r
+  CHAR16            *ProblemParam;\r
 \r
   ProblemParam = NULL;\r
-  ShellStatus = SHELL_SUCCESS;\r
+  ShellStatus  = SHELL_SUCCESS;\r
 \r
   Status = ShellCommandLineParseEx (Ping6ParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);\r
-  if (EFI_ERROR(Status)) {\r
+  if (EFI_ERROR (Status)) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_INPUT), gShellNetwork2HiiHandle);\r
     ShellStatus = SHELL_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
@@ -1280,7 +1287,7 @@ ShellCommandRunPing6 (
   //\r
   // Parse the parameter of count number.\r
   //\r
-  ValueStr = ShellCommandLineGetValue (ParamPackage, L"-n");\r
+  ValueStr    = ShellCommandLineGetValue (ParamPackage, L"-n");\r
   ValueStrPtr = ValueStr;\r
   if (ValueStr != NULL) {\r
     SendNumber = ShellStrToUintn (ValueStrPtr);\r
@@ -1294,10 +1301,11 @@ ShellCommandRunPing6 (
       goto ON_EXIT;\r
     }\r
   }\r
+\r
   //\r
   // Parse the parameter of buffer size.\r
   //\r
-  ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");\r
+  ValueStr    = ShellCommandLineGetValue (ParamPackage, L"-l");\r
   ValueStrPtr = ValueStr;\r
   if (ValueStr != NULL) {\r
     BufferSize = ShellStrToUintn (ValueStrPtr);\r
@@ -1318,31 +1326,33 @@ ShellCommandRunPing6 (
   //\r
   // Parse the parameter of source ip address.\r
   //\r
-  ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");\r
+  ValueStr    = ShellCommandLineGetValue (ParamPackage, L"-s");\r
   ValueStrPtr = ValueStr;\r
   if (ValueStr != NULL) {\r
     mIp6SrcString = ValueStr;\r
-    Status = NetLibStrToIp6 (ValueStrPtr, &SrcAddress);\r
+    Status        = NetLibStrToIp6 (ValueStrPtr, &SrcAddress);\r
     if (EFI_ERROR (Status)) {\r
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_IP), gShellNetwork2HiiHandle, ValueStr);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
       goto ON_EXIT;\r
     }\r
   }\r
+\r
   //\r
   // Parse the parameter of destination ip address.\r
   //\r
-  NonOptionCount = ShellCommandLineGetCount(ParamPackage);\r
-  ValueStr = ShellCommandLineGetRawValue (ParamPackage, (UINT32)(NonOptionCount-1));\r
+  NonOptionCount = ShellCommandLineGetCount (ParamPackage);\r
+  ValueStr       = ShellCommandLineGetRawValue (ParamPackage, (UINT32)(NonOptionCount-1));\r
   if (NonOptionCount != 2) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_INPUT), gShellNetwork2HiiHandle);\r
     ShellStatus = SHELL_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
   }\r
+\r
   ValueStrPtr = ValueStr;\r
   if (ValueStr != NULL) {\r
     mIp6DstString = ValueStr;\r
-    Status = NetLibStrToIp6 (ValueStrPtr, &DstAddress);\r
+    Status        = NetLibStrToIp6 (ValueStrPtr, &DstAddress);\r
     if (EFI_ERROR (Status)) {\r
       ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_IP), gShellNetwork2HiiHandle, ValueStr);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
@@ -1354,15 +1364,14 @@ ShellCommandRunPing6 (
   // Enter into ping6 process.\r
   //\r
   ShellStatus = ShellPing6 (\r
-              ImageHandle,\r
-              (UINT32)SendNumber,\r
-              (UINT32)BufferSize,\r
-              &SrcAddress,\r
-              &DstAddress\r
-              );\r
+                  ImageHandle,\r
+                  (UINT32)SendNumber,\r
+                  (UINT32)BufferSize,\r
+                  &SrcAddress,\r
+                  &DstAddress\r
+                  );\r
 \r
 ON_EXIT:\r
   ShellCommandLineFreeVarList (ParamPackage);\r
   return ShellStatus;\r
 }\r
-\r