diff options
| author | Roy Marples <roy@marples.name> | 2020-01-15 15:49:23 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2020-01-15 15:49:23 +0000 |
| commit | ab11ade311692253a038a3afceb3fec2b9d5f0bf (patch) | |
| tree | d18757b055ff9aa065c4b40bb13901eb035272e8 /src/if-bsd.c | |
| parent | c003fd8cff645876bd5b8116aee0170d0ed478ae (diff) | |
| download | dhcpcd-ab11ade311692253a038a3afceb3fec2b9d5f0bf.tar.xz | |
FreeBSD: Support hardware address randomisation
Diffstat (limited to 'src/if-bsd.c')
| -rw-r--r-- | src/if-bsd.c | 20 |
1 files changed, 17 insertions, 3 deletions
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 |
