summaryrefslogtreecommitdiffstats
path: root/net.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2010-08-04 06:44:56 +0000
committerRoy Marples <roy@marples.name>2010-08-04 06:44:56 +0000
commit462822d2815fb74dff1a90651965d7ba5ea46c65 (patch)
treef958282db66eb4cae66868438035e278e1c66445 /net.c
parent2aa893f8f42bebc591f758052d88467efa2242d8 (diff)
downloaddhcpcd-462822d2815fb74dff1a90651965d7ba5ea46c65.tar.xz
Use the active link layer address if supported.
Diffstat (limited to 'net.c')
-rw-r--r--net.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/net.c b/net.c
index 09719ba2..31b8c9a6 100644
--- a/net.c
+++ b/net.c
@@ -322,6 +322,15 @@ discover_interfaces(int argc, char * const *argv)
#endif
#ifdef AF_LINK
const struct sockaddr_dl *sdl;
+#ifdef IFLR_ACTIVE
+ struct if_laddrreq iflr;
+ int socket_aflink;
+
+ socket_aflink = socket(AF_LINK, SOCK_DGRAM, 0);
+ if (socket_aflink == -1)
+ return NULL;
+ memset(&iflr, 0, sizeof(iflr));
+#endif
#elif AF_PACKET
const struct sockaddr_ll *sll;
#endif
@@ -409,6 +418,23 @@ discover_interfaces(int argc, char * const *argv)
} else if (ifa->ifa_addr != NULL) {
#ifdef AF_LINK
sdl = (const struct sockaddr_dl *)(void *)ifa->ifa_addr;
+
+#ifdef IFLR_ACTIVE
+ /* We need to check for active address */
+ strlcpy(iflr.iflr_name, ifp->name,
+ sizeof(iflr.iflr_name));
+ memcpy(&iflr.addr, ifa->ifa_addr,
+ MIN(ifa->ifa_addr->sa_len, sizeof(iflr.addr)));
+ iflr.flags = IFLR_PREFIX;
+ iflr.prefixlen = sdl->sdl_alen * NBBY;
+ if (ioctl(socket_aflink, SIOCGLIFADDR, &iflr) == -1 ||
+ !(iflr.flags & IFLR_ACTIVE))
+ {
+ free_interface(ifp);
+ continue;
+ }
+#endif
+
switch(sdl->sdl_type) {
case IFT_ETHER:
ifp->family = ARPHRD_ETHER;
@@ -464,6 +490,11 @@ discover_interfaces(int argc, char * const *argv)
ifl = ifp;
}
freeifaddrs(ifaddrs);
+
+#ifdef IFLR_ACTIVE
+ close(socket_aflink);
+#endif
+
return ifs;
}