aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNils Schneider <nils@nilsschneider.net>2014-08-10 09:36:29 +0200
committerNils Schneider <nils@nilsschneider.net>2014-08-10 09:36:29 +0200
commita88b207cf12f6fd12c5701aa7b54a79eb590c76f (patch)
tree6ba3129a50febd24eabe8d4973b68cf35659e74a
parent263dd4ceff65c40d90b7f40937986bf3612d8f45 (diff)
remove fuzzy matching
-rw-r--r--nodedb.py94
1 files changed, 4 insertions, 90 deletions
diff --git a/nodedb.py b/nodedb.py
index 973861d..58595a5 100644
--- a/nodedb.py
+++ b/nodedb.py
@@ -59,16 +59,6 @@ class NodeDB:
except:
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):
for node in self._nodes:
for mac in macs:
@@ -115,11 +105,8 @@ class NodeDB:
node.add_mac(x['router'])
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 is_similar(x['router'], x['gateway']):
+ if x['router'] in node.macs:
node.add_mac(x['gateway'])
# skip processing as regular link
@@ -216,7 +203,7 @@ class NodeDB:
node = self.maybe_node_by_mac([mac])
except:
try:
- node = self.maybe_node_by_fuzzy_mac(mac)
+ node = self.maybe_node_mac(mac)
except:
# create an offline node
node = Node()
@@ -304,8 +291,8 @@ class NodeDB:
idt = link.target.interface
try:
- node_source = self.maybe_node_by_fuzzy_mac(ids)
- node_target = self.maybe_node_by_id(idt)
+ node_source = self.maybe_node_by_mac(ids)
+ node_target = self.maybe_node_by_mac(idt)
if not node_source.flags['client'] and not node_target.flags['client']:
# if none of the nodes associated with this link are clients,
@@ -354,76 +341,3 @@ def generateId(nodeId,nodeCounters):
n = 0
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