]> git.proxmox.com Git - mirror_frr.git/blob - lib/tc.c
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / lib / tc.c
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 {
11 char *endp;
12 uint64_t raw = strtoull(str, &endp, 10);
13
14 if (endp == str)
15 return -1;
16
17 /* if the string only contains a number, it must be valid rate (bps) */
18 bool valid = (*endp == '\0');
19
20 const char *p = endp;
21 bool bytes = false, binary_base = false;
22 int power = 0;
23
24 while (*p) {
25 if (strcmp(p, "Bps") == 0) {
26 bytes = true;
27 valid = true;
28 break;
29 } else if (strcmp(p, "bit") == 0) {
30 valid = true;
31 break;
32 }
33 switch (*p) {
34 case 'k':
35 case 'K':
36 power = 1;
37 break;
38 case 'm':
39 case 'M':
40 power = 2;
41 break;
42 case 'g':
43 case 'G':
44 power = 3;
45 break;
46 case 't':
47 case 'T':
48 power = 4;
49 break;
50 case 'i':
51 case 'I':
52 if (power != 0)
53 binary_base = true;
54 else
55 return -1;
56 break;
57 default:
58 return -1;
59 }
60 p++;
61 }
62
63 if (!valid)
64 return -1;
65
66 for (int i = 0; i < power; i++)
67 raw *= binary_base ? 1024ULL : 1000ULL;
68
69 if (bytes)
70 *rate = raw;
71 else
72 *rate = raw / 8ULL;
73
74 return 0;
75 }