]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Workaround NetBSD-7 sending an invalid bcast address in RTM_NEWADDR
authorRoy Marples <roy@marples.name>
Fri, 17 Aug 2018 16:29:30 +0000 (17:29 +0100)
committerRoy Marples <roy@marples.name>
Fri, 17 Aug 2018 16:29:30 +0000 (17:29 +0100)
src/if-bsd.c

index c3c95ba6b054e447a547ac69fa7a2ccd9bf6cf43..477dfd6bf58425278da675aa56fa7d442f59c8dc 100644 (file)
@@ -1103,9 +1103,32 @@ if_ifa(struct dhcpcd_ctx *ctx, const struct ifa_msghdr *ifam)
                sin = (const void *)rti_info[RTAX_NETMASK];
                mask.s_addr = sin != NULL && sin->sin_family == AF_INET ?
                    sin->sin_addr.s_addr : INADDR_ANY;
+
+#if defined(__NetBSD_Version__) && __NetBSD_Version__ < 800000000
+               /* NetBSD-7 and older send an invalid broadcast address.
+                * So we need to query the actual address to get
+                * the right one. */
+               {
+                       struct in_aliasreq ifra;
+
+                       memset(&ifra, 0, sizeof(ifra));
+                       strlcpy(ifra.ifra_name, ifp->name,
+                           sizeof(ifra.ifra_name));
+                       ifra.ifra_addr.sin_family = AF_INET;
+                       ifra.ifra_addr.sin_len = sizeof(ifra.ifra_addr);
+                       ifra.ifra_addr.sin_addr = addr;
+                       if (ioctl(ctx->pf_inet_fd, SIOCGIFALIAS, &ifra) == -1) {
+                               if (errno != EADDRNOTAVAIL)
+                                       logerr("%s: SIOCGIFALIAS", __func__);
+                               break;
+                       }
+                       bcast = ifra.ifra_broadaddr.sin_addr;
+               }
+#else
                sin = (const void *)rti_info[RTAX_BRD];
                bcast.s_addr = sin != NULL && sin->sin_family == AF_INET ?
                    sin->sin_addr.s_addr : INADDR_ANY;
+#endif
 
 #if defined(__FreeBSD__) || defined(__DragonFly__)
                /* FreeBSD sends RTM_DELADDR for each assigned address