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_link_id(if1, if2):
61 if if1['id'] < if2['id']:
62 link = (if1['id']<<7) + if2['id']
64 link = (if2['id']<<7) + if1['id']
67 def get_iface_id(if1, if2):
68 if if1['id'] < if2['id']:
74 def get_virt_ip(if1, if2):
75 link_id = get_link_id(if1, if2)
76 iface_id = get_iface_id(if1, if2)
78 second = ((link_id & 0x3f)<<2) + iface_id
79 return "192.168.%d.%s" % (frist, second)
81 def get_virt_net(link):
82 link_id = self.get_link_id(link)
84 second = (link_id & 0x3f)<<2
85 return "192.168.%d.%d/30" % (first, second)
87 def get_interface_id(interface):
88 if_name = PlXrn(interface=interface['component_id']).interface_name()
89 node, dev = if_name.split(":")
90 node_id = int(node.replace("pc", ""))
94 def get_topo_rspec(self, link):
95 link['interface1']['id'] = get_interface_id(link['interface1'])
96 link['interface2']['id'] = get_interface_id(link['interface2'])
97 my_ip = get_virt_ip(link['interface1'], link['interface2'])
98 remote_ip = get_virt_ip(link['interface2'], link['interface1'])
99 net = get_virt_net(link)
100 bw = format_tc_rate(long(link['capacity']))
101 ipaddr = remote.get_primary_iface().ipv4
102 return (link['interface2']['id'], ipaddr, bw, my_ip, remote_ip, net)