static bool bound = false, release = true;
static time_t last_update = 0;
+static unsigned int min_update_interval = DEFAULT_MIN_UPDATE_INTERVAL;
+
int main(_unused int argc, char* const argv[])
{
// Allocate ressources
int c;
unsigned int client_options = DHCPV6_CLIENT_FQDN | DHCPV6_ACCEPT_RECONFIGURE;
- while ((c = getopt(argc, argv, "S::N:V:P:FB:c:i:r:Ru:s:kt:hedp:fa")) != -1) {
+ while ((c = getopt(argc, argv, "S::N:V:P:FB:c:i:r:Ru:s:kt:m:hedp:fa")) != -1) {
switch (c) {
case 'S':
allow_slaac_only = (optarg) ? atoi(optarg) : -1;
sol_timeout = atoi(optarg);
break;
+ case 'm':
+ min_update_interval = atoi(optarg);
+ break;
+
case 'e':
logopt |= LOG_PERROR;
break;
break; // Other signal type
// Send renew as T1 expired
- size_t ia_pd_len, ia_na_len;
- odhcp6c_get_state(STATE_IA_PD, &ia_pd_len);
- odhcp6c_get_state(STATE_IA_NA, &ia_na_len);
-
- // If we have any IAs, send renew, otherwise request
- if (ia_pd_len == 0 && ia_na_len == 0)
- res = dhcpv6_request(DHCPV6_MSG_REQUEST);
- else
- res = dhcpv6_request(DHCPV6_MSG_RENEW);
-
+ res = dhcpv6_request(DHCPV6_MSG_RENEW);
odhcp6c_signal_process();
if (res > 0) { // Renew was succesfull
// Publish updates
odhcp6c_clear_state(STATE_SERVER_ID); // Remove binding
+ size_t ia_pd_len, ia_na_len;
+ odhcp6c_get_state(STATE_IA_PD, &ia_pd_len);
+ odhcp6c_get_state(STATE_IA_NA, &ia_na_len);
+
+ if (ia_pd_len == 0 && ia_na_len == 0)
+ break;
+
// If we have IAs, try rebind otherwise restart
res = dhcpv6_request(DHCPV6_MSG_REBIND);
odhcp6c_signal_process();
#ifdef EXT_BFD_PING
" -B <interval> Enable BFD ping check\n"
#endif
+ " -u <user-class> Set user-class option string\n"
" -c <clientid> Override client-ID (base-16 encoded)\n"
" -i <iface-id> Use a custom interface identifier for RA handling\n"
" -r <options> Options to be requested (comma-separated)\n"
" -f Don't send Client FQDN option\n"
" -k Don't send a RELEASE when stopping\n"
" -t <seconds> Maximum timeout for DHCPv6-SOLICIT (3600)\n"
+ " -m <seconds> Minimum time between accepting updates (30)\n"
"\nInvocation options:\n"
" -p <pidfile> Set pidfile (/var/run/odhcp6c.pid)\n"
" -d Daemonize\n"
{
struct timespec t = {0, 0};
syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &t);
- return t.tv_sec * 1000 + t.tv_nsec / 1000000;
+ return ((uint64_t)t.tv_sec) * 1000 + ((uint64_t)t.tv_nsec) / 1000000;
}
if (new->valid > 0) {
if (x) {
if (new->valid >= x->valid && new->valid != UINT32_MAX &&
- new->valid - x->valid < 60 &&
+ new->valid - x->valid < min_update_interval &&
new->preferred >= x->preferred &&
new->preferred != UINT32_MAX &&
- new->preferred - x->preferred < 60 &&
+ new->preferred - x->preferred < min_update_interval &&
x->class == new->class)
return false;
x->valid = new->valid;