Added announce frequency sampling to interfaces
This commit is contained in:
parent
ea52153969
commit
0fd75cb819
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)+"]"
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue