]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Use the active link layer address if supported.
authorRoy Marples <roy@marples.name>
Wed, 4 Aug 2010 06:44:56 +0000 (06:44 +0000)
committerRoy Marples <roy@marples.name>
Wed, 4 Aug 2010 06:44:56 +0000 (06:44 +0000)
net.c

diff --git a/net.c b/net.c
index 09719ba213d2155daa148fd1bf4e44c4b9f8d5c2..31b8c9a6b2e9000bcfc5df915afb282c5a2770cf 100644 (file)
--- 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;
 }