#include "Ip4Impl.h"\r
\r
IP4_ICMP_CLASS\r
-mIcmpClass[] = {\r
- {ICMP_ECHO_REPLY, ICMP_QUERY_MESSAGE },\r
- {1, ICMP_INVALID_MESSAGE},\r
- {2, ICMP_INVALID_MESSAGE},\r
- {ICMP_DEST_UNREACHABLE, ICMP_ERROR_MESSAGE },\r
- {ICMP_SOURCE_QUENCH, ICMP_ERROR_MESSAGE },\r
- {ICMP_REDIRECT, ICMP_ERROR_MESSAGE },\r
- {6, ICMP_INVALID_MESSAGE},\r
- {7, ICMP_INVALID_MESSAGE},\r
- {ICMP_ECHO_REQUEST, ICMP_QUERY_MESSAGE },\r
- {9, ICMP_INVALID_MESSAGE},\r
- {10, ICMP_INVALID_MESSAGE},\r
- {ICMP_TIME_EXCEEDED, ICMP_ERROR_MESSAGE },\r
- {ICMP_PARAMETER_PROBLEM, ICMP_ERROR_MESSAGE },\r
- {ICMP_TIMESTAMP , ICMP_QUERY_MESSAGE },\r
- {14, ICMP_INVALID_MESSAGE},\r
- {ICMP_INFO_REQUEST , ICMP_QUERY_MESSAGE },\r
- {ICMP_INFO_REPLY , ICMP_QUERY_MESSAGE },\r
+ mIcmpClass[] = {\r
+ { ICMP_ECHO_REPLY, ICMP_QUERY_MESSAGE },\r
+ { 1, ICMP_INVALID_MESSAGE },\r
+ { 2, ICMP_INVALID_MESSAGE },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_ERROR_MESSAGE },\r
+ { ICMP_SOURCE_QUENCH, ICMP_ERROR_MESSAGE },\r
+ { ICMP_REDIRECT, ICMP_ERROR_MESSAGE },\r
+ { 6, ICMP_INVALID_MESSAGE },\r
+ { 7, ICMP_INVALID_MESSAGE },\r
+ { ICMP_ECHO_REQUEST, ICMP_QUERY_MESSAGE },\r
+ { 9, ICMP_INVALID_MESSAGE },\r
+ { 10, ICMP_INVALID_MESSAGE },\r
+ { ICMP_TIME_EXCEEDED, ICMP_ERROR_MESSAGE },\r
+ { ICMP_PARAMETER_PROBLEM, ICMP_ERROR_MESSAGE },\r
+ { ICMP_TIMESTAMP, ICMP_QUERY_MESSAGE },\r
+ { 14, ICMP_INVALID_MESSAGE },\r
+ { ICMP_INFO_REQUEST, ICMP_QUERY_MESSAGE },\r
+ { ICMP_INFO_REPLY, ICMP_QUERY_MESSAGE },\r
};\r
\r
EFI_IP4_ICMP_TYPE\r
-mIp4SupportedIcmp[23] = {\r
- {ICMP_ECHO_REPLY, ICMP_DEFAULT_CODE },\r
-\r
- {ICMP_DEST_UNREACHABLE, ICMP_NET_UNREACHABLE },\r
- {ICMP_DEST_UNREACHABLE, ICMP_HOST_UNREACHABLE },\r
- {ICMP_DEST_UNREACHABLE, ICMP_PROTO_UNREACHABLE },\r
- {ICMP_DEST_UNREACHABLE, ICMP_PORT_UNREACHABLE },\r
- {ICMP_DEST_UNREACHABLE, ICMP_FRAGMENT_FAILED },\r
- {ICMP_DEST_UNREACHABLE, ICMP_SOURCEROUTE_FAILED },\r
- {ICMP_DEST_UNREACHABLE, ICMP_NET_UNKNOWN },\r
- {ICMP_DEST_UNREACHABLE, ICMP_HOST_UNKNOWN },\r
- {ICMP_DEST_UNREACHABLE, ICMP_SOURCE_ISOLATED },\r
- {ICMP_DEST_UNREACHABLE, ICMP_NET_PROHIBITED },\r
- {ICMP_DEST_UNREACHABLE, ICMP_HOST_PROHIBITED },\r
- {ICMP_DEST_UNREACHABLE, ICMP_NET_UNREACHABLE_TOS },\r
- {ICMP_DEST_UNREACHABLE, ICMP_HOST_UNREACHABLE_TOS},\r
-\r
- {ICMP_SOURCE_QUENCH, ICMP_DEFAULT_CODE },\r
-\r
- {ICMP_REDIRECT, ICMP_NET_REDIRECT },\r
- {ICMP_REDIRECT, ICMP_HOST_REDIRECT },\r
- {ICMP_REDIRECT, ICMP_NET_TOS_REDIRECT },\r
- {ICMP_REDIRECT, ICMP_HOST_TOS_REDIRECT },\r
-\r
- {ICMP_ECHO_REQUEST, ICMP_DEFAULT_CODE },\r
-\r
- {ICMP_TIME_EXCEEDED, ICMP_TIMEOUT_IN_TRANSIT },\r
- {ICMP_TIME_EXCEEDED, ICMP_TIMEOUT_REASSEMBLE },\r
-\r
- {ICMP_PARAMETER_PROBLEM, ICMP_DEFAULT_CODE },\r
+ mIp4SupportedIcmp[23] = {\r
+ { ICMP_ECHO_REPLY, ICMP_DEFAULT_CODE },\r
+\r
+ { ICMP_DEST_UNREACHABLE, ICMP_NET_UNREACHABLE },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_HOST_UNREACHABLE },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_PROTO_UNREACHABLE },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_PORT_UNREACHABLE },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_FRAGMENT_FAILED },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_SOURCEROUTE_FAILED },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_NET_UNKNOWN },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_HOST_UNKNOWN },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_SOURCE_ISOLATED },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_NET_PROHIBITED },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_HOST_PROHIBITED },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_NET_UNREACHABLE_TOS },\r
+ { ICMP_DEST_UNREACHABLE, ICMP_HOST_UNREACHABLE_TOS },\r
+\r
+ { ICMP_SOURCE_QUENCH, ICMP_DEFAULT_CODE },\r
+\r
+ { ICMP_REDIRECT, ICMP_NET_REDIRECT },\r
+ { ICMP_REDIRECT, ICMP_HOST_REDIRECT },\r
+ { ICMP_REDIRECT, ICMP_NET_TOS_REDIRECT },\r
+ { ICMP_REDIRECT, ICMP_HOST_TOS_REDIRECT },\r
+\r
+ { ICMP_ECHO_REQUEST, ICMP_DEFAULT_CODE },\r
+\r
+ { ICMP_TIME_EXCEEDED, ICMP_TIMEOUT_IN_TRANSIT },\r
+ { ICMP_TIME_EXCEEDED, ICMP_TIMEOUT_REASSEMBLE },\r
+\r
+ { ICMP_PARAMETER_PROBLEM, ICMP_DEFAULT_CODE },\r
};\r
\r
-\r
-\r
/**\r
Process the ICMP redirect. Find the instance then update\r
its route cache.\r
**/\r
EFI_STATUS\r
Ip4ProcessIcmpRedirect (\r
- IN IP4_SERVICE *IpSb,\r
- IN IP4_HEAD *Head,\r
- IN NET_BUF *Packet,\r
- IN IP4_ICMP_ERROR_HEAD *Icmp\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_HEAD *Head,\r
+ IN NET_BUF *Packet,\r
+ IN IP4_ICMP_ERROR_HEAD *Icmp\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- IP4_PROTOCOL *Ip4Instance;\r
- IP4_ROUTE_CACHE_ENTRY *CacheEntry;\r
- IP4_INTERFACE *IpIf;\r
- IP4_ADDR Gateway;\r
- IP4_ADDR Src;\r
- IP4_ADDR Dst;\r
+ LIST_ENTRY *Entry;\r
+ IP4_PROTOCOL *Ip4Instance;\r
+ IP4_ROUTE_CACHE_ENTRY *CacheEntry;\r
+ IP4_INTERFACE *IpIf;\r
+ IP4_ADDR Gateway;\r
+ IP4_ADDR Src;\r
+ IP4_ADDR Dst;\r
\r
//\r
// Find the interface whose IP address is the source of the\r
continue;\r
}\r
\r
- Dst = NTOHL (Icmp->IpHead.Dst);\r
- Src = NTOHL (Icmp->IpHead.Src);\r
+ Dst = NTOHL (Icmp->IpHead.Dst);\r
+ Src = NTOHL (Icmp->IpHead.Src);\r
CacheEntry = Ip4FindRouteCache (Ip4Instance->RouteTable, Dst, Src);\r
\r
//\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
Process the ICMP error packet. If it is an ICMP redirect packet,\r
update call Ip4ProcessIcmpRedirect to update the IP instance's\r
**/\r
EFI_STATUS\r
Ip4ProcessIcmpError (\r
- IN IP4_SERVICE *IpSb,\r
- IN IP4_HEAD *Head,\r
- IN NET_BUF *Packet\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_HEAD *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IP4_ICMP_ERROR_HEAD Icmp;\r
+ IP4_ICMP_ERROR_HEAD Icmp;\r
\r
if (Packet->TotalSize < sizeof (Icmp)) {\r
NetbufFree (Packet);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+ NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
\r
//\r
// If it is an ICMP redirect error, update the route cache\r
return Ip4Demultiplex (IpSb, Head, Packet, NULL, 0);\r
}\r
\r
-\r
/**\r
Replay an ICMP echo request.\r
\r
**/\r
EFI_STATUS\r
Ip4IcmpReplyEcho (\r
- IN IP4_SERVICE *IpSb,\r
- IN IP4_HEAD *Head,\r
- IN NET_BUF *Packet\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_HEAD *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IP4_ICMP_QUERY_HEAD *Icmp;\r
- NET_BUF *Data;\r
- EFI_STATUS Status;\r
- IP4_HEAD ReplyHead;\r
+ IP4_ICMP_QUERY_HEAD *Icmp;\r
+ NET_BUF *Data;\r
+ EFI_STATUS Status;\r
+ IP4_HEAD ReplyHead;\r
\r
//\r
// make a copy the packet, it is really a bad idea to\r
// use specific destination. See RFC1122. SRR/RR option\r
// update is omitted.\r
//\r
- Icmp = (IP4_ICMP_QUERY_HEAD *) NetbufGetByte (Data, 0, NULL);\r
+ Icmp = (IP4_ICMP_QUERY_HEAD *)NetbufGetByte (Data, 0, NULL);\r
ASSERT (Icmp != NULL);\r
Icmp->Head.Type = ICMP_ECHO_REPLY;\r
Icmp->Head.Checksum = 0;\r
- Icmp->Head.Checksum = (UINT16) (~NetblockChecksum ((UINT8 *) Icmp, Data->TotalSize));\r
+ Icmp->Head.Checksum = (UINT16)(~NetblockChecksum ((UINT8 *)Icmp, Data->TotalSize));\r
\r
- ReplyHead.Tos = 0;\r
- ReplyHead.Fragment = 0;\r
- ReplyHead.Ttl = 64;\r
- ReplyHead.Protocol = EFI_IP_PROTO_ICMP;\r
- ReplyHead.Src = 0;\r
+ ReplyHead.Tos = 0;\r
+ ReplyHead.Fragment = 0;\r
+ ReplyHead.Ttl = 64;\r
+ ReplyHead.Protocol = EFI_IP_PROTO_ICMP;\r
+ ReplyHead.Src = 0;\r
\r
//\r
// Ip4Output will select a source for us\r
return Status;\r
}\r
\r
-\r
/**\r
Process the ICMP query message. If it is an ICMP echo\r
request, answer it. Otherwise deliver it to upper layer.\r
**/\r
EFI_STATUS\r
Ip4ProcessIcmpQuery (\r
- IN IP4_SERVICE *IpSb,\r
- IN IP4_HEAD *Head,\r
- IN NET_BUF *Packet\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_HEAD *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IP4_ICMP_QUERY_HEAD Icmp;\r
+ IP4_ICMP_QUERY_HEAD Icmp;\r
\r
if (Packet->TotalSize < sizeof (Icmp)) {\r
NetbufFree (Packet);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+ NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
\r
if (Icmp.Head.Type == ICMP_ECHO_REQUEST) {\r
return Ip4IcmpReplyEcho (IpSb, Head, Packet);\r
return Ip4Demultiplex (IpSb, Head, Packet, NULL, 0);\r
}\r
\r
-\r
/**\r
Handle the ICMP packet. First validate the message format,\r
then according to the message types, process it as query or\r
**/\r
EFI_STATUS\r
Ip4IcmpHandle (\r
- IN IP4_SERVICE *IpSb,\r
- IN IP4_HEAD *Head,\r
- IN NET_BUF *Packet\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_HEAD *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IP4_ICMP_HEAD Icmp;\r
- UINT16 Checksum;\r
+ IP4_ICMP_HEAD Icmp;\r
+ UINT16 Checksum;\r
\r
if (Packet->TotalSize < sizeof (Icmp)) {\r
goto DROP;\r
}\r
\r
- NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+ NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
\r
if (Icmp.Type > ICMP_TYPE_MAX) {\r
goto DROP;\r
}\r
\r
- Checksum = (UINT16) (~NetbufChecksum (Packet));\r
+ Checksum = (UINT16)(~NetbufChecksum (Packet));\r
if ((Icmp.Checksum != 0) && (Checksum != 0)) {\r
goto DROP;\r
}\r
\r
if (mIcmpClass[Icmp.Type].IcmpClass == ICMP_ERROR_MESSAGE) {\r
return Ip4ProcessIcmpError (IpSb, Head, Packet);\r
-\r
} else if (mIcmpClass[Icmp.Type].IcmpClass == ICMP_QUERY_MESSAGE) {\r
return Ip4ProcessIcmpQuery (IpSb, Head, Packet);\r
-\r
}\r
\r
DROP:\r