Added announce frequency sampling to interfaces

This commit is contained in:
Mark Qvist 2023-09-30 19:11:10 +02:00
parent ea52153969
commit 0fd75cb819
11 changed files with 84 additions and 27 deletions

View File

@ -77,8 +77,7 @@ class AX25KISSInterface(Interface):
RNS.log("You can install one with the command: python3 -m pip install pyserial", RNS.LOG_CRITICAL) RNS.log("You can install one with the command: python3 -m pip install pyserial", RNS.LOG_CRITICAL)
RNS.panic() RNS.panic()
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 564 self.HW_MTU = 564

View File

@ -76,11 +76,9 @@ class AutoInterface(Interface):
def __init__(self, owner, name, group_id=None, discovery_scope=None, discovery_port=None, data_port=None, allowed_interfaces=None, ignored_interfaces=None, configured_bitrate=None): def __init__(self, owner, name, group_id=None, discovery_scope=None, discovery_port=None, data_port=None, allowed_interfaces=None, ignored_interfaces=None, configured_bitrate=None):
from RNS.vendor.ifaddr import niwrapper from RNS.vendor.ifaddr import niwrapper
super().__init__()
self.netinfo = niwrapper self.netinfo = niwrapper
self.rxb = 0
self.txb = 0
self.HW_MTU = 1064 self.HW_MTU = 1064
self.IN = True self.IN = True

View File

@ -390,8 +390,7 @@ class I2PInterfacePeer(Interface):
TUNNEL_STATE_STALE = 0x02 TUNNEL_STATE_STALE = 0x02
def __init__(self, parent_interface, owner, name, target_i2p_dest=None, connected_socket=None, max_reconnect_tries=None): def __init__(self, parent_interface, owner, name, target_i2p_dest=None, connected_socket=None, max_reconnect_tries=None):
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 1064 self.HW_MTU = 1064
@ -832,8 +831,7 @@ class I2PInterface(Interface):
BITRATE_GUESS = 256*1000 BITRATE_GUESS = 256*1000
def __init__(self, owner, name, rns_storagepath, peers, connectable = False, ifac_size = 16, ifac_netname = None, ifac_netkey = None): def __init__(self, owner, name, rns_storagepath, peers, connectable = False, ifac_size = 16, ifac_netname = None, ifac_netkey = None):
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 1064 self.HW_MTU = 1064
@ -964,6 +962,12 @@ class I2PInterface(Interface):
def processOutgoing(self, data): def processOutgoing(self, data):
pass pass
def received_announce(self, from_spawned=False):
if from_spawned: self.ia_freq_deque.append(time.time())
def sent_announce(self, from_spawned=False):
if from_spawned: self.oa_freq_deque.append(time.time())
def detach(self): def detach(self):
RNS.log("Detaching "+str(self), RNS.LOG_DEBUG) RNS.log("Detaching "+str(self), RNS.LOG_DEBUG)
self.i2p.stop() self.i2p.stop()

View File

@ -23,6 +23,7 @@
import RNS import RNS
import time import time
import threading import threading
from collections import deque
class Interface: class Interface:
IN = False IN = False
@ -43,14 +44,65 @@ class Interface:
# should actively discover paths for. # should actively discover paths for.
DISCOVER_PATHS_FOR = [MODE_ACCESS_POINT, MODE_GATEWAY] DISCOVER_PATHS_FOR = [MODE_ACCESS_POINT, MODE_GATEWAY]
# How many samples to use for incoming
# announce frequency calculation
IA_FREQ_SAMPLES = 6
OA_FREQ_SAMPLES = 6
def __init__(self): def __init__(self):
self.rxb = 0 self.rxb = 0
self.txb = 0 self.txb = 0
self.online = False self.online = False
self.ia_freq_deque = deque(maxlen=Interface.IA_FREQ_SAMPLES)
self.oa_freq_deque = deque(maxlen=Interface.OA_FREQ_SAMPLES)
def get_hash(self): def get_hash(self):
return RNS.Identity.full_hash(str(self).encode("utf-8")) return RNS.Identity.full_hash(str(self).encode("utf-8"))
def received_announce(self):
self.ia_freq_deque.append(time.time())
if hasattr(self, "parent_interface") and self.parent_interface != None:
self.parent_interface.received_announce(from_spawned=True)
def sent_announce(self):
self.oa_freq_deque.append(time.time())
if hasattr(self, "parent_interface") and self.parent_interface != None:
self.parent_interface.sent_announce(from_spawned=True)
def incoming_announce_frequency(self):
if not len(self.ia_freq_deque) > 1:
return 0
else:
dq_len = len(self.ia_freq_deque)
delta_sum = 0
for i in range(1,dq_len):
delta_sum += self.ia_freq_deque[i]-self.ia_freq_deque[i-1]
delta_sum += time.time() - self.ia_freq_deque[dq_len-1]
if delta_sum == 0:
avg = 0
else:
avg = 1/(delta_sum/(dq_len))
return avg
def outgoing_announce_frequency(self):
if not len(self.oa_freq_deque) > 1:
return 0
else:
dq_len = len(self.oa_freq_deque)
delta_sum = 0
for i in range(1,dq_len):
delta_sum += self.oa_freq_deque[i]-self.oa_freq_deque[i-1]
delta_sum += time.time() - self.oa_freq_deque[dq_len-1]
if delta_sum == 0:
avg = 0
else:
avg = 1/(delta_sum/(dq_len))
return avg
def process_announce_queue(self): def process_announce_queue(self):
if not hasattr(self, "announce_cap"): if not hasattr(self, "announce_cap"):
self.announce_cap = RNS.Reticulum.ANNOUNCE_CAP self.announce_cap = RNS.Reticulum.ANNOUNCE_CAP
@ -79,6 +131,7 @@ class Interface:
self.announce_allowed_at = now + wait_time self.announce_allowed_at = now + wait_time
self.processOutgoing(selected["raw"]) self.processOutgoing(selected["raw"])
self.sent_announce()
if selected in self.announce_queue: if selected in self.announce_queue:
self.announce_queue.remove(selected) self.announce_queue.remove(selected)

