]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c
Patch to remove STATIC modifier. This is on longer recommended by EFI Framework codin...
[mirror_edk2.git] / MdeModulePkg / Library / DxeIpIoLib / DxeIpIoLib.c
index 4b8a699aea9bb9bdb4c924a17b1eb2ba973375a3..d55ee8b0ce6caaa1cc3b278a93ccb38cbe588748 100644 (file)
@@ -29,13 +29,14 @@ Abstract:
 #include <Library/DebugLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
 \r
 \r
 #define NET_PROTO_HDR(Buf, Type)  ((Type *) ((Buf)->BlockOp[0].Head))\r
 #define ICMP_ERRLEN(IpHdr) \\r
   (sizeof(IP4_ICMP_HEAD) + EFI_IP4_HEADER_LEN(IpHdr) + 8)\r
 \r
-NET_LIST_ENTRY  mActiveIpIoList = {\r
+LIST_ENTRY  mActiveIpIoList = {\r
   &mActiveIpIoList,\r
   &mActiveIpIoList\r
 };\r
@@ -47,8 +48,8 @@ EFI_IP4_CONFIG_DATA  mIpIoDefaultIpConfigData = {
   FALSE,\r
   FALSE,\r
   FALSE,\r
-  {0, 0, 0, 0},\r
-  {0, 0, 0, 0},\r
+  {{0, 0, 0, 0}},\r
+  {{0, 0, 0, 0}},\r
   0,\r
   255,\r
   FALSE,\r
@@ -57,7 +58,25 @@ EFI_IP4_CONFIG_DATA  mIpIoDefaultIpConfigData = {
   0\r
 };\r
 \r
-STATIC\r
+ICMP_ERROR_INFO  mIcmpErrMap[10] = {\r
+  {FALSE, TRUE},\r
+  {FALSE, TRUE},\r
+  {TRUE, TRUE},\r
+  {TRUE, TRUE},\r
+  {TRUE, TRUE},\r
+  {FALSE, TRUE},\r
+  {FALSE, TRUE},\r
+  {FALSE, TRUE},\r
+  {FALSE, FALSE},\r
+  {FALSE, TRUE}\r
+};\r
+\r
+VOID\r
+EFIAPI\r
+IpIoTransmitHandlerDpc (\r
+  IN VOID      *Context\r
+  );\r
+\r
 VOID\r
 EFIAPI\r
 IpIoTransmitHandler (\r
@@ -80,7 +99,6 @@ IpIoTransmitHandler (
   @retval other                 The required operation failed.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 IpIoCreateIpChildOpenProtocol (\r
   IN  EFI_HANDLE  ControllerHandle,\r
@@ -143,7 +161,6 @@ IpIoCreateIpChildOpenProtocol (
   @retval other                 The required operation failed.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 IpIoCloseProtocolDestroyIpChild (\r
   IN EFI_HANDLE  ControllerHandle,\r
@@ -188,7 +205,6 @@ IpIoCloseProtocolDestroyIpChild (
   @retval EFI_ABORTED           This type of ICMP packet is not supported.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 IpIoIcmpHandler (\r
   IN IP_IO                *IpIo,\r
@@ -320,7 +336,6 @@ IpIoIcmpHandler (
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 IpIoExtFree (\r
   IN VOID  *Event\r
@@ -345,7 +360,6 @@ IpIoExtFree (
   @return resource limit occurred.\r
 \r
 **/\r
-STATIC\r
 IP_IO_SEND_ENTRY *\r
 IpIoCreateSndEntry (\r
   IN IP_IO             *IpIo,\r
@@ -367,7 +381,7 @@ IpIoCreateSndEntry (
   //\r
   // Allocate resource for SndEntry\r
   //\r
-  SndEntry = NetAllocatePool (sizeof (IP_IO_SEND_ENTRY));\r
+  SndEntry = AllocatePool (sizeof (IP_IO_SEND_ENTRY));\r
   if (NULL == SndEntry) {\r
     return NULL;\r
   }\r
@@ -375,14 +389,14 @@ IpIoCreateSndEntry (
   //\r
   // Allocate resource for SndToken\r
   //\r
-  SndToken = NetAllocatePool (sizeof (EFI_IP4_COMPLETION_TOKEN));\r
+  SndToken = AllocatePool (sizeof (EFI_IP4_COMPLETION_TOKEN));\r
   if (NULL == SndToken) {\r
     goto ReleaseSndEntry;\r
   }\r
 \r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL,\r
-                  NET_TPL_EVENT,\r
+                  TPL_NOTIFY,\r
                   IpIoTransmitHandler,\r
                   SndEntry,\r
                   &(SndToken->Event)\r
@@ -394,7 +408,7 @@ IpIoCreateSndEntry (
   //\r
   // Allocate resource for TxData\r
   //\r
-  TxData = NetAllocatePool (\r
+  TxData = AllocatePool (\r
     sizeof (EFI_IP4_TRANSMIT_DATA) +\r
     sizeof (EFI_IP4_FRAGMENT_DATA) * (Pkt->BlockOpNum - 1)\r
     );\r
@@ -409,20 +423,20 @@ IpIoCreateSndEntry (
   OverrideData = NULL;\r
   if (NULL != Override) {\r
 \r
-    OverrideData = NetAllocatePool (sizeof (EFI_IP4_OVERRIDE_DATA));\r
+    OverrideData = AllocatePool (sizeof (EFI_IP4_OVERRIDE_DATA));\r
     if (NULL == OverrideData) {\r
       goto ReleaseResource;\r
     }\r
     //\r
     // Set the fields of OverrideData\r
     //\r
-    *OverrideData = * (EFI_IP4_OVERRIDE_DATA *) Override;\r
+    CopyMem (OverrideData, Override, sizeof (*OverrideData));\r
   }\r
 \r
   //\r
   // Set the fields of TxData\r
   //\r
-  EFI_IP4 (TxData->DestinationAddress)  = Dest;\r
+  CopyMem (&TxData->DestinationAddress, &Dest, sizeof (EFI_IPv4_ADDRESS));\r
   TxData->OverrideData                  = OverrideData;\r
   TxData->OptionsLength                 = 0;\r
   TxData->OptionsBuffer                 = NULL;\r
@@ -453,21 +467,21 @@ IpIoCreateSndEntry (
 \r
   SndEntry->SndToken = SndToken;\r
 \r
-  NetListInsertTail (&IpIo->PendingSndList, &SndEntry->Entry);\r
+  InsertTailList (&IpIo->PendingSndList, &SndEntry->Entry);\r
 \r
   return SndEntry;\r
 \r
 ReleaseResource:\r
-  NetFreePool (TxData);\r
+  gBS->FreePool (TxData);\r
 \r
 ReleaseEvent:\r
   gBS->CloseEvent (SndToken->Event);\r
 \r
 ReleaseSndToken:\r
-  NetFreePool (SndToken);\r
+  gBS->FreePool (SndToken);\r
 \r
 ReleaseSndEntry:\r
-  NetFreePool (SndEntry);\r
+  gBS->FreePool (SndEntry);\r
 \r
   return NULL;\r
 }\r
@@ -481,7 +495,6 @@ ReleaseSndEntry:
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 IpIoDestroySndEntry (\r
   IN IP_IO_SEND_ENTRY  *SndEntry\r
@@ -492,34 +505,31 @@ IpIoDestroySndEntry (
   TxData = SndEntry->SndToken->Packet.TxData;\r
 \r
   if (NULL != TxData->OverrideData) {\r
-    NetFreePool (TxData->OverrideData);\r
+    gBS->FreePool (TxData->OverrideData);\r
   }\r
 \r
-  NetFreePool (TxData);\r
+  gBS->FreePool (TxData);\r
   NetbufFree (SndEntry->Pkt);\r
   gBS->CloseEvent (SndEntry->SndToken->Event);\r
 \r
-  NetFreePool (SndEntry->SndToken);\r
-  NetListRemoveEntry (&SndEntry->Entry);\r
+  gBS->FreePool (SndEntry->SndToken);\r
+  RemoveEntryList (&SndEntry->Entry);\r
 \r
-  NetFreePool (SndEntry);\r
+  gBS->FreePool (SndEntry);\r
 }\r
 \r
 \r
 /**\r
   Notify function for IP transmit token.\r
 \r
-  @param  Event                 The event signaled.\r
   @param  Context               The context passed in by the event notifier.\r
 \r
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 EFIAPI\r
-IpIoTransmitHandler (\r
-  IN EFI_EVENT Event,\r
+IpIoTransmitHandlerDpc (\r
   IN VOID      *Context\r
   )\r
 {\r
@@ -542,33 +552,56 @@ IpIoTransmitHandler (
   IpIoDestroySndEntry (SndEntry);\r
 }\r
 \r
+/**\r
+  Notify function for IP transmit token.\r
+\r
+  @param  Event                 The event signaled.\r
+  @param  Context               The context passed in by the event notifier.\r
+\r
+  @return None.\r
+\r
+**/\r
+\r
+VOID\r
+EFIAPI\r
+IpIoTransmitHandler (\r
+  IN EFI_EVENT Event,\r
+  IN VOID      *Context\r
+  )\r
+{\r
+  //\r
+  // Request IpIoTransmitHandlerDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  NetLibQueueDpc (TPL_CALLBACK, IpIoTransmitHandlerDpc, Context);\r
+}\r
+\r
 \r
 /**\r
   The dummy handler for the dummy IP receive token.\r
 \r
-  @param  Evt                   The event signaled.\r
   @param  Context               The context passed in by the event notifier.\r
 \r
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 EFIAPI\r
-IpIoDummyHandler (\r
-  IN EFI_EVENT Event,\r
+IpIoDummyHandlerDpc (\r
   IN VOID      *Context\r
   )\r
 {\r
   IP_IO_IP_INFO             *IpInfo;\r
   EFI_IP4_COMPLETION_TOKEN  *DummyToken;\r
 \r
-  ASSERT (Event && Context);\r
-\r
   IpInfo      = (IP_IO_IP_INFO *) Context;\r
   DummyToken  = &(IpInfo->DummyRcvToken);\r
 \r
-  if (EFI_SUCCESS == DummyToken->Status) {\r
+  if (EFI_ABORTED == DummyToken->Status) {\r
+    //\r
+    // The reception is actively aborted by the consumer, directly return.\r
+    //\r
+    return;\r
+  } else if (EFI_SUCCESS == DummyToken->Status) {\r
     ASSERT (DummyToken->Packet.RxData);\r
 \r
     gBS->SignalEvent (DummyToken->Packet.RxData->RecycleSignal);\r
@@ -579,8 +612,7 @@ IpIoDummyHandler (
 \r
 \r
 /**\r
-  Notify function for the IP receive token, used to process\r
-  the received IP packets.\r
+  Request IpIoDummyHandlerDpc as a DPC at TPL_CALLBACK.\r
 \r
   @param  Event                 The event signaled.\r
   @param  Context               The context passed in by the event notifier.\r
@@ -588,13 +620,34 @@ IpIoDummyHandler (
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 EFIAPI\r
-IpIoListenHandler (\r
+IpIoDummyHandler (\r
   IN EFI_EVENT Event,\r
   IN VOID      *Context\r
   )\r
+{\r
+  //\r
+  // Request IpIoDummyHandlerDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  NetLibQueueDpc (TPL_CALLBACK, IpIoDummyHandlerDpc, Context);\r
+}\r
+\r
+\r
+/**\r
+  Notify function for the IP receive token, used to process\r
+  the received IP packets.\r
+\r
+  @param  Context               The context passed in by the event notifier.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IpIoListenHandlerDpc (\r
+  IN VOID      *Context\r
+  )\r
 {\r
   IP_IO                 *IpIo;\r
   EFI_STATUS            Status;\r
@@ -609,6 +662,13 @@ IpIoListenHandler (
   Status  = IpIo->RcvToken.Status;\r
   RxData  = IpIo->RcvToken.Packet.RxData;\r
 \r
+  if (EFI_ABORTED == Status) {\r
+    //\r
+    // The reception is actively aborted by the consumer, directly return.\r
+    //\r
+    return;\r
+  }\r
+\r
   if (((EFI_SUCCESS != Status) && (EFI_ICMP_ERROR != Status)) || (NULL == RxData)) {\r
     //\r
     // Only process the normal packets and the icmp error packets, if RxData is NULL\r
@@ -675,6 +735,29 @@ Resume:
 }\r
 \r
 \r
+/**\r
+  Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK\r
+\r
+  @param  Event                 The event signaled.\r
+  @param  Context               The context passed in by the event notifier.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IpIoListenHandler (\r
+  IN EFI_EVENT Event,\r
+  IN VOID      *Context\r
+  )\r
+{\r
+  //\r
+  // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  NetLibQueueDpc (TPL_CALLBACK, IpIoListenHandlerDpc, Context);\r
+}\r
+\r
+\r
 /**\r
   Create a new IP_IO instance.\r
 \r
@@ -686,6 +769,7 @@ Resume:
 \r
 **/\r
 IP_IO *\r
+EFIAPI\r
 IpIoCreate (\r
   IN EFI_HANDLE Image,\r
   IN EFI_HANDLE Controller\r
@@ -694,19 +778,19 @@ IpIoCreate (
   EFI_STATUS  Status;\r
   IP_IO       *IpIo;\r
 \r
-  IpIo = NetAllocateZeroPool (sizeof (IP_IO));\r
+  IpIo = AllocateZeroPool (sizeof (IP_IO));\r
   if (NULL == IpIo) {\r
     return NULL;\r
   }\r
 \r
-  NetListInit (&(IpIo->PendingSndList));\r
-  NetListInit (&(IpIo->IpList));\r
+  InitializeListHead (&(IpIo->PendingSndList));\r
+  InitializeListHead (&(IpIo->IpList));\r
   IpIo->Controller  = Controller;\r
   IpIo->Image       = Image;\r
 \r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL,\r
-                  NET_TPL_EVENT,\r
+                  TPL_NOTIFY,\r
                   IpIoListenHandler,\r
                   IpIo,\r
                   &(IpIo->RcvToken.Event)\r
@@ -736,7 +820,7 @@ ReleaseIpIo:
     gBS->CloseEvent (IpIo->RcvToken.Event);\r
   }\r
 \r
-  NetFreePool (IpIo);\r
+  gBS->FreePool (IpIo);\r
 \r
   return NULL;\r
 }\r
@@ -754,6 +838,7 @@ ReleaseIpIo:
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 IpIoOpen (\r
   IN IP_IO           *IpIo,\r
   IN IP_IO_OPEN_DATA *OpenData\r
@@ -761,7 +846,6 @@ IpIoOpen (
 {\r
   EFI_STATUS        Status;\r
   EFI_IP4_PROTOCOL  *Ip;\r
-  EFI_IPv4_ADDRESS  ZeroIp;\r
 \r
   if (IpIo->IsConfigured) {\r
     return EFI_ACCESS_DENIED;\r
@@ -782,8 +866,7 @@ IpIoOpen (
   // (0.0.0.0, 0.0.0.0, 0.0.0.0). Delete this statement if Ip modified\r
   // its code\r
   //\r
-  EFI_IP4 (ZeroIp) = 0;\r
-  Status = Ip->Routes (Ip, TRUE, &ZeroIp, &ZeroIp, &ZeroIp);\r
+  Status = Ip->Routes (Ip, TRUE, &mZeroIp4Addr, &mZeroIp4Addr, &mZeroIp4Addr);\r
 \r
   if (EFI_ERROR (Status) && (EFI_NOT_FOUND != Status)) {\r
     return Status;\r
@@ -807,7 +890,7 @@ IpIoOpen (
   }\r
 \r
   IpIo->IsConfigured = TRUE;\r
-  NetListInsertTail (&mActiveIpIoList, &IpIo->Entry);\r
+  InsertTailList (&mActiveIpIoList, &IpIo->Entry);\r
 \r
 ErrorExit:\r
 \r
@@ -840,7 +923,7 @@ IpIoStop (
   //\r
   // Remove the IpIo from the active IpIo list.\r
   //\r
-  NetListRemoveEntry (&IpIo->Entry);\r
+  RemoveEntryList (&IpIo->Entry);\r
 \r
   Ip = IpIo->Ip;\r
 \r
@@ -858,7 +941,7 @@ IpIoStop (
   // Detroy the Ip List used by IpIo\r
   //\r
 \r
-  while (!NetListIsEmpty (&(IpIo->IpList))) {\r
+  while (!IsListEmpty (&(IpIo->IpList))) {\r
     IpInfo = NET_LIST_HEAD (&(IpIo->IpList), IP_IO_IP_INFO, Entry);\r
 \r
     IpIoRemoveIp (IpIo, IpInfo);\r
@@ -867,7 +950,7 @@ IpIoStop (
   //\r
   // All pending snd tokens should be flushed by reseting the IP instances.\r
   //\r
-  ASSERT (NetListIsEmpty (&IpIo->PendingSndList));\r
+  ASSERT (IsListEmpty (&IpIo->PendingSndList));\r
 \r
   //\r
   // Close the receive event.\r
@@ -889,6 +972,7 @@ IpIoStop (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 IpIoDestroy (\r
   IN IP_IO *IpIo\r
   )\r
@@ -903,7 +987,7 @@ IpIoDestroy (
   //\r
   IpIoCloseProtocolDestroyIpChild (IpIo->Controller, IpIo->Image, IpIo->ChildHandle);\r
 \r
-  NetFreePool (IpIo);\r
+  gBS->FreePool (IpIo);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -927,6 +1011,7 @@ IpIoDestroy (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 IpIoSend (\r
   IN IP_IO           *IpIo,\r
   IN NET_BUF         *Pkt,\r
@@ -977,12 +1062,13 @@ IpIoSend (
 \r
 **/\r
 VOID\r
+EFIAPI\r
 IpIoCancelTxToken (\r
   IN IP_IO  *IpIo,\r
   IN VOID   *Packet\r
   )\r
 {\r
-  NET_LIST_ENTRY    *Node;\r
+  LIST_ENTRY        *Node;\r
   IP_IO_SEND_ENTRY  *SndEntry;\r
   EFI_IP4_PROTOCOL  *Ip;\r
 \r
@@ -997,12 +1083,6 @@ IpIoCancelTxToken (
       Ip = SndEntry->Ip;\r
       Ip->Cancel (Ip, SndEntry->SndToken);\r
 \r
-      //\r
-      // Abort the user token.\r
-      //\r
-      SndEntry->SndToken->Status = EFI_ABORTED;\r
-      IpIoTransmitHandler (NULL, SndEntry);\r
-\r
       break;\r
     }\r
   }\r
@@ -1020,6 +1100,7 @@ IpIoCancelTxToken (
 \r
 **/\r
 IP_IO_IP_INFO *\r
+EFIAPI\r
 IpIoAddIp (\r
   IN IP_IO  *IpIo\r
   )\r
@@ -1029,7 +1110,7 @@ IpIoAddIp (
 \r
   ASSERT (IpIo);\r
 \r
-  IpInfo = NetAllocatePool (sizeof (IP_IO_IP_INFO));\r
+  IpInfo = AllocatePool (sizeof (IP_IO_IP_INFO));\r
   if (IpInfo == NULL) {\r
     return IpInfo;\r
   }\r
@@ -1038,7 +1119,7 @@ IpIoAddIp (
   // Init this IpInfo, set the Addr and SubnetMask to 0 before we configure the IP\r
   // instance.\r
   //\r
-  NetListInit (&IpInfo->Entry);\r
+  InitializeListHead (&IpInfo->Entry);\r
   IpInfo->ChildHandle = NULL;\r
   IpInfo->Addr        = 0;\r
   IpInfo->SubnetMask  = 0;\r
@@ -1062,7 +1143,7 @@ IpIoAddIp (
   //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL,\r
-                  NET_TPL_EVENT,\r
+                  TPL_NOTIFY,\r
                   IpIoDummyHandler,\r
                   IpInfo,\r
                   &IpInfo->DummyRcvToken.Event\r
@@ -1074,7 +1155,7 @@ IpIoAddIp (
   //\r
   // Link this IpInfo into the IpIo.\r
   //\r
-  NetListInsertTail (&IpIo->IpList, &IpInfo->Entry);\r
+  InsertTailList (&IpIo->IpList, &IpInfo->Entry);\r
 \r
   return IpInfo;\r
 \r
@@ -1088,7 +1169,7 @@ ReleaseIpChild:
 \r
 ReleaseIpInfo:\r
 \r
-  NetFreePool (IpInfo);\r
+  gBS->FreePool (IpInfo);\r
 \r
   return NULL;\r
 }\r
@@ -1110,6 +1191,7 @@ ReleaseIpInfo:
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 IpIoConfigIp (\r
   IN     IP_IO_IP_INFO        *IpInfo,\r
   IN OUT EFI_IP4_CONFIG_DATA  *Ip4ConfigData OPTIONAL\r
@@ -1147,8 +1229,8 @@ IpIoConfigIp (
       Ip4ConfigData->SubnetMask     = Ip4ModeData.ConfigData.SubnetMask;\r
     }\r
 \r
-    IpInfo->Addr       = EFI_IP4 (Ip4ConfigData->StationAddress);\r
-    IpInfo->SubnetMask = EFI_IP4 (Ip4ConfigData->SubnetMask);\r
+    CopyMem (&IpInfo->Addr, &Ip4ConfigData->StationAddress, sizeof (IP4_ADDR));\r
+    CopyMem (&IpInfo->SubnetMask, &Ip4ConfigData->SubnetMask, sizeof (IP4_ADDR));\r
 \r
     Status = Ip->Receive (Ip, &IpInfo->DummyRcvToken);\r
     if (EFI_ERROR (Status)) {\r
@@ -1180,6 +1262,7 @@ OnExit:
 \r
 **/\r
 VOID\r
+EFIAPI\r
 IpIoRemoveIp (\r
   IN IP_IO          *IpIo,\r
   IN IP_IO_IP_INFO  *IpInfo\r
@@ -1194,7 +1277,7 @@ IpIoRemoveIp (
     return;\r
   }\r
 \r
-  NetListRemoveEntry (&IpInfo->Entry);\r
+  RemoveEntryList (&IpInfo->Entry);\r
 \r
   IpInfo->Ip->Configure (IpInfo->Ip, NULL);\r
 \r
@@ -1202,7 +1285,7 @@ IpIoRemoveIp (
 \r
   gBS->CloseEvent (IpInfo->DummyRcvToken.Event);\r
 \r
-  NetFreePool (IpInfo);\r
+  gBS->FreePool (IpInfo);\r
 }\r
 \r
 \r
@@ -1218,14 +1301,15 @@ IpIoRemoveIp (
 \r
 **/\r
 IP_IO_IP_INFO *\r
+EFIAPI\r
 IpIoFindSender (\r
   IN OUT IP_IO     **IpIo,\r
   IN     IP4_ADDR  Src\r
   )\r
 {\r
-  NET_LIST_ENTRY  *IpIoEntry;\r
+  LIST_ENTRY      *IpIoEntry;\r
   IP_IO           *IpIoPtr;\r
-  NET_LIST_ENTRY  *IpInfoEntry;\r
+  LIST_ENTRY      *IpInfoEntry;\r
   IP_IO_IP_INFO   *IpInfo;\r
 \r
   NET_LIST_FOR_EACH (IpIoEntry, &mActiveIpIoList) {\r
@@ -1266,64 +1350,49 @@ IpIoFindSender (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 IpIoGetIcmpErrStatus (\r
   IN  ICMP_ERROR  IcmpError,\r
   OUT BOOLEAN     *IsHard, OPTIONAL\r
   OUT BOOLEAN     *Notify OPTIONAL\r
   )\r
 {\r
-  ICMP_ERROR_INFO  IcmpErrMap[10];\r
-\r
-  IcmpErrMap[0].Error  = EFI_NETWORK_UNREACHABLE;\r
-  IcmpErrMap[0].IsHard = FALSE;\r
-  IcmpErrMap[0].Notify = TRUE;\r
-\r
-  IcmpErrMap[1].Error = EFI_HOST_UNREACHABLE;\r
-  IcmpErrMap[1].IsHard = FALSE;\r
-  IcmpErrMap[1].Notify = TRUE;\r
-\r
-  IcmpErrMap[2].Error = EFI_PROTOCOL_UNREACHABLE;\r
-  IcmpErrMap[2].IsHard = TRUE;\r
-  IcmpErrMap[2].Notify = TRUE;\r
-\r
-  IcmpErrMap[3].Error = EFI_PORT_UNREACHABLE;\r
-  IcmpErrMap[3].IsHard = TRUE;\r
-  IcmpErrMap[3].Notify = TRUE;\r
-\r
-  IcmpErrMap[4].Error = EFI_ICMP_ERROR;\r
-  IcmpErrMap[4].IsHard = TRUE;\r
-  IcmpErrMap[4].Notify = TRUE;\r
-\r
-  IcmpErrMap[5].Error = EFI_ICMP_ERROR;\r
-  IcmpErrMap[5].IsHard = FALSE;\r
-  IcmpErrMap[5].Notify = TRUE;\r
+  ASSERT ((IcmpError >= ICMP_ERR_UNREACH_NET) && (IcmpError <= ICMP_ERR_PARAMPROB));\r
 \r
-  IcmpErrMap[6].Error = EFI_HOST_UNREACHABLE;\r
-  IcmpErrMap[6].IsHard = FALSE;\r
-  IcmpErrMap[6].Notify = TRUE;\r
+  if (IsHard != NULL) {\r
+    *IsHard = mIcmpErrMap[IcmpError].IsHard;\r
+  }\r
 \r
-  IcmpErrMap[7].Error = EFI_HOST_UNREACHABLE;\r
-  IcmpErrMap[7].IsHard = FALSE;\r
-  IcmpErrMap[7].Notify = TRUE;\r
+  if (Notify != NULL) {\r
+    *Notify = mIcmpErrMap[IcmpError].Notify;\r
+  }\r
 \r
-  IcmpErrMap[8].Error = EFI_ICMP_ERROR;\r
-  IcmpErrMap[8].IsHard = FALSE;\r
-  IcmpErrMap[8].Notify = FALSE;\r
+  switch (IcmpError) {\r
+  case ICMP_ERR_UNREACH_NET:\r
+    return  EFI_NETWORK_UNREACHABLE;\r
 \r
-  IcmpErrMap[9].Error = EFI_ICMP_ERROR;\r
-  IcmpErrMap[9].IsHard = FALSE;\r
-  IcmpErrMap[9].Notify = TRUE;\r
+  case ICMP_ERR_TIMXCEED_INTRANS:\r
+  case ICMP_ERR_TIMXCEED_REASS:\r
+  case ICMP_ERR_UNREACH_HOST:\r
+    return  EFI_HOST_UNREACHABLE;\r
 \r
-  ASSERT ((IcmpError >= ICMP_ERR_UNREACH_NET) && (IcmpError <= ICMP_ERR_PARAMPROB));\r
+  case ICMP_ERR_UNREACH_PROTOCOL:\r
+    return  EFI_PROTOCOL_UNREACHABLE;\r
 \r
-  if (IsHard != NULL) {\r
-    *IsHard = IcmpErrMap[IcmpError].IsHard;\r
-  }\r
+  case ICMP_ERR_UNREACH_PORT:\r
+    return  EFI_PORT_UNREACHABLE;\r
 \r
-  if (Notify != NULL) {\r
-    *Notify = IcmpErrMap[IcmpError].Notify;\r
+  case ICMP_ERR_MSGSIZE:\r
+  case ICMP_ERR_UNREACH_SRCFAIL:\r
+  case ICMP_ERR_QUENCH:\r
+  case ICMP_ERR_PARAMPROB:\r
+    return  EFI_ICMP_ERROR;\r
   }\r
 \r
-  return IcmpErrMap[IcmpError].Error;\r
+  //\r
+  // will never run here!\r
+  //\r
+  ASSERT (FALSE);\r
+  return EFI_UNSUPPORTED;\r
 }\r
 \r