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,
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 suffixes.has_key(suffix):
45 return int(float(m.group(1)) * suffixes[suffix])
49 def format_tc_rate(rate):
51 Formats a bits/second rate into a tc rate string
54 if rate >= 1000000000 and (rate % 1000000000) == 0:
55 return "%.0fgbit" % (rate / 1000000000.)
56 elif rate >= 1000000 and (rate % 1000000) == 0:
57 return "%.0fmbit" % (rate / 1000000.)
59 return "%.0fkbit" % (rate / 1000.)
61 return "%.0fbit" % rate
65 def get_link_id(if1, if2):
66 if if1['id'] < if2['id']:
67 link = (if1['id']<<7) + if2['id']
69 link = (if2['id']<<7) + if1['id']
73 def get_iface_id(if1, if2):
74 if if1['id'] < if2['id']:
81 def get_virt_ip(if1, if2):
82 link_id = VLink.get_link_id(if1, if2)
83 iface_id = VLink.get_iface_id(if1, if2)
85 second = ((link_id & 0x3f)<<2) + iface_id
86 return "192.168.%d.%s" % (first, second)
89 def get_virt_net(link):
90 link_id = VLink.get_link_id(link['interface1'], link['interface2'])
92 second = (link_id & 0x3f)<<2
93 return "192.168.%d.%d/30" % (first, second)
96 def get_interface_id(interface):
97 if_name = Xrn(interface['component_id']).get_leaf()
98 node, dev = if_name.split(":")
99 node_id = int(node.replace("node", ""))
104 def get_topo_rspec(link, ipaddr):
105 link['interface1']['id'] = VLink.get_interface_id(link['interface1'])
106 link['interface2']['id'] = VLink.get_interface_id(link['interface2'])
107 my_ip = VLink.get_virt_ip(link['interface1'], link['interface2'])
108 remote_ip = VLink.get_virt_ip(link['interface2'], link['interface1'])
109 net = VLink.get_virt_net(link)
110 bw = format_tc_rate(long(link['capacity']))
111 return (link['interface2']['id'], ipaddr, bw, my_ip, remote_ip, net)
114 def topo_rspec_to_link(topo_rspec):