struct ipv4_addr *ia;
#endif
- if (!callback)
+ s = -1;
+ if (!callback) {
+ /* No carrier? Don't bother sending the packet. */
+ if (ifp->carrier == LINK_DOWN)
+ return;
logger(ifp->ctx, LOG_DEBUG, "%s: sending %s with xid 0x%x",
ifp->name,
ifo->options & DHCPCD_BOOTP ? "BOOTP" : get_dhcp_op(type),
state->xid);
- else {
+ } else {
if (state->interval == 0)
state->interval = 4;
else {
tv.tv_nsec = (suseconds_t)arc4random_uniform(
(DHCP_RAND_MAX - DHCP_RAND_MIN) * NSEC_PER_SEC);
timespecnorm(&tv);
+ /* No carrier? Don't bother sending the packet.
+ * However, we do need to advance the timeout. */
+ if (ifp->carrier == LINK_DOWN)
+ goto fail;
logger(ifp->ctx, LOG_DEBUG,
"%s: sending %s (xid 0x%x), next in %0.1f seconds",
ifp->name,
if (s == -1 && errno != EADDRINUSE)
logger(ifp->ctx, LOG_ERR,
"%s: dhcp_openudp: %m", ifp->name);
- } else
- s = -1;
+ }
/* If we couldn't open a UDP port for our IP address
* then we cannot renew.
const char *broad_uni;
const struct in6_addr alldhcp = IN6ADDR_LINKLOCAL_ALLDHCP_INIT;
+ if (!callback && ifp->carrier == LINK_DOWN)
+ return 0;
+
memset(&dst, 0, sizeof(dst));
dst.sin6_family = AF_INET6;
dst.sin6_port = htons(DHCP6_SERVER_PORT);
}
logsend:
- logger(ifp->ctx, LOG_DEBUG,
- "%s: %s %s (xid 0x%02x%02x%02x),"
- " next in %0.1f seconds",
- ifp->name,
- broad_uni,
- dhcp6_get_op(state->send->type),
- state->send->xid[0],
- state->send->xid[1],
- state->send->xid[2],
- timespec_to_double(&state->RT));
+ if (ifp->carrier != LINK_DOWN)
+ logger(ifp->ctx, LOG_DEBUG,
+ "%s: %s %s (xid 0x%02x%02x%02x),"
+ " next in %0.1f seconds",
+ ifp->name,
+ broad_uni,
+ dhcp6_get_op(state->send->type),
+ state->send->xid[0],
+ state->send->xid[1],
+ state->send->xid[2],
+ timespec_to_double(&state->RT));
/* Wait the initial delay */
if (state->IMD) {
}
}
+ if (ifp->carrier == LINK_DOWN)
+ return 0;
+
/* Update the elapsed time */
dhcp6_updateelapsed(ifp, state->send, state->send_len);
if (ifp->options->auth.options & DHCPCD_AUTH_SEND &&