[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <423298ba47747a9b7153f329c991cb133a7d86ed.1606774951.git.me@pmachata.org>
Date: Mon, 30 Nov 2020 23:59:40 +0100
From: Petr Machata <me@...chata.org>
To: netdev@...r.kernel.org, dsahern@...il.com,
stephen@...workplumber.org
Cc: Po.Liu@....com, toke@...e.dk, dave.taht@...il.com,
edumazet@...gle.com, tahiliani@...k.edu.in, vtlam@...gle.com,
leon@...nel.org, Petr Machata <me@...chata.org>
Subject: [PATCH iproute2-next 4/6] lib: Move get_rate(), get_rate64() from tc here
The functions get_rate() and get_rate64() are useful for parsing rate-like
values. The DCB tool will find these useful in the maxrate subtool.
Move them over to lib so that they can be easily reused.
Signed-off-by: Petr Machata <me@...chata.org>
---
include/utils.h | 2 ++
lib/utils.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++
tc/tc_util.c | 79 -------------------------------------------------
tc/tc_util.h | 2 --
4 files changed, 81 insertions(+), 81 deletions(-)
diff --git a/include/utils.h b/include/utils.h
index 01454f71cb1a..e2073844f2ef 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -162,6 +162,8 @@ int get_be64(__be64 *val, const char *arg, int base);
int get_be32(__be32 *val, const char *arg, int base);
int get_be16(__be16 *val, const char *arg, int base);
int get_addr64(__u64 *ap, const char *cp);
+int get_rate(unsigned int *rate, const char *str);
+int get_rate64(__u64 *rate, const char *str);
int hex2mem(const char *buf, uint8_t *mem, int count);
char *hexstring_n2a(const __u8 *str, int len, char *buf, int blen);
diff --git a/lib/utils.c b/lib/utils.c
index a0ba5181160e..1237ae40246c 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -513,6 +513,85 @@ int get_addr64(__u64 *ap, const char *cp)
return 1;
}
+/* See http://physics.nist.gov/cuu/Units/binary.html */
+static const struct rate_suffix {
+ const char *name;
+ double scale;
+} suffixes[] = {
+ { "bit", 1. },
+ { "Kibit", 1024. },
+ { "kbit", 1000. },
+ { "mibit", 1024.*1024. },
+ { "mbit", 1000000. },
+ { "gibit", 1024.*1024.*1024. },
+ { "gbit", 1000000000. },
+ { "tibit", 1024.*1024.*1024.*1024. },
+ { "tbit", 1000000000000. },
+ { "Bps", 8. },
+ { "KiBps", 8.*1024. },
+ { "KBps", 8000. },
+ { "MiBps", 8.*1024*1024. },
+ { "MBps", 8000000. },
+ { "GiBps", 8.*1024.*1024.*1024. },
+ { "GBps", 8000000000. },
+ { "TiBps", 8.*1024.*1024.*1024.*1024. },
+ { "TBps", 8000000000000. },
+ { NULL }
+};
+
+int get_rate(unsigned int *rate, const char *str)
+{
+ char *p;
+ double bps = strtod(str, &p);
+ const struct rate_suffix *s;
+
+ if (p == str)
+ return -1;
+
+ for (s = suffixes; s->name; ++s) {
+ if (strcasecmp(s->name, p) == 0) {
+ bps *= s->scale;
+ p += strlen(p);
+ break;
+ }
+ }
+
+ if (*p)
+ return -1; /* unknown suffix */
+
+ bps /= 8; /* -> bytes per second */
+ *rate = bps;
+ /* detect if an overflow happened */
+ if (*rate != floor(bps))
+ return -1;
+ return 0;
+}
+
+int get_rate64(__u64 *rate, const char *str)
+{
+ char *p;
+ double bps = strtod(str, &p);
+ const struct rate_suffix *s;
+
+ if (p == str)
+ return -1;
+
+ for (s = suffixes; s->name; ++s) {
+ if (strcasecmp(s->name, p) == 0) {
+ bps *= s->scale;
+ p += strlen(p);
+ break;
+ }
+ }
+
+ if (*p)
+ return -1; /* unknown suffix */
+
+ bps /= 8; /* -> bytes per second */
+ *rate = bps;
+ return 0;
+}
+
static void set_address_type(inet_prefix *addr)
{
switch (addr->family) {
diff --git a/tc/tc_util.c b/tc/tc_util.c
index ff979c617b9b..3a133ad84ff9 100644
--- a/tc/tc_util.c
+++ b/tc/tc_util.c
@@ -164,32 +164,6 @@ char *sprint_tc_classid(__u32 h, char *buf)
return buf;
}
-/* See http://physics.nist.gov/cuu/Units/binary.html */
-static const struct rate_suffix {
- const char *name;
- double scale;
-} suffixes[] = {
- { "bit", 1. },
- { "Kibit", 1024. },
- { "kbit", 1000. },
- { "mibit", 1024.*1024. },
- { "mbit", 1000000. },
- { "gibit", 1024.*1024.*1024. },
- { "gbit", 1000000000. },
- { "tibit", 1024.*1024.*1024.*1024. },
- { "tbit", 1000000000000. },
- { "Bps", 8. },
- { "KiBps", 8.*1024. },
- { "KBps", 8000. },
- { "MiBps", 8.*1024*1024. },
- { "MBps", 8000000. },
- { "GiBps", 8.*1024.*1024.*1024. },
- { "GBps", 8000000000. },
- { "TiBps", 8.*1024.*1024.*1024.*1024. },
- { "TBps", 8000000000000. },
- { NULL }
-};
-
/* Parse a percent e.g: '30%'
* return: 0 = ok, -1 = error, 1 = out of range
*/
@@ -273,59 +247,6 @@ int get_percent_rate64(__u64 *rate, const char *str, const char *dev)
return get_rate64(rate, r_str);
}
-int get_rate(unsigned int *rate, const char *str)
-{
- char *p;
- double bps = strtod(str, &p);
- const struct rate_suffix *s;
-
- if (p == str)
- return -1;
-
- for (s = suffixes; s->name; ++s) {
- if (strcasecmp(s->name, p) == 0) {
- bps *= s->scale;
- p += strlen(p);
- break;
- }
- }
-
- if (*p)
- return -1; /* unknown suffix */
-
- bps /= 8; /* -> bytes per second */
- *rate = bps;
- /* detect if an overflow happened */
- if (*rate != floor(bps))
- return -1;
- return 0;
-}
-
-int get_rate64(__u64 *rate, const char *str)
-{
- char *p;
- double bps = strtod(str, &p);
- const struct rate_suffix *s;
-
- if (p == str)
- return -1;
-
- for (s = suffixes; s->name; ++s) {
- if (strcasecmp(s->name, p) == 0) {
- bps *= s->scale;
- p += strlen(p);
- break;
- }
- }
-
- if (*p)
- return -1; /* unknown suffix */
-
- bps /= 8; /* -> bytes per second */
- *rate = bps;
- return 0;
-}
-
void tc_print_rate(enum output_type t, const char *key, const char *fmt,
unsigned long long rate)
{
diff --git a/tc/tc_util.h b/tc/tc_util.h
index d3b38c69155d..675fb34269f6 100644
--- a/tc/tc_util.h
+++ b/tc/tc_util.h
@@ -76,9 +76,7 @@ struct qdisc_util *get_qdisc_kind(const char *str);
struct filter_util *get_filter_kind(const char *str);
int get_qdisc_handle(__u32 *h, const char *str);
-int get_rate(unsigned int *rate, const char *str);
int get_percent_rate(unsigned int *rate, const char *str, const char *dev);
-int get_rate64(__u64 *rate, const char *str);
int get_percent_rate64(__u64 *rate, const char *str, const char *dev);
int get_size(unsigned int *size, const char *str);
int get_size_and_cell(unsigned int *size, int *cell_log, char *str);
--
2.25.1
Powered by blists - more mailing lists