summaryrefslogtreecommitdiffstats
path: root/src/privsep-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-01-15 14:28:24 +0000
committerRoy Marples <roy@marples.name>2020-01-15 14:28:24 +0000
commit68f04fa827830e894559ba42461d86e0d8bd7b47 (patch)
tree8bbadd0bf18d911402270bffeec30288a1635129 /src/privsep-bsd.c
parent727ac8afce72b12d9ace53928b2586f718d88392 (diff)
downloaddhcpcd-68f04fa827830e894559ba42461d86e0d8bd7b47.tar.xz
Implement Anonymity Profiles for DHCP Clients, RFC 7844
This works by randomising the hardware address when carrier is down and using this to construct a DUID LL which is used over any saved DUID. IAID is defaulted to zero and hostname + FQDN are disabled. Then every possible option is masked out except for essential ones. It's possible to request options *after* anonymous option which will enable it. This is RFC compliant and allows 100% flexability in letting the user decide what, if any, details leek out. This is disabled by default. Only works on NetBSD, other OS coming shortly.
Diffstat (limited to 'src/privsep-bsd.c')
-rw-r--r--src/privsep-bsd.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/privsep-bsd.c b/src/privsep-bsd.c
index d07d0e07..08093f97 100644
--- a/src/privsep-bsd.c
+++ b/src/privsep-bsd.c
@@ -36,11 +36,11 @@
#include "privsep.h"
static ssize_t
-ps_root_doioctl6(unsigned long req, void *data, size_t len)
+ps_root_doioctldom(int domain, unsigned long req, void *data, size_t len)
{
int s, err;
- s = socket(PF_INET6, SOCK_DGRAM, 0);
+ s = socket(domain, SOCK_DGRAM, 0);
if (s != -1)
err = ioctl(s, req, data, len);
else
@@ -74,8 +74,10 @@ ps_root_os(struct ps_msghdr *psm, struct msghdr *msg)
size_t len = iov->iov_len;
switch (psm->ps_cmd) {
+ case PS_IOCTLLINK:
+ return ps_root_doioctldom(PF_LINK, psm->ps_flags, data, len);
case PS_IOCTL6:
- return ps_root_doioctl6(psm->ps_flags, data, len);
+ return ps_root_doioctldom(PF_INET6, psm->ps_flags, data, len);
case PS_ROUTE:
return ps_root_doroute(data, len);
default:
@@ -84,17 +86,32 @@ ps_root_os(struct ps_msghdr *psm, struct msghdr *msg)
}
}
-ssize_t
-ps_root_ioctl6(struct dhcpcd_ctx *ctx, unsigned long request, void *data, size_t len)
+static ssize_t
+ps_root_ioctldom(struct dhcpcd_ctx *ctx, uint8_t domain, unsigned long request,
+ void *data, size_t len)
{
- if (ps_sendcmd(ctx, ctx->ps_root_fd, PS_IOCTL6,
+ if (ps_sendcmd(ctx, ctx->ps_root_fd, domain,
request, data, len) == -1)
return -1;
return ps_root_readerror(ctx);
}
ssize_t
+ps_root_ioctllink(struct dhcpcd_ctx *ctx, unsigned long request, void *data, size_t len)
+{
+
+ return ps_root_ioctldom(ctx, PS_IOCTLLINK, request, data, len);
+}
+
+ssize_t
+ps_root_ioctl6(struct dhcpcd_ctx *ctx, unsigned long request, void *data, size_t len)
+{
+
+ return ps_root_ioctldom(ctx, PS_IOCTL6, request, data, len);
+}
+
+ssize_t
ps_root_route(struct dhcpcd_ctx *ctx, void *data, size_t len)
{