#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
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
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
@retval other The required operation failed.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
IpIoCreateIpChildOpenProtocol (\r
IN EFI_HANDLE ControllerHandle,\r
@retval other The required operation failed.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
IpIoCloseProtocolDestroyIpChild (\r
IN EFI_HANDLE ControllerHandle,\r
@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
case ICMP_CODE_UNREACH_PROTOCOL:\r
case ICMP_CODE_UNREACH_PORT:\r
case ICMP_CODE_UNREACH_SRCFAIL:\r
- IcmpErr = ICMP_ERR_UNREACH_NET + Code;\r
+ IcmpErr = (ICMP_ERROR) (ICMP_ERR_UNREACH_NET + Code);\r
\r
break;\r
\r
return EFI_ABORTED;\r
}\r
\r
- IcmpErr = Code + ICMP_ERR_TIMXCEED_INTRANS;\r
+ IcmpErr = (ICMP_ERROR) (Code + ICMP_ERR_TIMXCEED_INTRANS);\r
\r
break;\r
\r
@return None.\r
\r
**/\r
-STATIC\r
VOID\r
IpIoExtFree (\r
IN VOID *Event\r
@return resource limit occurred.\r
\r
**/\r
-STATIC\r
IP_IO_SEND_ENTRY *\r
IpIoCreateSndEntry (\r
IN IP_IO *IpIo,\r
EFI_IP4_TRANSMIT_DATA *TxData;\r
EFI_STATUS Status;\r
EFI_IP4_OVERRIDE_DATA *OverrideData;\r
- UINT32 Index;\r
+ volatile UINT32 Index;\r
\r
//\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
//\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
//\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
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
TxData->TotalDataLength = Pkt->TotalSize;\r
TxData->FragmentCount = Pkt->BlockOpNum;\r
\r
- for (Index = 0; Index < Pkt->BlockOpNum; Index++) {\r
\r
+ for (Index = 0; Index < Pkt->BlockOpNum; Index++) {\r
TxData->FragmentTable[Index].FragmentBuffer = Pkt->BlockOp[Index].Head;\r
TxData->FragmentTable[Index].FragmentLength = Pkt->BlockOp[Index].Size;\r
}\r
\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
@return None.\r
\r
**/\r
-STATIC\r
VOID\r
IpIoDestroySndEntry (\r
IN IP_IO_SEND_ENTRY *SndEntry\r
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
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
\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
@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
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
\r
if (EFI_SUCCESS == Status) {\r
\r
- IpIo->PktRcvdNotify (EFI_SUCCESS, 0, &Session, Pkt, IpIo->RcvdContext);\r
+ IpIo->PktRcvdNotify (EFI_SUCCESS, (ICMP_ERROR) 0, &Session, Pkt, IpIo->RcvdContext);\r
} else {\r
//\r
// Status is EFI_ICMP_ERROR\r
}\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
\r
**/\r
IP_IO *\r
+EFIAPI\r
IpIoCreate (\r
IN EFI_HANDLE Image,\r
IN EFI_HANDLE Controller\r
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
gBS->CloseEvent (IpIo->RcvToken.Event);\r
}\r
\r
- NetFreePool (IpIo);\r
+ gBS->FreePool (IpIo);\r
\r
return NULL;\r
}\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
IpIoOpen (\r
IN IP_IO *IpIo,\r
IN IP_IO_OPEN_DATA *OpenData\r
{\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
// (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
}\r
\r
IpIo->IsConfigured = TRUE;\r
- NetListInsertTail (&mActiveIpIoList, &IpIo->Entry);\r
+ InsertTailList (&mActiveIpIoList, &IpIo->Entry);\r
\r
ErrorExit:\r
\r
//\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
//\r
// Detroy the Ip List used by IpIo\r
//\r
- while (!NetListIsEmpty (&(IpIo->IpList))) {\r
+\r
+ while (!IsListEmpty (&(IpIo->IpList))) {\r
IpInfo = NET_LIST_HEAD (&(IpIo->IpList), IP_IO_IP_INFO, Entry);\r
\r
IpIoRemoveIp (IpIo, IpInfo);\r
//\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
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
IpIoDestroy (\r
IN IP_IO *IpIo\r
)\r
//\r
IpIoCloseProtocolDestroyIpChild (IpIo->Controller, IpIo->Image, IpIo->ChildHandle);\r
\r
- NetFreePool (IpIo);\r
+ gBS->FreePool (IpIo);\r
\r
return EFI_SUCCESS;\r
}\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
IpIoSend (\r
IN IP_IO *IpIo,\r
IN NET_BUF *Pkt,\r
\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
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
\r
**/\r
IP_IO_IP_INFO *\r
+EFIAPI\r
IpIoAddIp (\r
IN IP_IO *IpIo\r
)\r
\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
// 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
IpIo->Controller,\r
IpIo->Image,\r
&IpInfo->ChildHandle,\r
- &IpInfo->Ip\r
+ (VOID **) &IpInfo->Ip\r
);\r
if (EFI_ERROR (Status)) {\r
goto ReleaseIpInfo;\r
//\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_SIGNAL,\r
- NET_TPL_EVENT,\r
+ TPL_NOTIFY,\r
IpIoDummyHandler,\r
IpInfo,\r
&IpInfo->DummyRcvToken.Event\r
//\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
\r
ReleaseIpInfo:\r
\r
- NetFreePool (IpInfo);\r
+ gBS->FreePool (IpInfo);\r
\r
return NULL;\r
}\r
\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
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
\r
**/\r
VOID\r
+EFIAPI\r
IpIoRemoveIp (\r
IN IP_IO *IpIo,\r
IN IP_IO_IP_INFO *IpInfo\r
return;\r
}\r
\r
- NetListRemoveEntry (&IpInfo->Entry);\r
+ RemoveEntryList (&IpInfo->Entry);\r
\r
IpInfo->Ip->Configure (IpInfo->Ip, NULL);\r
\r
\r
gBS->CloseEvent (IpInfo->DummyRcvToken.Event);\r
\r
- NetFreePool (IpInfo);\r
+ gBS->FreePool (IpInfo);\r
}\r
\r
\r
\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
\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[] = {\r
- { EFI_NETWORK_UNREACHABLE, FALSE, TRUE }, // ICMP_ERR_UNREACH_NET\r
- { EFI_HOST_UNREACHABLE, FALSE, TRUE }, // ICMP_ERR_UNREACH_HOST\r
- { EFI_PROTOCOL_UNREACHABLE, TRUE, TRUE }, // ICMP_ERR_UNREACH_PROTOCOL\r
- { EFI_PORT_UNREACHABLE, TRUE, TRUE }, // ICMP_ERR_UNREACH_PORT\r
- { EFI_ICMP_ERROR, TRUE, TRUE }, // ICMP_ERR_MSGSIZE\r
- { EFI_ICMP_ERROR, FALSE, TRUE }, // ICMP_ERR_UNREACH_SRCFAIL\r
- { EFI_HOST_UNREACHABLE, FALSE, TRUE }, // ICMP_ERR_TIMXCEED_INTRANS\r
- { EFI_HOST_UNREACHABLE, FALSE, TRUE }, // ICMP_ERR_TIMEXCEED_REASS\r
- { EFI_ICMP_ERROR, FALSE, FALSE }, // ICMP_ERR_QUENCH\r
- { EFI_ICMP_ERROR, FALSE, TRUE } // ICMP_ERR_PARAMPROB\r
- };\r
-\r
ASSERT ((IcmpError >= ICMP_ERR_UNREACH_NET) && (IcmpError <= ICMP_ERR_PARAMPROB));\r
\r
if (IsHard != NULL) {\r
- *IsHard = IcmpErrMap[IcmpError].IsHard;\r
+ *IsHard = mIcmpErrMap[IcmpError].IsHard;\r
}\r
\r
if (Notify != NULL) {\r
- *Notify = IcmpErrMap[IcmpError].Notify;\r
+ *Notify = mIcmpErrMap[IcmpError].Notify;\r
}\r
\r
- return IcmpErrMap[IcmpError].Error;\r
+ switch (IcmpError) {\r
+ case ICMP_ERR_UNREACH_NET:\r
+ return EFI_NETWORK_UNREACHABLE;\r
+\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
+ case ICMP_ERR_UNREACH_PROTOCOL:\r
+ return EFI_PROTOCOL_UNREACHABLE;\r
+\r
+ case ICMP_ERR_UNREACH_PORT:\r
+ return EFI_PORT_UNREACHABLE;\r
+\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
+ //\r
+ // will never run here!\r
+ //\r
+ ASSERT (FALSE);\r
+ return EFI_UNSUPPORTED;\r
}\r
\r