On 8/6/18 11:09 AM, Yousuk Seung wrote: > diff --git a/tc/tc_core.h b/tc/tc_core.h > index 1dfa9a4f773b..a0fe0923d171 100644 > --- a/tc/tc_core.h > +++ b/tc/tc_core.h > @@ -7,6 +7,10 @@ > > #define TIME_UNITS_PER_SEC 1000000 > > +#define NSEC_PER_USEC 1000 > +#define NSEC_PER_MSEC 1000000 > +#define NSEC_PER_SEC 1000000000LL > +
These are not specific to tc so a header in include is a better location (utils.h or a new one) > enum link_layer { > LINKLAYER_UNSPEC, > LINKLAYER_ETHERNET, > diff --git a/tc/tc_util.c b/tc/tc_util.c > index d7578528a31b..c39c9046dcae 100644 > --- a/tc/tc_util.c > +++ b/tc/tc_util.c Similarly for these time functions - not specific to tc so move to lib/utils.c > @@ -385,6 +385,61 @@ char *sprint_ticks(__u32 ticks, char *buf) > return sprint_time(tc_core_tick2time(ticks), buf); > } > > +/* 64 bit times are represented internally in nanoseconds */ > +int get_time64(__s64 *time, const char *str) __u64 seems more appropriate than __s64 > +{ > + double nsec; > + char *p; > + > + nsec = strtod(str, &p); > + if (p == str) > + return -1; > + > + if (*p) { > + if (strcasecmp(p, "s") == 0 || > + strcasecmp(p, "sec") == 0 || > + strcasecmp(p, "secs") == 0) > + nsec *= NSEC_PER_SEC; > + else if (strcasecmp(p, "ms") == 0 || > + strcasecmp(p, "msec") == 0 || > + strcasecmp(p, "msecs") == 0) > + nsec *= NSEC_PER_MSEC; > + else if (strcasecmp(p, "us") == 0 || > + strcasecmp(p, "usec") == 0 || > + strcasecmp(p, "usecs") == 0) > + nsec *= NSEC_PER_USEC; > + else if (strcasecmp(p, "ns") == 0 || > + strcasecmp(p, "nsec") == 0 || > + strcasecmp(p, "nsecs") == 0) strncasecmp would be more efficient > + nsec *= 1; > + else > + return -1; > + } > + > + *time = nsec; > + return 0; > +} > + > +void print_time64(char *buf, int len, __s64 time) > +{ > + double nsec = time; > + > + if (time >= NSEC_PER_SEC) > + snprintf(buf, len, "%.3fs", nsec/NSEC_PER_SEC); > + else if (time >= NSEC_PER_MSEC) > + snprintf(buf, len, "%.3fms", nsec/NSEC_PER_MSEC); > + else if (time >= NSEC_PER_USEC) > + snprintf(buf, len, "%.3fus", nsec/NSEC_PER_USEC); > + else > + snprintf(buf, len, "%lldns", time); > +} > + > +char *sprint_time64(__s64 time, char *buf) > +{ > + print_time64(buf, SPRINT_BSIZE-1, time); > + return buf; > +} > + > int get_size(unsigned int *size, const char *str) > { > double sz;