Add user-class option
authorSteven Barth <steven@midlink.org>
Wed, 5 Feb 2014 13:47:47 +0000 (14:47 +0100)
committerSteven Barth <steven@midlink.org>
Wed, 5 Feb 2014 13:47:47 +0000 (14:47 +0100)
src/dhcpv6.c
src/odhcp6c.c
src/odhcp6c.h

index c9915c260aa74ff0d6d6a3a9fd685ce59beba867..f18a3e946f6d8cbe3b73cb2cba0bac841f8cad01 100644 (file)
@@ -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
index 2668d949bdedc9050572f3497ab06e62d04b9870..dbe2bdf04528997b0f015b39e66f9c79b0abb5dc 100644 (file)
@@ -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;
index 88d386791737292f3bd79eb35ddc0f9ed8f1bd90..e51fa33461efbd96cec364021b83f6801df6e94e 100644 (file)
@@ -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
 };