remove fuzzy matching
parent
263dd4ceff
commit
a88b207cf1
94
nodedb.py
94
nodedb.py
|
@ -59,16 +59,6 @@ class NodeDB:
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def maybe_node_by_fuzzy_mac(self, mac):
|
|
||||||
mac_a = mac.lower()
|
|
||||||
|
|
||||||
for node in self._nodes:
|
|
||||||
for mac_b in node.macs:
|
|
||||||
if is_derived_mac(mac_a, mac_b):
|
|
||||||
return node
|
|
||||||
|
|
||||||
raise KeyError
|
|
||||||
|
|
||||||
def maybe_node_by_mac(self, macs):
|
def maybe_node_by_mac(self, macs):
|
||||||
for node in self._nodes:
|
for node in self._nodes:
|
||||||
for mac in macs:
|
for mac in macs:
|
||||||
|
@ -115,11 +105,8 @@ class NodeDB:
|
||||||
node.add_mac(x['router'])
|
node.add_mac(x['router'])
|
||||||
self._nodes.append(node)
|
self._nodes.append(node)
|
||||||
|
|
||||||
# If it's a TT link and the MAC is very similar
|
|
||||||
# consider this MAC as one of the routers
|
|
||||||
# MACs
|
|
||||||
if 'gateway' in x and x['label'] == "TT":
|
if 'gateway' in x and x['label'] == "TT":
|
||||||
if is_similar(x['router'], x['gateway']):
|
if x['router'] in node.macs:
|
||||||
node.add_mac(x['gateway'])
|
node.add_mac(x['gateway'])
|
||||||
|
|
||||||
# skip processing as regular link
|
# skip processing as regular link
|
||||||
|
@ -216,7 +203,7 @@ class NodeDB:
|
||||||
node = self.maybe_node_by_mac([mac])
|
node = self.maybe_node_by_mac([mac])
|
||||||
except:
|
except:
|
||||||
try:
|
try:
|
||||||
node = self.maybe_node_by_fuzzy_mac(mac)
|
node = self.maybe_node_mac(mac)
|
||||||
except:
|
except:
|
||||||
# create an offline node
|
# create an offline node
|
||||||
node = Node()
|
node = Node()
|
||||||
|
@ -304,8 +291,8 @@ class NodeDB:
|
||||||
idt = link.target.interface
|
idt = link.target.interface
|
||||||
|
|
||||||
try:
|
try:
|
||||||
node_source = self.maybe_node_by_fuzzy_mac(ids)
|
node_source = self.maybe_node_by_mac(ids)
|
||||||
node_target = self.maybe_node_by_id(idt)
|
node_target = self.maybe_node_by_mac(idt)
|
||||||
|
|
||||||
if not node_source.flags['client'] and not node_target.flags['client']:
|
if not node_source.flags['client'] and not node_target.flags['client']:
|
||||||
# if none of the nodes associated with this link are clients,
|
# if none of the nodes associated with this link are clients,
|
||||||
|
@ -354,76 +341,3 @@ def generateId(nodeId,nodeCounters):
|
||||||
n = 0
|
n = 0
|
||||||
|
|
||||||
return nodeId + "_" + str(n)
|
return nodeId + "_" + str(n)
|
||||||
|
|
||||||
# compares two MACs and decides whether they are
|
|
||||||
# similar and could be from the same node
|
|
||||||
def is_similar(a, b):
|
|
||||||
if a == b:
|
|
||||||
return True
|
|
||||||
|
|
||||||
try:
|
|
||||||
mac_a = list(int(i, 16) for i in a.split(":"))
|
|
||||||
mac_b = list(int(i, 16) for i in b.split(":"))
|
|
||||||
except ValueError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
# first byte must only differ in bit 2
|
|
||||||
if mac_a[0] | 2 == mac_b[0] | 2:
|
|
||||||
# count different bytes
|
|
||||||
c = [x for x in zip(mac_a[1:], mac_b[1:]) if x[0] != x[1]]
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
# no more than two additional bytes must differ
|
|
||||||
if len(c) <= 2:
|
|
||||||
delta = 0
|
|
||||||
|
|
||||||
if len(c) > 0:
|
|
||||||
delta = sum(abs(i[0] -i[1]) for i in c)
|
|
||||||
|
|
||||||
# These addresses look pretty similar!
|
|
||||||
return delta < 8
|
|
||||||
|
|
||||||
def is_derived_mac(a, b):
|
|
||||||
if a == b:
|
|
||||||
return True
|
|
||||||
|
|
||||||
try:
|
|
||||||
mac_a = list(int(i, 16) for i in a.split(":"))
|
|
||||||
mac_b = list(int(i, 16) for i in b.split(":"))
|
|
||||||
except ValueError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
if mac_a[4] != mac_b[4] or mac_a[2] != mac_b[2] or mac_a[1] != mac_b[1]:
|
|
||||||
return False
|
|
||||||
|
|
||||||
x = list(mac_a)
|
|
||||||
x[5] += 1
|
|
||||||
x[5] %= 255
|
|
||||||
if mac_b == x:
|
|
||||||
return True
|
|
||||||
|
|
||||||
x[0] |= 2
|
|
||||||
if mac_b == x:
|
|
||||||
return True
|
|
||||||
|
|
||||||
x[3] += 1
|
|
||||||
x[3] %= 255
|
|
||||||
if mac_b == x:
|
|
||||||
return True
|
|
||||||
|
|
||||||
x = list(mac_a)
|
|
||||||
x[0] |= 2
|
|
||||||
x[5] += 2
|
|
||||||
x[5] %= 255
|
|
||||||
if mac_b == x:
|
|
||||||
return True
|
|
||||||
|
|
||||||
x = list(mac_a)
|
|
||||||
x[0] |= 2
|
|
||||||
x[3] += 1
|
|
||||||
x[3] %= 255
|
|
||||||
if mac_b == x:
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
Loading…
Reference in New Issue