IOV_ORO_REFRESH,
IOV_CL_ID,
IOV_SRV_ID,
- IOV_VENDOR_CLASS_HDR,
- IOV_VENDOR_CLASS,
- IOV_USER_CLASS_HDR,
- IOV_USER_CLASS,
IOV_OPTS,
IOV_RECONF_ACCEPT,
IOV_FQDN,
size_t opts_len;
void *opts = odhcp6c_get_state(STATE_OPTS, &opts_len);
- // Build vendor-class option
- 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);
[IOV_ORO_REFRESH] = {&oro_refresh, 0},
[IOV_CL_ID] = {cl_id, cl_id_len},
[IOV_SRV_ID] = {srv_id, srv_id_len},
- [IOV_VENDOR_CLASS_HDR] = {&vendor_class_hdr, vendor_class_len ? sizeof(vendor_class_hdr) : 0},
- [IOV_VENDOR_CLASS] = {vendor_class, vendor_class_len},
- [IOV_USER_CLASS_HDR] = {&user_class_hdr, user_class_len ? sizeof(user_class_hdr) : 0},
- [IOV_USER_CLASS] = {user_class, user_class_len},
[IOV_OPTS] = { opts, opts_len },
[IOV_RECONF_ACCEPT] = {&reconf_accept, sizeof(reconf_accept)},
[IOV_FQDN] = {&fqdn, fqdn_len},
const char *pidfile = NULL;
const char *script = "/usr/sbin/odhcp6c-update";
ssize_t l;
- uint8_t buf[134];
+ uint8_t buf[134], *o_data;
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;
+ struct odhcp6c_opt *opt;
int ia_pd_iaid_index = 0;
int sol_timeout = DHCPV6_SOL_MAX_RT;
int verbosity = 0;
break;
case 'V':
- l = script_unhexlify(buf, sizeof(buf), optarg);
- if (l) {
- if (odhcp6c_add_state(STATE_VENDORCLASS, buf, l)) {
- syslog(LOG_ERR, "Failed to set vendor-class option");
- return 1;
+ opt = odhcp6c_find_opt(DHCPV6_OPT_VENDOR_CLASS);
+ if (!opt) {
+ syslog(LOG_ERR, "Failed to set vendor-class option");
+ return 1;
+ }
+
+ o_data = NULL;
+ res = parse_opt_data(optarg, &o_data, opt->flags & OPT_MASK_SIZE,
+ (opt->flags & OPT_ARRAY) == OPT_ARRAY);
+ if (res > 0) {
+ res = add_opt(opt->code, o_data, res);
+ if (res) {
+ if (res > 0)
+ return 1;
+
+ help = true;
}
} else
help = true;
+
+ free(o_data);
break;
case 'P':
break;
case 'u':
- optlen = htons(strlen(optarg));
- if (odhcp6c_add_state(STATE_USERCLASS, &optlen, 2) ||
- odhcp6c_add_state(STATE_USERCLASS, optarg, strlen(optarg))) {
+ opt = odhcp6c_find_opt(DHCPV6_OPT_USER_CLASS);
+ if (!opt) {
syslog(LOG_ERR, "Failed to set user-class option");
return 1;
}
+
+ o_data = NULL;
+ res = parse_opt_data(optarg, &o_data, opt->flags & OPT_MASK_SIZE,
+ (opt->flags & OPT_ARRAY) == OPT_ARRAY);
+ if (res > 0) {
+ res = add_opt(opt->code, o_data, res);
+ if (res) {
+ if (res > 0)
+ return 1;
+
+ help = true;
+ }
+ } else
+ help = true;
+
+ free(o_data);
break;
case 's':