summaryrefslogtreecommitdiffstats
path: root/ipv6rs.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2013-06-09 08:37:01 +0000
committerRoy Marples <roy@marples.name>2013-06-09 08:37:01 +0000
commita824f281824cd66f7e9149c17e2b38c2ad8a315e (patch)
treea683a6461bacb364dff69a6e784d31dc98e1ed41 /ipv6rs.c
parentd5690e937bb0b6c4f451d3248ee66f4a1460e17c (diff)
downloaddhcpcd-a824f281824cd66f7e9149c17e2b38c2ad8a315e.tar.xz
Only wait for DAD to complete for RA addresses marked for autoconf.
Thanks to Jayce Lee.
Diffstat (limited to 'ipv6rs.c')
-rw-r--r--ipv6rs.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/ipv6rs.c b/ipv6rs.c
index 5652cd47..0ce4d985 100644
--- a/ipv6rs.c
+++ b/ipv6rs.c
@@ -414,7 +414,9 @@ ipv6rs_scriptrun(struct ra *rap)
/* If all addresses have completed DAD run the script */
TAILQ_FOREACH(ap, &rap->addrs, next) {
- if (ap->flags & IPV6_AF_ONLINK) {
+ if ((ap->flags & (IPV6_AF_ONLINK | IPV6_AF_AUTOCONF)) ==
+ (IPV6_AF_ONLINK | IPV6_AF_AUTOCONF))
+ {
if (!(ap->flags & IPV6_AF_DADCOMPLETED) &&
ipv6_findaddr(ap->iface, &ap->addr))
ap->flags |= IPV6_AF_DADCOMPLETED;
@@ -486,7 +488,9 @@ ipv6rs_dadcallback(void *arg)
continue;
wascompleted = 1;
TAILQ_FOREACH(rapap, &rap->addrs, next) {
- if ((rapap->flags & IPV6_AF_DADCOMPLETED) == 0){
+ if (rapap->flags & IPV6_AF_AUTOCONF &&
+ (rapap->flags & IPV6_AF_DADCOMPLETED) == 0)
+ {
wascompleted = 0;
break;
}
@@ -755,7 +759,7 @@ ipv6rs_handledata(__unused void *arg)
break;
}
ap->iface = rap->iface;
- ap->flags = IPV6_AF_NEW | IPV6_AF_AUTOCONF;
+ ap->flags = IPV6_AF_NEW;
ap->prefix_len = pi->nd_opt_pi_prefix_len;
memcpy(ap->prefix.s6_addr,
pi->nd_opt_pi_prefix.s6_addr,
@@ -763,6 +767,7 @@ ipv6rs_handledata(__unused void *arg)
if (pi->nd_opt_pi_flags_reserved &
ND_OPT_PI_FLAG_AUTO)
{
+ ap->flags |= IPV6_AF_AUTOCONF;
ipv6_makeaddr(&ap->addr, ifp,
&ap->prefix,
pi->nd_opt_pi_prefix_len);