Message ID | 1555105210-22996-2-git-send-email-greearb@candelatech.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Johannes Berg |
Headers | show |
Series | [1/2] iw: Support authenticated-at station statistic. | expand |
On Fri, Apr 12, 2019 at 2:40 PM <greearb@candelatech.com> wrote: > > From: Ben Greear <greearb@candelatech.com> > > This lets us more precisely calculate the absolute timestamp > of last-rix (ie, now - idle). Can you use 64-bit timestamps? struct timeval suffers from the overflow after 2038 problem. > > Signed-off-by: Ben Greear <greearb@candelatech.com> > --- > station.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/station.c b/station.c > index 3b0c5f1..60804f2 100644 > --- a/station.c > +++ b/station.c > @@ -314,6 +314,12 @@ static int print_sta_handler(struct nl_msg *msg, void *arg) > [NL80211_STA_INFO_ACK_SIGNAL_AVG] = { .type = NLA_U8 }, > }; > char *chain; > + struct timeval now; > + unsigned long long now_ms; > + > + gettimeofday(&now, NULL); > + now_ms = now.tv_sec * 1000; > + now_ms += (now.tv_usec / 1000); > > nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), > genlmsg_attrlen(gnlh, 0), NULL); > @@ -561,7 +567,7 @@ static int print_sta_handler(struct nl_msg *msg, void *arg) > printf("\n\tauthenticated at:\t%llu ms", > (unsigned long long)nla_get_u64(sinfo[NL80211_STA_INFO_AUTH_AT_MS])); > > - printf("\n"); > + printf("\n\tcurrent time:\t%llu ms\n", now_ms); > return NL_SKIP; > } > > -- > 2.7.5 >
On 4/12/19 2:43 PM, Kirtika Ruchandani wrote: > On Fri, Apr 12, 2019 at 2:40 PM <greearb@candelatech.com> wrote: >> >> From: Ben Greear <greearb@candelatech.com> >> >> This lets us more precisely calculate the absolute timestamp >> of last-rix (ie, now - idle). > > Can you use 64-bit timestamps? struct timeval suffers from the > overflow after 2038 problem. What is the preferred API to do this? Whatever it is, it would need to compile on old crufty systems as well. Thanks, Ben
On Fri, Apr 12, 2019 at 2:49 PM Ben Greear <greearb@candelatech.com> wrote: > > On 4/12/19 2:43 PM, Kirtika Ruchandani wrote: > > On Fri, Apr 12, 2019 at 2:40 PM <greearb@candelatech.com> wrote: > >> > >> From: Ben Greear <greearb@candelatech.com> > >> > >> This lets us more precisely calculate the absolute timestamp > >> of last-rix (ie, now - idle). > > > > Can you use 64-bit timestamps? struct timeval suffers from the > > overflow after 2038 problem. > > What is the preferred API to do this? Whatever it is, it would need > to compile on old crufty systems as well. I am not sure what the guidance for userspace is. The kernel uses 'struct timespec64' I think. Arnd (cc-ed) who has mostly led the 2038 problem in the kernel might have more input on the "old crufty systems" part. > > Thanks, > Ben > > -- > Ben Greear <greearb@candelatech.com> > Candela Technologies Inc http://www.candelatech.com >
On Sat, Apr 13, 2019 at 12:07 AM Kirtika Ruchandani <kirtika@google.com> wrote: > > On Fri, Apr 12, 2019 at 2:49 PM Ben Greear <greearb@candelatech.com> wrote: > > > > On 4/12/19 2:43 PM, Kirtika Ruchandani wrote: > > > On Fri, Apr 12, 2019 at 2:40 PM <greearb@candelatech.com> wrote: > > >> > > >> From: Ben Greear <greearb@candelatech.com> > > >> > > >> This lets us more precisely calculate the absolute timestamp > > >> of last-rix (ie, now - idle). > > > > > > Can you use 64-bit timestamps? struct timeval suffers from the > > > overflow after 2038 problem. > > > > What is the preferred API to do this? Whatever it is, it would need > > to compile on old crufty systems as well. > > I am not sure what the guidance for userspace is. The kernel uses > 'struct timespec64' I think. > Arnd (cc-ed) who has mostly led the 2038 problem in the kernel might > have more input on the > "old crufty systems" part. I'm not sure what you are trying to do, and there are different answers depending on the usecase. For getting the time in the kernel, see Documentation/core-api/timekeeping.rst do_gettimeofday() is going away for many reasons, so don't use that. It sounds like you want "ktime_to_ms(ktime_get())" here. In userspace interfaces, you should pass 64-bit nanoseconds as returned by ktime_get_ns(). If you want to pretty-print the current wall-clock, use the %pt format string on a 'struct rtc_time'. Arnd
On Sat, Apr 13, 2019 at 10:00 AM Arnd Bergmann <arnd@arndb.de> wrote: > > On Sat, Apr 13, 2019 at 12:07 AM Kirtika Ruchandani <kirtika@google.com> wrote: > > > > On Fri, Apr 12, 2019 at 2:49 PM Ben Greear <greearb@candelatech.com> wrote: > > > > > > On 4/12/19 2:43 PM, Kirtika Ruchandani wrote: > > > > On Fri, Apr 12, 2019 at 2:40 PM <greearb@candelatech.com> wrote: > > > >> > > > >> From: Ben Greear <greearb@candelatech.com> > > > >> > > > >> This lets us more precisely calculate the absolute timestamp > > > >> of last-rix (ie, now - idle). > > > > > > > > Can you use 64-bit timestamps? struct timeval suffers from the > > > > overflow after 2038 problem. > > > > > > What is the preferred API to do this? Whatever it is, it would need > > > to compile on old crufty systems as well. > > > > I am not sure what the guidance for userspace is. The kernel uses > > 'struct timespec64' I think. > > Arnd (cc-ed) who has mostly led the 2038 problem in the kernel might > > have more input on the > > "old crufty systems" part. > > I'm not sure what you are trying to do, and there are different > answers depending on the usecase. > > For getting the time in the kernel, see Documentation/core-api/timekeeping.rst > do_gettimeofday() is going away for many reasons, so don't use that. > It sounds like you want "ktime_to_ms(ktime_get())" here. > > In userspace interfaces, you should pass 64-bit nanoseconds as returned > by ktime_get_ns(). > > If you want to pretty-print the current wall-clock, use the %pt format string > on a 'struct rtc_time'. Ah, I see now this was just userspace code. In that case, using gettimeofday() works fine, it will end up using a 64-bit version of 'timeval', and converting that to 64-bit milliseconds is safe. Using clock_gettime() is generally preferred over gettimeofday() since it avoids the conversion from nanoseconds to microseconds (which you then convert to milliseconds). Arnd
diff --git a/station.c b/station.c index 3b0c5f1..60804f2 100644 --- a/station.c +++ b/station.c @@ -314,6 +314,12 @@ static int print_sta_handler(struct nl_msg *msg, void *arg) [NL80211_STA_INFO_ACK_SIGNAL_AVG] = { .type = NLA_U8 }, }; char *chain; + struct timeval now; + unsigned long long now_ms; + + gettimeofday(&now, NULL); + now_ms = now.tv_sec * 1000; + now_ms += (now.tv_usec / 1000); nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); @@ -561,7 +567,7 @@ static int print_sta_handler(struct nl_msg *msg, void *arg) printf("\n\tauthenticated at:\t%llu ms", (unsigned long long)nla_get_u64(sinfo[NL80211_STA_INFO_AUTH_AT_MS])); - printf("\n"); + printf("\n\tcurrent time:\t%llu ms\n", now_ms); return NL_SKIP; }