changeset 4961:cd7f5f9ed3cb draft

FreeBSD: Support hardware address randomisation
author Roy Marples <roy@marples.name>
date Wed, 15 Jan 2020 15:49:23 +0000
parents cf298b786d8c
children 854219946ad4
files src/if-bsd.c
diffstat 1 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/if-bsd.c	Wed Jan 15 15:48:27 2020 +0000
+++ b/src/if-bsd.c	Wed Jan 15 15:49:23 2020 +0000
@@ -217,6 +217,7 @@
 	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 @@
 	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_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