Stop supporting prefix lifetimes that decrement in real time.
It complicates the code, it's off by default and RFC 4861 section
6.2.1 lists it as MAY.
After this we can stop regenerating the RA packets everytime we send
them.

Also I'm not convinced that this has a use case. I think it
comes from a fairy tale where renumbering is easy.
Considering the two hour rule in RFC 4862 this might not actually
work to begin with...

OK?

diff --git config.c config.c
index 497fedbf562..62ce62c58d3 100644
--- config.c
+++ config.c
@@ -212,14 +212,6 @@ getconfig(char *intface)
 
        /* prefix information */
 
-       /*
-        * This is an implementation specific parameter to consider
-        * link propagation delays and poorly synchronized clocks when
-        * checking consistency of advertised lifetimes.
-        */
-       MAYHAVE(val, "clockskew", 0);
-       tmp->clockskew = val;
-
        tmp->pfxs = 0;
        for (i = -1; i < MAXPREFIX; i++) {
                struct prefix *pfx;
@@ -278,14 +270,6 @@ getconfig(char *intface)
 
                pfx->validlifetime = (u_int32_t)val64;
 
-               makeentry(entbuf, sizeof(entbuf), i, "vltimedecr");
-               if (agetflag(entbuf)) {
-                       struct timeval now;
-                       gettimeofday(&now, 0);
-                       pfx->vltimeexpire =
-                               now.tv_sec + pfx->validlifetime;
-               }
-
                makeentry(entbuf, sizeof(entbuf), i, "pltime");
                MAYHAVE(val64, entbuf, DEF_ADVPREFERREDLIFETIME);
                if (val64 < 0 || val64 > 0xffffffff)
@@ -296,13 +280,6 @@ getconfig(char *intface)
 
                pfx->preflifetime = (u_int32_t)val64;
 
-               makeentry(entbuf, sizeof(entbuf), i, "pltimedecr");
-               if (agetflag(entbuf)) {
-                       struct timeval now;
-                       gettimeofday(&now, 0);
-                       pfx->pltimeexpire =
-                               now.tv_sec + pfx->preflifetime;
-               }
        }
        if (tmp->pfxs == 0 && !agetflag("noifprefix"))
                get_prefix(tmp);
