Newer
Older
if 'hcbf_ui' not in packet.stats:
packet.stats = {
f'hcbf_{reason}': 0
for reason in ['direct', 'ui', 'lp','ui_lonely', 'lp_lonely',
'cbc', 'ncf' ]
}
stats = packet.stats
dest = packet.destination
def send(to, reason):
stats[f'hcbf_{reason}'] += 1
self.send(to, packet, reason=reason)
# case 1: direct delivery
if dest in self.links:
send(dest, 'direct')
return True
ui = community.get_ui
lp = community.get_lp
cbc = lambda n: community.get_cbc(n.community, dest.community)
ncf = lambda n: community.get_ncf(n, dest.community)
local_community = [
met for met in self.links if met in self.community
]
not_local_community = [
met for met in self.links if met not in self.community
]
if self.community is dest.community and local_community:
max_ui = max(local_community, key=ui)
if ui(max_ui) > ui(self):
send(max_ui, 'ui')
elif ui(max_ui) < ui(self):
return False
# ui(max_ui) == ui(self)
max_lp = max(local_community, key=lp)
if lp(max_lp) > lp(self):
send(max_lp, 'lp')
return True
elif lp(max_lp) < lp(self):
return False
# lp(max_lp) == lp(self)
max_cbc = max(not_local_community, key=cbc)
if cbc(max_cbc) > cbc(self):
send(max_cbc, 'cbc')
return True
elif cbc(max_cbc) < cbc(self):
return False
# cbc(max_cbc) == cbc(self)
if local_community:
max_ncf = max(local_community, key=ncf)
if ncf(max_ncf) > ncf(self):
send(max_ncf, 'ncf')
return True
elif ncf(max_ncf) < ncf(self):
return False
# ncf(max_ncf) == ncf(self)
max_ui = max(local_community, key=ui)
if ui(max_ui) > ui(self):
send(max_ui, 'ui_lonely')
return True
elif ui(max_ui) < ui(self):
return False
# ui(max_ui) == ui(self)
max_lp = max(local_community, key=lp)
if lp(max_lp) > lp(self):
send(max_lp, 'lp_lonely')
return True
elif lp(max_lp) < lp(self):
return False
# lp(max_lp) == lp(self)