From db2915f095db17cb10bf67d5b3bf67f891d45625 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Wed, 5 Feb 2014 14:47:47 +0100 Subject: [PATCH] Add user-class option --- src/dhcpv6.c | 14 +++++++++++--- src/odhcp6c.c | 9 ++++++++- src/odhcp6c.h | 2 ++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/dhcpv6.c b/src/dhcpv6.c index c9915c2..f18a3e9 100644 --- a/src/dhcpv6.c +++ b/src/dhcpv6.c @@ -369,14 +369,20 @@ static void dhcpv6_send(enum dhcpv6_msg type, uint8_t trid[3], uint32_t ecs) uint16_t oro_refresh = htons(DHCPV6_OPT_INFO_REFRESH); // Build vendor-class option - size_t vendor_class_len; + size_t vendor_class_len, user_class_len; struct dhcpv6_vendorclass *vendor_class = odhcp6c_get_state(STATE_VENDORCLASS, &vendor_class_len); + void *user_class = odhcp6c_get_state(STATE_USERCLASS, &user_class_len); struct { uint16_t type; uint16_t length; } vendor_class_hdr = {htons(DHCPV6_OPT_VENDOR_CLASS), htons(vendor_class_len)}; + struct { + uint16_t type; + uint16_t length; + } user_class_hdr = {htons(DHCPV6_OPT_USER_CLASS), htons(user_class_len)}; + // Prepare Header size_t oro_len; void *oro = odhcp6c_get_state(STATE_ORO, &oro_len); @@ -403,6 +409,8 @@ static void dhcpv6_send(enum dhcpv6_msg type, uint8_t trid[3], uint32_t ecs) {srv_id, srv_id_len}, {&vendor_class_hdr, vendor_class_len ? sizeof(vendor_class_hdr) : 0}, {vendor_class, vendor_class_len}, + {&user_class_hdr, user_class_len ? sizeof(user_class_hdr) : 0}, + {user_class, user_class_len}, {&reconf_accept, sizeof(reconf_accept)}, {&fqdn, fqdn_len}, {&hdr_ia_na, sizeof(hdr_ia_na)}, @@ -412,11 +420,11 @@ static void dhcpv6_send(enum dhcpv6_msg type, uint8_t trid[3], uint32_t ecs) size_t cnt = ARRAY_SIZE(iov); if (type == DHCPV6_MSG_INFO_REQ) { - cnt = 7; + cnt = 9; iov[2].iov_len = sizeof(oro_refresh); hdr.oro_len = htons(oro_len + sizeof(oro_refresh)); } else if (!request_prefix) { - cnt = 11; + cnt = 13; } // Disable IAs if not used diff --git a/src/odhcp6c.c b/src/odhcp6c.c index 2668d94..dbe2bdf 100644 --- a/src/odhcp6c.c +++ b/src/odhcp6c.c @@ -61,6 +61,7 @@ int main(_unused int argc, char* const argv[]) uint8_t buf[134]; char *optpos; uint16_t opttype; + uint16_t optlen; enum odhcp6c_ia_mode ia_na_mode = IA_MODE_TRY; enum odhcp6c_ia_mode ia_pd_mode = IA_MODE_NONE; int ia_pd_iaid_index = 0; @@ -76,7 +77,7 @@ int main(_unused int argc, char* const argv[]) int c; unsigned int client_options = DHCPV6_CLIENT_FQDN | DHCPV6_ACCEPT_RECONFIGURE; - while ((c = getopt(argc, argv, "S::N:V:P:FB:c:i:r:Rs:kt:hedp:fa")) != -1) { + while ((c = getopt(argc, argv, "S::N:V:P:FB:c:i:r:Ru:s:kt:hedp:fa")) != -1) { switch (c) { case 'S': allow_slaac_only = (optarg) ? atoi(optarg) : -1; @@ -178,6 +179,12 @@ int main(_unused int argc, char* const argv[]) client_options |= DHCPV6_STRICT_OPTIONS; break; + case 'u': + optlen = htons(strlen(optarg)); + odhcp6c_add_state(STATE_USERCLASS, &optlen, 2); + odhcp6c_add_state(STATE_USERCLASS, optarg, strlen(optarg)); + break; + case 's': script = optarg; break; diff --git a/src/odhcp6c.h b/src/odhcp6c.h index 88d3867..e51fa33 100644 --- a/src/odhcp6c.h +++ b/src/odhcp6c.h @@ -43,6 +43,7 @@ enum dhcvp6_opt { DHCPV6_OPT_AUTH = 11, DHCPV6_OPT_STATUS = 13, DHCPV6_OPT_RAPID_COMMIT = 14, + DHCPV6_OPT_USER_CLASS = 15, DHCPV6_OPT_VENDOR_CLASS = 16, DHCPV6_OPT_RECONF_MESSAGE = 19, DHCPV6_OPT_RECONF_ACCEPT = 20, @@ -211,6 +212,7 @@ enum odhcp6c_state { STATE_RA_DNS, STATE_AFTR_NAME, STATE_VENDORCLASS, + STATE_USERCLASS, _STATE_MAX }; -- 2.39.2