Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 12 Apr 2014 18:43:56 +0300
From:      Guy Yur <guyyur@gmail.com>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/188520: [patch] ifconfig -L shows pltime and vltime as zero since 10.0-RELEASE
Message-ID:  <53495f52.c5030e0a.4fc3.ffffbb4a@mx.google.com>
Resent-Message-ID: <201404121550.s3CFo0gm005826@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         188520
>Category:       bin
>Synopsis:       [patch] ifconfig -L shows pltime and vltime as zero since 10.0-RELEASE
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Apr 12 15:50:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator:     Guy Yur
>Release:        FreeBSD 10.0-RELEASE-p1 i386
>Organization:
>Environment:
System: FreeBSD vm2.localdomain 10.0-RELEASE-p1 FreeBSD 10.0-RELEASE-p1 #0 r264267M: Sat Apr 12 10:28:56 IDT 2014 root@vm2.localdomain:/usr/obj/i386.i386/usr/src/sys/VIRTUALBOX i386


>Description:
ifconfig -L shows pltime and vltime as zero.

Seems that ifconfig was missed in r253970 which
changed usage from time_second to time_uptime.


ifconfig -L
...
        inet6 XXXX:XXXX:XXXX:XXXX:YYYY:YYYY:YYYY:YYYY
          prefixlen 64 autoconf temporary pltime 0 vltime 0

The prefix is learned via router advertisment.
tcpdump shows non zero values in the icmp6 packet.

A test program that calls SIOCGIFALIFETIME_IN6
shows the value is < wall clock which is
the test done by ifconfig.
time = 1397314436
ia6t_preferred = 608907
ia6t_expire = 2596107


>How-To-Repeat:
Run "ifconfig -L" with global or ULA IPv6 addresses learned
through router advertisment or define an IPv6 address
with pltime and vltime:
ifconfig IFNAME inet6 2001:DB8::1 pltime 100 vltime 100
ifconfig -L IFNAME inet6

>Fix:

Attached patch to use clock_gettime(CLOCK_MONOTONIC_FAST)
in ifconfig per r253970 comment.



--- ifconfig_af_inet6_monotonic.patch begins here ---
Index: sbin/ifconfig/af_inet6.c
===================================================================
--- sbin/ifconfig/af_inet6.c	(revision 264366)
+++ sbin/ifconfig/af_inet6.c	(working copy)
@@ -42,6 +42,7 @@ static const char rcsid[] =
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <time.h>
 #include <ifaddrs.h>
 
 #include <arpa/inet.h>
@@ -98,10 +99,11 @@ static void
 setip6lifetime(const char *cmd, const char *val, int s, 
     const struct afswtch *afp)
 {
-	time_t newval, t;
+	struct timespec now;
+	time_t newval;
 	char *ep;
 
-	t = time(NULL);
+	clock_gettime(CLOCK_MONOTONIC_FAST, &now);
 	newval = (time_t)strtoul(val, &ep, 0);
 	if (val == ep)
 		errx(1, "invalid %s", cmd);
@@ -108,10 +110,10 @@ setip6lifetime(const char *cmd, const char *val, i
 	if (afp->af_af != AF_INET6)
 		errx(1, "%s not allowed for the AF", cmd);
 	if (strcmp(cmd, "vltime") == 0) {
-		in6_addreq.ifra_lifetime.ia6t_expire = t + newval;
+		in6_addreq.ifra_lifetime.ia6t_expire = now.tv_sec + newval;
 		in6_addreq.ifra_lifetime.ia6t_vltime = newval;
 	} else if (strcmp(cmd, "pltime") == 0) {
-		in6_addreq.ifra_lifetime.ia6t_preferred = t + newval;
+		in6_addreq.ifra_lifetime.ia6t_preferred = now.tv_sec + newval;
 		in6_addreq.ifra_lifetime.ia6t_pltime = newval;
 	}
 }
@@ -172,9 +174,11 @@ in6_status(int s __unused, const struct ifaddrs *i
 	int s6;
 	u_int32_t flags6;
 	struct in6_addrlifetime lifetime;
-	time_t t = time(NULL);
+	struct timespec now;
 	int error;
 
+	clock_gettime(CLOCK_MONOTONIC_FAST, &now);
+
 	memset(&null_sin, 0, sizeof(null_sin));
 
 	sin = (struct sockaddr_in6 *)ifa->ifa_addr;
@@ -258,15 +262,15 @@ in6_status(int s __unused, const struct ifaddrs *i
 	if (ip6lifetime && (lifetime.ia6t_preferred || lifetime.ia6t_expire)) {
 		printf("pltime ");
 		if (lifetime.ia6t_preferred) {
-			printf("%s ", lifetime.ia6t_preferred < t
-				? "0" : sec2str(lifetime.ia6t_preferred - t));
+			printf("%s ", lifetime.ia6t_preferred < now.tv_sec
+				? "0" : sec2str(lifetime.ia6t_preferred - now.tv_sec));
 		} else
 			printf("infty ");
 
 		printf("vltime ");
 		if (lifetime.ia6t_expire) {
-			printf("%s ", lifetime.ia6t_expire < t
-				? "0" : sec2str(lifetime.ia6t_expire - t));
+			printf("%s ", lifetime.ia6t_expire < now.tv_sec
+				? "0" : sec2str(lifetime.ia6t_expire - now.tv_sec));
 		} else
 			printf("infty ");
 	}
--- ifconfig_af_inet6_monotonic.patch ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53495f52.c5030e0a.4fc3.ffffbb4a>