time handling.
return addvar(ctx, e, prefix, var, buffer);
}
-
-time_t
-uptime(void)
-{
- struct timespec tv;
-
- if (clock_gettime(CLOCK_MONOTONIC, &tv) == -1)
- return -1;
- return tv.tv_sec;
-}
-
char *
hwaddr_ntoa(const unsigned char *hwaddr, size_t hwlen, char *buf, size_t buflen)
{
char ***, const char *, const char *, const char *);
ssize_t addvard(struct dhcpcd_ctx *,
char ***, const char *, const char *, size_t);
-time_t uptime(void);
char *hwaddr_ntoa(const unsigned char *, size_t, char *, size_t);
size_t hwaddr_aton(unsigned char *, const char *);
struct if_options *ifo = ifp->options;
const struct dhcp_state *state = D_CSTATE(ifp);
const struct dhcp_lease *lease = &state->lease;
- time_t up = uptime() - state->start_uptime;
char hbuf[HOSTNAME_MAX_LEN + 1];
const char *hostname;
const struct vivco *vivco;
dhcp->flags = htons(BROADCAST_FLAG);
if (type != DHCP_DECLINE && type != DHCP_RELEASE) {
- if (up < 0 || up > (time_t)UINT16_MAX)
+ struct timespec tv;
+
+ clock_gettime(CLOCK_MONOTONIC, &tv);
+ timespecsub(&tv, &state->started, &tv);
+ if (tv.tv_sec < 0 || tv.tv_sec > (time_t)UINT16_MAX)
dhcp->secs = htons((uint16_t)UINT16_MAX);
else
- dhcp->secs = htons((uint16_t)up);
+ dhcp->secs = htons((uint16_t)tv.tv_sec);
}
dhcp->xid = htonl(state->xid);
dhcp->cookie = htonl(MAGIC_COOKIE);
}
state = D_STATE(ifp);
- state->start_uptime = uptime();
+ clock_gettime(CLOCK_MONOTONIC, &state->started);
free(state->offer);
state->offer = NULL;
uint8_t added;
char leasefile[sizeof(LEASEFILE) + IF_NAMESIZE + (IF_SSIDSIZE * 4)];
- time_t start_uptime;
+ struct timespec started;
unsigned char *clientid;
struct authstate auth;
size_t arping_index;
struct dhcp6_state *state;
const struct dhcp6_option *co;
struct dhcp6_option *o;
- time_t up;
+ struct timespec tv;
uint16_t u16;
co = dhcp6_getmoption(D6_OPTION_ELAPSED, m, len);
o = __UNCONST(co);
state = D6_STATE(ifp);
- up = uptime() - state->start_uptime;
- if (up < 0 || up > (time_t)UINT16_MAX)
- up = (time_t)UINT16_MAX;
- u16 = htons((uint16_t)up);
+ clock_gettime(CLOCK_MONOTONIC, &tv);
+ if (tv.tv_sec < 0 || tv.tv_sec > (time_t)UINT16_MAX)
+ tv.tv_sec = (time_t)UINT16_MAX;
+ u16 = htons((uint16_t)tv.tv_sec);
memcpy(D6_OPTION_DATA(o), &u16, sizeof(u16));
return 0;
}
ifp = arg;
state = D6_STATE(ifp);
state->state = DH6S_RENEW;
- state->start_uptime = uptime();
+ clock_gettime(CLOCK_MONOTONIC, &state->started);
state->RTC = 0;
state->IRT = REN_TIMEOUT;
state->MRT = REN_MAX_RT;
logger(ifp->ctx, LOG_INFO, "%s: soliciting a DHCPv6 lease", ifp->name);
state = D6_STATE(ifp);
state->state = DH6S_DISCOVER;
- state->start_uptime = uptime();
+ clock_gettime(CLOCK_MONOTONIC, &state->started);
state->RTC = 0;
state->IMD = SOL_MAX_DELAY;
state->IRT = SOL_TIMEOUT;
state = D6_STATE(ifp);
state->state = DH6S_CONFIRM;
- state->start_uptime = uptime();
+ clock_gettime(CLOCK_MONOTONIC, &state->started);
state->RTC = 0;
state->IMD = CNF_MAX_DELAY;
state->IRT = CNF_TIMEOUT;
logger(ifp->ctx, LOG_INFO,
"%s: requesting DHCPv6 information", ifp->name);
state->state = DH6S_INFORM;
- state->start_uptime = uptime();
+ clock_gettime(CLOCK_MONOTONIC, &state->started);
state->RTC = 0;
state->IMD = INF_MAX_DELAY;
state->IRT = INF_TIMEOUT;
return;
state->state = DH6S_RELEASE;
- state->start_uptime = uptime();
+ clock_gettime(CLOCK_MONOTONIC, &state->started);
state->RTC = 0;
state->IRT = REL_TIMEOUT;
state->MRT = 0;
struct dhcp6_state {
enum DH6S state;
- time_t start_uptime;
+ struct timespec started;
/* Message retransmission timings */
struct timespec RT;
ifp->name, inet_ntoa(astate->addr));
#endif
state->addr = astate->addr;
- state->defend = 0;
+ timespecclear(&state->defend);
ipv4_buildroutes(ifp->ctx);
arp_announce(astate);
script_runreason(ifp, "IPV4LL");
arp_report_conflicted(astate, amsg);
if (astate->failed.s_addr == state->addr.s_addr) {
- time_t up;
+ struct timespec now, defend;
/* RFC 3927 Section 2.5 */
- up = uptime();
- if (state->defend + DEFEND_INTERVAL > up) {
+ defend.tv_sec = state->defend.tv_sec + DEFEND_INTERVAL;
+ defend.tv_nsec = state->defend.tv_nsec;
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ if (timespeccmp(&defend, &now, >)) {
logger(astate->iface->ctx, LOG_WARNING,
"%s: IPv4LL %d second defence failed for %s",
astate->iface->name, DEFEND_INTERVAL,
logger(astate->iface->ctx, LOG_DEBUG,
"%s: defended IPv4LL address %s",
astate->iface->name, inet_ntoa(state->addr));
- state->defend = up;
+ state->defend = now;
return;
}
}
struct in_addr addr;
struct arp_state *arp;
unsigned int conflicts;
- time_t defend;
+ struct timespec defend;
char randomstate[128];
};