summaryrefslogtreecommitdiff
path: root/src/ra.c
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2013-05-31 15:45:42 +0200
committerSteven Barth <steven@midlink.org>2013-05-31 15:45:42 +0200
commit56920baef21f23307c3df9719914e75fe729e0b8 (patch)
tree3968792939f93077d477b5ec1550d1dab61fb647 /src/ra.c
parentcf2c1eec0dcd49c0b838a97a1e21e712a83b4320 (diff)
downloadodhcp6c-56920baef21f23307c3df9719914e75fe729e0b8.tar.gz
Work around false-positive DAD-hits
Diffstat (limited to 'src/ra.c')
-rw-r--r--src/ra.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/ra.c b/src/ra.c
index 24c99c5..1b2f729 100644
--- a/src/ra.c
+++ b/src/ra.c
@@ -155,12 +155,16 @@ static bool ra_deduplicate(const struct in6_addr *any, uint8_t length)
bool ra_rtnl_process(void)
{
bool found = false;
+ uint32_t elapsed = odhcp6c_elapsed();
uint8_t buf[8192];
while (true) {
ssize_t len = recv(rtnl_sock, buf, sizeof(buf), MSG_DONTWAIT);
if (len < 0)
break;
+ if (elapsed > 10)
+ continue;
+
for (struct nlmsghdr *nh = (struct nlmsghdr*)buf; NLMSG_OK(nh, (size_t)len);
nh = NLMSG_NEXT(nh, len)) {
struct ifaddrmsg *ifa = NLMSG_DATA(nh);
@@ -197,7 +201,6 @@ bool ra_process(void)
struct nd_router_advert *adv = (struct nd_router_advert*)buf;
struct odhcp6c_entry entry = {IN6ADDR_ANY_INIT, 0, 0, IN6ADDR_ANY_INIT, 0, 0};
const struct in6_addr any = IN6ADDR_ANY_INIT;
- odhcp6c_expire();
while (true) {
struct sockaddr_in6 from;
@@ -214,7 +217,10 @@ bool ra_process(void)
rs_attempt = 0;
}
- found = true;
+ if (!found) {
+ odhcp6c_expire();
+ found = true;
+ }
uint32_t router_valid = ntohs(adv->nd_ra_router_lifetime);
// Parse default route
@@ -308,6 +314,8 @@ bool ra_process(void)
entry[i].valid = router_valid;
}
- odhcp6c_expire();
+ if (found)
+ odhcp6c_expire();
+
return found;
}