summaryrefslogtreecommitdiffstats
path: root/src/if-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-01-15 15:49:23 +0000
committerRoy Marples <roy@marples.name>2020-01-15 15:49:23 +0000
commitab11ade311692253a038a3afceb3fec2b9d5f0bf (patch)
treed18757b055ff9aa065c4b40bb13901eb035272e8 /src/if-bsd.c
parentc003fd8cff645876bd5b8116aee0170d0ed478ae (diff)
downloaddhcpcd-ab11ade311692253a038a3afceb3fec2b9d5f0bf.tar.xz
FreeBSD: Support hardware address randomisation
Diffstat (limited to 'src/if-bsd.c')
-rw-r--r--src/if-bsd.c20
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