]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Use ND6_INFINITE_LIFETIME instead of ~0U
authorRoy Marples <roy@marples.name>
Fri, 31 May 2013 13:40:46 +0000 (13:40 +0000)
committerRoy Marples <roy@marples.name>
Fri, 31 May 2013 13:40:46 +0000 (13:40 +0000)
If we have an infinite lease, don't check expiry time when CONFIRMing

dhcp6.c
ipv6.c
ipv6.h

diff --git a/dhcp6.c b/dhcp6.c
index 7fb4f47a9a38d0759273b55d91f2832904004d39..f1cb6ed9454ca66db106d8c60ad3613fb4101996 100644 (file)
--- a/dhcp6.c
+++ b/dhcp6.c
@@ -1379,7 +1379,7 @@ dhcp6_validatelease(struct interface *ifp,
        }
 
        state->renew = state->rebind = state->expire = 0;
-       state->lowpl = ~0U;
+       state->lowpl = ND6_INFINITE_LIFETIME;
        len -= (const char *)o - (const char *)m;
        return dhcp6_findia(ifp, (const uint8_t *)o, len, sfrom);
 }
@@ -1436,10 +1436,13 @@ dhcp6_readlease(struct interface *ifp)
        if (dhcp6_validatelease(ifp, state->new, state->new_len, NULL) == -1)
                goto ex;
 
-       gettimeofday(&now, NULL);
-       if ((time_t)state->expire < now.tv_sec - st.st_mtime) {
-               syslog(LOG_DEBUG, "%s: discarding expired lease", ifp->name);
-               goto ex;
+       if (state->expire != ND6_INFINITE_LIFETIME) {
+               gettimeofday(&now, NULL);
+               if ((time_t)state->expire < now.tv_sec - st.st_mtime) {
+                       syslog(LOG_DEBUG,"%s: discarding expired lease",
+                           ifp->name);
+                       goto ex;
+               }
        }
 
        return bytes;
@@ -1461,8 +1464,8 @@ dhcp6_startinit(struct interface *ifp)
 
        state = D6_STATE(ifp);
        state->state = DH6S_INIT;
-       state->expire = ~0U;
-       state->lowpl = ~0U;
+       state->expire = ND6_INFINITE_LIFETIME;
+       state->lowpl = ND6_INFINITE_LIFETIME;
        if (!(options & DHCPCD_TEST) &&
            ifp->options->ia_type != D6_OPTION_IA_TA &&
            ifp->options->reboot != 0)
@@ -1841,8 +1844,8 @@ recv:
        case DH6S_INFORM:
                state->renew = 0;
                state->rebind = 0;
-               state->expire = ~0U;
-               state->lowpl = ~0U;
+               state->expire = ND6_INFINITE_LIFETIME;
+               state->lowpl = ND6_INFINITE_LIFETIME;
                state->reason = "INFORM6";
                break;
        case DH6S_REQUEST:
@@ -1860,14 +1863,14 @@ recv:
                if (state->reason == NULL)
                        state->reason = "REBOOT6";
                if (state->renew == 0) {
-                       if (state->expire == ~0U)
-                               state->renew = ~0U;
+                       if (state->expire == ND6_INFINITE_LIFETIME)
+                               state->renew = ND6_INFINITE_LIFETIME;
                        else
                                state->renew = state->lowpl * 0.5;
                }
                if (state->rebind == 0) {
-                       if (state->expire == ~0U)
-                               state->rebind = ~0U;
+                       if (state->expire == ND6_INFINITE_LIFETIME)
+                               state->rebind = ND6_INFINITE_LIFETIME;
                        else
                                state->rebind = state->lowpl * 0.8;
                }
@@ -1893,13 +1896,13 @@ recv:
                if (state->state == DH6S_INFORM)
                        script_runreason(ifp, state->reason);
                state->state = DH6S_BOUND;
-               if (state->renew)
+               if (state->renew && state->renew != ND6_INFINITE_LIFETIME)
                        eloop_timeout_add_sec(state->renew,
                            dhcp6_startrenew, ifp);
-               if (state->rebind)
+               if (state->rebind && state->rebind != ND6_INFINITE_LIFETIME)
                        eloop_timeout_add_sec(state->rebind,
                            dhcp6_startrebind, ifp);
-               if (state->expire != ~0U)
+               if (state->expire && state->expire != ND6_INFINITE_LIFETIME)
                        eloop_timeout_add_sec(state->expire,
                            dhcp6_startexpire, ifp);
                if (ifp->options->ia_type == D6_OPTION_IA_PD)
diff --git a/ipv6.c b/ipv6.c
index 13ae7c1baf7f8cbafb41aeeba2b7eed6a41b9fb8..94409cacb37718ba2c6cb00857ec4161f86ee291 100644 (file)
--- a/ipv6.c
+++ b/ipv6.c
@@ -247,9 +247,23 @@ ipv6_addaddr(struct ipv6_addr *ap)
                ap->flags |= IPV6_AF_DELEGATED;
        if (ipv6_removesubnet(ap->iface, ap) == -1)
                syslog(LOG_ERR,"ipv6_removesubnet %m");
-       syslog(LOG_DEBUG,
-           "%s: pltime %d seconds, vltime %d seconds",
-           ap->iface->name, ap->prefix_pltime, ap->prefix_vltime);
+       if (ap->prefix_pltime == ND6_INFINITE_LIFETIME &&
+           ap->prefix_vltime == ND6_INFINITE_LIFETIME)
+               syslog(LOG_DEBUG,
+                   "%s: pltime infinity, vltime infinity",
+                   ap->iface->name);
+       else if (ap->prefix_pltime == ND6_INFINITE_LIFETIME)
+               syslog(LOG_DEBUG,
+                   "%s: pltime infinity, vltime %d seconds",
+                   ap->iface->name, ap->prefix_vltime);
+       else if (ap->prefix_vltime == ND6_INFINITE_LIFETIME)
+               syslog(LOG_DEBUG,
+                   "%s: pltime %d seconds, vltime infinity",
+                   ap->iface->name, ap->prefix_pltime);
+       else
+               syslog(LOG_DEBUG,
+                   "%s: pltime %d seconds, vltime %d seconds",
+                   ap->iface->name, ap->prefix_pltime, ap->prefix_vltime);
        return 0;
 }
 
diff --git a/ipv6.h b/ipv6.h
index 74af1e36fe4c66ccb8e571dbeade3944d6c99d60..080f78f4538ec3716fc56f44044dc5d5d9a6c2e2 100644 (file)
--- a/ipv6.h
+++ b/ipv6.h
 #define ROUNDUP8(a) (1 + (((a) - 1) | 7))
 
 #ifdef INET6
+#ifndef ND6_INFINITE_LIFETIME
+#  define ND6_INFINITE_LIFETIME                ((uint32_t)~0)
+#endif
+
 /*
  * BSD kernels don't inform userland of DAD results.
  * Also, for RTM_NEWADDR messages the address flags could be