// 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},
};
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_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;