From 2e9e12c3d737a851ae651d7bbfe440b60ff2e0fc Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Tue, 28 May 2013 18:26:34 +0200 Subject: [PATCH] Add more sanity checks and logging to DAD --- src/ra.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ra.c b/src/ra.c index c572c13..7d1ded0 100644 --- a/src/ra.c +++ b/src/ra.c @@ -18,9 +18,11 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -165,7 +167,8 @@ bool ra_rtnl_process(void) struct in6_addr *addr = NULL; if (NLMSG_PAYLOAD(nh, 0) < sizeof(*ifa) || ifa->ifa_index != if_index || (nh->nlmsg_type == RTM_NEWADDR && !(ifa->ifa_flags & IFA_F_DADFAILED)) || - (nh->nlmsg_type == RTM_DELADDR && !(ifa->ifa_flags & IFA_F_TENTATIVE))) + (nh->nlmsg_type == RTM_DELADDR && !(ifa->ifa_flags & IFA_F_TENTATIVE)) || + (nh->nlmsg_type != RTM_NEWADDR && nh->nlmsg_type != RTM_DELADDR)) continue; ssize_t alen = NLMSG_PAYLOAD(nh, sizeof(*ifa)); @@ -174,8 +177,13 @@ bool ra_rtnl_process(void) if (rta->rta_type == IFA_ADDRESS && RTA_PAYLOAD(rta) >= sizeof(*addr)) addr = RTA_DATA(rta); - if (addr) + if (addr) { + char ipbuf[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, addr, ipbuf, sizeof(ipbuf)); + syslog(LOG_WARNING, "duplicate address detected: %s (code: %u:%x)", + ipbuf, (unsigned)nh->nlmsg_type, (unsigned)ifa->ifa_flags); found |= ra_deduplicate(addr, ifa->ifa_prefixlen); + } } } return found; -- 2.25.1