Coverage Report

Created: 2025-07-14 06:48

/src/frr/lib/tc.c
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
}