def get_sre(net, target_prefix_len):
"""Calculate first and last /target_prefix_len subnets from net
Returns: first, last, cnt (all integers)
"""
assert isinstance(net, (ipaddr.IPv4Network, ipaddr.IPv6Network))
assert target_prefix_len <= 64, "Max target prefix length is 64"
assert net.prefixlen <= target_prefix_len, \
("Prefix length ({}) must be <= of the target prefix "
"length ({}): {}".format(net.prefixlen, target_prefix_len, net))
first = UniqueSmallestRoutableEntriesMonitor.get_first(net)
tot_len = 64 if net.version == 6 else 32
# first <= 2^63 -1 to avoid overflows
assert first <= 9223372036854775807, \
"Only prefixes <= 7fff:ffff:ffff:ffff::/64 can be processed"
diff_len = target_prefix_len - net.prefixlen
last = first | ((2**diff_len - 1) << tot_len - target_prefix_len)
return first, last, 2**diff_len
评论列表
文章目录