-int init_dhcpv6(const char *ifname, bool strict_options, int sol_timeout)
+// client options
+static unsigned int client_options = 0;
+
+
+int init_dhcpv6(const char *ifname, unsigned int options, int sol_timeout)
dhcpv6_retx[DHCPV6_MSG_SOLICIT].max_timeo = sol_timeout;
sock = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP);
dhcpv6_retx[DHCPV6_MSG_SOLICIT].max_timeo = sol_timeout;
sock = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP);
uint16_t oro[] = {
htons(DHCPV6_OPT_SIP_SERVER_D),
htons(DHCPV6_OPT_SIP_SERVER_A),
uint16_t oro[] = {
htons(DHCPV6_OPT_SIP_SERVER_D),
htons(DHCPV6_OPT_SIP_SERVER_A),
+ // Build vendor-class option
+ size_t vendor_class_len;
+ struct dhcpv6_vendorclass *vendor_class = odhcp6c_get_state(STATE_VENDORCLASS, &vendor_class_len);
+
+ struct {
+ uint16_t type;
+ uint16_t length;
+ } vendor_class_hdr = {htons(DHCPV6_OPT_VENDOR_CLASS), htons(vendor_class_len)};
+
{&reconf_accept, sizeof(reconf_accept)},
{&fqdn, fqdn_len},
{&hdr_ia_na, sizeof(hdr_ia_na)},
{&reconf_accept, sizeof(reconf_accept)},
{&fqdn, fqdn_len},
{&hdr_ia_na, sizeof(hdr_ia_na)},
iov[2].iov_len = sizeof(oro_refresh);
hdr.oro_len = htons(oro_len + sizeof(oro_refresh));
} else if (!request_prefix) {
iov[2].iov_len = sizeof(oro_refresh);
hdr.oro_len = htons(oro_len + sizeof(oro_refresh));
} else if (!request_prefix) {
struct sockaddr_in6 srv = {AF_INET6, htons(DHCPV6_SERVER_PORT),
0, ALL_DHCPV6_RELAYS, ifindex};
struct msghdr msg = {&srv, sizeof(srv), iov, cnt, NULL, 0, 0};
struct sockaddr_in6 srv = {AF_INET6, htons(DHCPV6_SERVER_PORT),
0, ALL_DHCPV6_RELAYS, ifindex};
struct msghdr msg = {&srv, sizeof(srv), iov, cnt, NULL, 0, 0};