From guyyur@gmail.com  Sat Apr 12 15:44:21 2014
Return-Path: <guyyur@gmail.com>
Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115])
	(using TLSv1 with cipher ADH-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by hub.freebsd.org (Postfix) with ESMTPS id 97D79D7C
	for <FreeBSD-gnats-submit@freebsd.org>; Sat, 12 Apr 2014 15:44:21 +0000 (UTC)
Received: from mail-ee0-x22d.google.com (mail-ee0-x22d.google.com [IPv6:2a00:1450:4013:c00::22d])
	(using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits))
	(Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK))
	by mx1.freebsd.org (Postfix) with ESMTPS id 300FE1390
	for <FreeBSD-gnats-submit@freebsd.org>; Sat, 12 Apr 2014 15:44:21 +0000 (UTC)
Received: by mail-ee0-f45.google.com with SMTP id d17so5100502eek.4
        for <FreeBSD-gnats-submit@freebsd.org>; Sat, 12 Apr 2014 08:44:19 -0700 (PDT)
Received: from vm2.localdomain ([31.210.185.47])
        by mx.google.com with ESMTPSA id 45sm26210947eeh.9.2014.04.12.08.44.16
        for <FreeBSD-gnats-submit@freebsd.org>
        (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Sat, 12 Apr 2014 08:44:18 -0700 (PDT)
Received: by vm2.localdomain (sSMTP sendmail emulation); Sat, 12 Apr 2014 18:43:56 +0300
Message-Id: <53495f52.c5030e0a.4fc3.ffffbb4a@mx.google.com>
Date: Sat, 12 Apr 2014 18:43:56 +0300
From: Guy Yur <guyyur@gmail.com>
Reply-To: Guy Yur <guyyur@gmail.com>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [patch] ifconfig -L shows pltime and vltime as zero since 10.0-RELEASE
X-Send-Pr-Version: 3.114
X-GNATS-Notify:

>Number:         188520
>Category:       bin
>Synopsis:       [patch] ifconfig(8): 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:  Wed Apr 16 01:40:06 UTC 2014
>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:
