From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg0-x243.google.com (mail-pg0-x243.google.com [IPv6:2607:f8b0:400e:c05::243]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.bufferbloat.net (Postfix) with ESMTPS id 027293BA8E for ; Fri, 17 Nov 2017 16:19:50 -0500 (EST) Received: by mail-pg0-x243.google.com with SMTP id r12so2814025pgu.10 for ; Fri, 17 Nov 2017 13:19:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=f5TFdKyx1+SvVLCVnGq9AYI1za6Y6nQBcYmgkzsp+cw=; b=N1G5ccJ9McCWUvzxoVVPmVwV7wEgZ0uI0hjQMGvfNYXxyevHErNI59BYbBPIYeJLzj YknT0MeztI6yC3XMEPNWW+0I9L4aQrvbXdNu5DqIbA2n6usTUG1sEIhC/ZdGVJ/7UfIZ 52Kbk0ZJDpzUWMG3rYuolWQ+Nf/ZUwOj0lJf7XwoivtpUqaUbTQ2m8No4c15tLzaWLB/ 7KIo2O+2b/9dUnsvhfsn2lQbFRW/Wy2CwwWVPmkzo2e6rY/NT86O+xd1rjCqnZme4U6n 0gmHS/vE/k51UnELLb4/oZb/fIo4oLgT/HKf06y6HQQsi93ZCvixcvGZ8S9utu6EqNxX GgpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=f5TFdKyx1+SvVLCVnGq9AYI1za6Y6nQBcYmgkzsp+cw=; b=J+uruhNxP/lisp8Trz7CoyIFxVE2u41Vl6YgRfFVuTw4DffI059pbnxOyp7ILmX+eE kykUFtCHth7M8X6aWTKGLOTE/nBEliZRYvg1wNJjvyRWO9WmmX55RyAcrulrcPNWnpqC JJ6waL8loAXx/JohwkJGIqgOpt3DEMhXOXvk60sdeHQudphP/NayUajrANEDmXNnPDxB sc8lguy5X/0sXZCEbgPPbH3ymULx9gtDe9VcqSSKGhEozc9wU+SRkUJzl2tdvErmYTs/ 5eVEgUethr69LkXY+MgtH9Q4hQPpRHGZwWQiKaS9GgwvtdVG5xoYQtd9nOgUoLjubhYR W8ww== X-Gm-Message-State: AJaThX7Y1pV4iIo+iWm+52KDB6xwgDgthLhZ6UzdfzPD+JHsILqpm50G Z+GlBU69GCeeOFZnqfG0N/A7/A== X-Google-Smtp-Source: AGs4zMYrAcX5SzAxh+tN2jCxMWUL2NewY/2rBWI6UGY9LVoz6b+npZO6t3SpgeMiz1Y1P1TTP1XtVw== X-Received: by 10.99.185.89 with SMTP id v25mr6362542pgo.110.1510953590002; Fri, 17 Nov 2017 13:19:50 -0800 (PST) Received: from nemesis.lab.teklibre.com (c-24-6-113-161.hsd1.ca.comcast.net. [24.6.113.161]) by smtp.gmail.com with ESMTPSA id r68sm8747869pfb.149.2017.11.17.13.19.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 17 Nov 2017 13:19:49 -0800 (PST) From: Dave Taht To: cake@lists.bufferbloat.net Date: Fri, 17 Nov 2017 13:19:26 -0800 Message-Id: <1510953568-11797-4-git-send-email-dave.taht@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1510953568-11797-1-git-send-email-dave.taht@gmail.com> References: <1510953568-11797-1-git-send-email-dave.taht@gmail.com> Subject: [Cake] [RFC PATCH 3/5] tc: support conversions to or from 64 bit nanosecond-based time X-BeenThere: cake@lists.bufferbloat.net X-Mailman-Version: 2.1.20 Precedence: list List-Id: Cake - FQ_codel the next generation List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Nov 2017 21:19:51 -0000 Using a 32 bit field to represent time in nanoseconds results in a maximum value of about 4.3 seconds, which is well below many observed delays in WiFi and LTE, and barely in the ballpark for a trip past the Earth's moon, Luna. Using 64 bit time fields in nanoseconds allows us to simulate network diameters of several hundred light-years. However, only conversions to and from ns, us, ms, and seconds are provided. --- tc/tc_util.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tc/tc_util.h | 3 +++ 2 files changed, 63 insertions(+) diff --git a/tc/tc_util.c b/tc/tc_util.c index 472fc5d..ab344c8 100644 --- a/tc/tc_util.c +++ b/tc/tc_util.c @@ -322,6 +322,66 @@ char *sprint_ticks(__u32 ticks, char *buf) return sprint_time(tc_core_tick2time(ticks), buf); } +/* 64 bit times are represented internally in nanoseconds */ + +#define USEC_PER_SEC 1000 +#define MSEC_PER_SEC (1000 * 1000) +#define NSEC_PER_SEC (MSEC_PER_SEC * 1000) + +int get_time64(__u64 *time, const char *str) +{ + double t; + char *p; + + t = strtod(str, &p); + if (p == str) + return -1; + + if (*p) { + if (strcasecmp(p, "s") == 0 || + strcasecmp(p, "sec") == 0 || + strcasecmp(p, "secs") == 0) + t *= NSEC_PER_SEC; + else if (strcasecmp(p, "ms") == 0 || + strcasecmp(p, "msec") == 0 || + strcasecmp(p, "msecs") == 0) + t *= MSEC_PER_SEC; + else if (strcasecmp(p, "us") == 0 || + strcasecmp(p, "usec") == 0 || + strcasecmp(p, "usecs") == 0) + t *= USEC_PER_SEC; + else if (strcasecmp(p, "ns") == 0 || + strcasecmp(p, "nsec") == 0 || + strcasecmp(p, "nsecs") == 0) + t *= 1; + else + return -1; + } + + *time = t; + return 0; +} + +void print_time64(char *buf, int len, __u64 time) +{ + double tmp = time; + + if (time >= NSEC_PER_SEC) + snprintf(buf, len, "%.3fs", tmp/NSEC_PER_SEC); + else if (time >= MSEC_PER_SEC) + snprintf(buf, len, "%.3fms", tmp/MSEC_PER_SEC); + else if (time >= USEC_PER_SEC) + snprintf(buf, len, "%.3fus", tmp/USEC_PER_SEC); + else + snprintf(buf, len, "%lldns", time); +} + +char *sprint_time64(__u64 time, char *buf) +{ + print_time64(buf, SPRINT_BSIZE-1, time); + return buf; +} + int get_size(unsigned int *size, const char *str) { double sz; diff --git a/tc/tc_util.h b/tc/tc_util.h index 583a21a..3d87e8d 100644 --- a/tc/tc_util.h +++ b/tc/tc_util.h @@ -72,12 +72,14 @@ int get_rate64(__u64 *rate, const char *str); int get_size(unsigned int *size, const char *str); int get_size_and_cell(unsigned int *size, int *cell_log, char *str); int get_time(unsigned int *time, const char *str); +int get_time64(__u64 *time, const char *str); int get_linklayer(unsigned int *val, const char *arg); void print_rate(char *buf, int len, __u64 rate); void print_size(char *buf, int len, __u32 size); void print_qdisc_handle(char *buf, int len, __u32 h); void print_time(char *buf, int len, __u32 time); +void print_time64(char *buf, int len, __u64 time); void print_linklayer(char *buf, int len, unsigned int linklayer); char *sprint_rate(__u64 rate, char *buf); @@ -85,6 +87,7 @@ char *sprint_size(__u32 size, char *buf); char *sprint_qdisc_handle(__u32 h, char *buf); char *sprint_tc_classid(__u32 h, char *buf); char *sprint_time(__u32 time, char *buf); +char *sprint_time64(__u64 time, char *buf); char *sprint_ticks(__u32 ticks, char *buf); char *sprint_linklayer(unsigned int linklayer, char *buf); -- 2.7.4