]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c
Remove duplicate DAD entry in IP6 driver to fix DAD fail issue.
[mirror_edk2.git] / NetworkPkg / Ip6Dxe / Ip6ConfigImpl.c
index 9a1e3d076f6a021829a8b28310a5ae828fca7be3..75d4f23fb003068d78e8584deb3b60eee0a4b889 100644 (file)
@@ -52,7 +52,8 @@ Ip6ConfigOnPolicyChanged (
   LIST_ENTRY      *Next;\r
   IP6_INTERFACE   *IpIf;\r
   IP6_DAD_ENTRY   *DadEntry;\r
-\r
+  IP6_DELAY_JOIN_LIST       *DelayNode;\r
+  \r
   //\r
   // Currently there are only two policies: Manual and Automatic. Regardless of\r
   // what transition is going on, i.e., Manual -> Automatic and Automatic ->\r
@@ -94,10 +95,18 @@ Ip6ConfigOnPolicyChanged (
 \r
   NET_LIST_FOR_EACH (Entry, &IpSb->Interfaces) {\r
     //\r
-    // remove all pending DAD entries for the global addresses.\r
+    // remove all pending delay node and DAD entries for the global addresses.\r
     //\r
     IpIf = NET_LIST_USER_STRUCT_S (Entry, IP6_INTERFACE, Link, IP6_INTERFACE_SIGNATURE);\r
 \r
+    NET_LIST_FOR_EACH_SAFE (Entry2, Next, &IpIf->DelayJoinList) {\r
+      DelayNode = NET_LIST_USER_STRUCT (Entry2, IP6_DELAY_JOIN_LIST, Link);\r
+      if (!NetIp6IsLinkLocalAddr (&DelayNode->AddressInfo->Address)) {\r
+        RemoveEntryList (&DelayNode->Link);\r
+        FreePool (DelayNode);\r
+      }\r
+    }\r
+\r
     NET_LIST_FOR_EACH_SAFE (Entry2, Next, &IpIf->DupAddrDetectList) {\r
       DadEntry = NET_LIST_USER_STRUCT_S (Entry2, IP6_DAD_ENTRY, Link, IP6_DAD_ENTRY_SIGNATURE);\r
 \r