Cidr4 merge algorithm #5
@@ -10,27 +10,25 @@ class Cidr4MergerError(Exception):
|
|||||||
|
|
||||||
|
|
||||||
def find_parent(a: Node, b: Node) -> Node:
|
def find_parent(a: Node, b: Node) -> Node:
|
||||||
ip_a, mask_len_a = a
|
ia, la = a
|
||||||
ip_b, mask_len_b = b
|
ib, lb = b
|
||||||
mask_len = min(mask_len_a, mask_len_b)
|
min_l = min(la, lb)
|
||||||
mask = ((1 << mask_len) - 1) << (32 - mask_len)
|
mask = ((1 << min_l) - 1) << (32 - min_l)
|
||||||
while ip_a & mask != ip_b & mask:
|
while ia & mask != ib & mask:
|
||||||
mask_len -= 1
|
min_l -= 1
|
||||||
mask = (mask << 1) & ((1 << 32) - 1)
|
mask = (mask << 1) & ((1 << 32) - 1)
|
||||||
ip = ip_a & mask
|
return ia & mask, min_l
|
||||||
parent_node = ip, mask_len
|
|
||||||
return parent_node
|
|
||||||
|
|
||||||
|
|
||||||
def calc_dip(mask_len_a: int, mask_len_b: int, mask_len_p: int) -> int:
|
def calc_dip(la: int, lb: int, lp: int) -> int:
|
||||||
def dip(mla, mlp):
|
def dip(l1, lp):
|
||||||
m = mlp + 1
|
m = lp + 1
|
||||||
res = 1 << (mla - m)
|
res = 1 << (l1 - m)
|
||||||
res -= 1
|
res -= 1
|
||||||
res <<= 32 - mla
|
res <<= 32 - l1
|
||||||
return res
|
return res
|
||||||
|
|
||||||
return dip(mask_len_a, mask_len_p) + dip(mask_len_b, mask_len_p)
|
return dip(la, lp) + dip(lb, lp)
|
||||||
|
|
||||||
|
|
||||||
def merge_two_nodes(node_a: Node, node_b: Node) -> tuple[Node, int]:
|
def merge_two_nodes(node_a: Node, node_b: Node) -> tuple[Node, int]:
|
||||||
|
|||||||
Reference in New Issue
Block a user