]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Ip6Dxe/Ip6Icmp.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / NetworkPkg / Ip6Dxe / Ip6Icmp.c
index f6a9bb406f7f54641049ed09249657b6ae9b131a..a0e4d25db774c7f857f0ee8c88d61756b2f5d1b5 100644 (file)
@@ -1,23 +1,16 @@
 /** @file\r
   The ICMPv6 handle routines to process the ICMPv6 control messages.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
   (C) Copyright 2016 Hewlett Packard Enterprise Development LP<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 "Ip6Impl.h"\r
 \r
-EFI_IP6_ICMP_TYPE mIp6SupportedIcmp[23] = {\r
-\r
+EFI_IP6_ICMP_TYPE  mIp6SupportedIcmp[23] = {\r
   {\r
     ICMP_V6_DEST_UNREACHABLE,\r
     ICMP_V6_NO_ROUTE_TO_DEST\r
@@ -133,15 +126,15 @@ EFI_IP6_ICMP_TYPE mIp6SupportedIcmp[23] = {
 **/\r
 EFI_STATUS\r
 Ip6IcmpReplyEcho (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN EFI_IP6_HEADER         *Head,\r
-  IN NET_BUF                *Packet\r
+  IN IP6_SERVICE     *IpSb,\r
+  IN EFI_IP6_HEADER  *Head,\r
+  IN NET_BUF         *Packet\r
   )\r
 {\r
-  IP6_ICMP_INFORMATION_HEAD *Icmp;\r
-  NET_BUF                   *Data;\r
-  EFI_STATUS                Status;\r
-  EFI_IP6_HEADER            ReplyHead;\r
+  IP6_ICMP_INFORMATION_HEAD  *Icmp;\r
+  NET_BUF                    *Data;\r
+  EFI_STATUS                 Status;\r
+  EFI_IP6_HEADER             ReplyHead;\r
 \r
   Status = EFI_OUT_OF_RESOURCES;\r
   //\r
@@ -159,7 +152,7 @@ Ip6IcmpReplyEcho (
   // use specific destination. See RFC1122. SRR/RR option\r
   // update is omitted.\r
   //\r
-  Icmp = (IP6_ICMP_INFORMATION_HEAD *) NetbufGetByte (Data, 0, NULL);\r
+  Icmp = (IP6_ICMP_INFORMATION_HEAD *)NetbufGetByte (Data, 0, NULL);\r
   if (Icmp == NULL) {\r
     NetbufFree (Data);\r
     goto Exit;\r
@@ -175,9 +168,9 @@ Ip6IcmpReplyEcho (
   //\r
   ZeroMem (&ReplyHead, sizeof (EFI_IP6_HEADER));\r
 \r
-  ReplyHead.PayloadLength  = HTONS ((UINT16) (Packet->TotalSize));\r
-  ReplyHead.NextHeader     = IP6_ICMP;\r
-  ReplyHead.HopLimit       = IpSb->CurHopLimit;\r
+  ReplyHead.PayloadLength = HTONS ((UINT16)(Packet->TotalSize));\r
+  ReplyHead.NextHeader    = IP6_ICMP;\r
+  ReplyHead.HopLimit      = IpSb->CurHopLimit;\r
   IP6_COPY_ADDRESS (&ReplyHead.DestinationAddress, &Head->SourceAddress);\r
 \r
   if (Ip6IsOneOfSetAddress (IpSb, &Head->DestinationAddress, NULL, NULL)) {\r
@@ -224,17 +217,17 @@ Exit:
 **/\r
 EFI_STATUS\r
 Ip6ProcessPacketTooBig (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN EFI_IP6_HEADER         *Head,\r
-  IN NET_BUF                *Packet\r
+  IN IP6_SERVICE     *IpSb,\r
+  IN EFI_IP6_HEADER  *Head,\r
+  IN NET_BUF         *Packet\r
   )\r
 {\r
-  IP6_ICMP_ERROR_HEAD       Icmp;\r
-  UINT32                    Mtu;\r
-  IP6_ROUTE_ENTRY           *RouteEntry;\r
-  EFI_IPv6_ADDRESS          *DestAddress;\r
+  IP6_ICMP_ERROR_HEAD  Icmp;\r
+  UINT32               Mtu;\r
+  IP6_ROUTE_ENTRY      *RouteEntry;\r
+  EFI_IPv6_ADDRESS     *DestAddress;\r
 \r
-  NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+  NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
   Mtu         = NTOHL (Icmp.Fourth);\r
   DestAddress = &Icmp.IpHead.DestinationAddress;\r
 \r
@@ -286,12 +279,12 @@ Ip6ProcessPacketTooBig (
 **/\r
 EFI_STATUS\r
 Ip6ProcessIcmpError (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN EFI_IP6_HEADER         *Head,\r
-  IN NET_BUF                *Packet\r
+  IN IP6_SERVICE     *IpSb,\r
+  IN EFI_IP6_HEADER  *Head,\r
+  IN NET_BUF         *Packet\r
   )\r
 {\r
-  IP6_ICMP_ERROR_HEAD       Icmp;\r
+  IP6_ICMP_ERROR_HEAD  Icmp;\r
 \r
   //\r
   // Check the validity of the packet\r
@@ -300,13 +293,13 @@ Ip6ProcessIcmpError (
     goto DROP;\r
   }\r
 \r
-  NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+  NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
   if (Icmp.Head.Type == ICMP_V6_PACKET_TOO_BIG) {\r
     return Ip6ProcessPacketTooBig (IpSb, Head, Packet);\r
   }\r
 \r
   //\r
-  // Notify the upper-layer process that an ICMPv6 eror message is received.\r
+  // Notify the upper-layer process that an ICMPv6 error message is received.\r
   //\r
   IP6_GET_CLIP_INFO (Packet)->Status = EFI_ICMP_ERROR;\r
   return Ip6Demultiplex (IpSb, Head, Packet);\r
@@ -335,55 +328,56 @@ DROP:
 **/\r
 EFI_STATUS\r
 Ip6ProcessIcmpInformation (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN EFI_IP6_HEADER         *Head,\r
-  IN NET_BUF                *Packet\r
+  IN IP6_SERVICE     *IpSb,\r
+  IN EFI_IP6_HEADER  *Head,\r
+  IN NET_BUF         *Packet\r
   )\r
 {\r
-  IP6_ICMP_INFORMATION_HEAD Icmp;\r
-  EFI_STATUS                Status;\r
+  IP6_ICMP_INFORMATION_HEAD  Icmp;\r
+  EFI_STATUS                 Status;\r
 \r
   NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
   NET_CHECK_SIGNATURE (Packet, NET_BUF_SIGNATURE);\r
   ASSERT (Head != NULL);\r
 \r
-  NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+  NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
   Status = EFI_INVALID_PARAMETER;\r
 \r
   switch (Icmp.Head.Type) {\r
-  case ICMP_V6_ECHO_REQUEST:\r
-    //\r
-    // If ICMPv6 echo, reply it\r
-    //\r
-    if (Icmp.Head.Code == 0) {\r
-      Status = Ip6IcmpReplyEcho (IpSb, Head, Packet);\r
-    }\r
-    break;\r
-  case ICMP_V6_LISTENER_QUERY:\r
-    Status = Ip6ProcessMldQuery (IpSb, Head, Packet);\r
-    break;\r
-  case ICMP_V6_LISTENER_REPORT:\r
-  case ICMP_V6_LISTENER_REPORT_2:\r
-    Status = Ip6ProcessMldReport (IpSb, Head, Packet);\r
-    break;\r
-  case ICMP_V6_NEIGHBOR_SOLICIT:\r
-    Status = Ip6ProcessNeighborSolicit (IpSb, Head, Packet);\r
-    break;\r
-  case ICMP_V6_NEIGHBOR_ADVERTISE:\r
-    Status = Ip6ProcessNeighborAdvertise (IpSb, Head, Packet);\r
-    break;\r
-  case ICMP_V6_ROUTER_ADVERTISE:\r
-    Status = Ip6ProcessRouterAdvertise (IpSb, Head, Packet);\r
-    break;\r
-  case ICMP_V6_REDIRECT:\r
-    Status = Ip6ProcessRedirect (IpSb, Head, Packet);\r
-    break;\r
-  case ICMP_V6_ECHO_REPLY:\r
-    Status = Ip6Demultiplex (IpSb, Head, Packet);\r
-    break;\r
-  default:\r
-    Status = EFI_INVALID_PARAMETER;\r
-    break;\r
+    case ICMP_V6_ECHO_REQUEST:\r
+      //\r
+      // If ICMPv6 echo, reply it\r
+      //\r
+      if (Icmp.Head.Code == 0) {\r
+        Status = Ip6IcmpReplyEcho (IpSb, Head, Packet);\r
+      }\r
+\r
+      break;\r
+    case ICMP_V6_LISTENER_QUERY:\r
+      Status = Ip6ProcessMldQuery (IpSb, Head, Packet);\r
+      break;\r
+    case ICMP_V6_LISTENER_REPORT:\r
+    case ICMP_V6_LISTENER_REPORT_2:\r
+      Status = Ip6ProcessMldReport (IpSb, Head, Packet);\r
+      break;\r
+    case ICMP_V6_NEIGHBOR_SOLICIT:\r
+      Status = Ip6ProcessNeighborSolicit (IpSb, Head, Packet);\r
+      break;\r
+    case ICMP_V6_NEIGHBOR_ADVERTISE:\r
+      Status = Ip6ProcessNeighborAdvertise (IpSb, Head, Packet);\r
+      break;\r
+    case ICMP_V6_ROUTER_ADVERTISE:\r
+      Status = Ip6ProcessRouterAdvertise (IpSb, Head, Packet);\r
+      break;\r
+    case ICMP_V6_REDIRECT:\r
+      Status = Ip6ProcessRedirect (IpSb, Head, Packet);\r
+      break;\r
+    case ICMP_V6_ECHO_REPLY:\r
+      Status = Ip6Demultiplex (IpSb, Head, Packet);\r
+      break;\r
+    default:\r
+      Status = EFI_INVALID_PARAMETER;\r
+      break;\r
   }\r
 \r
   return Status;\r
@@ -399,21 +393,21 @@ Ip6ProcessIcmpInformation (
   @param[in]  Packet             The content of the ICMPv6 packet with IP head\r
                                  removed.\r
 \r
-  @retval EFI_INVALID_PARAMETER  The packet is malformated.\r
+  @retval EFI_INVALID_PARAMETER  The packet is malformatted.\r
   @retval EFI_SUCCESS            The ICMPv6 message successfully processed.\r
   @retval Others                 Failed to handle the ICMPv6 packet.\r
 \r
 **/\r
 EFI_STATUS\r
 Ip6IcmpHandle (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN EFI_IP6_HEADER         *Head,\r
-  IN NET_BUF                *Packet\r
+  IN IP6_SERVICE     *IpSb,\r
+  IN EFI_IP6_HEADER  *Head,\r
+  IN NET_BUF         *Packet\r
   )\r
 {\r
-  IP6_ICMP_HEAD             Icmp;\r
-  UINT16                    PseudoCheckSum;\r
-  UINT16                    CheckSum;\r
+  IP6_ICMP_HEAD  Icmp;\r
+  UINT16         PseudoCheckSum;\r
+  UINT16         CheckSum;\r
 \r
   //\r
   // Check the validity of the incoming packet.\r
@@ -422,7 +416,7 @@ Ip6IcmpHandle (
     goto DROP;\r
   }\r
 \r
-  NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *) &Icmp);\r
+  NetbufCopy (Packet, 0, sizeof (Icmp), (UINT8 *)&Icmp);\r
 \r
   //\r
   // Make sure checksum is valid.\r
@@ -464,28 +458,28 @@ DROP:
 **/\r
 VOID\r
 Ip6GetPrefix (\r
-  IN     UINT8              PrefixLength,\r
-  IN OUT EFI_IPv6_ADDRESS   *Prefix\r
+  IN     UINT8             PrefixLength,\r
+  IN OUT EFI_IPv6_ADDRESS  *Prefix\r
   )\r
 {\r
-  UINT8                     Byte;\r
-  UINT8                     Bit;\r
-  UINT8                     Mask;\r
-  UINT8                     Value;\r
+  UINT8  Byte;\r
+  UINT8  Bit;\r
+  UINT8  Mask;\r
+  UINT8  Value;\r
 \r
-  ASSERT ((Prefix != NULL) && (PrefixLength < IP6_PREFIX_NUM));\r
+  ASSERT ((Prefix != NULL) && (PrefixLength < IP6_PREFIX_MAX));\r
 \r
   if (PrefixLength == 0) {\r
     ZeroMem (Prefix, sizeof (EFI_IPv6_ADDRESS));\r
-    return ;\r
+    return;\r
   }\r
 \r
-  if (PrefixLength >= IP6_PREFIX_NUM - 1) {\r
-    return ;\r
+  if (PrefixLength >= IP6_PREFIX_MAX) {\r
+    return;\r
   }\r
 \r
-  Byte  = (UINT8) (PrefixLength / 8);\r
-  Bit   = (UINT8) (PrefixLength % 8);\r
+  Byte  = (UINT8)(PrefixLength / 8);\r
+  Bit   = (UINT8)(PrefixLength % 8);\r
   Value = Prefix->Addr[Byte];\r
 \r
   if (Byte > 0) {\r
@@ -493,10 +487,9 @@ Ip6GetPrefix (
   }\r
 \r
   if (Bit > 0) {\r
-    Mask = (UINT8) (0xFF << (8 - Bit));\r
-    Prefix->Addr[Byte] = (UINT8) (Value & Mask);\r
+    Mask               = (UINT8)(0xFF << (8 - Bit));\r
+    Prefix->Addr[Byte] = (UINT8)(Value & Mask);\r
   }\r
-\r
 }\r
 \r
 /**\r
@@ -511,13 +504,13 @@ Ip6GetPrefix (
 **/\r
 BOOLEAN\r
 Ip6IsAnycast (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN EFI_IPv6_ADDRESS       *DestinationAddress\r
+  IN IP6_SERVICE       *IpSb,\r
+  IN EFI_IPv6_ADDRESS  *DestinationAddress\r
   )\r
 {\r
-  IP6_PREFIX_LIST_ENTRY     *PrefixEntry;\r
-  EFI_IPv6_ADDRESS          Prefix;\r
-  BOOLEAN                   Flag;\r
+  IP6_PREFIX_LIST_ENTRY  *PrefixEntry;\r
+  EFI_IPv6_ADDRESS       Prefix;\r
+  BOOLEAN                Flag;\r
 \r
   ZeroMem (&Prefix, sizeof (EFI_IPv6_ADDRESS));\r
 \r
@@ -560,7 +553,7 @@ Ip6IsAnycast (
   @param[in]  Pointer            If not NULL, identifies the octet offset within\r
                                  the invoking packet where the error was detected.\r
 \r
-  @retval EFI_INVALID_PARAMETER  The packet is malformated.\r
+  @retval EFI_INVALID_PARAMETER  The packet is malformatted.\r
   @retval EFI_OUT_OF_RESOURCES   There is no sufficient resource to complete the\r
                                  operation.\r
   @retval EFI_SUCCESS            The ICMPv6 message was successfully sent out.\r
@@ -569,21 +562,21 @@ Ip6IsAnycast (
 **/\r
 EFI_STATUS\r
 Ip6SendIcmpError (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN NET_BUF                *Packet,\r
-  IN EFI_IPv6_ADDRESS       *SourceAddress       OPTIONAL,\r
-  IN EFI_IPv6_ADDRESS       *DestinationAddress,\r
-  IN UINT8                  Type,\r
-  IN UINT8                  Code,\r
-  IN UINT32                 *Pointer             OPTIONAL\r
+  IN IP6_SERVICE       *IpSb,\r
+  IN NET_BUF           *Packet,\r
+  IN EFI_IPv6_ADDRESS  *SourceAddress       OPTIONAL,\r
+  IN EFI_IPv6_ADDRESS  *DestinationAddress,\r
+  IN UINT8             Type,\r
+  IN UINT8             Code,\r
+  IN UINT32            *Pointer             OPTIONAL\r
   )\r
 {\r
-  UINT32                    PacketLen;\r
-  NET_BUF                   *ErrorMsg;\r
-  UINT16                    PayloadLen;\r
-  EFI_IP6_HEADER            Head;\r
-  IP6_ICMP_INFORMATION_HEAD *IcmpHead;\r
-  UINT8                     *ErrorBody;\r
+  UINT32                     PacketLen;\r
+  NET_BUF                    *ErrorMsg;\r
+  UINT16                     PayloadLen;\r
+  EFI_IP6_HEADER             Head;\r
+  IP6_ICMP_INFORMATION_HEAD  *IcmpHead;\r
+  UINT8                      *ErrorBody;\r
 \r
   if (DestinationAddress == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -598,24 +591,25 @@ Ip6SendIcmpError (
   if (NetIp6IsUnspecifiedAddr (DestinationAddress) ||\r
       IP6_IS_MULTICAST (DestinationAddress)        ||\r
       Ip6IsAnycast (IpSb, DestinationAddress)\r
-      ) {\r
+      )\r
+  {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   switch (Type) {\r
-  case ICMP_V6_DEST_UNREACHABLE:\r
-  case ICMP_V6_TIME_EXCEEDED:\r
-    break;\r
+    case ICMP_V6_DEST_UNREACHABLE:\r
+    case ICMP_V6_TIME_EXCEEDED:\r
+      break;\r
 \r
-  case ICMP_V6_PARAMETER_PROBLEM:\r
-    if (Pointer == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
+    case ICMP_V6_PARAMETER_PROBLEM:\r
+      if (Pointer == NULL) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
 \r
-    break;\r
+      break;\r
 \r
-  default:\r
-    return EFI_INVALID_PARAMETER;\r
+    default:\r
+      return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   PacketLen = sizeof (IP6_ICMP_ERROR_HEAD) + Packet->TotalSize;\r
@@ -629,16 +623,16 @@ Ip6SendIcmpError (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  PayloadLen = (UINT16) (PacketLen - sizeof (EFI_IP6_HEADER));\r
+  PayloadLen = (UINT16)(PacketLen - sizeof (EFI_IP6_HEADER));\r
 \r
   //\r
   // Create the basic IPv6 header.\r
   //\r
   ZeroMem (&Head, sizeof (EFI_IP6_HEADER));\r
 \r
-  Head.PayloadLength  = HTONS (PayloadLen);\r
-  Head.NextHeader     = IP6_ICMP;\r
-  Head.HopLimit       = IpSb->CurHopLimit;\r
+  Head.PayloadLength = HTONS (PayloadLen);\r
+  Head.NextHeader    = IP6_ICMP;\r
+  Head.HopLimit      = IpSb->CurHopLimit;\r
 \r
   if (SourceAddress != NULL) {\r
     IP6_COPY_ADDRESS (&Head.SourceAddress, SourceAddress);\r
@@ -653,7 +647,7 @@ Ip6SendIcmpError (
   //\r
   // Fill in the ICMP error message head\r
   //\r
-  IcmpHead = (IP6_ICMP_INFORMATION_HEAD *) NetbufAllocSpace (ErrorMsg, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);\r
+  IcmpHead = (IP6_ICMP_INFORMATION_HEAD *)NetbufAllocSpace (ErrorMsg, sizeof (IP6_ICMP_INFORMATION_HEAD), FALSE);\r
   if (IcmpHead == NULL) {\r
     NetbufFree (ErrorMsg);\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -671,7 +665,7 @@ Ip6SendIcmpError (
   // Fill in the ICMP error message body\r
   //\r
   PayloadLen -= sizeof (IP6_ICMP_INFORMATION_HEAD);\r
-  ErrorBody =  NetbufAllocSpace (ErrorMsg, PayloadLen, FALSE);\r
+  ErrorBody   =  NetbufAllocSpace (ErrorMsg, PayloadLen, FALSE);\r
   if (ErrorBody != NULL) {\r
     ZeroMem (ErrorBody, PayloadLen);\r
     NetbufCopy (Packet, 0, PayloadLen, ErrorBody);\r
@@ -682,4 +676,3 @@ Ip6SendIcmpError (
   //\r
   return Ip6Output (IpSb, NULL, NULL, ErrorMsg, &Head, NULL, 0, Ip6SysPacketSent, NULL);\r
 }\r
-\r