]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Ip6Dxe/Ip6Output.c
OvmfPkg: raise DXEFV size to 13 MB in the traditional platform FDFs
[mirror_edk2.git] / NetworkPkg / Ip6Dxe / Ip6Output.c
index ecbaf2d94ca9014f5fe1cbb2c81972673c9f6721..9a100f1c720cd80d4156694d10cb321c96d2573f 100644 (file)
@@ -1,21 +1,15 @@
 /** @file\r
   The internal functions and routines to transmit the IP6 packet.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<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
-UINT32 mIp6Id;\r
+UINT32  mIp6Id;\r
 \r
 /**\r
   Output all the available source addresses to a list entry head SourceList. The\r
@@ -23,7 +17,7 @@ UINT32 mIp6Id;
 \r
   @param[in]       IpSb             Points to an IP6 service binding instance.\r
   @param[out]      SourceList       The list entry head of all source addresses.\r
-                                    It is the caller's responsiblity to free the\r
+                                    It is the caller's responsibility to free the\r
                                     resources.\r
   @param[out]      SourceCount      The number of source addresses.\r
 \r
@@ -34,16 +28,16 @@ UINT32 mIp6Id;
 **/\r
 EFI_STATUS\r
 Ip6CandidateSource (\r
-  IN IP6_SERVICE            *IpSb,\r
-  OUT LIST_ENTRY            *SourceList,\r
-  OUT UINT32                *SourceCount\r
+  IN IP6_SERVICE  *IpSb,\r
+  OUT LIST_ENTRY  *SourceList,\r
+  OUT UINT32      *SourceCount\r
   )\r
 {\r
-  IP6_INTERFACE             *IpIf;\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *Entry2;\r
-  IP6_ADDRESS_INFO          *AddrInfo;\r
-  IP6_ADDRESS_INFO          *Copy;\r
+  IP6_INTERFACE     *IpIf;\r
+  LIST_ENTRY        *Entry;\r
+  LIST_ENTRY        *Entry2;\r
+  IP6_ADDRESS_INFO  *AddrInfo;\r
+  IP6_ADDRESS_INFO  *Copy;\r
 \r
   *SourceCount = 0;\r
 \r
@@ -53,12 +47,12 @@ Ip6CandidateSource (
       return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
-    Copy->Signature         = IP6_ADDR_INFO_SIGNATURE;\r
+    Copy->Signature = IP6_ADDR_INFO_SIGNATURE;\r
     IP6_COPY_ADDRESS (&Copy->Address, &IpSb->LinkLocalAddr);\r
     Copy->IsAnycast         = FALSE;\r
     Copy->PrefixLength      = IP6_LINK_LOCAL_PREFIX_LENGTH;\r
-    Copy->ValidLifetime     = (UINT32) IP6_INFINIT_LIFETIME;\r
-    Copy->PreferredLifetime = (UINT32) IP6_INFINIT_LIFETIME;\r
+    Copy->ValidLifetime     = (UINT32)IP6_INFINIT_LIFETIME;\r
+    Copy->PreferredLifetime = (UINT32)IP6_INFINIT_LIFETIME;\r
 \r
     InsertTailList (SourceList, &Copy->Link);\r
     (*SourceCount)++;\r
@@ -91,7 +85,7 @@ Ip6CandidateSource (
 }\r
 \r
 /**\r
-  Caculate how many bits are the same between two IPv6 addresses.\r
+  Calculate how many bits are the same between two IPv6 addresses.\r
 \r
   @param[in]       AddressA         Points to an IPv6 address.\r
   @param[in]       AddressB         Points to another IPv6 address.\r
@@ -101,15 +95,15 @@ Ip6CandidateSource (
 **/\r
 UINT8\r
 Ip6CommonPrefixLen (\r
-  IN EFI_IPv6_ADDRESS       *AddressA,\r
-  IN EFI_IPv6_ADDRESS       *AddressB\r
+  IN EFI_IPv6_ADDRESS  *AddressA,\r
+  IN EFI_IPv6_ADDRESS  *AddressB\r
   )\r
 {\r
-  UINT8                     Count;\r
-  UINT8                     Index;\r
-  UINT8                     ByteA;\r
-  UINT8                     ByteB;\r
-  UINT8                     NumBits;\r
+  UINT8  Count;\r
+  UINT8  Index;\r
+  UINT8  ByteA;\r
+  UINT8  ByteB;\r
+  UINT8  NumBits;\r
 \r
   Count = 0;\r
   Index = 0;\r
@@ -128,14 +122,14 @@ Ip6CommonPrefixLen (
     // Check how many bits are common between the two bytes.\r
     //\r
     NumBits = 8;\r
-    ByteA   = (UINT8) (ByteA ^ ByteB);\r
+    ByteA   = (UINT8)(ByteA ^ ByteB);\r
 \r
     while (ByteA != 0) {\r
       NumBits--;\r
-      ByteA = (UINT8) (ByteA >> 1);\r
+      ByteA = (UINT8)(ByteA >> 1);\r
     }\r
 \r
-    return (UINT8) (Count + NumBits);\r
+    return (UINT8)(Count + NumBits);\r
   }\r
 \r
   return Count;\r
@@ -157,21 +151,21 @@ Ip6CommonPrefixLen (
 **/\r
 EFI_STATUS\r
 Ip6SelectSourceAddress (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN EFI_IPv6_ADDRESS       *Destination,\r
-  OUT EFI_IPv6_ADDRESS      *Source\r
+  IN IP6_SERVICE        *IpSb,\r
+  IN EFI_IPv6_ADDRESS   *Destination,\r
+  OUT EFI_IPv6_ADDRESS  *Source\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  LIST_ENTRY                SourceList;\r
-  UINT32                    SourceCount;\r
-  UINT8                     ScopeD;\r
-  LIST_ENTRY                *Entry;\r
-  IP6_ADDRESS_INFO          *AddrInfo;\r
-  IP6_PREFIX_LIST_ENTRY     *Prefix;\r
-  UINT8                     LastCommonLength;\r
-  UINT8                     CurrentCommonLength;\r
-  EFI_IPv6_ADDRESS          *TmpAddress;\r
+  EFI_STATUS             Status;\r
+  LIST_ENTRY             SourceList;\r
+  UINT32                 SourceCount;\r
+  UINT8                  ScopeD;\r
+  LIST_ENTRY             *Entry;\r
+  IP6_ADDRESS_INFO       *AddrInfo;\r
+  IP6_PREFIX_LIST_ENTRY  *Prefix;\r
+  UINT8                  LastCommonLength;\r
+  UINT8                  CurrentCommonLength;\r
+  EFI_IPv6_ADDRESS       *TmpAddress;\r
 \r
   NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
 \r
@@ -194,7 +188,7 @@ Ip6SelectSourceAddress (
   // Rule 2: Prefer appropriate scope.\r
   //\r
   if (IP6_IS_MULTICAST (Destination)) {\r
-    ScopeD = (UINT8) (Destination->Addr[1] >> 4);\r
+    ScopeD = (UINT8)(Destination->Addr[1] >> 4);\r
   } else if (NetIp6IsLinkLocalAddr (Destination)) {\r
     ScopeD = 0x2;\r
   } else {\r
@@ -290,15 +284,15 @@ Exit:
 **/\r
 IP6_INTERFACE *\r
 Ip6SelectInterface (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN EFI_IPv6_ADDRESS       *Destination,\r
-  IN OUT EFI_IPv6_ADDRESS   *Source\r
+  IN IP6_SERVICE           *IpSb,\r
+  IN EFI_IPv6_ADDRESS      *Destination,\r
+  IN OUT EFI_IPv6_ADDRESS  *Source\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  EFI_IPv6_ADDRESS          SelectedSource;\r
-  IP6_INTERFACE             *IpIf;\r
-  BOOLEAN                   Exist;\r
+  EFI_STATUS        Status;\r
+  EFI_IPv6_ADDRESS  SelectedSource;\r
+  IP6_INTERFACE     *IpIf;\r
+  BOOLEAN           Exist;\r
 \r
   NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
   ASSERT (Destination != NULL && Source != NULL);\r
@@ -341,10 +335,10 @@ Ip6SelectInterface (
 **/\r
 VOID\r
 Ip6SysPacketSent (\r
-  NET_BUF                   *Packet,\r
-  EFI_STATUS                IoStatus,\r
-  UINT32                    LinkFlag,\r
-  VOID                      *Context\r
+  NET_BUF     *Packet,\r
+  EFI_STATUS  IoStatus,\r
+  UINT32      LinkFlag,\r
+  VOID        *Context\r
   )\r
 {\r
   NetbufFree (Packet);\r
@@ -364,35 +358,37 @@ Ip6SysPacketSent (
   @param[in]  LastHeader       The pointer of next header of last extension header.\r
   @param[in]  HeadLen          The length of the unfragmented part of the IP6 header.\r
 \r
-  @retval EFI_BAD_BUFFER_SIZE  There is no enought room in the head space of\r
+  @retval EFI_BAD_BUFFER_SIZE  There is no enough room in the head space of\r
                                Packet.\r
   @retval EFI_SUCCESS          The operation performed successfully.\r
 \r
 **/\r
 EFI_STATUS\r
 Ip6PrependHead (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN NET_BUF                *Packet,\r
-  IN EFI_IP6_HEADER         *Head,\r
-  IN UINT16                 FragmentOffset,\r
-  IN UINT8                  *ExtHdrs,\r
-  IN UINT32                 ExtHdrsLen,\r
-  IN UINT8                  LastHeader,\r
-  IN UINT32                 HeadLen\r
+  IN IP6_SERVICE     *IpSb,\r
+  IN NET_BUF         *Packet,\r
+  IN EFI_IP6_HEADER  *Head,\r
+  IN UINT16          FragmentOffset,\r
+  IN UINT8           *ExtHdrs,\r
+  IN UINT32          ExtHdrsLen,\r
+  IN UINT8           LastHeader,\r
+  IN UINT32          HeadLen\r
   )\r
 {\r
-  UINT32                    Len;\r
-  UINT32                    UnFragExtHdrsLen;\r
-  EFI_IP6_HEADER            *PacketHead;\r
-  UINT8                     *UpdatedExtHdrs;\r
-  EFI_STATUS                Status;\r
-  UINT8                     NextHeader;\r
+  UINT32          Len;\r
+  UINT32          UnFragExtHdrsLen;\r
+  EFI_IP6_HEADER  *PacketHead;\r
+  UINT8           *UpdatedExtHdrs;\r
+  EFI_STATUS      Status;\r
+  UINT8           NextHeader;\r
+\r
+  UpdatedExtHdrs = NULL;\r
 \r
   //\r
   // HeadLen is the length of the fixed part of the sequences of fragments, i.e.\r
   // the unfragment part.\r
   //\r
-  PacketHead = (EFI_IP6_HEADER *) NetbufAllocSpace (Packet, HeadLen, NET_BUF_HEAD);\r
+  PacketHead = (EFI_IP6_HEADER *)NetbufAllocSpace (Packet, HeadLen, NET_BUF_HEAD);\r
   if (PacketHead == NULL) {\r
     return EFI_BAD_BUFFER_SIZE;\r
   }\r
@@ -401,7 +397,7 @@ Ip6PrependHead (
   // Set the head up, convert the host byte order to network byte order\r
   //\r
   CopyMem (PacketHead, Head, sizeof (EFI_IP6_HEADER));\r
-  PacketHead->PayloadLength = HTONS ((UINT16) (Packet->TotalSize - sizeof (EFI_IP6_HEADER)));\r
+  PacketHead->PayloadLength = HTONS ((UINT16)(Packet->TotalSize - sizeof (EFI_IP6_HEADER)));\r
   Packet->Ip.Ip6            = PacketHead;\r
 \r
   Len              = HeadLen - sizeof (EFI_IP6_HEADER);\r
@@ -435,7 +431,7 @@ Ip6PrependHead (
   }\r
 \r
   CopyMem (\r
-    (UINT8 *) (PacketHead + 1),\r
+    (UINT8 *)(PacketHead + 1),\r
     UpdatedExtHdrs,\r
     UnFragExtHdrsLen + sizeof (IP6_FRAGMENT_HEADER)\r
     );\r
@@ -478,52 +474,52 @@ Ip6PrependHead (
 **/\r
 EFI_STATUS\r
 Ip6Output (\r
-  IN IP6_SERVICE            *IpSb,\r
-  IN IP6_INTERFACE          *Interface   OPTIONAL,\r
-  IN IP6_PROTOCOL           *IpInstance  OPTIONAL,\r
-  IN NET_BUF                *Packet,\r
-  IN EFI_IP6_HEADER         *Head,\r
-  IN UINT8                  *ExtHdrs,\r
-  IN UINT32                 ExtHdrsLen,\r
-  IN IP6_FRAME_CALLBACK     Callback,\r
-  IN VOID                   *Context\r
+  IN IP6_SERVICE         *IpSb,\r
+  IN IP6_INTERFACE       *Interface   OPTIONAL,\r
+  IN IP6_PROTOCOL        *IpInstance  OPTIONAL,\r
+  IN NET_BUF             *Packet,\r
+  IN EFI_IP6_HEADER      *Head,\r
+  IN UINT8               *ExtHdrs,\r
+  IN UINT32              ExtHdrsLen,\r
+  IN IP6_FRAME_CALLBACK  Callback,\r
+  IN VOID                *Context\r
   )\r
 {\r
-  IP6_INTERFACE             *IpIf;\r
-  EFI_IPv6_ADDRESS          NextHop;\r
-  IP6_NEIGHBOR_ENTRY        *NeighborCache;\r
-  IP6_ROUTE_CACHE_ENTRY     *RouteCache;\r
-  EFI_STATUS                Status;\r
-  UINT32                    Mtu;\r
-  UINT32                    HeadLen;\r
-  UINT16                    FragmentOffset;\r
-  UINT8                     *LastHeader;\r
-  UINT32                    UnFragmentLen;\r
-  UINT32                    UnFragmentHdrsLen;\r
-  UINT32                    FragmentHdrsLen;\r
-  UINT16                    *Checksum;\r
-  UINT16                    PacketChecksum;\r
-  UINT16                    PseudoChecksum;\r
-  UINT32                    Index;\r
-  UINT32                    PacketLen;\r
-  UINT32                    RealExtLen;\r
-  UINT32                    Offset;\r
-  NET_BUF                   *TmpPacket;\r
-  NET_BUF                   *Fragment;\r
-  UINT32                    Num;\r
-  UINT8                     *Buf;\r
-  EFI_IP6_HEADER            *PacketHead;\r
-  IP6_ICMP_HEAD             *IcmpHead;\r
-  IP6_TXTOKEN_WRAP          *Wrap;\r
-  IP6_ROUTE_ENTRY           *RouteEntry;\r
-  UINT8                     *UpdatedExtHdrs;\r
-  UINT8                     NextHeader;\r
-  UINT8                     LastHeaderBackup;\r
-  BOOLEAN                   FragmentHeadInserted;\r
-  UINT8                     *ExtHdrsBackup;\r
-  UINT8                     NextHeaderBackup;\r
-  EFI_IPv6_ADDRESS          Source;\r
-  EFI_IPv6_ADDRESS          Destination;\r
+  IP6_INTERFACE          *IpIf;\r
+  EFI_IPv6_ADDRESS       NextHop;\r
+  IP6_NEIGHBOR_ENTRY     *NeighborCache;\r
+  IP6_ROUTE_CACHE_ENTRY  *RouteCache;\r
+  EFI_STATUS             Status;\r
+  UINT32                 Mtu;\r
+  UINT32                 HeadLen;\r
+  UINT16                 FragmentOffset;\r
+  UINT8                  *LastHeader;\r
+  UINT32                 UnFragmentLen;\r
+  UINT32                 UnFragmentHdrsLen;\r
+  UINT32                 FragmentHdrsLen;\r
+  UINT16                 *Checksum;\r
+  UINT16                 PacketChecksum;\r
+  UINT16                 PseudoChecksum;\r
+  UINT32                 Index;\r
+  UINT32                 PacketLen;\r
+  UINT32                 RealExtLen;\r
+  UINT32                 Offset;\r
+  NET_BUF                *TmpPacket;\r
+  NET_BUF                *Fragment;\r
+  UINT32                 Num;\r
+  UINT8                  *Buf;\r
+  EFI_IP6_HEADER         *PacketHead;\r
+  IP6_ICMP_HEAD          *IcmpHead;\r
+  IP6_TXTOKEN_WRAP       *Wrap;\r
+  IP6_ROUTE_ENTRY        *RouteEntry;\r
+  UINT8                  *UpdatedExtHdrs;\r
+  UINT8                  NextHeader;\r
+  UINT8                  LastHeaderBackup;\r
+  BOOLEAN                FragmentHeadInserted;\r
+  UINT8                  *ExtHdrsBackup;\r
+  UINT8                  NextHeaderBackup;\r
+  EFI_IPv6_ADDRESS       Source;\r
+  EFI_IPv6_ADDRESS       Destination;\r
 \r
   NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
 \r
@@ -561,7 +557,7 @@ Ip6Output (
     // IpInstance->Interface is NULL when IpInstance is configured with both stationaddress\r
     // and destinationaddress is unspecified.\r
     //\r
-    if (IpInstance == NULL || IpInstance->Interface == NULL) {\r
+    if ((IpInstance == NULL) || (IpInstance->Interface == NULL)) {\r
       IpIf = Ip6SelectInterface (IpSb, &Head->DestinationAddress, &Head->SourceAddress);\r
       if (IpInstance != NULL) {\r
         IpInstance->Interface = IpIf;\r
@@ -582,43 +578,46 @@ Ip6Output (
   Head->TrafficClassL = 0;\r
   Head->TrafficClassH = 0;\r
 \r
-  Checksum            = NULL;\r
-  NextHeader          = *LastHeader;\r
+  Checksum   = NULL;\r
+  NextHeader = *LastHeader;\r
 \r
   switch (NextHeader) {\r
-  case EFI_IP_PROTO_UDP:\r
-    Packet->Udp = (EFI_UDP_HEADER *) NetbufGetByte (Packet, 0, NULL);\r
-    ASSERT (Packet->Udp != NULL);\r
-    if (Packet->Udp->Checksum == 0) {\r
-      Checksum = &Packet->Udp->Checksum;\r
-    }\r
-    break;\r
+    case EFI_IP_PROTO_UDP:\r
+      Packet->Udp = (EFI_UDP_HEADER *)NetbufGetByte (Packet, 0, NULL);\r
+      ASSERT (Packet->Udp != NULL);\r
+      if (Packet->Udp->Checksum == 0) {\r
+        Checksum = &Packet->Udp->Checksum;\r
+      }\r
 \r
-  case EFI_IP_PROTO_TCP:\r
-    Packet->Tcp = (TCP_HEAD *) NetbufGetByte (Packet, 0, NULL);\r
-    ASSERT (Packet->Tcp != NULL);\r
-    if (Packet->Tcp->Checksum == 0) {\r
-      Checksum = &Packet->Tcp->Checksum;\r
-    }\r
-    break;\r
+      break;\r
 \r
-  case IP6_ICMP:\r
-    //\r
-    // Don't send ICMP packet to an IPv6 anycast address.\r
-    //\r
-    if (Ip6IsAnycast (IpSb, &Head->DestinationAddress)) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
+    case EFI_IP_PROTO_TCP:\r
+      Packet->Tcp = (TCP_HEAD *)NetbufGetByte (Packet, 0, NULL);\r
+      ASSERT (Packet->Tcp != NULL);\r
+      if (Packet->Tcp->Checksum == 0) {\r
+        Checksum = &Packet->Tcp->Checksum;\r
+      }\r
 \r
-    IcmpHead = (IP6_ICMP_HEAD *) NetbufGetByte (Packet, 0, NULL);\r
-    ASSERT (IcmpHead != NULL);\r
-    if (IcmpHead->Checksum == 0) {\r
-      Checksum = &IcmpHead->Checksum;\r
-    }\r
-    break;\r
+      break;\r
+\r
+    case IP6_ICMP:\r
+      //\r
+      // Don't send ICMP packet to an IPv6 anycast address.\r
+      //\r
+      if (Ip6IsAnycast (IpSb, &Head->DestinationAddress)) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+\r
+      IcmpHead = (IP6_ICMP_HEAD *)NetbufGetByte (Packet, 0, NULL);\r
+      ASSERT (IcmpHead != NULL);\r
+      if (IcmpHead->Checksum == 0) {\r
+        Checksum = &IcmpHead->Checksum;\r
+      }\r
+\r
+      break;\r
 \r
-  default:\r
-    break;\r
+    default:\r
+      break;\r
   }\r
 \r
   if (Checksum != NULL) {\r
@@ -628,11 +627,11 @@ Ip6Output (
     //\r
     PacketChecksum = NetbufChecksum (Packet);\r
     PseudoChecksum = NetIp6PseudoHeadChecksum (\r
-                      &Head->SourceAddress,\r
-                      &Head->DestinationAddress,\r
-                      NextHeader,\r
-                      Packet->TotalSize\r
-                      );\r
+                       &Head->SourceAddress,\r
+                       &Head->DestinationAddress,\r
+                       NextHeader,\r
+                       Packet->TotalSize\r
+                       );\r
     *Checksum = (UINT16) ~NetAddChecksum (PacketChecksum, PseudoChecksum);\r
   }\r
 \r
@@ -647,7 +646,7 @@ Ip6Output (
              Context\r
              );\r
 \r
-  if (EFI_ERROR(Status)) {\r
+  if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
@@ -667,7 +666,8 @@ Ip6Output (
          &RealExtLen,\r
          &UnFragmentHdrsLen,\r
          NULL\r
-         )) {\r
+         ))\r
+  {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -689,13 +689,25 @@ Ip6Output (
     // For unicast packets, use a combination of the Destination Cache, the Prefix List\r
     // and the Default Router List to determine the IP address of the appropriate next hop.\r
     //\r
-    RouteCache = Ip6Route (IpSb, &Head->DestinationAddress, &Head->SourceAddress);\r
-    if (RouteCache == NULL) {\r
-      return EFI_NOT_FOUND;\r
-    }\r
 \r
-    IP6_COPY_ADDRESS (&NextHop, &RouteCache->NextHop);\r
-    Ip6FreeRouteCacheEntry (RouteCache);\r
+    NeighborCache = Ip6FindNeighborEntry (IpSb, &Head->DestinationAddress);\r
+    if (NeighborCache != NULL) {\r
+      //\r
+      // Hit Neighbor Cache.\r
+      //\r
+      IP6_COPY_ADDRESS (&NextHop, &Head->DestinationAddress);\r
+    } else {\r
+      //\r
+      // Not in Neighbor Cache, check Router cache\r
+      //\r
+      RouteCache = Ip6Route (IpSb, &Head->DestinationAddress, &Head->SourceAddress);\r
+      if (RouteCache == NULL) {\r
+        return EFI_NOT_FOUND;\r
+      }\r
+\r
+      IP6_COPY_ADDRESS (&NextHop, &RouteCache->NextHop);\r
+      Ip6FreeRouteCacheEntry (RouteCache);\r
+    }\r
   }\r
 \r
   //\r
@@ -712,7 +724,7 @@ Ip6Output (
       }\r
 \r
       //\r
-      // Send out multicast neighbor solicitation for address resolution immediatly.\r
+      // Send out multicast neighbor solicitation for address resolution immediately.\r
       //\r
       Ip6CreateSNMulticastAddr (&NeighborCache->Neighbor, &Destination);\r
       Status = Ip6SelectSourceAddress (IpSb, &NeighborCache->Neighbor, &Source);\r
@@ -754,7 +766,6 @@ Ip6Output (
                  );\r
   if (RouteEntry != NULL) {\r
     if ((RouteEntry->Flag & IP6_PACKET_TOO_BIG) == IP6_PACKET_TOO_BIG) {\r
-\r
       //\r
       // FragmentHead is inserted after Hop-by-Hop Options header, Destination\r
       // Options header (first occur), Routing header, and before Fragment header,\r
@@ -779,10 +790,10 @@ Ip6Output (
         Head->NextHeader = IP6_FRAGMENT;\r
       }\r
 \r
-      ExtHdrsBackup    = ExtHdrs;\r
-      ExtHdrs          = UpdatedExtHdrs;\r
-      ExtHdrsLen       = ExtHdrsLen + sizeof (IP6_FRAGMENT_HEADER);\r
-      RealExtLen       = RealExtLen + sizeof (IP6_FRAGMENT_HEADER);\r
+      ExtHdrsBackup = ExtHdrs;\r
+      ExtHdrs       = UpdatedExtHdrs;\r
+      ExtHdrsLen    = ExtHdrsLen + sizeof (IP6_FRAGMENT_HEADER);\r
+      RealExtLen    = RealExtLen + sizeof (IP6_FRAGMENT_HEADER);\r
 \r
       mIp6Id++;\r
 \r
@@ -795,7 +806,7 @@ Ip6Output (
   //\r
   // OK, selected the source and route, fragment the packet then send\r
   // them. Tag each fragment other than the first one as spawn from it.\r
-  // Each extension header is an integar multiple of 8 octets long, in\r
+  // Each extension header is an integer multiple of 8 octets long, in\r
   // order to retain 8-octet alignment for subsequent headers.\r
   //\r
   Mtu     = IpSb->MaxPacketSize + sizeof (EFI_IP6_HEADER);\r
@@ -862,7 +873,7 @@ Ip6Output (
 \r
     for (Index = 0, Offset = 0, PacketLen = Mtu; Index < Num; Index++) {\r
       //\r
-      // Get fragment from the Packet, append UnFragnmentLen spare buffer\r
+      // Get fragment from the Packet, append UnFragmentLen spare buffer\r
       // before the fragmented data, the corresponding data is filled in later.\r
       //\r
       Fragment = NetbufGetFragment (Packet, Offset, PacketLen, UnFragmentLen);\r
@@ -871,8 +882,8 @@ Ip6Output (
         goto Error;\r
       }\r
 \r
-      FragmentOffset = (UINT16) ((UINT16) Offset | 0x1);\r
-      if (Index == Num - 1){\r
+      FragmentOffset = (UINT16)((UINT16)Offset | 0x1);\r
+      if (Index == Num - 1) {\r
         //\r
         // The last fragment, clear the M flag.\r
         //\r
@@ -907,11 +918,11 @@ Ip6Output (
       // The last fragment of upper layer packet, update the IP6 token status.\r
       //\r
       if ((Index == Num -1) && (Context != NULL)) {\r
-        Wrap                = (IP6_TXTOKEN_WRAP *) Context;\r
+        Wrap                = (IP6_TXTOKEN_WRAP *)Context;\r
         Wrap->Token->Status = Status;\r
       }\r
 \r
-      Offset    += PacketLen;\r
+      Offset   += PacketLen;\r
       PacketLen = Packet->TotalSize - Offset;\r
       if (PacketLen > Mtu) {\r
         PacketLen = Mtu;\r
@@ -931,7 +942,7 @@ Ip6Output (
   //\r
   // Need not fragment the packet, send it in one frame.\r
   //\r
-  PacketHead = (EFI_IP6_HEADER *) NetbufAllocSpace (Packet, HeadLen, NET_BUF_HEAD);\r
+  PacketHead = (EFI_IP6_HEADER *)NetbufAllocSpace (Packet, HeadLen, NET_BUF_HEAD);\r
   if (PacketHead == NULL) {\r
     Status = EFI_BAD_BUFFER_SIZE;\r
     goto Error;\r
@@ -941,7 +952,7 @@ Ip6Output (
   Packet->Ip.Ip6 = PacketHead;\r
 \r
   if (ExtHdrs != NULL) {\r
-    Buf = (UINT8 *) (PacketHead + 1);\r
+    Buf = (UINT8 *)(PacketHead + 1);\r
     CopyMem (Buf, ExtHdrs, ExtHdrsLen);\r
   }\r
 \r
@@ -949,8 +960,8 @@ Ip6Output (
     //\r
     // A Fragment Header is inserted to the packet, update the payload length.\r
     //\r
-    PacketHead->PayloadLength = (UINT16) (NTOHS (PacketHead->PayloadLength) +\r
-                                sizeof (IP6_FRAGMENT_HEADER));\r
+    PacketHead->PayloadLength = (UINT16)(NTOHS (PacketHead->PayloadLength) +\r
+                                         sizeof (IP6_FRAGMENT_HEADER));\r
     PacketHead->PayloadLength = HTONS (PacketHead->PayloadLength);\r
     FreePool (UpdatedExtHdrs);\r
   }\r
@@ -968,6 +979,7 @@ Error:
   if (UpdatedExtHdrs != NULL) {\r
     FreePool (UpdatedExtHdrs);\r
   }\r
+\r
   Ip6CancelPacket (IpIf, Packet, Status);\r
   return Status;\r
 }\r
@@ -985,11 +997,11 @@ Error:
 **/\r
 BOOLEAN\r
 Ip6CancelPacketFragments (\r
-  IN IP6_LINK_TX_TOKEN   *Frame,\r
-  IN VOID                *Context\r
+  IN IP6_LINK_TX_TOKEN  *Frame,\r
+  IN VOID               *Context\r
   )\r
 {\r
-  if ((Frame->Packet == (NET_BUF *) Context) || (Frame->Context == Context)) {\r
+  if ((Frame->Packet == (NET_BUF *)Context) || (Frame->Context == Context)) {\r
     return TRUE;\r
   }\r
 \r
@@ -1010,18 +1022,18 @@ Ip6CancelPacketFragments (
 **/\r
 VOID\r
 Ip6CancelFrames (\r
-  IN IP6_INTERFACE          *Interface,\r
-  IN EFI_STATUS             IoStatus,\r
-  IN IP6_FRAME_TO_CANCEL    FrameToCancel   OPTIONAL,\r
-  IN VOID                   *Context        OPTIONAL\r
+  IN IP6_INTERFACE        *Interface,\r
+  IN EFI_STATUS           IoStatus,\r
+  IN IP6_FRAME_TO_CANCEL  FrameToCancel   OPTIONAL,\r
+  IN VOID                 *Context        OPTIONAL\r
   )\r
 {\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *Next;\r
-  IP6_LINK_TX_TOKEN         *Token;\r
-  IP6_SERVICE               *IpSb;\r
-  IP6_NEIGHBOR_ENTRY        *ArpQue;\r
-  EFI_STATUS                Status;\r
+  LIST_ENTRY          *Entry;\r
+  LIST_ENTRY          *Next;\r
+  IP6_LINK_TX_TOKEN   *Token;\r
+  IP6_SERVICE         *IpSb;\r
+  IP6_NEIGHBOR_ENTRY  *ArpQue;\r
+  EFI_STATUS          Status;\r
 \r
   IpSb = Interface->Service;\r
   NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
@@ -1067,11 +1079,10 @@ Ip6CancelFrames (
 **/\r
 VOID\r
 Ip6CancelPacket (\r
-  IN IP6_INTERFACE    *IpIf,\r
-  IN NET_BUF          *Packet,\r
-  IN EFI_STATUS       IoStatus\r
+  IN IP6_INTERFACE  *IpIf,\r
+  IN NET_BUF        *Packet,\r
+  IN EFI_STATUS     IoStatus\r
   )\r
 {\r
   Ip6CancelFrames (IpIf, IoStatus, Ip6CancelPacketFragments, Packet);\r
 }\r
-\r