diff --git a/RNS/Discovery.py b/RNS/Discovery.py index 2d26cd5d..47ab56ae 100644 --- a/RNS/Discovery.py +++ b/RNS/Discovery.py @@ -634,7 +634,11 @@ class InterfaceDiscovery(): if interface: interface.autoconnect_hash = endpoint_hash interface.autoconnect_source = info["network_id"] - RNS.Reticulum.get_instance()._add_interface(interface, ifac_netname=ifac_netname, ifac_netkey=ifac_netkey, configured_bitrate=5E6) + ar_target = RNS.Reticulum.get_instance()._default_ar_target() if RNS.Reticulum.transport_enabled() else None + ar_penalty = RNS.Reticulum.get_instance()._default_ar_penalty() if RNS.Reticulum.transport_enabled() else None + ar_grace = RNS.Reticulum.get_instance()._default_ar_grace() if RNS.Reticulum.transport_enabled() else None + RNS.Reticulum.get_instance()._add_interface(interface, ifac_netname=ifac_netname, ifac_netkey=ifac_netkey, configured_bitrate=5E6, + announce_rate_target=ar_target, announce_rate_grace=ar_grace, announce_rate_penalty=ar_penalty) self.monitor_interface(interface) except Exception as e: diff --git a/RNS/Interfaces/Interface.py b/RNS/Interfaces/Interface.py index 637f5b1d..aeec1f87 100755 --- a/RNS/Interfaces/Interface.py +++ b/RNS/Interfaces/Interface.py @@ -73,6 +73,11 @@ class Interface: IC_HELD_RELEASE_INTERVAL = 2 IC_DEQUE_MIN_SAMPLE = 32 + # Default announce rate targets + DEFAULT_AR_TARGET = 3600 + DEFAULT_AR_PENALTY = 0 + DEFAULT_AR_GRACE = 5 + AUTOCONFIGURE_MTU = False FIXED_MTU = False diff --git a/RNS/Reticulum.py b/RNS/Reticulum.py index 573d3f06..ddd3c497 100755 --- a/RNS/Reticulum.py +++ b/RNS/Reticulum.py @@ -266,6 +266,9 @@ class Reticulum: Reticulum.__publish_blackhole = False Reticulum.__blackhole_sources = [] Reticulum.__interface_sources = [] + Reticulum.__default_ar_target = None + Reticulum.__default_ar_penalty = None + Reticulum.__default_ar_grace = None Reticulum.panic_on_interface_error = False @@ -583,6 +586,19 @@ class Reticulum: if option == "autoconnect_discovered_interfaces": v = self.config["reticulum"].as_int(option) if v > 0: Reticulum.__autoconnect_discovered_interfaces = v + + if option == "default_ar_target": + v = self.config["reticulum"].as_int(option) + if v == 0: Reticulum.__default_ar_target = None + elif v > 0: Reticulum.__default_ar_target = v + + if option == "default_ar_penalty": + v = self.config["reticulum"].as_int(option) + if v >= 0: Reticulum.__default_ar_penalty = v + + if option == "default_ar_grace": + v = self.config["reticulum"].as_int(option) + if v >= 0: Reticulum.__default_ar_grace = 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) @@ -723,6 +739,11 @@ class Reticulum: ignore_config_warnings = False if "ignore_config_warnings" in c: ignore_config_warnings = c.as_bool("ignore_config_warnings") + if Reticulum.transport_enabled(): + if announce_rate_target == None: announce_rate_target = self._default_ar_target() + if announce_rate_penalty == None: announce_rate_penalty = self._default_ar_penalty() + if announce_rate_grace == None: announce_rate_grace = self._default_ar_grace() + discoverable = False discovery_announce_interval = None discovery_stamp_value = None @@ -995,6 +1016,15 @@ class Reticulum: RNS.Transport.interfaces.append(interface) interface.final_init() + def _default_ar_target(self): + return self.__default_ar_target or RNS.Interfaces.Interface.Interface.DEFAULT_AR_TARGET + + def _default_ar_penalty(self): + return self.__default_ar_penalty or RNS.Interfaces.Interface.Interface.DEFAULT_AR_PENALTY + + def _default_ar_grace(self): + return self.__default_ar_grace or RNS.Interfaces.Interface.Interface.DEFAULT_AR_GRACE + def _should_persist_data(self, background=False): if time.time() > self.last_data_persist+Reticulum.GRACIOUS_PERSIST_INTERVAL: def job(): self.__persist_data(background=background) @@ -1278,6 +1308,9 @@ class Reticulum: ifstats["txb"] = interface.txb ifstats["incoming_announce_frequency"] = interface.incoming_announce_frequency() ifstats["outgoing_announce_frequency"] = interface.outgoing_announce_frequency() + ifstats["announce_rate_target"] = interface.announce_rate_target + ifstats["announce_rate_penalty"] = interface.announce_rate_penalty + ifstats["announce_rate_grace"] = interface.announce_rate_grace ifstats["held_announces"] = len(interface.held_announces) ifstats["status"] = interface.online ifstats["mode"] = interface.mode diff --git a/RNS/Transport.py b/RNS/Transport.py index 0c458d42..5b16daa9 100755 --- a/RNS/Transport.py +++ b/RNS/Transport.py @@ -2842,7 +2842,7 @@ class Transport: requestor_transport_id = requesting_transport_instance, tag=tag_bytes) - else: RNS.log("Ignoring duplicate path request for "+RNS.prettyhexrep(destination_hash)+" with tag "+RNS.prettyhexrep(unique_tag), RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None + else: RNS.log("Ignoring duplicate path request for "+RNS.prettyhexrep(destination_hash)+" with tag "+RNS.prettyhexrep(unique_tag), RNS.LOG_EXTREME) if RNS.sl(RNS.LOG_EXTREME) else None else: RNS.log("Ignoring tagless path request for "+RNS.prettyhexrep(destination_hash), RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None diff --git a/RNS/Utilities/rnstatus.py b/RNS/Utilities/rnstatus.py index fa2e3e27..9ee21d00 100644 --- a/RNS/Utilities/rnstatus.py +++ b/RNS/Utilities/rnstatus.py @@ -533,18 +533,33 @@ def program_setup(configdir, dispall=False, verbosity=0, name_filter=None, json= print(" Held : {np} announce".format(np=aqn)) else: print(" Held : {np} announces".format(np=aqn)) - - if astats and "incoming_announce_frequency" in ifstat and ifstat["incoming_announce_frequency"] != None: - print(" Announces : {iaf}↑".format(iaf=RNS.prettyfrequency(ifstat["outgoing_announce_frequency"]))) - print(" {iaf}↓".format(iaf=RNS.prettyfrequency(ifstat["incoming_announce_frequency"]))) + art = None; arp = None; arg = None + if astats and "announce_rate_target" in ifstat: art = ifstat["announce_rate_target"] + if astats and "announce_rate_penalty" in ifstat: arp = ifstat["announce_rate_penalty"] + if astats and "announce_rate_grace" in ifstat: arg = ifstat["announce_rate_grace"] + if art and arp != None and arg: art_str = f"(t:{RNS.prettytime(art)}/p:{RNS.prettytime(arp)}/g:{arg})" + elif art and arp != None: art_str = f"(t:{RNS.prettytime(art)}/p:{RNS.prettytime(arp)})" + elif art: art_str = f"(t:{RNS.prettytime(art)})" + else: art_str = "" + rxb_str = "↓"+RNS.prettysize(ifstat["rxb"]) txb_str = "↑"+RNS.prettysize(ifstat["txb"]) strdiff = len(rxb_str)-len(txb_str) - if strdiff > 0: - txb_str += " "*strdiff - elif strdiff < 0: - rxb_str += " "*-strdiff + if strdiff > 0: txb_str += " "*strdiff + elif strdiff < 0: rxb_str += " "*-strdiff + + if astats and "incoming_announce_frequency" in ifstat and ifstat["incoming_announce_frequency"] != None: + oaf = RNS.prettyfrequency(ifstat["outgoing_announce_frequency"])+"↑" + iaf = RNS.prettyfrequency(ifstat["incoming_announce_frequency"])+"↓" + strdiff = len(oaf)-len(iaf) + if strdiff > 0: iaf += " "*strdiff + elif strdiff < 0: oaf += " "*-strdiff + strdiff = len(rxb_str)-len(oaf) + if strdiff > 0: oaf += " "*strdiff + elif strdiff < 0: txb_str += " "*-strdiff; rxb_str += " "*-strdiff + print(f" Announces : {oaf}") + print(f" {iaf} {art_str}") rxstat = rxb_str txstat = txb_str