]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Ip6Dxe/Ip6Nd.c
BaseTools/Capsule: Do not support -o with --dump-info
[mirror_edk2.git] / NetworkPkg / Ip6Dxe / Ip6Nd.c
index 4bcf1a6d44a3a118c11b19cdb0a2ae006edf9cea..e4132ff4c8cf4aa813e4b59ff597cfa18ac66d06 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 - 2018, 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
@@ -198,7 +198,7 @@ Ip6CreatePrefixListEntry (
   LIST_ENTRY                *Entry;\r
   IP6_PREFIX_LIST_ENTRY     *TmpPrefixEntry;\r
 \r
-  if (Prefix == NULL || PreferredLifetime > ValidLifetime || PrefixLength >= IP6_PREFIX_NUM) {\r
+  if (Prefix == NULL || PreferredLifetime > ValidLifetime || PrefixLength > IP6_PREFIX_MAX) {\r
     return NULL;\r
   }\r
 \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,6 +821,7 @@ Ip6OnDADFinished (
   UINT16                    OptBuf[4];\r
   EFI_DHCP6_PACKET_OPTION   *Oro;\r
   EFI_DHCP6_RETRANSMISSION  InfoReqReXmit;\r
+  EFI_IPv6_ADDRESS          AllNodes;\r
 \r
   IpSb     = IpIf->Service;\r
   AddrInfo = DadEntry->AddressInfo;\r
@@ -852,9 +853,9 @@ Ip6OnDADFinished (
         // with DNS SERVERS.\r
         //\r
         Oro         = (EFI_DHCP6_PACKET_OPTION *) OptBuf;\r
-        Oro->OpCode = HTONS (IP6_CONFIG_DHCP6_OPTION_ORO);\r
+        Oro->OpCode = HTONS (DHCP6_OPT_ORO);\r
         Oro->OpLen  = HTONS (2);\r
-        *((UINT16 *) &Oro->Data[0]) = HTONS (IP6_CONFIG_DHCP6_OPTION_DNS_SERVERS);\r
+        *((UINT16 *) &Oro->Data[0]) = HTONS (DHCP6_OPT_DNS_SERVERS);\r
 \r
         InfoReqReXmit.Irt = 4;\r
         InfoReqReXmit.Mrc = 64;\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
@@ -976,6 +982,13 @@ Ip6InitDADProcess (
   NET_CHECK_SIGNATURE (IpIf, IP6_INTERFACE_SIGNATURE);\r
   ASSERT (AddressInfo != NULL);\r
 \r
+  //\r
+  // Do nothing if we have already started DAD on the address.\r
+  //\r
+  if (Ip6FindDADEntry (IpIf->Service, &AddressInfo->Address, NULL) != NULL) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
   Status   = EFI_SUCCESS;\r
   IpSb     = IpIf->Service;\r
   DadXmits = &IpSb->Ip6ConfigInstance.DadXmits;\r
@@ -1571,16 +1584,6 @@ Ip6ProcessNeighborSolicit (
   if (IsDAD && !IsMaintained) {\r
     DupAddrDetect = Ip6FindDADEntry (IpSb, &Target, &IpIf);\r
     if (DupAddrDetect != NULL) {\r
-      if (DupAddrDetect->Transmit == 0) {\r
-        //\r
-        // The NS is from another node to performing DAD on the same address since\r
-        // we haven't send out any NS yet. Fail DAD for the tentative address.\r
-        //\r
-        Ip6OnDADFinished (FALSE, IpIf, DupAddrDetect);\r
-        Status = EFI_ICMP_ERROR;\r
-        goto Exit;\r
-      }\r
-\r
       //\r
       // Check the MAC address of the incoming packet.\r
       //\r
@@ -2857,7 +2860,7 @@ Ip6NdFasterTimerTicking (
           //\r
           Flag = FALSE;\r
           if ((DupAddrDetect->Receive == 0) ||\r
-              (DupAddrDetect->Transmit == DupAddrDetect->Receive)) {\r
+              (DupAddrDetect->Transmit <= DupAddrDetect->Receive)) {\r
             Flag = TRUE;\r
           }\r
 \r