Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0-or-later
2 : /*
3 : * Traffic Control (TC) main library
4 : * Copyright (C) 2022 Shichu Yang
5 : */
6 :
7 : #include "tc.h"
8 :
9 0 : int tc_getrate(const char *str, uint64_t *rate)
10 : {
11 0 : char *endp;
12 0 : uint64_t raw = strtoull(str, &endp, 10);
13 :
14 0 : if (endp == str)
15 : return -1;
16 :
17 : /* if the string only contains a number, it must be valid rate (bps) */
18 0 : bool valid = (*endp == '\0');
19 :
20 0 : const char *p = endp;
21 0 : bool bytes = false, binary_base = false;
22 0 : int power = 0;
23 :
24 0 : while (*p) {
25 0 : if (strcmp(p, "Bps") == 0) {
26 : bytes = true;
27 : valid = true;
28 : break;
29 0 : } else if (strcmp(p, "bit") == 0) {
30 : valid = true;
31 : break;
32 : }
33 0 : switch (*p) {
34 : case 'k':
35 : case 'K':
36 : power = 1;
37 : break;
38 0 : case 'm':
39 : case 'M':
40 0 : power = 2;
41 0 : break;
42 0 : case 'g':
43 : case 'G':
44 0 : power = 3;
45 0 : break;
46 0 : case 't':
47 : case 'T':
48 0 : power = 4;
49 0 : break;
50 0 : case 'i':
51 : case 'I':
52 0 : if (power != 0)
53 : binary_base = true;
54 : else
55 : return -1;
56 : break;
57 : default:
58 : return -1;
59 : }
60 0 : p++;
61 : }
62 :
63 0 : if (!valid)
64 : return -1;
65 :
66 0 : for (int i = 0; i < power; i++)
67 0 : raw *= binary_base ? 1024ULL : 1000ULL;
68 :
69 0 : if (bytes)
70 0 : *rate = raw;
71 : else
72 0 : *rate = raw / 8ULL;
73 :
74 : return 0;
75 : }
|