const struct dhcp_opt *opt;
const struct if_options *ifo;
struct ipv6_addr *ap;
- uint8_t has_new;
+ bool valid_op, has_new;
uint32_t u32;
dctx = arg;
#endif
op = dhcp6_get_op(r->type);
+ valid_op = op != NULL;
switch(r->type) {
case DHCP6_REPLY:
switch(state->state) {
}
break;
case DH6S_DISCOVER:
- if (has_option_mask(ifo->requestmask6,
- D6_OPTION_RAPID_COMMIT) &&
- dhcp6_getmoption(D6_OPTION_RAPID_COMMIT, r, len))
- state->state = DH6S_REQUEST;
- else
- op = NULL;
+ /* Only accept REPLY in DISCOVER for RAPID_COMMIT.
+ * Normally we get an ADVERTISE for a DISCOVER. */
+ if (!has_option_mask(ifo->requestmask6,
+ D6_OPTION_RAPID_COMMIT) ||
+ !dhcp6_getmoption(D6_OPTION_RAPID_COMMIT, r, len))
+ {
+ valid_op = false;
+ break;
+ }
+ /* Validate lease before setting state to REQUEST. */
/* FALLTHROUGH */
case DH6S_REQUEST: /* FALLTHROUGH */
case DH6S_RENEW: /* FALLTHROUGH */
#endif
return;
}
+ if (state->state == DH6S_DISCOVER)
+ state->state = DH6S_REQUEST;
break;
default:
- op = NULL;
+ valid_op = false;
+ break;
}
break;
case DHCP6_ADVERTISE:
if (state->state != DH6S_DISCOVER) {
- op = NULL;
+ valid_op = false;
break;
}
/* RFC7083 */
ifp->name, op, r->type);
return;
}
- if (op == NULL) {
+ if (!valid_op) {
logger(ifp->ctx, LOG_WARNING,
"%s: invalid state for DHCP6 type %s (%d)",
ifp->name, op, r->type);
return;
}
- has_new = 0;
+ has_new = false;
TAILQ_FOREACH(ap, &state->addrs, next) {
if (ap->flags & IPV6_AF_NEW) {
- has_new = 1;
+ has_new = true;
break;
}
}