Merge branch 'master' into exp2
[sfa.git] / sfa / util / bwlimit.py
1 # Taken from bwlimit.py
2 #
3 # See tc_util.c and http://physics.nist.gov/cuu/Units/binary.html. Be
4 # warned that older versions of tc interpret "kbps", "mbps", "mbit",
5 # and "kbit" to mean (in this system) "kibps", "mibps", "mibit", and
6 # "kibit" and that if an older version is installed, all rates will
7 # be off by a small fraction.
8 suffixes = {
9     "":         1,
10     "bit":  1,
11     "kibit":    1024,
12     "kbit": 1000,
13     "mibit":    1024*1024,
14     "mbit": 1000000,
15     "gibit":    1024*1024*1024,
16     "gbit": 1000000000,
17     "tibit":    1024*1024*1024*1024,
18     "tbit": 1000000000000,
19     "bps":  8,
20     "kibps":    8*1024,
21     "kbps": 8000,
22     "mibps":    8*1024*1024,
23     "mbps": 8000000,
24     "gibps":    8*1024*1024*1024,
25     "gbps": 8000000000,
26     "tibps":    8*1024*1024*1024*1024,
27     "tbps": 8000000000000
28 }
29
30 def get_tc_rate(s):
31     """
32     Parses an integer or a tc rate string (e.g., 1.5mbit) into bits/second
33     """
34
35     if type(s) == int:
36         return s
37     m = re.match(r"([0-9.]+)(\D*)", s)
38     if m is None:
39         return -1
40     suffix = m.group(2).lower()
41     if suffixes.has_key(suffix):
42         return int(float(m.group(1)) * suffixes[suffix])
43     else:
44         return -1
45
46 def format_tc_rate(rate):
47     """
48     Formats a bits/second rate into a tc rate string
49     """
50
51     if rate >= 1000000000 and (rate % 1000000000) == 0:
52         return "%.0fgbit" % (rate / 1000000000.)
53     elif rate >= 1000000 and (rate % 1000000) == 0:
54         return "%.0fmbit" % (rate / 1000000.)
55     elif rate >= 1000:
56         return "%.0fkbit" % (rate / 1000.)
57     else:
58         return "%.0fbit" % rate