View File

@ -70,8 +70,7 @@ class KISSInterface(Interface):
RNS.log("You can install one with the command: python3 -m pip install pyserial", RNS.LOG_CRITICAL) RNS.log("You can install one with the command: python3 -m pip install pyserial", RNS.LOG_CRITICAL)
RNS.panic() RNS.panic()
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 564 self.HW_MTU = 564

View File

@ -53,8 +53,7 @@ class LocalClientInterface(Interface):
RECONNECT_WAIT = 3 RECONNECT_WAIT = 3
def __init__(self, owner, name, target_port = None, connected_socket=None): def __init__(self, owner, name, target_port = None, connected_socket=None):
self.rxb = 0 super().__init__()
self.txb = 0
# TODO: Remove at some point # TODO: Remove at some point
# self.rxptime = 0 # self.rxptime = 0
@ -280,8 +279,7 @@ class LocalClientInterface(Interface):
class LocalServerInterface(Interface): class LocalServerInterface(Interface):
def __init__(self, owner, bindport=None): def __init__(self, owner, bindport=None):
self.rxb = 0 super().__init__()
self.txb = 0
self.online = False self.online = False
self.clients = 0 self.clients = 0
@ -338,6 +336,12 @@ class LocalServerInterface(Interface):
def processOutgoing(self, data): def processOutgoing(self, data):
pass pass
def received_announce(self, from_spawned=False):
if from_spawned: self.ia_freq_deque.append(time.time())
def sent_announce(self, from_spawned=False):
if from_spawned: self.oa_freq_deque.append(time.time())
def __str__(self): def __str__(self):
return "Shared Instance["+str(self.bind_port)+"]" return "Shared Instance["+str(self.bind_port)+"]"

View File

@ -54,8 +54,7 @@ class PipeInterface(Interface):
if respawn_delay == None: if respawn_delay == None:
respawn_delay = 5 respawn_delay = 5
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 1064 self.HW_MTU = 1064

View File

@ -114,8 +114,7 @@ class RNodeInterface(Interface):
RNS.log("You can install one with the command: python3 -m pip install pyserial", RNS.LOG_CRITICAL) RNS.log("You can install one with the command: python3 -m pip install pyserial", RNS.LOG_CRITICAL)
RNS.panic() RNS.panic()
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 508 self.HW_MTU = 508

View File

@ -60,8 +60,7 @@ class SerialInterface(Interface):
RNS.log("You can install one with the command: python3 -m pip install pyserial", RNS.LOG_CRITICAL) RNS.log("You can install one with the command: python3 -m pip install pyserial", RNS.LOG_CRITICAL)
RNS.panic() RNS.panic()
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 564 self.HW_MTU = 564

View File

@ -79,8 +79,7 @@ class TCPClientInterface(Interface):
I2P_PROBES = 5 I2P_PROBES = 5
def __init__(self, owner, name, target_ip=None, target_port=None, connected_socket=None, max_reconnect_tries=None, kiss_framing=False, i2p_tunneled = False, connect_timeout = None): def __init__(self, owner, name, target_ip=None, target_port=None, connected_socket=None, max_reconnect_tries=None, kiss_framing=False, i2p_tunneled = False, connect_timeout = None):
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 1064 self.HW_MTU = 1064
@ -419,8 +418,7 @@ class TCPServerInterface(Interface):
return ifaddr[netinfo.AF_INET][0]["broadcast"] return ifaddr[netinfo.AF_INET][0]["broadcast"]
def __init__(self, owner, name, device=None, bindip=None, bindport=None, i2p_tunneled=False): def __init__(self, owner, name, device=None, bindip=None, bindport=None, i2p_tunneled=False):
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 1064 self.HW_MTU = 1064
@ -505,6 +503,12 @@ class TCPServerInterface(Interface):
self.clients += 1 self.clients += 1
spawned_interface.read_loop() spawned_interface.read_loop()
def received_announce(self, from_spawned=False):
if from_spawned: self.ia_freq_deque.append(time.time())
def sent_announce(self, from_spawned=False):
if from_spawned: self.oa_freq_deque.append(time.time())
def processOutgoing(self, data): def processOutgoing(self, data):
pass pass

View File

@ -45,8 +45,7 @@ class UDPInterface(Interface):
return ifaddr[netinfo.AF_INET][0]["broadcast"] return ifaddr[netinfo.AF_INET][0]["broadcast"]
def __init__(self, owner, name, device=None, bindip=None, bindport=None, forwardip=None, forwardport=None): def __init__(self, owner, name, device=None, bindip=None, bindport=None, forwardip=None, forwardport=None):
self.rxb = 0 super().__init__()
self.txb = 0
self.HW_MTU = 1064 self.HW_MTU = 1064