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>