@@ -748,9 +725,6 @@ make_packet(struct rainfo *rainfo)
        }
 
        TAILQ_FOREACH(pfx, &rainfo->prefixes, entry) {
-               u_int32_t vltime, pltime;
-               struct timeval now;
-
                ndopt_pi = (struct nd_opt_prefix_info *)buf;
                ndopt_pi->nd_opt_pi_type = ND_OPT_PREFIX_INFORMATION;
                ndopt_pi->nd_opt_pi_len = 4;
@@ -762,27 +736,9 @@ make_packet(struct rainfo *rainfo)
                if (pfx->autoconfflg)
                        ndopt_pi->nd_opt_pi_flags_reserved |=
                                ND_OPT_PI_FLAG_AUTO;
-               if (pfx->vltimeexpire || pfx->pltimeexpire)
-                       gettimeofday(&now, NULL);
-               if (pfx->vltimeexpire == 0)
-                       vltime = pfx->validlifetime;
-               else
-                       vltime = (u_int32_t)(pfx->vltimeexpire > now.tv_sec ?
-                               pfx->vltimeexpire - now.tv_sec : 0);
-               if (pfx->pltimeexpire == 0)
-                       pltime = pfx->preflifetime;
-               else
-                       pltime = (u_int32_t)(pfx->pltimeexpire > now.tv_sec ?
-                               pfx->pltimeexpire - now.tv_sec : 0);
-               if (vltime < pltime) {
-                       /*
-                        * this can happen if vltime is decremented but pltime
-                        * is not.
-                        */
-                       pltime = vltime;
-               }
-               ndopt_pi->nd_opt_pi_valid_time = htonl(vltime);
-               ndopt_pi->nd_opt_pi_preferred_time = htonl(pltime);
+
+               ndopt_pi->nd_opt_pi_valid_time = htonl(pfx->validlifetime);
+               ndopt_pi->nd_opt_pi_preferred_time = htonl(pfx->preflifetime);
                ndopt_pi->nd_opt_pi_reserved2 = 0;
                ndopt_pi->nd_opt_pi_prefix = pfx->prefix;
 
diff --git dump.c dump.c
index bccfad7a3fb..f4a7bd4b2cf 100644
--- dump.c
+++ dump.c
@@ -113,7 +113,6 @@ rtadvd_dump(void)
        int first;
        struct timeval now, next;
        char *origin, *vltime, *pltime, *flags;
-       char *vltimexpire, *pltimexpire;
        char ctimebuf[26];
 
        gettimeofday(&now, NULL);
@@ -164,9 +163,7 @@ rtadvd_dump(void)
                log_info("  ReachableTime: %d, RetransTimer: %d, "
                    "CurHopLimit: %d", rai->reachabletime,
                    rai->retranstimer, rai->hoplimit);
-               if (rai->clockskew)
-                       log_info("  Clock skew: %ldsec",
-                           rai->clockskew);
+
                first = 1;
                TAILQ_FOREACH(pfx, &rai->prefixes, entry) {
                        if (first) {
@@ -186,40 +183,17 @@ rtadvd_dump(void)
                        default:
                                origin = "";
                        }
-                       if (pfx->vltimeexpire != 0) {
-                               /* truncate to onwire value */
-                               if (asprintf(&vltimexpire, "(decr,expire %u)",
-                                   (u_int32_t)(pfx->vltimeexpire > now.tv_sec ?
-                                   pfx->vltimeexpire - now.tv_sec : 0)) == -1)
-                                       vltimexpire = NULL;
-                       } else
-                               vltimexpire = NULL;
-
-                       if (pfx->pltimeexpire != 0) {
-                               /* truncate to onwire value */
-                               if (asprintf(&pltimexpire, "(decr,expire %u)",
-                                   (u_int32_t)(pfx->pltimeexpire > now.tv_sec ?
-                                   pfx->pltimeexpire - now.tv_sec : 0)) == -1)
-                                       pltimexpire = NULL;
-                       } else
-                               pltimexpire = NULL;
-
                        vltime = lifetime(pfx->validlifetime);
                        pltime = lifetime(pfx->preflifetime);
                        asprintf(&flags, "%s%s",
                            pfx->onlinkflg ? "L" : "-",
                            pfx->autoconfflg ? "A" : "-");
-                       log_info("    %s/%d(%s, vltime: %s%s, "
-                           "pltime: %s%s, flags: %s)",
+                       log_info("    %s/%d(%s, vltime: %s, "
+                           "pltime: %s, flags: %s)",
                            inet_ntop(AF_INET6, &pfx->prefix, prefixbuf,
                            sizeof(prefixbuf)), pfx->prefixlen, origin,
-                           vltime, (vltimexpire)? vltimexpire : "",
-                           pltime, (pltimexpire)? pltimexpire : "", flags);
+                           vltime, pltime, flags);
 
-                       free(vltimexpire);
-                       vltimexpire = NULL;
-                       free(pltimexpire);
-                       pltimexpire = NULL;
                        free(vltime);
                        free(pltime);
                        free(flags);
diff --git rtadvd.c rtadvd.c
index cabec6c5950..0af71fa2804 100644
--- rtadvd.c
+++ rtadvd.c
@@ -832,11 +832,10 @@ static int
 prefix_check(struct nd_opt_prefix_info *pinfo,
             struct rainfo *rai, struct sockaddr_in6 *from)
 {
-       time_t preferred_time, valid_time;
+       uint32_t preferred_time, valid_time;
        struct prefix *pp;
        int inconsistent = 0;
        u_char ntopbuf[INET6_ADDRSTRLEN], prefixbuf[INET6_ADDRSTRLEN];
-       struct timeval now;
 
 #if 0                          /* impossible */
        if (pinfo->nd_opt_pi_type != ND_OPT_PREFIX_INFORMATION)
@@ -869,32 +868,7 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
        }
 
        preferred_time = ntohl(pinfo->nd_opt_pi_preferred_time);
-       if (pp->pltimeexpire) {
-               /*
-                * The lifetime is decremented in real time, so we should
-                * compare the expiration time.
-                * (RFC 2461 Section 6.2.7.)
-                * XXX: can we really expect that all routers on the link
-                * have synchronized clocks?
-                */
-               gettimeofday(&now, NULL);
-               preferred_time += now.tv_sec;
-
-               if (rai->clockskew &&
-                   llabs(preferred_time - pp->pltimeexpire) > rai->clockskew) {
-                       log_info("preferred lifetime for %s/%d"
-                           " (decr. in real time) inconsistent on %s:"
-                           " %lld from %s, %lld from us",
-                           inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix,
-                               prefixbuf, INET6_ADDRSTRLEN),
-                           pinfo->nd_opt_pi_prefix_len,
-                           rai->ifname, (long long)preferred_time,
-                           inet_ntop(AF_INET6, &from->sin6_addr,
-                               ntopbuf, INET6_ADDRSTRLEN),
-                           (long long)pp->pltimeexpire);
-                       inconsistent++;
-               }
-       } else if (preferred_time != pp->preflifetime)
+       if (preferred_time != pp->preflifetime) {
                log_info("preferred lifetime for %s/%d"
                    " inconsistent on %s:"
                    " %lld from %s, %d from us",
@@ -905,27 +879,11 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
                    inet_ntop(AF_INET6, &from->sin6_addr,
                        ntopbuf, INET6_ADDRSTRLEN),
                    pp->preflifetime);
+               inconsistent++;
+       }
 
        valid_time = ntohl(pinfo->nd_opt_pi_valid_time);
-       if (pp->vltimeexpire) {
-               gettimeofday(&now, NULL);
-               valid_time += now.tv_sec;
-
-               if (rai->clockskew &&
-                   llabs(valid_time - pp->vltimeexpire) > rai->clockskew) {
-                       log_info("valid lifetime for %s/%d"
-                           " (decr. in real time) inconsistent on %s:"
-                           " %lld from %s, %lld from us",
-                           inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix,
-                               prefixbuf, INET6_ADDRSTRLEN),
-                           pinfo->nd_opt_pi_prefix_len,
-                           rai->ifname, (long long)preferred_time,
-                           inet_ntop(AF_INET6, &from->sin6_addr,
-                               ntopbuf, INET6_ADDRSTRLEN),
-                           (long long)pp->vltimeexpire);
-                       inconsistent++;
-               }
-       } else if (valid_time != pp->validlifetime) {
+       if (valid_time != pp->validlifetime) {
                log_info("valid lifetime for %s/%d"
                    " inconsistent on %s:"
                    " %lld from %s, %d from us",
diff --git rtadvd.conf.5 rtadvd.conf.5
index d3e0cd8bc59..a96744b74a4 100644
--- rtadvd.conf.5
+++ rtadvd.conf.5
@@ -157,23 +157,10 @@ will automatically get appropriate prefixes from the 
kernel's routing table,
 and advertise the prefixes with the default parameters, unless the
 .Cm noifprefix
 flag is specified.
-Keywords other than
-.Cm clockskew
-can be augmented with a number, like
+ Keywords can be augmented with a number, like
 .Dq Li prefix2 ,
 to specify multiple prefixes.
 .Bl -tag -width indent
-.It Cm \&clockskew
-(num) Time skew to adjust link propagation delays and clock skews
-between routers on the link
-.Pq unit: seconds .
-This value is used in consistency check for locally-configured and
-advertised prefix lifetimes, and has its meaning when the local router
-configures a prefix on the link with a lifetime that decrements in
-real time.
-If the value is 0, it means the consistency check will be skipped
-for such prefixes.
-The default value is 0.
 .It Cm \&prefixlen
 (num) Prefix length field.
 The default value is 64.
@@ -211,16 +198,10 @@ will send RA packets with no prefix information.
 (num) Valid lifetime field
 .Pq unit: seconds .
 The default value is 2592000 (30 days).
-.It Cm \&vltimedecr
-(bool) This item means the advertised valid lifetime will decrement
-in real time, which is disabled by default.
 .It Cm \&pltime
 (num) Preferred lifetime field
 .Pq unit: seconds .
 The default value is 604800 (7 days).
-.It Cm \&pltimedecr
-(bool) This item means the advertised preferred lifetime will decrement
-in real time, which is disabled by default.
 .El
 .Pp
 The following item is for ICMPv6 MTU option,
diff --git rtadvd.h rtadvd.h
index 18f532b9436..4ce2fb3051f 100644
--- rtadvd.h
+++ rtadvd.h
@@ -69,9 +69,7 @@ struct prefix {
        TAILQ_ENTRY(prefix) entry;
 
        u_int32_t validlifetime; /* AdvValidLifetime */
-       time_t  vltimeexpire;   /* expiration of vltime; decrement case only */
        u_int32_t preflifetime; /* AdvPreferredLifetime */
-       time_t  pltimeexpire;   /* expiration of pltime; decrement case only */
        u_int onlinkflg;        /* bool: AdvOnLinkFlag */
        u_int autoconfflg;      /* bool: AdvAutonomousFlag */
        int prefixlen;
@@ -151,8 +149,6 @@ struct      rainfo {
        TAILQ_HEAD(rtinfolist, rtinfo) rtinfos;
        TAILQ_HEAD(rdnsslist, rdnss) rdnsss; /* advertised recursive dns 
servers */
        TAILQ_HEAD(dnssllist, dnssl) dnssls;
-       long    clockskew;      /* used for consistency check of lifetimes */
-
 
        /* actual RA packet data and its length */
        size_t ra_datalen;


-- 
I'm not entirely sure you are real.

Reply via email to