state->claims = 0;
state->probes = 0;
state->conflicts = 0;
- return 0;
+ return 1;
}
#endif
(state->options & DHCPCD_DAEMONISE))
return -1;
state->state = STATE_RENEW_REQUESTED;
- return 0;
+ return 1;
case STATE_BOUND:
logger(LOG_INFO, "renewing lease of %s",inet_ntoa(lease->addr));
+ do_socket(state, SOCKET_OPEN);
+ state->xid = arc4random();
state->state = STATE_RENEWING;
tv.tv_sec = lease->rebindtime - lease->renewaltime;
break;
tv.tv_sec = lease->rebindtime - lease->renewaltime;
break;
case STATE_REBINDING:
- logger(LOG_ERR, "failed to rebind, attempting to discover");
- reason = "EXPIRE";
- drop_config(state, reason, options);
- state->state = STATE_INIT;
+ logger(LOG_ERR, "failed to rebind");
+ if (state->options & DHCPCD_IPV4LL)
+ state->state = STATE_INIT_IPV4LL;
+ else {
+ reason = "EXPIRE";
+ drop_config(state, reason, options);
+ state->state = STATE_INIT;
+ }
break;
case STATE_PROBING: /* FALLTHROUGH */
case STATE_ANNOUNCING:
timeradd(&state->start, &tv, &state->stop);
/* This effectively falls through into the handle_timeout funtion */
- return 0;
+ return 1;
}
static int
goto dhcp_timeout;
} else {
state->state = STATE_BOUND;
- tv.tv_sec = lease->renewaltime -
- (ANNOUNCE_INTERVAL * ANNOUNCE_NUM);
close(iface->arp_fd);
iface->arp_fd = -1;
+ tv.tv_sec = lease->renewaltime -
+ (ANNOUNCE_INTERVAL * ANNOUNCE_NUM);
+ get_time(&state->stop);
+ timeradd(&state->stop, &tv, &state->stop);
+ return 0;
}
- i = 0;
}
break;
}
state->state = STATE_REQUESTING;
}
break;
- case STATE_BOUND:
- logger(LOG_INFO, "renewing lease of %s",inet_ntoa(lease->addr));
- state->state = STATE_RENEWING;
- tv.tv_sec = lease->rebindtime - lease->renewaltime;
- timeradd(&state->start, &tv, &state->stop);
- break;
}
switch (state->state) {
}
if (retval == 0)
return 0;
+
+ timerclear(&state->timeout);
switch (carrier_status(state->interface->name)) {
case -1:
logger(LOG_ERR, "carrier_status: %s", strerror(errno));
do_socket(state, SOCKET_CLOSED);
if (state->state != STATE_BOUND)
timerclear(&state->stop);
- break;
+ return 0;
default:
logger(LOG_INFO, "carrier acquired");
state->state = STATE_RENEW_REQUESTED;
state->carrier = LINK_UP;
timerclear(&state->stop);
- break;
+ return 1;
}
- timerclear(&state->timeout);
- return 0;
+ /* NOTREACHED */
}
int
} else if (retval > 0) {
if (fd_hasdata(iface->link_fd) == 1) {
retval = handle_link(state);
- if (retval == 0 &&
- state->state == STATE_RENEW_REQUESTED)
- /* Fallthrough to handle_timeout */
- continue;
} else if (fd_hasdata(iface->raw_fd) == 1) {
retval = handle_dhcp_packet(state, options);
if (retval == 0 &&
else
retval = 0;
}
- if (retval != 0)
+ if (retval == -1)
break;
- retval = wait_for_packet(state);
+ if (retval == 0)
+ retval = wait_for_packet(state);
+ else
+ retval = 0;
}
eexit: