1 # Taken from bwlimit.py
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.
15 "gibit": 1024*1024*1024,
17 "tibit": 1024*1024*1024*1024,
18 "tbit": 1000000000000,
24 "gibps": 8*1024*1024*1024,
26 "tibps": 8*1024*1024*1024*1024,
32 Parses an integer or a tc rate string (e.g., 1.5mbit) into bits/second
37 m = re.match(r"([0-9.]+)(\D*)", s)
40 suffix = m.group(2).lower()
41 if suffixes.has_key(suffix):
42 return int(float(m.group(1)) * suffixes[suffix])
46 def format_tc_rate(rate):
48 Formats a bits/second rate into a tc rate string
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.)
56 return "%.0fkbit" % (rate / 1000.)
58 return "%.0fbit" % rate
60 def get_virt_ip(self, remote):
61 link = self.get_link_id(remote)
62 iface = self.get_iface_id(remote)
64 second = ((link & 0x3f)<<2) + iface
65 return "192.168.%d.%d" % (first, second)
67 def get_virt_net(self, remote):
68 link = self.get_link_id(remote)
70 second = (link & 0x3f)<<2
71 return "192.168.%d.%d/30" % (first, second)
73 def get_topo_rspec(self, link):
76 elif link.end2 == self:
79 raise Error("Link does not connect to Node")
81 my_ip = self.get_virt_ip(remote)
82 remote_ip = remote.get_virt_ip(self)
83 net = self.get_virt_net(remote)
84 bw = format_tc_rate(link.bps)
85 ipaddr = remote.get_primary_iface().ipv4
86 return (remote.id, ipaddr, bw, my_ip, remote_ip, net)