IOV_TOTAL
};
-void dhcpv6_set_ia_mode(enum odhcp6c_ia_mode na, enum odhcp6c_ia_mode pd)
+int dhcpv6_set_ia_mode(enum odhcp6c_ia_mode na, enum odhcp6c_ia_mode pd)
{
+ int mode = DHCPV6_UNKNOWN;
+
na_mode = na;
pd_mode = pd;
+
+ if (na_mode == IA_MODE_NONE && pd_mode == IA_MODE_NONE)
+ mode = DHCPV6_STATELESS;
+ else if (na_mode == IA_MODE_FORCE || pd_mode == IA_MODE_FORCE)
+ mode = DHCPV6_STATEFUL;
+
+ return mode;
}
static void dhcpv6_send(enum dhcpv6_msg type, uint8_t trid[3], uint32_t ecs)
round_end = timeout * 1000 + start;
// Built and send package
- if (type != DHCPV6_MSG_UNKNOWN) {
- if (type != DHCPV6_MSG_SOLICIT)
- syslog(LOG_NOTICE, "Send %s message (elapsed %llums, rc %d)",
- retx->name, (unsigned long long)elapsed, rc);
+ switch (type) {
+ case DHCPV6_MSG_UNKNOWN:
+ break;
+ default:
+ syslog(LOG_NOTICE, "Send %s message (elapsed %llums, rc %d)",
+ retx->name, (unsigned long long)elapsed, rc);
+ // Fall through
+ case DHCPV6_MSG_SOLICIT:
+ case DHCPV6_MSG_INFO_REQ:
dhcpv6_send(type, trid, elapsed / 10);
rc++;
}
if (otype == DHCPV6_OPT_SERVERID && olen <= 130) {
memcpy(cand.duid, odata, olen);
cand.duid_len = olen;
- } else if (otype == DHCPV6_OPT_STATUS && olen >= 2) {
- int error = ((int)odata[0] << 8 | (int)odata[1]);
-
- switch (error) {
- case DHCPV6_NoPrefixAvail:
- // Status code on global level
- cand.preference -= 2000;
- break;
-
- default :
- break;
- }
} else if (otype == DHCPV6_OPT_PREF && olen >= 1 &&
cand.preference >= 0) {
cand.preference = pref = odata[0];
odhcp6c_clear_state(STATE_S46_MAPE);
odhcp6c_clear_state(STATE_S46_LW);
odhcp6c_clear_state(STATE_PASSTHRU);
+ odhcp6c_clear_state(STATE_CUSTOM_OPTS);
// Parse and find all matching IAs
dhcpv6_for_each_option(opt, end, otype, olen, odata) {