Line | Count | Source (jump to first uncovered line) |
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 | | int tc_getrate(const char *str, uint64_t *rate) |
10 | 0 | { |
11 | 0 | char *endp; |
12 | 0 | uint64_t raw = strtoull(str, &endp, 10); |
13 | |
|
14 | 0 | if (endp == str) |
15 | 0 | 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 | 0 | bytes = true; |
27 | 0 | valid = true; |
28 | 0 | break; |
29 | 0 | } else if (strcmp(p, "bit") == 0) { |
30 | 0 | valid = true; |
31 | 0 | break; |
32 | 0 | } |
33 | 0 | switch (*p) { |
34 | 0 | case 'k': |
35 | 0 | case 'K': |
36 | 0 | power = 1; |
37 | 0 | break; |
38 | 0 | case 'm': |
39 | 0 | case 'M': |
40 | 0 | power = 2; |
41 | 0 | break; |
42 | 0 | case 'g': |
43 | 0 | case 'G': |
44 | 0 | power = 3; |
45 | 0 | break; |
46 | 0 | case 't': |
47 | 0 | case 'T': |
48 | 0 | power = 4; |
49 | 0 | break; |
50 | 0 | case 'i': |
51 | 0 | case 'I': |
52 | 0 | if (power != 0) |
53 | 0 | binary_base = true; |
54 | 0 | else |
55 | 0 | return -1; |
56 | 0 | break; |
57 | 0 | default: |
58 | 0 | return -1; |
59 | 0 | } |
60 | 0 | p++; |
61 | 0 | } |
62 | | |
63 | 0 | if (!valid) |
64 | 0 | 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 | 0 | else |
72 | 0 | *rate = raw / 8ULL; |
73 | |
|
74 | 0 | return 0; |
75 | 0 | } |