/** @file\r
\r
-Copyright (c) 2005 - 2006, Intel Corporation.<BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\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
{ICMP_ECHO_REQUEST, ICMP_DEFAULT_CODE },\r
\r
{ICMP_TIME_EXCEEDED, ICMP_TIMEOUT_IN_TRANSIT },\r
- {ICMP_TIME_EXCEEDED, ICMp_TIMEOUT_REASSEMBLE },\r
+ {ICMP_TIME_EXCEEDED, ICMP_TIMEOUT_REASSEMBLE },\r
\r
{ICMP_PARAMETER_PROBLEM, ICMP_DEFAULT_CODE },\r
};\r
/**\r
Process the ICMP redirect. Find the instance then update\r
its route cache.\r
- \r
+\r
All kinds of redirect is treated as host redirect as\r
specified by RFC1122 3.3.1.2:\r
"Since the subnet mask appropriate to the destination\r
message SHOULD be treated identically to a Host Redirect\r
message;"\r
\r
- @param[in] IpSb The IP4 service binding instance that received \r
+ @param[in] IpSb The IP4 service binding instance that received\r
the packet.\r
@param[in] Head The IP head of the received ICMPpacket.\r
@param[in] Packet The content of the ICMP redirect packet with IP\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
- CacheEntry = Ip4FindRouteCache (\r
- Ip4Instance->RouteTable,\r
- NTOHL (Icmp->IpHead.Dst),\r
- NTOHL (Icmp->IpHead.Src)\r
- );\r
+ Dst = NTOHL (Icmp->IpHead.Dst);\r
+ Src = NTOHL (Icmp->IpHead.Src);\r
+ CacheEntry = Ip4FindRouteCache (Ip4Instance->RouteTable, Dst, Src);\r
\r
//\r
// Only update the route cache's gateway if the source of the\r
update call Ip4ProcessIcmpRedirect to update the IP instance's\r
route cache, otherwise, deliver the packet to upper layer.\r
\r
- @param[in] IpSb The IP service that received the packet.\r
- @param[in] Head The IP head of the ICMP error packet\r
- @param[in] Packet The content of the ICMP error with IP head\r
+ @param[in] IpSb The IP4 service that received the packet.\r
+ @param[in] Head The IP4 head of the ICMP error packet\r
+ @param[in] Packet The content of the ICMP error with IP4 head\r
removed.\r
\r
@retval EFI_SUCCESS The ICMP error is processed successfully.\r
@retval EFI_INVALID_PARAMETER The packet is invalid\r
@retval Others Failed to process the packet.\r
- \r
+\r
**/\r
EFI_STATUS\r
Ip4ProcessIcmpError (\r
}\r
\r
IP4_GET_CLIP_INFO (Packet)->Status = EFI_ICMP_ERROR;\r
- return Ip4Demultiplex (IpSb, Head, Packet);\r
+ return Ip4Demultiplex (IpSb, Head, Packet, NULL, 0);\r
}\r
\r
\r
/**\r
Replay an ICMP echo request.\r
\r
- @param[in] IpSb The IP service that receivd the packet\r
- @param[in] Head The IP head of the ICMP error packet\r
- @param[in] Packet The content of the ICMP error with IP head\r
+ @param[in] IpSb The IP4 service that receivd the packet\r
+ @param[in] Head The IP4 head of the ICMP error packet\r
+ @param[in] Packet The content of the ICMP error with IP4 head\r
removed.\r
\r
@retval EFI_OUT_OF_RESOURCES Failed to allocate resource.\r
// update is omitted.\r
//\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
ReplyHead.Tos = 0;\r
ReplyHead.Fragment = 0;\r
ReplyHead.Ttl = 64;\r
- ReplyHead.Protocol = IP4_PROTO_ICMP;\r
+ ReplyHead.Protocol = EFI_IP_PROTO_ICMP;\r
ReplyHead.Src = 0;\r
\r
//\r
Ip4SysPacketSent,\r
NULL\r
);\r
+ if (EFI_ERROR (Status)) {\r
+ NetbufFree (Data);\r
+ }\r
\r
ON_EXIT:\r
NetbufFree (Packet);\r
Process the ICMP query message. If it is an ICMP echo\r
request, answer it. Otherwise deliver it to upper layer.\r
\r
- @param[in] IpSb The IP service that receivd the packet\r
- @param[in] Head The IP head of the ICMP query packet\r
- @param[in] Packet The content of the ICMP query with IP head\r
+ @param[in] IpSb The IP4 service that receivd the packet\r
+ @param[in] Head The IP4 head of the ICMP query packet\r
+ @param[in] Packet The content of the ICMP query with IP4 head\r
removed.\r
\r
@retval EFI_INVALID_PARAMETER The packet is invalid\r
return Ip4IcmpReplyEcho (IpSb, Head, Packet);\r
}\r
\r
- return Ip4Demultiplex (IpSb, Head, Packet);\r
+ return Ip4Demultiplex (IpSb, Head, Packet, NULL, 0);\r
}\r
\r
\r
then according to the message types, process it as query or\r
error packet.\r
\r
- @param[in] IpSb The IP service that receivd the packet\r
- @param[in] Head The IP head of the ICMP query packet\r
- @param[in] Packet The content of the ICMP query with IP head\r
+ @param[in] IpSb The IP4 service that receivd the packet.\r
+ @param[in] Head The IP4 head of the ICMP query packet.\r
+ @param[in] Packet The content of the ICMP query with IP4 head\r
removed.\r
\r
@retval EFI_INVALID_PARAMETER The packet is malformated.\r