// RFC 3315 - 5.5 Timeout and Delay values
static struct dhcpv6_retx dhcpv6_retx[_DHCPV6_MSG_MAX] = {
[DHCPV6_MSG_UNKNOWN] = {false, 1, 120, 0, "<POLL>",
- dhcpv6_handle_reconfigure, NULL},
+ dhcpv6_handle_reconfigure, NULL},
[DHCPV6_MSG_SOLICIT] = {true, 1, DHCPV6_SOL_MAX_RT, 0, "SOLICIT",
- dhcpv6_handle_advert, dhcpv6_commit_advert},
+ dhcpv6_handle_advert, dhcpv6_commit_advert},
[DHCPV6_MSG_REQUEST] = {true, 1, DHCPV6_REQ_MAX_RT, 10, "REQUEST",
- dhcpv6_handle_reply, NULL},
+ dhcpv6_handle_reply, NULL},
[DHCPV6_MSG_RENEW] = {false, 10, DHCPV6_REN_MAX_RT, 0, "RENEW",
- dhcpv6_handle_reply, NULL},
+ dhcpv6_handle_reply, NULL},
[DHCPV6_MSG_REBIND] = {false, 10, DHCPV6_REB_MAX_RT, 0, "REBIND",
- dhcpv6_handle_rebind_reply, NULL},
+ dhcpv6_handle_rebind_reply, NULL},
[DHCPV6_MSG_RELEASE] = {false, 1, 0, 5, "RELEASE", NULL, NULL},
[DHCPV6_MSG_DECLINE] = {false, 1, 0, 5, "DECLINE", NULL, NULL},
[DHCPV6_MSG_INFO_REQ] = {true, 1, DHCPV6_INF_MAX_RT, 0, "INFOREQ",
- dhcpv6_handle_reply, NULL},
+ dhcpv6_handle_reply, NULL},
};
htons(DHCPV6_OPT_SIP_SERVER_A),
htons(DHCPV6_OPT_DNS_SERVERS),
htons(DHCPV6_OPT_DNS_DOMAIN),
+ htons(DHCPV6_OPT_SNTP_SERVERS),
htons(DHCPV6_OPT_NTP_SERVER),
htons(DHCPV6_OPT_AFTR_NAME),
htons(DHCPV6_OPT_PD_EXCLUDE),
if (r->protocol != 3 || r->algorithm != 1 || r->reconf_type != 2)
continue;
- md5_state_t md5;
+ md5_ctx_t md5;
uint8_t serverhash[16], secretbytes[16], hash[16];
memcpy(serverhash, r->key, sizeof(serverhash));
memset(r->key, 0, sizeof(r->key));
for (size_t i = 0; i < sizeof(secretbytes); ++i)
secretbytes[i] ^= 0x36;
- md5_init(&md5);
- md5_append(&md5, secretbytes, sizeof(secretbytes));
- md5_append(&md5, buf, len);
- md5_finish(&md5, hash);
+ md5_begin(&md5);
+ md5_hash(secretbytes, sizeof(secretbytes), &md5);
+ md5_hash(buf, len, &md5);
+ md5_end(hash, &md5);
for (size_t i = 0; i < sizeof(secretbytes); ++i) {
secretbytes[i] ^= 0x36;
secretbytes[i] ^= 0x5c;
}
- md5_init(&md5);
- md5_append(&md5, secretbytes, sizeof(secretbytes));
- md5_append(&md5, hash, 16);
- md5_finish(&md5, hash);
+ md5_begin(&md5);
+ md5_hash(secretbytes, sizeof(secretbytes), &md5);
+ md5_hash(hash, 16, &md5);
+ md5_end(hash, &md5);
rcauth_ok = !memcmp(hash, serverhash, sizeof(hash));
} else if (otype == DHCPV6_OPT_RECONF_MESSAGE && olen == 1) {
cand.wants_reconfigure = true;
} else if (otype == DHCPV6_OPT_SOL_MAX_RT && olen == 4) {
uint32_t sol_max_rt = ntohl(*((uint32_t *)odata));
- if (sol_max_rt >= DHCPV6_SOL_MAX_RT_MIN &&
+ if (sol_max_rt >= DHCPV6_SOL_MAX_RT_MIN &&
sol_max_rt <= DHCPV6_SOL_MAX_RT_MAX)
cand.sol_max_rt = sol_max_rt;
} else if (otype == DHCPV6_OPT_INF_MAX_RT && olen == 4) {
uint32_t inf_max_rt = ntohl(*((uint32_t *)odata));
- if (inf_max_rt >= DHCPV6_INF_MAX_RT_MIN &&
+ if (inf_max_rt >= DHCPV6_INF_MAX_RT_MIN &&
inf_max_rt <= DHCPV6_INF_MAX_RT_MAX)
cand.inf_max_rt = inf_max_rt;
} else if (otype == DHCPV6_OPT_IA_PD && request_prefix) {
if ((!have_na && na_mode == IA_MODE_FORCE) ||
(!have_pd && pd_mode == IA_MODE_FORCE)) {
- /*
- * RFC7083 states to process the SOL_MAX_RT and
+ /*
+ * RFC7083 states to process the SOL_MAX_RT and
* INF_MAX_RT options even if the DHCPv6 server
* did not propose any IA_NA and/or IA_PD
*/
odhcp6c_clear_state(STATE_DNS);
odhcp6c_clear_state(STATE_SEARCH);
odhcp6c_clear_state(STATE_SNTP_IP);
- odhcp6c_clear_state(STATE_SNTP_FQDN);
+ odhcp6c_clear_state(STATE_NTP_IP);
+ odhcp6c_clear_state(STATE_NTP_FQDN);
odhcp6c_clear_state(STATE_SIP_IP);
odhcp6c_clear_state(STATE_SIP_FQDN);
odhcp6c_clear_state(STATE_AFTR_NAME);
odhcp6c_add_state(STATE_DNS, odata, olen);
} else if (otype == DHCPV6_OPT_DNS_DOMAIN) {
odhcp6c_add_state(STATE_SEARCH, odata, olen);
+ } else if (otype == DHCPV6_OPT_SNTP_SERVERS) {
+ if (olen % 16 == 0)
+ odhcp6c_add_state(STATE_SNTP_IP, odata, olen);
} else if (otype == DHCPV6_OPT_NTP_SERVER) {
uint16_t stype, slen;
uint8_t *sdata;
stype, slen, sdata) {
if (slen == 16 && (stype == NTP_MC_ADDR ||
stype == NTP_SRV_ADDR))
- odhcp6c_add_state(STATE_SNTP_IP,
+ odhcp6c_add_state(STATE_NTP_IP,
sdata, slen);
else if (slen > 0 && stype == NTP_SRV_FQDN)
- odhcp6c_add_state(STATE_SNTP_FQDN,
+ odhcp6c_add_state(STATE_NTP_FQDN,
sdata, slen);
}
} else if (otype == DHCPV6_OPT_SIP_SERVER_A) {
odhcp6c_add_state(STATE_AFTR_NAME, odata, olen);
} else if (otype == DHCPV6_OPT_SOL_MAX_RT && olen == 4) {
uint32_t sol_max_rt = ntohl(*((uint32_t *)odata));
- if (sol_max_rt >= DHCPV6_SOL_MAX_RT_MIN &&
+ if (sol_max_rt >= DHCPV6_SOL_MAX_RT_MIN &&
sol_max_rt <= DHCPV6_SOL_MAX_RT_MAX)
dhcpv6_retx[DHCPV6_MSG_SOLICIT].max_timeo = sol_max_rt;
} else if (otype == DHCPV6_OPT_INF_MAX_RT && olen == 4) {
uint32_t inf_max_rt = ntohl(*((uint32_t *)odata));
- if (inf_max_rt >= DHCPV6_INF_MAX_RT_MIN &&
+ if (inf_max_rt >= DHCPV6_INF_MAX_RT_MIN &&
inf_max_rt <= DHCPV6_INF_MAX_RT_MAX)
dhcpv6_retx[DHCPV6_MSG_INFO_REQ].max_timeo = inf_max_rt;
}else if (otype != DHCPV6_OPT_CLIENTID &&
uint8_t *sdata;
#ifdef EXT_PREFIX_CLASS
- // Find prefix class, if any
+ // Find prefix class, if any
dhcpv6_for_each_option(&prefix[1], odata + olen,
stype, slen, sdata)
if (stype == DHCPV6_OPT_PREFIX_CLASS && slen == 2)
t1 = l_t1;
t2 = l_t2;
t3 = l_t3;
+ } else {
+ t1 = 600;
}
return (int)(ia_pd_entries + ia_na_entries);
size_t cand_len;
struct dhcpv6_server_cand *cand = odhcp6c_get_state(STATE_SERVER_CAND, &cand_len);
uint16_t hdr[2];
- int ret = DHCPV6_STATELESS;
+ int ret = (na_mode == IA_MODE_NONE && pd_mode == IA_MODE_NONE) ?
+ DHCPV6_STATELESS : DHCPV6_STATEFUL;
// Clear lingering candidate state info
odhcp6c_clear_state(STATE_SERVER_ID);
dhcpv6_retx[DHCPV6_MSG_SOLICIT].max_timeo = cand->sol_max_rt;
dhcpv6_retx[DHCPV6_MSG_INFO_REQ].max_timeo = cand->inf_max_rt;
-
+
odhcp6c_remove_state(STATE_SERVER_CAND, 0, sizeof(*cand));
return ret;