Mercurial > hg > dhcpcd
changeset 4258:f7795e713bf5 draft
DHCPv6: Transpose DHCP userclass option into DHCPv6
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Tue, 17 Apr 2018 11:36:32 +0100 |
| parents | 29971caaafc9 |
| children | bf08893bc7fd |
| files | src/dhcp6.c src/dhcp6.h |
| diffstat | 2 files changed, 47 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/dhcp6.c Mon Apr 16 09:23:30 2018 +0000 +++ b/src/dhcp6.c Tue Apr 17 11:36:32 2018 +0100 @@ -194,6 +194,48 @@ } static size_t +dhcp6_makeuser(void *data, const struct interface *ifp) +{ + const struct if_options *ifo = ifp->options; + struct dhcp6_option o; + uint8_t *p; + const uint8_t *up, *ue; + uint16_t ulen, unlen; + size_t olen; + + /* Convert the DHCPv4 user class option to DHCPv6 */ + up = ifo->userclass; + ulen = *up++; + if (ulen == 0) + return 0; + + p = data; + olen = 0; + if (p != NULL) + p += sizeof(o); + + ue = up + ulen; + for (; up < ue; up += ulen) { + ulen = *up++; + olen += sizeof(ulen) + ulen; + if (data == NULL) + continue; + unlen = htons(ulen); + memcpy(p, &unlen, sizeof(unlen)); + p += sizeof(unlen); + memcpy(p, up, ulen); + p += ulen; + } + if (data != NULL) { + o.code = htons(D6_OPTION_USER_CLASS); + o.len = htons(olen); + memcpy(data, &o, sizeof(o)); + } + + return sizeof(o) + olen; +} + +static size_t dhcp6_makevendor(void *data, const struct interface *ifp) { const struct if_options *ifo; @@ -677,6 +719,8 @@ len += sizeof(*state->send); len += sizeof(o) + ifp->ctx->duid_len; len += sizeof(o) + sizeof(uint16_t); /* elapsed */ + if (!has_option_mask(ifo->nomask6, D6_OPTION_USER_CLASS)) + len += dhcp6_makeuser(NULL, ifp); if (!has_option_mask(ifo->nomask6, D6_OPTION_VENDOR_CLASS)) len += dhcp6_makevendor(NULL, ifp); @@ -844,6 +888,8 @@ si_len = 0; COPYIN(D6_OPTION_ELAPSED, &si_len, sizeof(si_len)); + if (!has_option_mask(ifo->nomask6, D6_OPTION_USER_CLASS)) + p += dhcp6_makeuser(p, ifp); if (!has_option_mask(ifo->nomask6, D6_OPTION_VENDOR_CLASS)) p += dhcp6_makevendor(p, ifp);
--- a/src/dhcp6.h Mon Apr 16 09:23:30 2018 +0000 +++ b/src/dhcp6.h Tue Apr 17 11:36:32 2018 +0100 @@ -67,6 +67,7 @@ #define D6_OPTION_UNICAST 12 #define D6_OPTION_STATUS_CODE 13 #define D6_OPTION_RAPID_COMMIT 14 +#define D6_OPTION_USER_CLASS 15 #define D6_OPTION_VENDOR_CLASS 16 #define D6_OPTION_VENDOR_OPTS 17 #define D6_OPTION_INTERFACE_ID 18
