2 from sfa.util.xrn import Xrn
3 # Taken from bwlimit.py
5 # See tc_util.c and http://physics.nist.gov/cuu/Units/binary.html. Be
6 # warned that older versions of tc interpret "kbps", "mbps", "mbit",
7 # and "kbit" to mean (in this system) "kibps", "mibps", "mibit", and
8 # "kibit" and that if an older version is installed, all rates will
9 # be off by a small fraction.
17 "gibit": 1024 * 1024 * 1024,
19 "tibit": 1024 * 1024 * 1024 * 1024,
20 "tbit": 1000000000000,
24 "mibps": 8 * 1024 * 1024,
26 "gibps": 8 * 1024 * 1024 * 1024,
28 "tibps": 8 * 1024 * 1024 * 1024 * 1024,
35 Parses an integer or a tc rate string (e.g., 1.5mbit) into bits/second
40 m = re.match(r"([0-9.]+)(\D*)", s)
43 suffix = m.group(2).lower()
44 if suffix in suffixes:
45 return int(float(m.group(1)) * suffixes[suffix])
50 def format_tc_rate(rate):
52 Formats a bits/second rate into a tc rate string
55 if rate >= 1000000000 and (rate % 1000000000) == 0:
56 return "%.0fgbit" % (rate / 1000000000.)
57 elif rate >= 1000000 and (rate % 1000000) == 0:
58 return "%.0fmbit" % (rate / 1000000.)
60 return "%.0fkbit" % (rate / 1000.)
62 return "%.0fbit" % rate
68 def get_link_id(if1, if2):
69 if if1['id'] < if2['id']:
70 link = (if1['id'] << 7) + if2['id']
72 link = (if2['id'] << 7) + if1['id']
76 def get_iface_id(if1, if2):
77 if if1['id'] < if2['id']:
84 def get_virt_ip(if1, if2):
85 link_id = VLink.get_link_id(if1, if2)
86 iface_id = VLink.get_iface_id(if1, if2)
88 second = ((link_id & 0x3f) << 2) + iface_id
89 return "192.168.%d.%s" % (first, second)
92 def get_virt_net(link):
93 link_id = VLink.get_link_id(link['interface1'], link['interface2'])
95 second = (link_id & 0x3f) << 2
96 return "192.168.%d.%d/30" % (first, second)
99 def get_interface_id(interface):
100 if_name = Xrn(interface['component_id']).get_leaf()
101 node, dev = if_name.split(":")
102 node_id = int(node.replace("node", ""))
106 def get_topo_rspec(link, ipaddr):
107 link['interface1']['id'] = VLink.get_interface_id(link['interface1'])
108 link['interface2']['id'] = VLink.get_interface_id(link['interface2'])
109 my_ip = VLink.get_virt_ip(link['interface1'], link['interface2'])
110 remote_ip = VLink.get_virt_ip(link['interface2'], link['interface1'])
111 net = VLink.get_virt_net(link)
112 bw = format_tc_rate(long(link['capacity']))
113 return (link['interface2']['id'], ipaddr, bw, my_ip, remote_ip, net)
116 def topo_rspec_to_link(topo_rspec):