const struct ipv6_addr *ap;
state = D6_CSTATE(ifp);
- if (!TAILQ_FIRST(&state->addrs))
- return 0;
-
TAILQ_FOREACH(ap, &state->addrs, next) {
if (ap->flags & IPV6_AF_ADDED &&
!(ap->flags & IPV6_AF_DADCOMPLETED))
}
static int
-dhcp6_readlease(struct interface *ifp)
+dhcp6_readlease(struct interface *ifp, int validate)
{
struct dhcp6_state *state;
struct stat st;
state = D6_STATE(ifp);
if (stat(state->leasefile, &st) == -1) {
- if (errno == ENOENT)
- return 0;
- logger(ifp->ctx, LOG_ERR, "%s: %s: %m", ifp->name, __func__);
+ if (errno != ENOENT)
+ logger(ifp->ctx, LOG_ERR, "%s: %s: %m",
+ ifp->name, __func__);
return -1;
}
logger(ifp->ctx, LOG_DEBUG, "%s: reading lease `%s'",
goto ex;
}
+ /* If not validating IA's and if they have expired,
+ * skip to the auth check. */
+ if (!validate) {
+ fd = 0;
+ goto auth;
+ }
+
if ((now = time(NULL)) == -1) {
logger(ifp->ctx, LOG_ERR, "%s: time: %m", __func__);
goto ex;
}
}
+auth:
/* Authenticate the message */
o = dhcp6_getmoption(D6_OPTION_AUTH, state->new, state->new_len);
if (o) {
!(has_ta && !has_non_ta) &&
ifp->options->reboot != 0)
{
- r = dhcp6_readlease(ifp);
+ r = dhcp6_readlease(ifp, 1);
if (r == -1)
logger(ifp->ctx, LOG_ERR, "%s: dhcp6_readlease: %s: %m",
ifp->name, state->leasefile);
int completed;
state = D6_STATE(ifp);
- if (!TAILQ_FIRST(&state->addrs))
- return;
-
completed = 1;
/* If all addresses have completed DAD run the script */
TAILQ_FOREACH(ap, &state->addrs, next) {
case DHCP6_REPLY:
switch(state->state) {
case DH6S_INFORM:
+ if (dhcp6_checkstatusok(ifp, r, NULL, len) == -1)
+ return;
/* RFC4242 */
o = dhcp6_getmoption(D6_OPTION_INFO_REFRESH_TIME,
r, len);
dhcp6_dump(struct interface *ifp)
{
struct dhcp6_state *state;
- int r;
ifp->if_data[IF_DATA_DHCP6] = state = calloc(1, sizeof(*state));
if (state == NULL) {
dhcp_set_leasefile(state->leasefile, sizeof(state->leasefile),
AF_INET6, ifp,
ifp->options->options & DHCPCD_PFXDLGONLY ? ".pd" : "");
- r = dhcp6_readlease(ifp);
- if (r == -1) {
- if (errno == ENOENT)
- logger(ifp->ctx, LOG_ERR,
- "%s: no lease to dump", ifp->name);
- else
- logger(ifp->ctx, LOG_ERR,
- "%s: dhcp6_readlease: %m", ifp->name);
+ if (dhcp6_readlease(ifp, 0) == -1) {
+ logger(ifp->ctx, LOG_ERR,
+ "%s: %s: %m", state->leasefile, __func__);
return -1;
}
state->reason = "DUMP6";