summaryrefslogtreecommitdiffstats
path: root/if-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2015-05-01 09:41:54 +0000
committerRoy Marples <roy@marples.name>2015-05-01 09:41:54 +0000
commitd686aa4f7d4a3cbdc58a27633a65e66abbbde9c0 (patch)
treea56bea469128d9d548a37bb0cf32c0cd4f3a5d8b /if-bsd.c
parent741b689fd2206fd4f1ae9424a5b16a53070de0fb (diff)
downloaddhcpcd-d686aa4f7d4a3cbdc58a27633a65e66abbbde9c0.tar.xz
Support IN_IFF_TENTATIVE and IN_IFF_DUPLICATED on NetBSD.
Diffstat (limited to 'if-bsd.c')
-rw-r--r--if-bsd.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/if-bsd.c b/if-bsd.c
index 775c857d..ac9b6ec9 100644
--- a/if-bsd.c
+++ b/if-bsd.c
@@ -713,6 +713,33 @@ if_initrt(struct interface *ifp)
free(buf);
return 0;
}
+
+int
+if_addrflags(const struct in_addr *addr, const struct interface *ifp)
+{
+#ifdef SIOCGIFAFLAG_IN
+ int s, flags;
+ struct ifreq ifr;
+ struct sockaddr_in *sin;
+
+ s = socket(PF_INET, SOCK_DGRAM, 0);
+ flags = -1;
+ if (s != -1) {
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name));
+ sin = (struct sockaddr_in *)(void *)&ifr.ifr_addr;
+ sin->sin_family = AF_INET;
+ sin->sin_addr = *addr;
+ if (ioctl(s, SIOCGIFAFLAG_IN, &ifr) != -1)
+ flags = ifr.ifr_addrflags;
+ close(s);
+ }
+ return flags;
+#else
+ errno = ENOTSUP;
+ return 0;
+#endif
+}
#endif
#ifdef INET6
@@ -1127,6 +1154,8 @@ if_managelink(struct dhcpcd_ctx *ctx)
struct rt6 rt6;
struct in6_addr ia6, net6;
struct sockaddr_in6 *sin6;
+#endif
+#if (defined(INET) && defined(IN_IFF_TENTATIVE)) || defined(INET6)
int ifa_flags;
#endif
@@ -1261,9 +1290,15 @@ if_managelink(struct dhcpcd_ctx *ctx)
COPYOUT(rt.dest, rti_info[RTAX_IFA]);
COPYOUT(rt.net, rti_info[RTAX_NETMASK]);
COPYOUT(rt.gate, rti_info[RTAX_BRD]);
+ if (rtm->rtm_type == RTM_NEWADDR) {
+ ifa_flags = if_addrflags(&rt.dest, ifp);
+ if (ifa_flags == -1)
+ break;
+ } else
+ ifa_flags = 0;
ipv4_handleifa(ctx, rtm->rtm_type,
NULL, ifp->name,
- &rt.dest, &rt.net, &rt.gate);
+ &rt.dest, &rt.net, &rt.gate, ifa_flags);
break;
#endif
#ifdef INET6