From: Roy Marples Date: Wed, 15 Jan 2020 15:49:23 +0000 (+0000) Subject: FreeBSD: Support hardware address randomisation X-Git-Tag: v9.0.0~118 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e332edfb99bb4976bca6190f7bdd4d173c08e76;p=thirdparty%2Fdhcpcd.git FreeBSD: Support hardware address randomisation --- diff --git a/src/if-bsd.c b/src/if-bsd.c index f44988ac..599bdf05 100644 --- a/src/if-bsd.c +++ b/src/if-bsd.c @@ -217,6 +217,7 @@ if_closesockets_os(struct dhcpcd_ctx *ctx) ctx->priv = NULL; } +#ifdef SIOCALIFADDR /*NetBSD */ static int if_ioctllink(struct dhcpcd_ctx *ctx, unsigned long req, void *data, size_t len) { @@ -237,19 +238,22 @@ if_ioctllink(struct dhcpcd_ctx *ctx, unsigned long req, void *data, size_t len) close(s); return retval; } +#endif int if_setmac(struct interface *ifp, void *mac, uint8_t maclen) { - struct if_laddrreq iflr = { .flags = IFLR_ACTIVE }; - struct sockaddr_dl *sdl = satosdl(&iflr.addr); - int retval; if (ifp->hwlen != maclen) { errno = EINVAL; return -1; } +#ifdef SIOCALIFADDR /*NetBSD */ + struct if_laddrreq iflr = { .flags = IFLR_ACTIVE }; + struct sockaddr_dl *sdl = satosdl(&iflr.addr); + int retval; + strlcpy(iflr.iflr_name, ifp->name, sizeof(iflr.iflr_name)); sdl->sdl_family = AF_LINK; sdl->sdl_len = sizeof(*sdl); @@ -262,6 +266,16 @@ if_setmac(struct interface *ifp, void *mac, uint8_t maclen) if_ioctllink(ifp->ctx, SIOCDLIFADDR, &iflr, sizeof(iflr)); return retval; +#else + struct ifreq ifr = { + .ifr_addr.sa_family = AF_LINK, + .ifr_addr.sa_len = maclen, + }; + + strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name)); + memcpy(ifr.ifr_addr.sa_data, mac, maclen); + return if_ioctl(ifp->ctx, SIOCSIFLLADDR, &ifr, sizeof(ifr)); +#endif } static bool