diff options
| author | Roy Marples <roy@marples.name> | 2020-01-15 14:28:24 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2020-01-15 14:28:24 +0000 |
| commit | 4dcd539c2259273ae89a364069378ca7327cd428 (patch) | |
| tree | 8bbadd0bf18d911402270bffeec30288a1635129 /src/privsep-bsd.c | |
| parent | dbf19b104503e4dea1616e03fa472f60d2cdfd4e (diff) | |
| download | dhcpcd-4dcd539c2259273ae89a364069378ca7327cd428.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.c | 29 |
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) { |
