Fix calculation of preferred and valid times
authorSteven Barth <steven@midlink.org>
Mon, 21 Jan 2013 07:45:16 +0000 (08:45 +0100)
committerSteven Barth <steven@midlink.org>
Mon, 21 Jan 2013 07:45:16 +0000 (08:45 +0100)
src/dhcpv6.c
src/odhcp6c.h
src/rtnetlink.c

index 93433d4d59ce5e4b945fec9904e6d4d3feba5057..28fad507b4a4fa39e541c01f1e6091bed255f491 100644 (file)
@@ -614,20 +614,24 @@ static int dhcpv6_handle_reply(_unused enum dhcpv6_msg orig,
        dhcpv6_for_each_option(ia_pd, ia_pd + ia_pd_len, otype, olen, odata) {
                struct dhcpv6_ia_prefix *p = (void*)&odata[-4];
                uint32_t valid = ntohl(p->valid);
-               p->valid = (valid < elapsed) ? 0 : htonl(valid - elapsed);
+               if (valid != UINT32_MAX)
+                       p->valid = (valid < elapsed) ? 0 : htonl(valid - elapsed);
 
                uint32_t pref = ntohl(p->preferred);
-               p->preferred = (pref < elapsed) ? 0 : htonl(pref - elapsed);
+               if (pref != UINT32_MAX)
+                       p->preferred = (pref < elapsed) ? 0 : htonl(pref - elapsed);
        }
 
        // Decrease valid and preferred lifetime of addresses
        dhcpv6_for_each_option(ia_na, ia_na + ia_na_len, otype, olen, odata) {
                struct dhcpv6_ia_addr *p = (void*)&odata[-4];
                uint32_t valid = ntohl(p->valid);
-               p->valid = (valid < elapsed) ? 0 : htonl(valid - elapsed);
+               if (valid != UINT32_MAX)
+                       p->valid = (valid < elapsed) ? 0 : htonl(valid - elapsed);
 
                uint32_t pref = ntohl(p->preferred);
-               p->preferred = (pref < elapsed) ? 0 : htonl(pref - elapsed);
+               if (pref != UINT32_MAX)
+                       p->preferred = (pref < elapsed) ? 0 : htonl(pref - elapsed);
        }
 
        // Parse and find all matching IAs
index 04a32ecf8a26a7cf2328ced475e1759e2552cfec..1a5aabcc1ddaccedf5e77e4d8a8152ad50ee7dd0 100644 (file)
@@ -195,7 +195,7 @@ void dhcpv6_remove_addrs(void);
 
 int init_rtnetlink(void);
 int set_rtnetlink_addr(int ifindex, const struct in6_addr *addr,
-               time_t pref, time_t valid);
+               uint32_t pref, uint32_t valid);
 
 int script_init(const char *path, const char *ifname);
 ssize_t script_unhexlify(uint8_t *dst, size_t len, const char *src);
index d15ae13924162747d8398f8663d95ef4cb2e5816..6017aabf6ac3899e200fa98554fbff136ce13786 100644 (file)
@@ -43,12 +43,12 @@ int init_rtnetlink(void)
 
 // CRUD addresses to interface
 int set_rtnetlink_addr(int ifindex, const struct in6_addr *addr,
-               time_t pref, time_t valid)
+               uint32_t pref, uint32_t valid)
 {
        int flags = NLM_F_REQUEST | NLM_F_ACK;
        int cmd = RTM_DELADDR;
 
-       if (valid > 0) {
+       if (valid) {
                flags |= NLM_F_CREATE | NLM_F_REPLACE;
                cmd = RTM_NEWADDR;
        }