Made queue lengths configurable

master
Mark Qvist 2026-08-18 11:45:20 +02:00
parent f366dd9cf2
commit efb8c8500d
No known key found for this signature in database
3 changed files with 55 additions and 13 deletions

View File

@ -247,7 +247,7 @@ class Interface:
RNS.log("Releasing held announce packet "+str(selected_announce_packet)+" from "+str(self), RNS.LOG_EXTREME)
self.ic_held_release = time.time() + self.ic_held_release_interval
self.held_announces.pop(selected_announce_packet.destination_hash)
def release(): RNS.Transport.inbound(selected_announce_packet.raw, selected_announce_packet.receiving_interface)
def release(): RNS.Transport.inbound(selected_announce_packet.raw, selected_announce_packet.receiving_interface, tc=RNS.Transport.TC_INGRESS_LIMITED)
threading.Thread(target=release, daemon=True).start()
except Exception as e:

View File

@ -284,6 +284,10 @@ class Reticulum:
Reticulum.__ic_held_release_interval = None
Reticulum.__ec_pr_freq = None
Reticulum.__egress_control = None
Reticulum.__inbound_data_queue_length = None
Reticulum.__inbound_announce_queue_length = None
Reticulum.__inbound_pr_queue_length = None
Reticulum.__inbound_il_queue_length = None
Reticulum.panic_on_interface_error = False
@ -696,6 +700,22 @@ class Reticulum:
v = self.config["reticulum"].as_float(option)
if v >= 0: Reticulum.__ic_held_release_interval = v
if option == "qlen_in_data":
v = self.config["reticulum"].as_int(option)
if v > 0: Reticulum.__inbound_data_queue_length = v
if option == "qlen_in_announce":
v = self.config["reticulum"].as_int(option)
if v > 0: Reticulum.__inbound_announce_queue_length = v
if option == "qlen_in_pr":
v = self.config["reticulum"].as_int(option)
if v > 0: Reticulum.__inbound_pr_queue_length = v
if option == "qlen_in_il":
v = self.config["reticulum"].as_int(option)
if v > 0: Reticulum.__inbound_il_queue_length = v
if RNS.compiled: RNS.log("Reticulum running in compiled mode", RNS.LOG_DEBUG)
else: RNS.log("Reticulum running in interpreted mode", RNS.LOG_DEBUG)
@ -1900,6 +1920,22 @@ class Reticulum:
def local_hops_delta():
return Reticulum.__local_hops_delta
@staticmethod
def default_data_queue_length():
return Reticulum.__inbound_data_queue_length
@staticmethod
def default_announce_queue_length():
return Reticulum.__inbound_announce_queue_length
@staticmethod
def default_pr_queue_length():
return Reticulum.__inbound_pr_queue_length
@staticmethod
def default_il_queue_length():
return Reticulum.__inbound_il_queue_length
# Default configuration file:
__default_rns_config__ = '''# This is the default Reticulum config file.
# You should probably edit it to include any additional,

View File

@ -131,11 +131,11 @@ class Transport:
USE_INBOUND_QUEUE = True
USE_OUTBOUND_QUEUE = False
INBOUND_DA_QUEUE_LENGTH = 8192
INBOUND_AN_QUEUE_LENGTH = 1024
INBOUND_PR_QUEUE_LENGTH = 1024
INBOUND_IL_QUEUE_LENGTH = 256
OUTBOUND_QUEUE_LENGTH = 32768
INBOUND_DA_QUEUE_LENGTH = 4096
INBOUND_AN_QUEUE_LENGTH = 256
INBOUND_PR_QUEUE_LENGTH = 256
INBOUND_IL_QUEUE_LENGTH = 128
OUTBOUND_QUEUE_LENGTH = 4096
STATE_UNKNOWN = 0x00
STATE_UNRESPONSIVE = 0x01
@ -184,10 +184,7 @@ class Transport:
max_queued_discovery_prs = 32 # Maximum amount of queued discovery path requests
pr_destination_hash = None # Destination hash of the local path request destination
inbound_queues = InboundQueues((INBOUND_DA_QUEUE_LENGTH,
INBOUND_AN_QUEUE_LENGTH,
INBOUND_PR_QUEUE_LENGTH,
INBOUND_IL_QUEUE_LENGTH))
inbound_queues = None
interfaces_lock = Lock()
destinations_lock = Lock()
destinations_map_lock = Lock()
@ -279,6 +276,15 @@ class Transport:
def start(reticulum_instance):
Transport.owner = reticulum_instance
Transport.INBOUND_DA_QUEUE_LENGTH = RNS.Reticulum.default_data_queue_length() or Transport.INBOUND_DA_QUEUE_LENGTH
Transport.INBOUND_AN_QUEUE_LENGTH = RNS.Reticulum.default_announce_queue_length() or Transport.INBOUND_AN_QUEUE_LENGTH
Transport.INBOUND_PR_QUEUE_LENGTH = RNS.Reticulum.default_pr_queue_length() or Transport.INBOUND_PR_QUEUE_LENGTH
Transport.INBOUND_IL_QUEUE_LENGTH = RNS.Reticulum.default_il_queue_length() or Transport.INBOUND_IL_QUEUE_LENGTH
Transport.inbound_queues = InboundQueues((Transport.INBOUND_DA_QUEUE_LENGTH,
Transport.INBOUND_AN_QUEUE_LENGTH,
Transport.INBOUND_PR_QUEUE_LENGTH,
Transport.INBOUND_IL_QUEUE_LENGTH))
if Transport.identity == None:
transport_identity_path = RNS.Reticulum.storagepath+"/transport_identity"
if os.path.isfile(transport_identity_path):
@ -1519,7 +1525,7 @@ class Transport:
return False
@staticmethod
def inbound(raw, interface=None):
def inbound(raw, interface=None, tc=None):
if not Transport.ready:
wait_start = time.time()
while not Transport.ready:
@ -1584,14 +1590,14 @@ class Transport:
packet = RNS.Packet(None, raw)
if not packet.unpack(): return
if not Transport.packet_filter(packet): return
traffic_class = Transport.TC_DATA
traffic_class = tc or Transport.TC_DATA
packet.receiving_interface = interface
packet.hops += 1
# Ingress limit announces early
if packet.packet_type == RNS.Packet.ANNOUNCE:
traffic_class = Transport.TC_ANNOUNCE
if not tc: traffic_class = Transport.TC_ANNOUNCE
announce_signature_valid = RNS.Identity.validate_announce(packet, only_validate_signature=True)
if not announce_signature_valid: return
elif packet.receiving_interface != None: packet.receiving_interface.received_announce()