]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Ip6Dxe/Ip6Nd.c
Fix an issue that execute "map -r" in UEFI shell cannot reinstate iSCSI session with...
[mirror_edk2.git] / NetworkPkg / Ip6Dxe / Ip6Nd.c
index 47ef74be52a866f3eec7ac40d3197745b959f37c..9f30f9b20e05545d5d640bf607ec0bdec9359dc3 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Implementation of Neighbor Discovery support routines.\r
 \r
-  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2012, 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
@@ -261,7 +261,7 @@ Ip6CreatePrefixListEntry (
 }\r
 \r
 /**\r
-  Destory a IP6 prefix list entry.\r
+  Destroy a IP6 prefix list entry.\r
 \r
   @param[in]  IpSb              The pointer to IP6_SERVICE instance.\r
   @param[in]  PrefixEntry       The to be destroyed prefix list entry.\r
@@ -821,7 +821,8 @@ Ip6OnDADFinished (
   UINT16                    OptBuf[4];\r
   EFI_DHCP6_PACKET_OPTION   *Oro;\r
   EFI_DHCP6_RETRANSMISSION  InfoReqReXmit;\r
-\r
+  EFI_IPv6_ADDRESS          AllNodes;\r
+  \r
   IpSb     = IpIf->Service;\r
   AddrInfo = DadEntry->AddressInfo;\r
 \r
@@ -922,6 +923,11 @@ Ip6OnDADFinished (
     RemoveEntryList (&DadEntry->Link);\r
     FreePool (DadEntry);\r
     //\r
+    // Leave link-scope all-nodes multicast address (FF02::1)\r
+    //\r
+    Ip6SetToAllNodeMulticast (FALSE, IP6_LINK_LOCAL_SCOPE, &AllNodes);\r
+    Ip6LeaveGroup (IpSb, &AllNodes);\r
+    //\r
     // Disable IP operation since link-local address is a duplicate address.\r
     //\r
     IpSb->LinkLocalDadFail = TRUE;\r
@@ -1497,13 +1503,16 @@ Ip6ProcessNeighborSolicit (
     goto Exit;\r
   } else {\r
     OptionLen = (UINT16) (Head->PayloadLength - IP6_ND_LENGTH);\r
-    Option    = NetbufGetByte (Packet, IP6_ND_LENGTH, NULL);\r
+    if (OptionLen != 0) {\r
+      Option    = NetbufGetByte (Packet, IP6_ND_LENGTH, NULL);\r
+      ASSERT (Option != NULL);\r
 \r
-    //\r
-    // All included options should have a length that is greater than zero.\r
-    //\r
-    if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
-      goto Exit;\r
+      //\r
+      // All included options should have a length that is greater than zero.\r
+      //\r
+      if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
+        goto Exit;\r
+      }\r
     }\r
   }\r
 \r
@@ -1733,13 +1742,16 @@ Ip6ProcessNeighborAdvertise (
     goto Exit;\r
   } else {\r
     OptionLen = (UINT16) (Head->PayloadLength - IP6_ND_LENGTH);\r
-    Option    = NetbufGetByte (Packet, IP6_ND_LENGTH, NULL);\r
+    if (OptionLen != 0) {\r
+      Option    = NetbufGetByte (Packet, IP6_ND_LENGTH, NULL);\r
+      ASSERT (Option != NULL);\r
 \r
-    //\r
-    // All included options should have a length that is greater than zero.\r
-    //\r
-    if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
-      goto Exit;\r
+      //\r
+      // All included options should have a length that is greater than zero.\r
+      //\r
+      if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
+        goto Exit;\r
+      }\r
     }\r
   }\r
 \r
@@ -1982,10 +1994,13 @@ Ip6ProcessRouterAdvertise (
   // All included options have a length that is greater than zero.\r
   //\r
   OptionLen = (UINT16) (Head->PayloadLength - IP6_RA_LENGTH);\r
-  Option    = NetbufGetByte (Packet, IP6_RA_LENGTH, NULL);\r
+  if (OptionLen != 0) {\r
+    Option    = NetbufGetByte (Packet, IP6_RA_LENGTH, NULL);\r
+    ASSERT (Option != NULL);\r
 \r
-  if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
-    goto Exit;\r
+    if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
+      goto Exit;\r
+    }\r
   }\r
 \r
   //\r
@@ -2428,10 +2443,13 @@ Ip6ProcessRedirect (
   // All included options have a length that is greater than zero.\r
   //\r
   OptionLen = (UINT16) (Head->PayloadLength - IP6_REDITECT_LENGTH);\r
-  Option    = NetbufGetByte (Packet, IP6_REDITECT_LENGTH, NULL);\r
+  if (OptionLen != 0) {\r
+    Option    = NetbufGetByte (Packet, IP6_REDITECT_LENGTH, NULL);\r
+    ASSERT (Option != NULL);\r
 \r
-  if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
-    goto Exit;\r
+    if (!Ip6IsNDOptionValid (Option, OptionLen)) {\r
+      goto Exit;\r
+    }\r
   }\r
 \r
   Target   = (EFI_IPv6_ADDRESS *) (Icmp + 1);\r