if (state == NULL)
return;
- arp_close(ifp);
if (state->raw_fd != -1) {
eloop_event_delete(ifp->ctx->eloop, state->raw_fd, 0);
close(state->raw_fd);
default:
if (!(iface->ctx->options & DHCPCD_TEST))
dhcp_drop(iface, "FAIL");
- dhcp_close(iface);
+ dhcp_free(iface);
eloop_timeout_delete(iface->ctx->eloop,
NULL, iface);
callback = NULL;
eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
dhcp_drop(ifp, "EXPIRE");
unlink(state->leasefile);
-
state->interval = 0;
dhcp_discover(ifp);
}
return;
}
if (state->reason == NULL) {
- if (state->old) {
+ if (state->old && state->new->cookie != htonl(MAGIC_COOKIE)) {
if (state->old->yiaddr == state->new->yiaddr &&
lease->server.s_addr)
state->reason = "RENEW";
struct timespec ts;
#endif
+ state = D_STATE(ifp);
/* dhcp_start may just have been called and we don't yet have a state
* but we do have a timeout, so punt it. */
- eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
-
- state = D_STATE(ifp);
- if (state == NULL)
+ if (state == NULL) {
+ eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
return;
- dhcp_auth_reset(&state->auth);
- dhcp_close(ifp);
+ }
+ if (state->state != DHS_IPV4LL_BOUND) {
+ eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
+ dhcp_auth_reset(&state->auth);
+ dhcp_close(ifp);
+ }
if (ifp->options->options & DHCPCD_RELEASE) {
unlink(state->leasefile);
if (ifp->carrier != LINK_DOWN &&
return;
}
dhcp_close(astate->iface);
+ arp_close(astate->iface);
eloop_timeout_delete(astate->iface->ctx->eloop, NULL,
astate->iface);
dhcpcd_startinterface(astate->iface);
case 0:
log_dhcp(LOG_WARNING, "IPv4LL disabled from",
iface, dhcp, from);
- dhcp_close(iface);
+ dhcp_drop(iface, "EXPIRE");
+ arp_close(iface);
eloop_timeout_delete(iface->ctx->eloop,
NULL, iface);
eloop_timeout_add_sec(iface->ctx->eloop,
syslog(LOG_ERR, "%s: dhcp if_readrawpacket: %m",
ifp->name);
dhcp_close(ifp);
+ arp_close(ifp);
break;
}
if (valid_udp_packet(ifp->ctx->packet, bytes,
struct dhcpcd_ctx *ctx;
dhcp_close(ifp);
+ arp_close(ifp);
if (state) {
free(state->old);
free(state->new);
return;
}
- /* Close any pre-existing sockets as we're starting over */
- dhcp_close(ifp);
-
state = D_STATE(ifp);
state->start_uptime = uptime();
free(state->offer);
}
}
+ arp_cancel(astate);
if (++state->conflicts == MAX_CONFLICTS)
syslog(LOG_ERR, "%s: failed to acquire an IPv4LL address",
astate->iface->name);
astate->addr.s_addr = ipv4ll_pick_addr(astate);
eloop_timeout_add_sec(astate->iface->ctx->eloop,
- state->conflicts > MAX_CONFLICTS ?
+ state->conflicts >= MAX_CONFLICTS ?
RATE_LIMIT_INTERVAL : PROBE_WAIT,
ipv4ll_probe, astate);
}