From 7329817d958f1d7602cadbacba5fadd12e64316f Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Sat, 3 Jan 2026 19:58:49 +0100 Subject: [PATCH] Updated docs --- docs/manual/.buildinfo | 2 +- .../_sources/gettingstartedfast.rst.txt | 161 ++++++----- docs/manual/_sources/interfaces.rst.txt | 206 ++++++++++++++ docs/manual/_sources/understanding.rst.txt | 76 ++++++ docs/manual/_sources/using.rst.txt | 258 +++++++++++++++++- docs/manual/_static/documentation_options.js | 2 +- docs/manual/examples.html | 8 +- docs/manual/forhumans.html | 8 +- docs/manual/genindex.html | 28 +- docs/manual/gettingstartedfast.html | 141 +++++----- docs/manual/hardware.html | 8 +- docs/manual/index.html | 41 ++- docs/manual/interfaces.html | 203 +++++++++++++- docs/manual/networks.html | 8 +- docs/manual/objects.inv | Bin 2782 -> 2961 bytes docs/manual/reference.html | 69 ++++- docs/manual/search.html | 8 +- docs/manual/searchindex.js | 2 +- docs/manual/support.html | 8 +- docs/manual/understanding.html | 75 ++++- docs/manual/using.html | 225 +++++++++++++-- docs/manual/whatis.html | 8 +- docs/source/gettingstartedfast.rst | 161 ++++++----- docs/source/interfaces.rst | 206 ++++++++++++++ docs/source/understanding.rst | 76 ++++++ docs/source/using.rst | 258 +++++++++++++++++- 26 files changed, 1949 insertions(+), 297 deletions(-) diff --git a/docs/manual/.buildinfo b/docs/manual/.buildinfo index 1736bbb..f168294 100644 --- a/docs/manual/.buildinfo +++ b/docs/manual/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 20d025da4d38e75f8d591e11524d799d +config: c3849c16b3b83f052a917bd19fa2d896 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/manual/_sources/gettingstartedfast.rst.txt b/docs/manual/_sources/gettingstartedfast.rst.txt index 0ce5017..1ae7158 100644 --- a/docs/manual/_sources/gettingstartedfast.rst.txt +++ b/docs/manual/_sources/gettingstartedfast.rst.txt @@ -8,7 +8,7 @@ scenarios. Standalone Reticulum Installation -============================================= +================================= If you simply want to install Reticulum and related utilities on a system, the easiest way is via the ``pip`` package manager: @@ -254,14 +254,90 @@ In general it is recommended to use an I2P node if you want to host a publicly a instance, while preserving anonymity. If you care more about performance, and a slightly easier setup, use TCP. +.. _bootstrapping-connectivity: + +Bootstrapping Connectivity +========================== + +Reticulum is not a service you subscribe to, nor is it a single global network you "join". It is a *networking stack*; a toolkit for building communications systems that align with your specific values, requirements, and operational environment. The way you choose to connect to other Reticulum peers is entirely your own choice. + +One of the most powerful aspects of Reticulum is that it provides a multitude of tools to establish, maintain, and optimize connectivity. You can use these tools in isolation or combine them in complex configurations to achieve a vast array of goals. + +Whether your aim is to create a completely private, air-gapped network for your family; to build a resilient community mesh that survives infrastructure collapse; to connect far and wide to as many nodes as possible; or simply to maintain a reliable, encrypted link to a specific organization you care about, Reticulum provides the mechanisms to make it happen. + +There is no "right" or "wrong" way to build a Reticulum network, and you don't need to be a network engineer just to get started. If the information flows in the way you intend, and your privacy and security requirements are met, your configuration is a success. Reticulum is designed to make the most challenging and difficult scenarios attainable, even when other networking technologies fail. + + +Finding Your Way +^^^^^^^^^^^^^^^^ + +When you first start using Reticulum, you need a way to obtain connectivity with the peers you want to communicate with. This is the process of **bootstrapping**. + +A common mistake in modern networking is the reliance on a few centralized, hard-coded entrypoints. If every user simply connects to the same list of public IP addresses found on a website, the network becomes brittle, centralized, and ultimately fails to deliver on the promise of decentralization. + +Reticulum encourages the approach of *organic growth*. Instead of relying on permanent static connections to distant servers, you can use temporary bootstrap connections to *discover* better, more relevant or local infrastructure. Once discovered, your system can automatically form stronger, more direct links to these peers, and discard the temporary bootstrap links. This results in a web of connections that are geographically relevant, resilient and efficient. + +It is possible to simply add a few public entrypoints to the ``[interfaces]`` section of your Reticulum configuration and be connected, but a better option is to enable :ref:`interface discovery` and either manually select relevant, local interfaces, or enable discovered interface auto-connection. + +A relevant option in this context is the :ref:`bootstrap only` interface option. This is an automated tool for better distributing connectivity. By marking an interface as ``bootstrap_only``, you tell Reticulum: *"Use this connection to find connectivity options, and prefer discovered interfaces once they are available"*. This helps create a network topology that favors locality and resilience over the simple centralization caused by using only a few static entrypoints. + +A good place to find interface definitions for bootstrapping connectivity is `rmap.world `_. + + +Building Personal Infrastructure +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You do not need a datacenter to be a meaningful part of the Reticulum ecosystem. In fact, the most important nodes in the network are often the smallest ones. + +We strongly encourage everyone, even home users, to think in terms of building **personal infrastructure**. Don't connect every phone, tablet, and computer in your house directly to a public internet gateway. Instead, repurpose an old computer, a Raspberry Pi, or a supported router to act as your own, personal **Transport Node**: + +* Your local Transport Node sits in your home, connected to your WiFi and perhaps a radio interface (like an RNode). +* You configure this node with a ``bootstrap_only`` interface (perhaps a TCP tunnel to a wider network) and enable interface discovery. +* While you sleep, work, or cook, your node listens to the network. It discovers other local community members, validates their Network Identities, and automatically establishes direct links. +* Your personal devices now connect to your *local* node, which is integrated into a living, breathing local mesh. Your traffic flows through local paths provided by other real people in the community rather than bouncing off a distant server. + +**Don't wait for others to build the networks you want to see**. Every network is important, perhaps even most so those that support individual families and persons. Once enough of this personal, local infrastructure exist, connecting them directly to each other, without traversing the public Internet, becomes not just possible, but inevitable. + + +Mixing Strategies +^^^^^^^^^^^^^^^^^ + +There is no requirement to commit to a single strategy. The most robust setups often mix static, dynamic, and discovered interfaces. + +* **Static Interfaces:** You maintain a permanent interface to a trusted friend or organization using a static configuration. +* **Bootstrap Links:** You run a ``bootstrap_only`` TCP interface to a public gateway to scan for new connectable peers or to regain connectivity if your other interfaces fail. +* **Local Wide-Area Connectivity:** You run a ``RNodeInterface`` on a shared frequency, giving you completely self-sovereign and private wide-area access to both your own network and other Reticulum peers globally, without any "service providers" being able to control or monitor how you interact with people. + +By combining these methods, you create a system that is secure against single points of failure, adaptable to changing network conditions, and better integrated into your physical and social reality. + + +Network Health & Responsibility +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As you participate in the wider networks you discover and build, you will inevitably encounter peers that are misconfigured, malicious, or simply broken. To protect your resources and those of your local peers, you can utilize the :ref:`Blackhole Management` system. + +Whether you manually block a spamming identity or subscribe to a blackhole list maintained by a trusted Network Identity, these tools help ensure that your transport capacity is used for legitimate communication. This keeps your local segment efficient and contributes to the health of the wider network. + + +Contributing to the Global Ret +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you have the means to host a stable node with a public IP address, consider becoming a :ref:`Public Entrypoint`. By :ref:`publishing your interface as discoverable`, you provide a potential connection point for others, helping the network grow and reach new areas. + +For guidelines on how to properly configure and secure a public gateway, refer to the :ref:`Hosting Public Entrypoints` section. Connect to the Public Testnet -=========================================== +============================= An experimental public testnet has been made accessible by volunteers in the community. You can find interface definitions for adding to your ``.reticulum/config`` file on the -`Reticulum Website `_ or the -`Community Wiki `_ +`Reticulum Website `_, or the +`Community Wiki `_. + +As development of Reticulum has transitioned away from the public Internet, and is now happening exclusively over Reticulum itself, the lists on the `Reticulum Website `_ and the +`Community Wiki `_ are no longer actively maintained, and any up-to-date connectivity information will have to be found elsewhere. + +For a while, these resources will likely still be a usable way to find bootstrap connections, that will allow you to discover other entrypoints to connect to, but it is highly recommended to also check community run projects like `rmap.world `_. You can connect your devices or instances to one or more of these to gain access to any Reticulum networks they are physically connected to. Simply add one or more interface @@ -269,24 +345,18 @@ snippets to your config file in the ``[interface]`` section, like in the example .. code:: ini - # TCP/IP interface to the BetweenTheBorders Hub (community-provided) - [[RNS Testnet BetweenTheBorders]] + # TCP/IP interface to the RNS Amsterdam Hub + [[RNS Testnet Amsterdam]] type = TCPClientInterface enabled = yes - target_host = reticulum.betweentheborders.com - target_port = 4242 + target_host = amsterdam.connect.reticulum.network + target_port = 4965 .. tip:: - Ideally, set up a Reticulum Transport Node that your own devices can reach locally, and then - connect that transport node to a couple of public entrypoints. This will provide efficient - connections and redundancy in case any of them go down. + Don't rely on a single connection to a testnet entrypoint for everyday use. The testnet is often used for development and failure testing scenarios. Instead, read the :ref:`Bootstrapping Connectivity` section. -Many other Reticulum instances are connecting to this testnet, and you can also join it -via other entry points if you know them. There is absolutely no control over the network -topography, usage or what types of instances connect. It will also occasionally be used -to test various failure scenarios, and there are no availability or service guarantees. -Expect weird things to happen on this network, as people experiment and try out things. +As the amount of global Reticulum nodes and entrypoints have grown to a substantial quantity, the public Amsterdam Testnet entrypoint is slated for de-commisioning in the first quarter of 2026. If your own instances rely on this entrypoint for connectivity, it is high time to start configuring alternatives. Read the :ref:`Bootstrapping Connectivity` section for pointers. .. warning:: It probably goes without saying, but *don't use the testnet entry-points as @@ -295,12 +365,15 @@ Expect weird things to happen on this network, as people experiment and try out connectivity solutions, if needed and applicable, or in most cases, simply leave it up to the user which networks to connect to, and how. +.. _hosting-entrypoints: Hosting Public Entrypoints -=========================================== +========================== If you want to host a public (or private) entry-point to a Reticulum network over the -Internet, this section offers some helpful pointers. You will need a machine, physical or +Internet, this section offers some helpful pointers. Once you have set up your public entrypoint, it is a great idea to :ref:`make it discoverable over Reticulum`. + +You will need a machine, physical or virtual with a public IP address, that can be reached by other devices on the Internet. The most efficient and performant way to host a connectable entry-point supporting many @@ -348,7 +421,7 @@ If you are hosting an entry-point on an operating system that does not support not be as performant. Adding Radio Interfaces -============================================== +======================= Once you have Reticulum installed and working, you can add radio interfaces with any compatible hardware you have available. Reticulum supports a wide range of radio hardware, and if you already have any available, it is very likely that it will @@ -377,7 +450,7 @@ and propose adding an interface for the hardware. Creating and Using Custom Interfaces -=========================================== +==================================== While Reticulum includes a flexible and broad range of built-in interfaces, these will not cover every conceivable type of communications hardware that Reticulum @@ -404,54 +477,10 @@ ready to import and use RNS in your own programs. The next step will most likely be to look at some :ref:`Example Programs`. The entire Reticulum API is documented in the :ref:`API Reference` -chapter of this manual. +chapter of this manual. Before diving in, it's probably a good idea to read +this manual in full, but at least start with the :ref:`Understanding Reticulum` chapter. -Participate in Reticulum Development -============================================== -If you want to participate in the development of Reticulum and associated -utilities, you'll want to get the latest source from GitHub. In that case, -don't use pip, but try this recipe: - -.. code:: shell - - # Install dependencies - pip install cryptography pyserial - - # Clone repository - git clone https://github.com/markqvist/Reticulum.git - - # Move into Reticulum folder and symlink library to examples folder - cd Reticulum - ln -s ../RNS ./Examples/ - - # Run an example - python Examples/Echo.py -s - - # Unless you've manually created a config file, Reticulum will do so now, - # and immediately exit. Make any necessary changes to the file: - nano ~/.reticulum/config - - # ... and launch the example again. - python Examples/Echo.py -s - - # You can now repeat the process on another computer, - # and run the same example with -h to get command line options. - python Examples/Echo.py -h - - # Run the example in client mode to "ping" the server. - # Replace the hash below with the actual destination hash of your server. - python Examples/Echo.py 174a64852a75682259ad8b921b8bf416 - - # Have a look at another example - python Examples/Filetransfer.py -h - -When you have experimented with the basic examples, it's time to go read the -:ref:`Understanding Reticulum` chapter. Before submitting -your first pull request, it is probably a good idea to introduce yourself on -the `disucssion forum on GitHub `_, -or ask one of the developers or maintainers for a good place to start. - .. _install-guides: Platform-Specific Install Notes diff --git a/docs/manual/_sources/interfaces.rst.txt b/docs/manual/_sources/interfaces.rst.txt index 9954124..edc3ff2 100644 --- a/docs/manual/_sources/interfaces.rst.txt +++ b/docs/manual/_sources/interfaces.rst.txt @@ -911,6 +911,203 @@ beaconing functionality described above. # small internal packet buffer. flow_control = false +.. _interfaces-discoverable: + +Discoverable Interfaces +======================= + +Reticulum includes a powerful system for publishing your local interfaces to the wider network, allowing other peers to discover, validate, and automatically connect to them. This feature is particularly useful for creating decentralized networks where peers can dynamically find entrypoints, such as public Internet gateways or local radio access points, without relying on static configuration files or centralized directories. + +When an interface is made **discoverable**, your Reticulum instance will periodically broadcast an announce packet containing the connection details and parameters required for other peers to establish a connection. These announces are propagated over the network using the standard Reticulum announce mechanism using the ``rnstransport.discovery.interface`` destination type. + +.. note:: + To use the interface discovery functionality, the ``LXMF`` module must be installed in your Python environment. You can install it using pip: + + .. code:: sh + + pip install lxmf + + +Enabling Discovery +------------------ + +Interface discovery is enabled on a per-interface basis. To make a specific interface discoverable, you must add the ``discoverable`` option to that interface's configuration block and set it to ``yes``. + +.. code:: ini + + [[My Public Gateway]] + type = BackboneInterface + ... + discoverable = yes + +Once enabled, Reticulum will automatically handle the generation, signing, stamping, and broadcasting of the discovery announces. It is not *required* to enable Transport to publish interface discovery information, but for most use cases where you want others to connect to you, you will likely want ``enable_transport`` set to ``yes`` in the ``[reticulum]`` section of your configuration. + + +Discovery Parameters +-------------------- + +When ``discoverable`` is enabled, a variety of additional options become available to control how the interface is presented to the network. These parameters allow you to fine-tune the metadata, security requirements, and visibility of your interface. + +**Basic Metadata** + +``discovery_name`` + A human-readable name for the interface. This name will be displayed to users on remote systems when they list discovered interfaces. If not specified, the interface name (the section header) will be used. + +``announce_interval`` + The interval in minutes between successive discovery announces for this interface. Default is 360 minutes (6 hours). For stable, long-running infrastructure, higher intervals (12 to 22 hours) are usually sufficient and reduce network load. Minimum allowed value is 5 minutes (but expect to have your announces throttled if using intervals below one hour). + +**Connectivity Specification** + +``reachable_on`` + Specifies the address that remote peers should use to connect to this interface. + + * For TCP and Backbone interfaces, this is typically the public IP address or hostname. Do not include the port, this is fetched automatically from the interface. + * For I2P interfaces, this is usually the I2P ``b32`` address. This value is fetched automatically from the ``I2PInterface`` once it is up and connected to the I2P network, so you should not set this manually, unless you absolutely know what you're doing. + + **Dynamic Resolution:** This option also accepts a path to an external executable script or binary. If a path is provided, Reticulum will execute the script and use its ``stdout`` as the reachability address. This is useful for devices behind dynamic DNS, NATs, or complex cloud environments where the external IP is not known locally. The script must simply print the address to stdout and exit. + +.. note:: **Script Execution Requirements:** + When using an executable script for ``reachable_on``, Reticulum expects the script to output only the IP address or hostname to ``stdout``, followed by a newline character. Any additional output or errors may cause the resolution to fail. Ensure the script has executable permissions and is robust against temporary network failures. + +**Security & Cost** + +``discovery_stamp_value`` + Defines the proof-of-work difficulty for the cryptographic stamp included in the announce. This value acts as a cost barrier to prevent network flooding. The default value is ``14``. Increasing this value makes it computationally more expensive to generate an announce, which can be useful to prevent spam on very large networks, but it also increases CPU load on your system when generating announces. Stamps are cached, and only generated if interface information changes, or at instance restart. If you have the computational resources, it is generally advisable to use as high a stamp value as possible. + +**Privacy & Encryption** + +``discovery_encrypt`` + If set to ``yes``, the discovery announce payload will be encrypted. To decrypt the announce, remote peers must possess the *network identity* configured for your instance (see ``network_identity`` in the ``[reticulum]`` section). This allows you to publish private interfaces that are only discoverable to specific trusted networks. + +.. warning:: + If you enable ``discovery_encrypt`` but do not configure a valid ``network_identity`` in the ``[reticulum]`` section of your configuration, Reticulum will abort the interface discovery announce. Encryption requires a valid network identity key to function. + +``publish_ifac`` + If set to ``yes``, the Interface Access Code (IFAC) name and passphrase for this interface will be included in the discovery announce. This allows peers to automatically configure the correct authentication parameters when connecting to the interface. + +**Physical Location** + +``latitude``, ``longitude``, ``height`` + Optional physical coordinates for the interface. These are useful for mapping discovered interfaces geographically or for clients to automatically select the nearest access point. Coordinates should be in decimal degrees, height in meters. + +**Radio Parameters** + +For physical radio interfaces like ``RNodeInterface`` or ``KISSInterface``, the following optional parameters allow you to broadcast the operating frequency and characteristics, allowing clients to verify compatibility before connecting: + +``discovery_frequency`` + The operating frequency in Hz. Auto-configured on RNode interfaces. Necessary on KISS-based radio interfaces and ``TCPClientInterfaces`` connecting to radio modems. + +``discovery_bandwidth`` + The signal bandwidth in Hz. Auto-configured on RNode interfaces. Useful on KISS-based radio interfaces and ``TCPClientInterfaces`` connecting to radio modems. + +``discovery_modulation`` + The modulation type or scheme. Auto-configured on RNode interfaces, but highly advisable to include on other radio-based interfaces. + + +Interface Modes +--------------- + +When you enable discovery on an interface, Reticulum enforces certain interface modes to ensure the interface is actually useful for remote peers. + +If an interface is configured as ``discoverable``, but its mode is not explicitly set to ``gateway`` (for server-style interfaces like ``BackboneInterface`` or ``TCPServerInterface``) or ``access_point`` (for radio interfaces like ``RNodeInterface``), Reticulum will automatically configure the appropriate mode and log a notice. + +For example, if you enable discovery on a ``RNodeInterface`` without specifying the mode, Reticulum will automatically set it to ``access_point`` mode. + +Security Considerations +----------------------- + +When making interfaces discoverable, you are effectively broadcasting an invitation to connect to your system. It is important to understand the security implications of the configuration options you choose. + +**Publishing Credentials** + +If you enable ``publish_ifac = yes``, your interface's authentication passphrase will be included in the announce. If you are operating a public network and want anyone to connect, this is acceptable. However, if you wish to restrict access to a specific group of users, you **must** enable ``discovery_encrypt = yes``. This ensures that only peers possessing the correct ``network_identity`` can decode the passphrase. + +**Topology Exposure** + +A discoverable interface announces its presence, location (if configured), and capabilities to the network. Even if the connection details are encrypted, the *fact* that a connectable node exists within a certain network becomes public information. In high-security or scenarios requiring operational secrecy, consider the implications of advertising your infrastructure's existence. + +Example Configuration +--------------------- + +Below is an example configuration for a public backbone gateway. This configuration publishes a high-value, publicly discoverable interface, that anyone can connect to. + +.. code:: ini + + [[My Public Gateway]] + type = BackboneInterface + mode = gateway + listen_on = 0.0.0.0 + port = 4242 + + # Enable Discovery + discoverable = yes + + # Interface Details + discovery_name = Region A Public Entrypoint + announce_interval = 720 + + # Use external script to resolve dynamic IP + reachable_on = /usr/local/bin/get_external_ip.sh + + # Generate high stamp value + discovery_stamp_value = 24 + + # Optional location data + latitude = 51.99714 + longitude = -0.74195 + height = 15 + +The next example create an encrypted discovery-enabled interface, requiring a specific network identity to decode, and includes IFAC credentials for seamless authentication. + +.. code:: ini + + [[My Private Gateway]] + type = BackboneInterface + mode = gateway + listen_on = 0.0.0.0 + port = 5858 + network_name = internal_1 + passphrase = Mevpekyafshak5Wr + + # Enable Discovery + discoverable = yes + + # Interface Details + discovery_name = Region A Private Backbone + announce_interval = 720 + + # Use external script to resolve dynamic IP + reachable_on = /usr/local/bin/get_external_ip.sh + + # Target stamp value + discovery_stamp_value = 22 + + # Encrypt announces for our network only + discovery_encrypt = yes + + # Include credentials so trusted + # peers can connect automatically + publish_ifac = yes + + # Optional location data + latitude = 34.06915 + longitude = -118.44318 + height = 15 + +In the ``[reticulum]`` section of your configuration, you would define the network identity used for encryption as follows: + +.. code:: ini + + [reticulum] + ... + # The identity used to sign/encrypt discovery announces + network_identity = ~/.reticulum/storage/identities/my_network_identity + ... + +With these configuration options applied, your Reticulum instance will actively participate in the network's discovery ecosystem. Other peers running Reticulum with discovery enabled will be able to see your interface, validate its cryptographic stamp, and (depending on their configuration) automatically connect to it. + +For information on how to use these discovered interfaces and configure your system to auto-connect to them, refer to the :ref:`Discovering Interfaces` chapter. + .. _interfaces-options: Common Interface Options @@ -991,6 +1188,15 @@ These can be used to control various aspects of interface behaviour. option, to set the interface speed in *bits per second*. + * | The ``bootstrap_only`` option designates an interface as a temporary + bridge for initial connectivity. If this option is enabled, the + interface will be monitored and automatically detached once the + number of auto-connected interfaces reaches the limit configured by + ``autoconnect_discovered_interfaces``. This is particularly useful + for using a slow or expensive connection (such as a single LoRa + link or a remote TCP tunnel) solely to discover better local + infrastructure, which then supersedes the bootstrap interface. + .. _interfaces-modes: Interface Modes diff --git a/docs/manual/_sources/understanding.rst.txt b/docs/manual/_sources/understanding.rst.txt index f9ac2aa..f7402b3 100644 --- a/docs/manual/_sources/understanding.rst.txt +++ b/docs/manual/_sources/understanding.rst.txt @@ -596,6 +596,82 @@ the transfer, integrity verification and reassembling the data on the other end. of codes to reliably transfer any amount of data. They can be used to transfer data stored in memory, or stream data directly from files. +.. _understanding-network_identities: + +Network Identities +================== + +In Reticulum, every peer and application utilizes a cryptographic **Identity** to verify authenticity and establish encrypted channels. While standard identities are typically used to represent a single user, device, or service, Reticulum introduces the concept of a **Network Identity** to represent a logical group of nodes or an entire community infrastructure. + +A Network Identity is, at its core, a standard Reticulum Identity keyset. However, its purpose and usage differ from a personal identity. Instead of identifying a single entity, a Network Identity acts as a shared credential that federates multiple independent Transport Instances under a single, verifiable administrative domain. + + +Conceptual Overview +------------------- + +You can think of a standard Reticulum Identity as a self-sovereign, privately created passport for a single person. A Network Identity, conversely, is akin to a cryptographic flag, or a charter that flies over a fleet of ships. It signifies that while the ships may operate independently and be physically distant, they belong to the same organization, follow the same protocols, and are expected to act in concert. + +When you configure a Network Identity on one or more of your nodes, you are effectively declaring that these nodes constitute a specific "network" within a broader Reticulum mesh. This allows other peers to recognize interfaces not just as "a node named Alice", but as "a gateway belonging to The Eastern Ret Of Freedom". + + +Current Usage +------------- + +At present, the primary function of a Network Identity is within the :ref:`Interface Discovery` system. + +When a Transport Instance broadcasts a discovery announce for an interface, it can optionally sign that announce with a Network Identity, instead of just its local transport identity. Remote peers receiving the announce can then verify the signature. This provides functionality for two important distinctions: + +1. **Authenticity:** It proves that the interface was published by an operator who possesses the private key for that Network Identity. +2. **Trust Boundaries:** It allows users to configure their systems to only accept and connect to interfaces that belong to specific Network Identities, effectively creating "whitelisted" zones of trusted infrastructure. + +.. note:: + If you enable encryption on your discovery announces, the Network Identity is used as the shared secret. Only peers who have been explicitly provided with the Network Identity's full keyset (and have it configured locally) will be able to decrypt and utilize the connection details. + + This functionality will be expanded in the future, so that peers with delegated keys can be allowed to decrypt discovery announces without holding the root network key. Currently, the functionality is sufficient for sharing interface information privately where you control all nodes that must decrypt the discovered interfaces. + + +Future Implications +------------------- + +While the current implementation focuses on interface discovery, the concept of Network Identities serves as the foundational building block for future Reticulum features designed to support large-scale, organic mesh formation. + +As the ecosystem evolves, Network Identities will facilitate: + +* **Distributed Name Resolution:** A system where networks can publish name-to-identity mappings, allowing human-readable names to resolve without centralized servers. +* **Service Publishing:** Networks will be able to announce specific capabilities, services, or information endpoints available publicly or to their members. +* **Inter-Network Federation:** Trust relationships between different networks, allowing for seamless but managed flow of traffic and information across distinct administrative boundaries. +* **Distributed Blackhole Management:** A reputation-based system for blackhole list distribution, where trusted Network Identities can sign and publish lists of blackholed identities. This allows communities to collaboratively enforce security standards and filter spam or malicious identities across the parts of the wider mesh that they are responsible for. + +By adopting the use of Network Identities now, you are preparing your infrastructure to be compatible with this future functionality. + + +Creating and Using a Network Identity +------------------------------------- + +Since a Network Identity is simply a standard Reticulum Identity, you create one using the built-in tools. + +1. **Generate the Identity:** + Use the ``rnid`` utility to generate a new identity file that will serve as your Network Identity. + + .. code:: sh + + $ rnid -g ~/.reticulum/storage/identities/my_network + +2. **Distribute the Public Key:** + The public key must be distributed to any Transport Instance that needs to verify your network's announces and discovery information. By default, if your node is set up to use a network identity, this happens automatically (using the standard announce mechanism). + +3. **Configure Instances:** + In the ``[reticulum]`` section of the configuration file on every node within your network, point the ``network_identity`` option to the file you created. + + .. code:: ini + + [reticulum] + ... + network_identity = ~/.reticulum/storage/identities/my_network + ... + +Once configured, your instances will automatically utilize this identity for signing discovery announces (and potentially decrypting network-private information), presenting a unified front to the wider network. + .. _understanding-referencesystem: Reference Setup diff --git a/docs/manual/_sources/using.rst.txt b/docs/manual/_sources/using.rst.txt index fdd1126..b0ec654 100644 --- a/docs/manual/_sources/using.rst.txt +++ b/docs/manual/_sources/using.rst.txt @@ -338,8 +338,8 @@ Filter output to only show some interfaces: .. code:: text usage: rnstatus [-h] [--config CONFIG] [--version] [-a] [-A] - [-l] [-s SORT] [-r] [-j] [-R hash] [-i path] - [-w seconds] [-v] [-m] [-mi seconds] [filter] + [-l] [-t] [-s SORT] [-r] [-j] [-R hash] [-i path] + [-w seconds] [-d] [-D] [-m] [-I seconds] [-v] [filter] Reticulum Network Stack Status @@ -353,16 +353,20 @@ Filter output to only show some interfaces: -a, --all show all interfaces -A, --announce-stats show announce stats -l, --link-stats show link stats - -s SORT, --sort SORT sort interfaces by [rate, traffic, rx, tx, announces, arx, atx, held] + -t, --totals display traffic totals + -s, --sort SORT sort interfaces by [rate, traffic, rx, tx, rxs, txs, + announces, arx, atx, held] -r, --reverse reverse sorting -j, --json output in JSON format - -R hash transport identity hash of remote instance to get status from (requires -i) + -R hash transport identity hash of remote instance to get status from -i path path to identity used for remote management -w seconds timeout before giving up on remote queries - -v, --verbose + -d, --discovered list discovered interfaces + -D show details and config entries for discovered interfaces -m, --monitor continuously monitor status - -I seconds, --monitor-interval seconds + -I, --monitor-interval seconds refresh interval for monitor mode (default: 1) + -v, --verbose .. note:: @@ -466,6 +470,7 @@ Decrypt a file using the Reticulum Identity it was encrypted for: -B, --base32 Use base32-encoded input and output --version show program's version number and exit +.. _utility-rnpath: The rnpath Utility ==================== @@ -487,21 +492,23 @@ Resolve path to a destination: .. code:: text - usage: rnpath [-h] [--config CONFIG] [--version] [-t] [-m hops] - [-r] [-d] [-D] [-x] [-w seconds] [-R hash] [-i path] - [-W seconds] [-j] [-v] [destination] + usage: rnpath [-h] [--config CONFIG] [--version] [-t] [-m hops] [-r] [-d] [-D] + [-x] [-w seconds] [-R hash] [-i path] [-W seconds] [-b] [-B] [-U] + [--duration DURATION] [--reason REASON] [-p] [-j] [-v] + [destination] [list_filter] - Reticulum Path Discovery Utility + Reticulum Path Management Utility positional arguments: destination hexadecimal hash of the destination + list_filter filter for remote blackhole list view options: -h, --help show this help message and exit --config CONFIG path to alternative Reticulum config directory --version show program's version number and exit -t, --table show all known paths - -m hops, --max hops maximum hops to filter path table by + -m, --max hops maximum hops to filter path table by -r, --rates show announce rate info -d, --drop remove the path to a destination -D, --drop-announces drop all queued announces @@ -510,6 +517,13 @@ Resolve path to a destination: -R hash transport identity hash of remote instance to manage -i path path to identity used for remote management -W seconds timeout before giving up on remote queries + -b, --blackholed list blackholed identities + -B, --blackhole blackhole identity + -U, --unblackhole unblackhole identity + --duration DURATION duration of blackhole enforcement in hours + --reason REASON reason for blackholing identity + -p, --blackholed-list + view published blackhole list for remote transport instance -j, --json output in JSON format -v, --verbose @@ -821,6 +835,104 @@ to create and provision new :ref:`RNodes` from any supported hardwar For more information on how to create your own RNodes, please read the :ref:`Creating RNodes` section of this manual. +.. _using-interface_discovery: +Discovering Interfaces +---------------------- + +Reticulum includes built-in functionality for discovering connectable interfaces over Reticulum itself. This is particularly useful in situations where you want to do one or more of the following: + +* Discover connectable entrypoints available on the Internet +* Find connectable radio access points in the physical world +* Maintain connectivity to RNS instances with unknown or changing IP addresses + +Discovered interfaces can be **auto-connected** by Reticulum, which makes it possible to create setups where an arbitrary interface can act simply as a bootstrap connection, that can be torn down again once more suitable interfaces have been discovered and connected. + +The interface discovery mechanism uses announces sent over Reticulum itself, and supports both publicly readable interfaces and private, encrypted discovery, that can only be decoded by specified *network identities*. It is also possible to specify which network identities should be considered valid sources for discovered interfaces, so that interfaces published by unknown entities are ignored. + +.. note:: + A *network identity* is a normal Reticulum identity keyset that can be used by + one or more transport nodes to identify them as belonging to the same overall + network. In the context of interface discovery, this makes it easy to manage + connecting to only the particular networks you care about, even if those networks + utilize many individual physical transport node. + + This also makes it convenient to auto-connect discovered interfaces only for networks you have some level of trust in. + +For information on how to make your interfaces discoverable, see the :ref:`Discoverable Interfaces` chapter of this manual. The current section will focus on how to actually *discover and connect to* interfaces available on the network. + +In its most basic form, enabling interface discovery is as simple as setting ``discover_interfaces`` to ``true`` in your Reticulum config: + +.. code:: text + + [reticulum] + ... + discover_interfaces = yes + ... + +Once this option is enabled, your RNS instance will start listening for interface discovery announces, and store them for later use or inspection. You can list discovered interfaces with the ``rnstatus`` utility: + +.. code:: text + + $ rnstatus -d + + Name Type Status Last Heard Value Location + ------------------------------------------------------------------------- + Sideband Hub Backbone ✓ Available 1h ago 16 46.2316, 6.0536 + RNS Amsterdam Backbone ✓ Available 32m ago 16 52.3865, 4.9037 + + +You can view more detailed information about discovered interfaces, including configuration snippets for pasting directly into your ``[interfaces]`` config, by using the ``rnstatus -D`` option: + +.. code:: text + + $ rnstatus -D sideband + + Transport ID : 521c87a83afb8f29e4455e77930b973b + Name : Sideband Hub + Type : BackboneInterface + Status : Available + Transport : Enabled + Distance : 2 hops + Discovered : 9h and 40m ago + Last Heard : 1h and 15m ago + Location : 46.2316, 6.0536 + Address : sideband.connect.reticulum.network:7822 + Stamp Value : 16 + + Configuration Entry: + [[Sideband Hub]] + type = BackboneInterface + enabled = yes + remote = sideband.connect.reticulum.network + target_port = 7822 + transport_identity = 521c87a83afb8f29e4455e77930b973b + +In addition to providing local interface discovery information and control, the ``rnstatus`` utility can export discovered interface data in machine-readable JSON format using the ``rnstatus -d --json`` option. This can be useful for exporting the data to external applications such as status pages, access point maps and similar. + +To control what sources are considered valid for discovered sources, additional +configuration options can be specified for the interface discovery system. + +* The ``interface_discovery_sources`` option is a list of the network or transport identities from which interfaces will be accepted. If this option is set, all others will be ignored. If this option is not set, discovered interfaces will be accepted from any source, but are still subject to stamp value requirements. + +* The ``required_discovery_value`` options specifies the minimum stamp value required for the interface announce to be considered valid. To make it computationally difficult to spam the network with a large number of defunct or malicious interfaces, each announced interface requires a valid cryptographical stamp, of configurable difficulty value. + +* The ``autoconnect_discovered_interfaces`` value defaults to ``0``, and specifies the maximum number of discovered interfaces that should be auto-connected at any given time. If set to a number greater than ``0``, Reticulum automatically manages discovered interface connections, and will bring discovered interfaces up and down based on availability. You can at any time add discovered interfaces to your configuration manually, to persistently keep them available. + +* The ``network_identity`` option specifies the *network identity* for this RNS instance. This identity is used both to sign (and potentially encrypt) *outgoing* interface discovery announces, and to decrypt incoming discovery information. + +The configuration snippet below contains an example of setting these additional configuration options: + +.. code:: text + + [reticulum] + ... + discover_interfaces = yes + interface_discovery_sources = 521c87a83afb8f29e4455e77930b973b + required_discovery_value = 16 + autoconnect_discovered_interfaces = 3 + network_identity = ~/.reticulum/storage/identities/my_network + ... + Remote Management ----------------- @@ -846,6 +958,130 @@ in the Reticulum configuration file: For a complete example configuration, you can run ``rnsd --exampleconfig``. +.. _using-blackhole_management: + +Blackhole Management +-------------------- + +Reticulum networks are fundamentally permissionless and open, allowing anyone with a compatible interface to participate. While this openness is essential for a resilient and decentralized network, it also exposes the network to potential abuse, such as peers flooding the network with excessive announce broadcasts or other forms of resource exhaustion. + +The **Blackhole** system provides tools to help manage this problem. It allows operators and individual users to block specific identities at the Transport layer, preventing them from propagating announces through your node, and for other nodes to reach them through your network. + +.. note:: + + There is fundamentally **no way** to *globally* block or censor any identity or destination in Reticulum networks. The blackhole functionality will prevent announces from (and traffic to) all destinations associated with the blackholed identity *on your own network segments only*. + + This provides users and operators with control over what they want to allow *on their own network segments*, but there is no way to globally censor or remove an identity, as long as *someone* is willing to provide transport for it. + +This functionality serves a dual purpose: + +* **For Individual Users:** It offers a simple way to maintain a quiet and efficient local network by manually blocking spammy or unwanted peers. +* **For Network Operators:** It enables the creation of federated, community-wide security standards. By publishing and sharing blackhole lists, operators can protect large infrastructures and distribute spam filtering rules across the mesh without manual intervention. + + +Local Blackhole Management +========================== + +The most immediate way to manage unwanted identities is through manual configuration using the ``rnpath`` utility. This allows you to instantly block or unblock specific identities on your local Transport Instance. + +**Blackholing an Identity** + +To block an identity, use the ``-B`` (or ``--blackhole``) flag followed by the identity hash. You can optionally specify a duration and a reason, which are useful for logging and future reference. + +.. code:: text + + $ rnpath -B 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o + +You can also add a duration (in hours) and a reason: + +.. code:: text + + $ rnpath -B 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o --duration 24 --reason "Excessive announces" + +**Lifting Blackholes** + +To remove an identity from the blackhole, use the ``-U`` (or ``--unblackhole``) flag: + +.. code:: text + + $ rnpath -U 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o + +**Viewing the Blackhole List** + +To see all identities currently blackholed on your local instance, use the ``-b`` (or ``--blackholed``) flag: + +.. code:: text + + $ rnpath -b + + <3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o> blackholed for 23h, 56m (Excessive announces) + <399ea050ce0eed1816c300bcb0840938> blackholed indefinitely (Announce spam) + blackholed indefinitely (Announce spam) + <2b9ec651326d9bc274119054c70fb75e> blackholed indefinitely (Announce spam) + <1178a8f1fad405bf2ad153bf5036bdfd> blackholed indefinitely (Announce spam) + + + +Automated List Sourcing +======================= + +Manually blocking identities is effective for immediate threats, but maintaining an up-to-date blocklist for a large network is impractical. Reticulum supports **automated list sourcing**, allowing your node to subscribe to blackhole lists maintained by trusted peers, or a central authority you manage yourself. + +.. warning:: **Verify Before Subscribing!** + Subscribing to a blackhole source is a powerful action that grants that source the ability to dictate who you can communicate with. Before adding a source to your configuration, verify that the maintainer aligns with your usage policy and values. Blindly subscribing to untrusted lists could inadvertently block legitimate peers or essential services. + +When enabled, your Transport Instance will periodically (approximately once per hour) connect to configured sources, retrieve their latest blackhole lists, and automatically merge them into your local blocklist. This provides "set-and-forget" protection for both individual users and large networks. + +**Configuration** + +To enable automated sourcing, add the ``blackhole_sources`` option to the ``[reticulum]`` section of your configuration file. This option accepts a comma-separated list of Transport Identity hashes that you trust to provide valid blackhole lists. + +.. code:: ini + + [reticulum] + ... + # Automatically fetch blackhole lists from these trusted sources + blackhole_sources = 521c87a83afb8f29e4455e77930b973b, 68a4aa91ac350c4087564e8a69f84e86 + ... + +**How It Works** + +1. The ``BlackholeUpdater`` service runs in the background. +2. For every identity hash listed in ``blackhole_sources``, it attempts to establish a temporary link to the destination ``rnstransport.info.blackhole``. +3. It requests the ``/list`` path, which returns a dictionary of blocked identities and their associated metadata. +4. The received list is merged with your local ``blackholed_identities`` database. +5. The lists are persisted to disk, ensuring they survive restarts. + +.. note:: + You can verify the external lists you are subscribed to, and their contents, without importing them by using ``rnpath -p``. See the :ref:`rnpath utility documentation` for details on querying remote blackhole lists. + + +Publishing Blackhole Lists +========================== + +If you are operating a public gateway, a community hub, or simply wish to share your blocklist with others, you can configure your instance to act as a blackhole list publisher. This allows other nodes to subscribe to *your* definitions of unwanted traffic. + +**Enabling Publishing** + +To publish your local blackhole list, enable the ``publish_blackhole`` option in the ``[reticulum]`` section: + +.. code:: ini + + [reticulum] + ... + publish_blackhole = yes + ... + +When this is enabled, your Transport Instance will register a request handler at ``rnstransport.info.blackhole``. Any peer that connects to this destination and requests ``/list`` will receive the complete set of identities currently present in your local blackhole database. + +**Federation and Trust** + +The blackhole system relies on the trust relationship between the subscriber and the publisher. By subscribing to a source, you are implicitly trusting that source to only block identities that are genuinely detrimental to the network. + +As the ecosystem matures, this system is designed to integrate with **Network Identities**. This allows communities to verify that a published blackhole list is actually provided by a specific network or organization with a certain level of reputation and trustworthiness, adding a layer of cryptographic trust to the federation process. This prevents malicious actors from publishing fake lists intended to censor legitimate traffic. + +For operators, this creates a scalable model where maintaining a single high-quality blocklist can protect thousands of downstream peers, drastically reducing the administrative overhead of network hygiene. + Improving System Configuration ------------------------------ diff --git a/docs/manual/_static/documentation_options.js b/docs/manual/_static/documentation_options.js index d0fab5f..c891ba6 100644 --- a/docs/manual/_static/documentation_options.js +++ b/docs/manual/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '1.0.5', + VERSION: '1.1.0', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/manual/examples.html b/docs/manual/examples.html index f624d1e..d4ab2a8 100644 --- a/docs/manual/examples.html +++ b/docs/manual/examples.html @@ -7,7 +7,7 @@ - Code Examples - Reticulum Network Stack 1.0.5 documentation + Code Examples - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
@@ -204,7 +204,7 @@
- Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation
- + diff --git a/docs/manual/forhumans.html b/docs/manual/forhumans.html index fdaf54b..11a9808 100644 --- a/docs/manual/forhumans.html +++ b/docs/manual/forhumans.html @@ -7,7 +7,7 @@ - An Explanation of Reticulum for Human Beings - Reticulum Network Stack 1.0.5 documentation + An Explanation of Reticulum for Human Beings - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
@@ -204,7 +204,7 @@
- Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -291,7 +291,7 @@
- + diff --git a/docs/manual/genindex.html b/docs/manual/genindex.html index 20f351a..5f6a8bb 100644 --- a/docs/manual/genindex.html +++ b/docs/manual/genindex.html @@ -5,7 +5,7 @@ - Index - Reticulum Network Stack 1.0.5 documentation + Index - Reticulum Network Stack 1.1.0 documentation @@ -178,7 +178,7 @@ - + diff --git a/docs/manual/gettingstartedfast.html b/docs/manual/gettingstartedfast.html index 44e2952..c88bb45 100644 --- a/docs/manual/gettingstartedfast.html +++ b/docs/manual/gettingstartedfast.html @@ -7,7 +7,7 @@ - Getting Started Fast - Reticulum Network Stack 1.0.5 documentation + Getting Started Fast - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
@@ -204,7 +204,7 @@
- Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -451,34 +451,79 @@ deep-packet-inspection much more difficult.

instance, while preserving anonymity. If you care more about performance, and a slightly easier setup, use TCP.

+
+

Bootstrapping Connectivity

+

Reticulum is not a service you subscribe to, nor is it a single global network you “join”. It is a networking stack; a toolkit for building communications systems that align with your specific values, requirements, and operational environment. The way you choose to connect to other Reticulum peers is entirely your own choice.

+

One of the most powerful aspects of Reticulum is that it provides a multitude of tools to establish, maintain, and optimize connectivity. You can use these tools in isolation or combine them in complex configurations to achieve a vast array of goals.

+

Whether your aim is to create a completely private, air-gapped network for your family; to build a resilient community mesh that survives infrastructure collapse; to connect far and wide to as many nodes as possible; or simply to maintain a reliable, encrypted link to a specific organization you care about, Reticulum provides the mechanisms to make it happen.

+

There is no “right” or “wrong” way to build a Reticulum network, and you don’t need to be a network engineer just to get started. If the information flows in the way you intend, and your privacy and security requirements are met, your configuration is a success. Reticulum is designed to make the most challenging and difficult scenarios attainable, even when other networking technologies fail.

+
+

Finding Your Way

+

When you first start using Reticulum, you need a way to obtain connectivity with the peers you want to communicate with. This is the process of bootstrapping.

+

A common mistake in modern networking is the reliance on a few centralized, hard-coded entrypoints. If every user simply connects to the same list of public IP addresses found on a website, the network becomes brittle, centralized, and ultimately fails to deliver on the promise of decentralization.

+

Reticulum encourages the approach of organic growth. Instead of relying on permanent static connections to distant servers, you can use temporary bootstrap connections to discover better, more relevant or local infrastructure. Once discovered, your system can automatically form stronger, more direct links to these peers, and discard the temporary bootstrap links. This results in a web of connections that are geographically relevant, resilient and efficient.

+

It is possible to simply add a few public entrypoints to the [interfaces] section of your Reticulum configuration and be connected, but a better option is to enable interface discovery and either manually select relevant, local interfaces, or enable discovered interface auto-connection.

+

A relevant option in this context is the bootstrap only interface option. This is an automated tool for better distributing connectivity. By marking an interface as bootstrap_only, you tell Reticulum: “Use this connection to find connectivity options, and prefer discovered interfaces once they are available”. This helps create a network topology that favors locality and resilience over the simple centralization caused by using only a few static entrypoints.

+

A good place to find interface definitions for bootstrapping connectivity is rmap.world.

+
+
+

Building Personal Infrastructure

+

You do not need a datacenter to be a meaningful part of the Reticulum ecosystem. In fact, the most important nodes in the network are often the smallest ones.

+

We strongly encourage everyone, even home users, to think in terms of building personal infrastructure. Don’t connect every phone, tablet, and computer in your house directly to a public internet gateway. Instead, repurpose an old computer, a Raspberry Pi, or a supported router to act as your own, personal Transport Node:

+
    +
  • Your local Transport Node sits in your home, connected to your WiFi and perhaps a radio interface (like an RNode).

  • +
  • You configure this node with a bootstrap_only interface (perhaps a TCP tunnel to a wider network) and enable interface discovery.

  • +
  • While you sleep, work, or cook, your node listens to the network. It discovers other local community members, validates their Network Identities, and automatically establishes direct links.

  • +
  • Your personal devices now connect to your local node, which is integrated into a living, breathing local mesh. Your traffic flows through local paths provided by other real people in the community rather than bouncing off a distant server.

  • +
+

Don’t wait for others to build the networks you want to see. Every network is important, perhaps even most so those that support individual families and persons. Once enough of this personal, local infrastructure exist, connecting them directly to each other, without traversing the public Internet, becomes not just possible, but inevitable.

+
+
+

Mixing Strategies

+

There is no requirement to commit to a single strategy. The most robust setups often mix static, dynamic, and discovered interfaces.

+
    +
  • Static Interfaces: You maintain a permanent interface to a trusted friend or organization using a static configuration.

  • +
  • Bootstrap Links: You run a bootstrap_only TCP interface to a public gateway to scan for new connectable peers or to regain connectivity if your other interfaces fail.

  • +
  • Local Wide-Area Connectivity: You run a RNodeInterface on a shared frequency, giving you completely self-sovereign and private wide-area access to both your own network and other Reticulum peers globally, without any “service providers” being able to control or monitor how you interact with people.

  • +
+

By combining these methods, you create a system that is secure against single points of failure, adaptable to changing network conditions, and better integrated into your physical and social reality.

+
+
+

Network Health & Responsibility

+

As you participate in the wider networks you discover and build, you will inevitably encounter peers that are misconfigured, malicious, or simply broken. To protect your resources and those of your local peers, you can utilize the Blackhole Management system.

+

Whether you manually block a spamming identity or subscribe to a blackhole list maintained by a trusted Network Identity, these tools help ensure that your transport capacity is used for legitimate communication. This keeps your local segment efficient and contributes to the health of the wider network.

+
+
+

Contributing to the Global Ret

+

If you have the means to host a stable node with a public IP address, consider becoming a Public Entrypoint. By publishing your interface as discoverable, you provide a potential connection point for others, helping the network grow and reach new areas.

+

For guidelines on how to properly configure and secure a public gateway, refer to the Hosting Public Entrypoints section.

+
+

Connect to the Public Testnet

An experimental public testnet has been made accessible by volunteers in the community. You can find interface definitions for adding to your .reticulum/config file on the -Reticulum Website or the -Community Wiki

+Reticulum Website, or the +Community Wiki.

+

As development of Reticulum has transitioned away from the public Internet, and is now happening exclusively over Reticulum itself, the lists on the Reticulum Website and the +Community Wiki are no longer actively maintained, and any up-to-date connectivity information will have to be found elsewhere.

+

For a while, these resources will likely still be a usable way to find bootstrap connections, that will allow you to discover other entrypoints to connect to, but it is highly recommended to also check community run projects like rmap.world.

You can connect your devices or instances to one or more of these to gain access to any Reticulum networks they are physically connected to. Simply add one or more interface snippets to your config file in the [interface] section, like in the example below:

-
# TCP/IP interface to the BetweenTheBorders Hub (community-provided)
-[[RNS Testnet BetweenTheBorders]]
+
# TCP/IP interface to the RNS Amsterdam Hub
+[[RNS Testnet Amsterdam]]
   type = TCPClientInterface
   enabled = yes
-  target_host = reticulum.betweentheborders.com
-  target_port = 4242
+  target_host = amsterdam.connect.reticulum.network
+  target_port = 4965
 

Tip

-

Ideally, set up a Reticulum Transport Node that your own devices can reach locally, and then -connect that transport node to a couple of public entrypoints. This will provide efficient -connections and redundancy in case any of them go down.

+

Don’t rely on a single connection to a testnet entrypoint for everyday use. The testnet is often used for development and failure testing scenarios. Instead, read the Bootstrapping Connectivity section.

-

Many other Reticulum instances are connecting to this testnet, and you can also join it -via other entry points if you know them. There is absolutely no control over the network -topography, usage or what types of instances connect. It will also occasionally be used -to test various failure scenarios, and there are no availability or service guarantees. -Expect weird things to happen on this network, as people experiment and try out things.

+

As the amount of global Reticulum nodes and entrypoints have grown to a substantial quantity, the public Amsterdam Testnet entrypoint is slated for de-commisioning in the first quarter of 2026. If your own instances rely on this entrypoint for connectivity, it is high time to start configuring alternatives. Read the Bootstrapping Connectivity section for pointers.

Warning

It probably goes without saying, but don’t use the testnet entry-points as @@ -489,9 +534,10 @@ leave it up to the user which networks to connect to, and how.

-

Hosting Public Entrypoints

+

Hosting Public Entrypoints

If you want to host a public (or private) entry-point to a Reticulum network over the -Internet, this section offers some helpful pointers. You will need a machine, physical or +Internet, this section offers some helpful pointers. Once you have set up your public entrypoint, it is a great idea to make it discoverable over Reticulum.

+

You will need a machine, physical or virtual with a public IP address, that can be reached by other devices on the Internet.

The most efficient and performant way to host a connectable entry-point supporting many users is to use the BackboneInterface. This interface type is fully compatible with @@ -579,50 +625,8 @@ started is to install the latest release of Reticulum via pip:

ready to import and use RNS in your own programs. The next step will most likely be to look at some Example Programs.

The entire Reticulum API is documented in the API Reference -chapter of this manual.

-
-
-

Participate in Reticulum Development

-

If you want to participate in the development of Reticulum and associated -utilities, you’ll want to get the latest source from GitHub. In that case, -don’t use pip, but try this recipe:

-
# Install dependencies
-pip install cryptography pyserial
-
-# Clone repository
-git clone https://github.com/markqvist/Reticulum.git
-
-# Move into Reticulum folder and symlink library to examples folder
-cd Reticulum
-ln -s ../RNS ./Examples/
-
-# Run an example
-python Examples/Echo.py -s
-
-# Unless you've manually created a config file, Reticulum will do so now,
-# and immediately exit. Make any necessary changes to the file:
-nano ~/.reticulum/config
-
-# ... and launch the example again.
-python Examples/Echo.py -s
-
-# You can now repeat the process on another computer,
-# and run the same example with -h to get command line options.
-python Examples/Echo.py -h
-
-# Run the example in client mode to "ping" the server.
-# Replace the hash below with the actual destination hash of your server.
-python Examples/Echo.py 174a64852a75682259ad8b921b8bf416
-
-# Have a look at another example
-python Examples/Filetransfer.py -h
-
-
-

When you have experimented with the basic examples, it’s time to go read the -Understanding Reticulum chapter. Before submitting -your first pull request, it is probably a good idea to introduce yourself on -the disucssion forum on GitHub, -or ask one of the developers or maintainers for a good place to start.

+chapter of this manual. Before diving in, it’s probably a good idea to read +this manual in full, but at least start with the Understanding Reticulum chapter.

Platform-Specific Install Notes

@@ -1010,12 +1014,19 @@ All other available modules will still be loaded when needed.

  • Using the Included Utilities
  • Creating a Network With Reticulum
  • Connecting Reticulum Instances Over the Internet
  • +
  • Bootstrapping Connectivity +
  • Connect to the Public Testnet
  • Hosting Public Entrypoints
  • Adding Radio Interfaces
  • Creating and Using Custom Interfaces
  • Develop a Program with Reticulum
  • -
  • Participate in Reticulum Development
  • Platform-Specific Install Notes
    • Android
    • ARM64
    • @@ -1040,7 +1051,7 @@ All other available modules will still be loaded when needed.

  • - + diff --git a/docs/manual/hardware.html b/docs/manual/hardware.html index 6b826a4..536291a 100644 --- a/docs/manual/hardware.html +++ b/docs/manual/hardware.html @@ -7,7 +7,7 @@ - Communications Hardware - Reticulum Network Stack 1.0.5 documentation + Communications Hardware - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
    @@ -204,7 +204,7 @@
    - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -671,7 +671,7 @@ can be used with Reticulum. This includes virtual software modems such as
    - + diff --git a/docs/manual/index.html b/docs/manual/index.html index ad20196..68c9161 100644 --- a/docs/manual/index.html +++ b/docs/manual/index.html @@ -7,7 +7,7 @@ - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
    @@ -204,7 +204,7 @@
    - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -291,12 +291,19 @@ to participate in the development of Reticulum itself.

  • Using the Included Utilities
  • Creating a Network With Reticulum
  • Connecting Reticulum Instances Over the Internet
  • +
  • Bootstrapping Connectivity +
  • Connect to the Public Testnet
  • Hosting Public Entrypoints
  • Adding Radio Interfaces
  • Creating and Using Custom Interfaces
  • Develop a Program with Reticulum
  • -
  • Participate in Reticulum Development
  • Platform-Specific Install Notes
  • +
  • Discovering Interfaces
  • Remote Management
  • +
  • Blackhole Management +
  • Improving System Configuration
  • +
  • Network Identities +
  • Reference Setup
  • Protocol Specifics @@ -520,7 +549,7 @@ to participate in the development of Reticulum itself.

  • - + diff --git a/docs/manual/interfaces.html b/docs/manual/interfaces.html index be3b57f..958a096 100644 --- a/docs/manual/interfaces.html +++ b/docs/manual/interfaces.html @@ -7,7 +7,7 @@ - Configuring Interfaces - Reticulum Network Stack 1.0.5 documentation + Configuring Interfaces - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
    @@ -204,7 +204,7 @@
    - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -1076,6 +1076,176 @@ relevant regulation for your location, and to make decisions accordingly.

    +
    +

    Discoverable Interfaces

    +

    Reticulum includes a powerful system for publishing your local interfaces to the wider network, allowing other peers to discover, validate, and automatically connect to them. This feature is particularly useful for creating decentralized networks where peers can dynamically find entrypoints, such as public Internet gateways or local radio access points, without relying on static configuration files or centralized directories.

    +

    When an interface is made discoverable, your Reticulum instance will periodically broadcast an announce packet containing the connection details and parameters required for other peers to establish a connection. These announces are propagated over the network using the standard Reticulum announce mechanism using the rnstransport.discovery.interface destination type.

    +
    +

    Note

    +

    To use the interface discovery functionality, the LXMF module must be installed in your Python environment. You can install it using pip:

    +
    pip install lxmf
    +
    +
    +
    +
    +

    Enabling Discovery

    +

    Interface discovery is enabled on a per-interface basis. To make a specific interface discoverable, you must add the discoverable option to that interface’s configuration block and set it to yes.

    +
    [[My Public Gateway]]
    +  type = BackboneInterface
    +  ...
    +  discoverable = yes
    +
    +
    +

    Once enabled, Reticulum will automatically handle the generation, signing, stamping, and broadcasting of the discovery announces. It is not required to enable Transport to publish interface discovery information, but for most use cases where you want others to connect to you, you will likely want enable_transport set to yes in the [reticulum] section of your configuration.

    +
    +
    +

    Discovery Parameters

    +

    When discoverable is enabled, a variety of additional options become available to control how the interface is presented to the network. These parameters allow you to fine-tune the metadata, security requirements, and visibility of your interface.

    +

    Basic Metadata

    +
    +
    discovery_name

    A human-readable name for the interface. This name will be displayed to users on remote systems when they list discovered interfaces. If not specified, the interface name (the section header) will be used.

    +
    +
    announce_interval

    The interval in minutes between successive discovery announces for this interface. Default is 360 minutes (6 hours). For stable, long-running infrastructure, higher intervals (12 to 22 hours) are usually sufficient and reduce network load. Minimum allowed value is 5 minutes (but expect to have your announces throttled if using intervals below one hour).

    +
    +
    +

    Connectivity Specification

    +
    +
    reachable_on

    Specifies the address that remote peers should use to connect to this interface.

    +
      +
    • For TCP and Backbone interfaces, this is typically the public IP address or hostname. Do not include the port, this is fetched automatically from the interface.

    • +
    • For I2P interfaces, this is usually the I2P b32 address. This value is fetched automatically from the I2PInterface once it is up and connected to the I2P network, so you should not set this manually, unless you absolutely know what you’re doing.

    • +
    +

    Dynamic Resolution: This option also accepts a path to an external executable script or binary. If a path is provided, Reticulum will execute the script and use its stdout as the reachability address. This is useful for devices behind dynamic DNS, NATs, or complex cloud environments where the external IP is not known locally. The script must simply print the address to stdout and exit.

    +
    +
    +
    +

    Note

    +

    Script Execution Requirements: +When using an executable script for reachable_on, Reticulum expects the script to output only the IP address or hostname to stdout, followed by a newline character. Any additional output or errors may cause the resolution to fail. Ensure the script has executable permissions and is robust against temporary network failures.

    +
    +

    Security & Cost

    +
    +
    discovery_stamp_value

    Defines the proof-of-work difficulty for the cryptographic stamp included in the announce. This value acts as a cost barrier to prevent network flooding. The default value is 14. Increasing this value makes it computationally more expensive to generate an announce, which can be useful to prevent spam on very large networks, but it also increases CPU load on your system when generating announces. Stamps are cached, and only generated if interface information changes, or at instance restart. If you have the computational resources, it is generally advisable to use as high a stamp value as possible.

    +
    +
    +

    Privacy & Encryption

    +
    +
    discovery_encrypt

    If set to yes, the discovery announce payload will be encrypted. To decrypt the announce, remote peers must possess the network identity configured for your instance (see network_identity in the [reticulum] section). This allows you to publish private interfaces that are only discoverable to specific trusted networks.

    +
    +
    +
    +

    Warning

    +

    If you enable discovery_encrypt but do not configure a valid network_identity in the [reticulum] section of your configuration, Reticulum will abort the interface discovery announce. Encryption requires a valid network identity key to function.

    +
    +
    +
    publish_ifac

    If set to yes, the Interface Access Code (IFAC) name and passphrase for this interface will be included in the discovery announce. This allows peers to automatically configure the correct authentication parameters when connecting to the interface.

    +
    +
    +

    Physical Location

    +
    +
    latitude, longitude, height

    Optional physical coordinates for the interface. These are useful for mapping discovered interfaces geographically or for clients to automatically select the nearest access point. Coordinates should be in decimal degrees, height in meters.

    +
    +
    +

    Radio Parameters

    +

    For physical radio interfaces like RNodeInterface or KISSInterface, the following optional parameters allow you to broadcast the operating frequency and characteristics, allowing clients to verify compatibility before connecting:

    +
    +
    discovery_frequency

    The operating frequency in Hz. Auto-configured on RNode interfaces. Necessary on KISS-based radio interfaces and TCPClientInterfaces connecting to radio modems.

    +
    +
    discovery_bandwidth

    The signal bandwidth in Hz. Auto-configured on RNode interfaces. Useful on KISS-based radio interfaces and TCPClientInterfaces connecting to radio modems.

    +
    +
    discovery_modulation

    The modulation type or scheme. Auto-configured on RNode interfaces, but highly advisable to include on other radio-based interfaces.

    +
    +
    +
    +
    +

    Interface Modes

    +

    When you enable discovery on an interface, Reticulum enforces certain interface modes to ensure the interface is actually useful for remote peers.

    +

    If an interface is configured as discoverable, but its mode is not explicitly set to gateway (for server-style interfaces like BackboneInterface or TCPServerInterface) or access_point (for radio interfaces like RNodeInterface), Reticulum will automatically configure the appropriate mode and log a notice.

    +

    For example, if you enable discovery on a RNodeInterface without specifying the mode, Reticulum will automatically set it to access_point mode.

    +
    +
    +

    Security Considerations

    +

    When making interfaces discoverable, you are effectively broadcasting an invitation to connect to your system. It is important to understand the security implications of the configuration options you choose.

    +

    Publishing Credentials

    +

    If you enable publish_ifac = yes, your interface’s authentication passphrase will be included in the announce. If you are operating a public network and want anyone to connect, this is acceptable. However, if you wish to restrict access to a specific group of users, you must enable discovery_encrypt = yes. This ensures that only peers possessing the correct network_identity can decode the passphrase.

    +

    Topology Exposure

    +

    A discoverable interface announces its presence, location (if configured), and capabilities to the network. Even if the connection details are encrypted, the fact that a connectable node exists within a certain network becomes public information. In high-security or scenarios requiring operational secrecy, consider the implications of advertising your infrastructure’s existence.

    +
    +
    +

    Example Configuration

    +

    Below is an example configuration for a public backbone gateway. This configuration publishes a high-value, publicly discoverable interface, that anyone can connect to.

    +
    [[My Public Gateway]]
    +  type = BackboneInterface
    +  mode = gateway
    +  listen_on = 0.0.0.0
    +  port = 4242
    +
    +  # Enable Discovery
    +  discoverable = yes
    +
    +  # Interface Details
    +  discovery_name = Region A Public Entrypoint
    +  announce_interval = 720
    +
    +  # Use external script to resolve dynamic IP
    +  reachable_on = /usr/local/bin/get_external_ip.sh
    +
    +  # Generate high stamp value
    +  discovery_stamp_value = 24
    +
    +  # Optional location data
    +  latitude = 51.99714
    +  longitude = -0.74195
    +  height = 15
    +
    +
    +

    The next example create an encrypted discovery-enabled interface, requiring a specific network identity to decode, and includes IFAC credentials for seamless authentication.

    +
    [[My Private Gateway]]
    +  type = BackboneInterface
    +  mode = gateway
    +  listen_on = 0.0.0.0
    +  port = 5858
    +  network_name = internal_1
    +  passphrase = Mevpekyafshak5Wr
    +
    +  # Enable Discovery
    +  discoverable = yes
    +
    +  # Interface Details
    +  discovery_name = Region A Private Backbone
    +  announce_interval = 720
    +
    +  # Use external script to resolve dynamic IP
    +  reachable_on = /usr/local/bin/get_external_ip.sh
    +
    +  # Target stamp value
    +  discovery_stamp_value = 22
    +
    +  # Encrypt announces for our network only
    +  discovery_encrypt = yes
    +
    +  # Include credentials so trusted
    +  # peers can connect automatically
    +  publish_ifac = yes
    +
    +  # Optional location data
    +  latitude = 34.06915
    +  longitude = -118.44318
    +  height = 15
    +
    +
    +

    In the [reticulum] section of your configuration, you would define the network identity used for encryption as follows:

    +
    [reticulum]
    +...
    +# The identity used to sign/encrypt discovery announces
    +network_identity = ~/.reticulum/storage/identities/my_network_identity
    +...
    +
    +
    +

    With these configuration options applied, your Reticulum instance will actively participate in the network’s discovery ecosystem. Other peers running Reticulum with discovery enabled will be able to see your interface, validate its cryptographic stamp, and (depending on their configuration) automatically connect to it.

    +

    For information on how to use these discovered interfaces and configure your system to auto-connect to them, refer to the Discovering Interfaces chapter.

    +
    +

    Common Interface Options

    A number of general configuration options are available on most interfaces. @@ -1169,11 +1339,22 @@ sufficient, but it can be configured by using the +

    The bootstrap_only option designates an interface as a temporary +bridge for initial connectivity. If this option is enabled, the +interface will be monitored and automatically detached once the +number of auto-connected interfaces reaches the limit configured by +autoconnect_discovered_interfaces. This is particularly useful +for using a slow or expensive connection (such as a single LoRa +link or a remote TCP tunnel) solely to discover better local +infrastructure, which then supersedes the bootstrap interface.
    + +
    -
    -

    Interface Modes

    +
    +

    Interface Modes

    The optional mode setting is available on all interfaces, and allows selecting the high-level behaviour of the interface from a number of modes. These modes affect how Reticulum selects paths in the network, how announces @@ -1471,8 +1652,16 @@ to 30

  • Pipe Interface
  • KISS Interface
  • AX.25 KISS Interface
  • -
  • Common Interface Options
  • +
  • Discoverable Interfaces +
  • +
  • Common Interface Options
  • +
  • Interface Modes
  • Announce Rate Control
  • New Destination Rate Limiting
  • @@ -1486,7 +1675,7 @@ to 30 - + diff --git a/docs/manual/networks.html b/docs/manual/networks.html index 06befb6..e375976 100644 --- a/docs/manual/networks.html +++ b/docs/manual/networks.html @@ -7,7 +7,7 @@ - Building Networks - Reticulum Network Stack 1.0.5 documentation + Building Networks - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
    @@ -204,7 +204,7 @@
    - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -501,7 +501,7 @@ connected outliers are now an integral part of the network.

    - + diff --git a/docs/manual/objects.inv b/docs/manual/objects.inv index 5208faeaf004f5ee866967b19765a55076686798..712966f254eb004fca80fc308cdeaa3174c523f8 100644 GIT binary patch delta 2857 zcmV+^3)b}B6_FQ^O#?A5Fp*F^e@l3kn73zCD}B zB!*a(#JRCk)y%J-MiW5lt4 zBq7OhzzI!J>>u?~6U-wT4(dj+a3Q5cUJ zct%*c+KbPr&u|)!;Yh+lz_OfXIOi90V2;m(fyVSg_$9+*W{~5Ae&FAs4_h6q<&X=+ z@Q?vFMJ34-W}Ku*SgU~re>9}~k^RFqMX!mx`F{Db+WX75!)7n25a&5L795*Rq{6$K z{mT13e;q-Af&gcn`7ue~nThUO;54NLNLb^t%m*v+5z8Q4F#nX(#7|LTO%%i!<$j1y zsED~QXhX!2HH!=&@AzV^fe;7zCFAxm?R`1^yMQ+~ZqsDKDLTdwe>4#fBFvdReAN7L zdZKyoz_7nEvHxSX{EWGu<>W){m@Pa)EE7z?9-U6f#W)x_K3~Q#DEIJ53S0Jp z;!zx!Ba*^W#`+o~f9KQ$<2FosAQ@Jov*p42zB0@@8gxBSf9}+B9sIY|&z<{U>tR*0 zd;sdN{@S|UPh0ffJ8YKo{p!honeSd+SDUZ<7h8^?$l-OvqC%T3wMkPNW04v(rVNtD z3&+eJb|NvhLltrCo5pjE8j(NR*aAXbFbbMOtcHbJPkBtzf9Qb6O&Xdxh@T@MRyjpu zZ6nnT+9qqO;W<>SNaP0VeSio~U{OZny+UF%h@?WyDvFkX)owpuyt=!W^=h;C_wIW2 zcG&ydmFK^_ZEc9YtybIlt7|v92I-NX=ga+@XT#A}Pk;O`Wf~YyW_1q-n8>(v_r#(t z-QWS`y{`PPf8Km)wQLC!OSVA?zlXll)MQHepgxx{#^@R>QE9?%NGQmm6O&bj9a5b? zn9I}9asX~Oz~5HV;_w2Zs!cs#V;Lh>0G8&)@^VHe^BF$K`AZ6v@M3D zM`-**TNo|4Jx&$##`3x?31Z4DTL4Wkq7~8DmPwt+f7mJHn9)Ks*$<*=8pK8T@GKy{ zh16)np8>0r1T1>L^R-OUJCXNLVrTuJpH4Xc2*aEr${S2W~JBYp#7 z81oeZe;mc|3|s;1#ILkwCNI~{x%EI&1K@`Rv&YIasu)sQez6KW*EF0Y7?RIJV5=$I zzO6Hc%zQ|*g!}%O@yZ)2dAIb)w5z+FN0_=7jK&Z<1>9&33;{EpChZ4PM+)=|&dWx^ ztK(b}jwWCkO&NX=UK;yI4s$>ER5@U@O;WT6e{-wvQ*s?V3L%bgVyYp93J|=Dtsp`b zWlhb<|FAXE^iZM&%Aho3_9!cpZ2%cQi!Re12(?+tK+Ik>gh3&jWMaCeF3L$z#6@Cc zV@h^5-)!Cvo8`)1&P~rzYVfPO`R1?p2mi_4E#JPcj8BSdinY6O*N3&gaQEJPzp}^g ze-GA}9!=fytV*y;af~4=L^Ou_zT7TmwL_(8kQBm);Z<^tEH7402pWr!uz;48!l)^f z4P(NKn#T@b9o^&^cl^q*0Qfa2JWk6e`nkI{^i--Jgq!`ZRiIzxM#?IKd1$}6zCHP z9U&fBt+DwzK=nz5&Bbm_1leQ6@Da_J_K#lIk1(QF*b*Pd&K|4n+T$}JOJp^Qw` zw``1uf5zwt1;O;DXmxmNA{#co4l)1LdeWa9&!?!FW z>3Is>PAWds{J1hE$i-liXLZ_lLX1}&izb7!Y%omlF9Zn!Pxbd;ElTy4X=74S8g|Sn z3IiDGK5kKoX<)Cfbz!QftU(3ie>AD%&wX$y?6{RQ(=<4U=zZ)8B(%7=r>x4~`>^MR zq=xI;fV)sv9XSVONYUWyNYDj}lT$4Yx*-V~(CS(WX;5`ae;1^hM&|qr{*?` zAq}p8U~3_ER_c+K?}=MiyVnAqXdV?%TD3;f59Ltv6y&oQsh|wCPF?kie@lxOA?qx# zaFNLwrz8#WudWBlr;^YW|4y#GsyT-nKIeRu&z+ro;XDi5k5C?dq8v8~s%MqDlB7tL z5isXPz0}Aa#kB}Z#oeHwB4M4UU}pIxqeL`;hT-EyLY-~-DT1@A878$7)p{EGtJS~3 z{FCPILL0%mvqotF=2x~2e{noL7vLerbJ@m-!)_+iU4{eUFR)D|kF$aDTTG~O_x7x+ zrTSXCoH)M7dwiaU?aZU1Uu z_r*~`qV-J{^b8nX354t!|I-r%^=Q(e;uSB-F8MXa&tjtEP@AwlaL zk@yC)_~{rrfA<(p?;v`BZ3E^NqQGv`9}y$L2}I@Z0k1mEUUpX`(Xc2n&?PJchx6Pd z>5S4iLP=3__*-J4RfiA{~Nw&<0+vX=4)^3e`PcCnuK!kxwM%{ueET8Mdb*%uNl8z$ku-X`b2HS~&;avIQ>sb0We&erV0I8KZ- zP$m5xf96GY#aG=+nJ_8Y4#$ntz8f4>->gr)Ck5*!B~~XR)^aBY9OoxY!r7I}m(Xc_ zyH(#%b>_lqPiRA?4alN;DB5`SPz}*@qc<>uMoeo&)$?^)8wuzMG^`n5Of(^_BD_OW z6CkL36uPXWq5hc^oQPxwJwD=`jo! za2DaoQKZSg{_Wl01qOJAzds|?;5IWrpR*&%GMoe$#lsqB_zP-37!fXNe;VIXix@@% zhdUAzh9f~}hLUh+rkY}Lr179{vB?2nUauiHK8<$5_B{NB|TS6h$}}JWNRT&TV|(B4-&b0O8Eb^AMsWL_CLd!NWbHX_%qZStv>{VquK; zs7OR8Wn(0evx-U}@A%~Gffz^ZlnZy7S$z!uEZ~mIvS}*e4DAv~f0{@{M=ZEIeU$w; z+fx?ZFzl~fKL0U~{D4K6GxDLIm@EB=_;C!Uj?pr5NsKc=g!AwTMe!}>|E{p%;Kf^) zjnt57BZO-ZgoGb)97ZTfb|`uuBbEaX{@f(NDBV}ixz(Ifiwg*Hd^n9!(90tv89cHN zl#J5A0+9@+GIp(Te{#rdIDR9f2Z~_@oy@ku_qk=&F{JZ>`fI1bb@<=rZ)^X*&co_r zc>^_^|FiOgH&^y1*e++&&HOQZp01x?=F6{}XIG7=U~sz;QL)P-btzMZ<4_t5r%aN& zlfc}awkHX8V--mf+U9e^8c{#m+yYWvG>Xa~SHnb|O&(J;e>&uGMnf|P`EvxtsiqjN zYo?k&+vFTIg29dz$=cxj93X=en3UCcFHjgQGO2_)Wzmu_UvH)lFaG*@F<)-NjlY<` zZa3j-9)!=YD;J?}^Z9D};=7G*NM_`x>1^{FxM;N9)1UuKOoJ1ssvh776P1^)o>;We z4IOaa%RKxVe@tgi(^fP&WfzuQ_t1CRhD?c%>T?Nej@g5yx=gqY2^(_g#MCasjj7Kc z?C~^q96-1Y@Y4w`4=*6Ay6op`F6YFFz%yozR~GH zpz)7gX|xdTJiVE>#+$YzN+@@10gS+iR>W{yA+;xCe@$SR(?T}cH?nCKB}II*6_8(; z_zf!d-BigI7_pdsX7&UI#)bLuBrUe2 zGhm@uf1ZJBf*btIYj$`wcOjeyQXYVHSa5f)I-^RUq_LAz+BugIB*jpCZX!FGaQSVW zHDwY)nI$3&$Bb9Lp;GUbZZW%hw{we9_XVRh#mxa1ngdJ1#FR<*!Ss;=J;37SBk9#~ zE{R7A@SJ8G-$*ZmeWZr{IuG=A!0It6Xbq+)JD&(iP>N znv?%wXQu6;M2nQe){MKeoIe9-pfL)10`HlnDzva8&nprk#(BX$M;SrUU-i@z&trTUjNiL5*)Cu0-QKc=auT%NxyFe+behWI=IsWYL_5g1V71{0q`F&Bw9SyTCoN zTPQXEH~FdBXV~}(<>X#}#KlGYcY=0M3GXjLt5ZuGY~1)P#s+VW=WM_-r&s|~M23c+ zu6!@3E-Dg~AlZ@cl@;ju02uc@GuL5PO$Hm!|ujnpAK>(>g_5 zCzoK)uh87c;OI!NbLW6CaQP0c+L~RbJvESqZceJNQhj|K8kMWwkk1!umncv53>`~e`d%yl$X?)MrTBCCSPaF^(BMvNiAnjuSMKbb}V2Q z(;CTKR6|WOz~>3lc@wr3^^Qy)s6R`r_kc-u;CBa{ku1i)+D24Ym7p*G1*8y?qRw~s zRj6wl&hIMjS9RT6s~g^vjQt~G@h4)qDNtRj+?A$9rh|Zc&-$ie_BgI3e^5HEU!tC_ z9=S2o+EGg^J}G;bc1Q2t0%ZjRO1XDUlKVpevCO+J>vaGavPzHuzo+->97i&;!J(y& zw}d?@zcb62x2>wKRvyXr_tuP=WMvj3R?=$pS@fA?$1BcvV8@Q}_!h3i#Osd7l;JV!Pp$d`PG?|)hK4-bz^ zHlz2E^6-$(5`TKlZ-L9F^FmT0W2>qAPWa$6zUq-zdfmY?nPdm(!BT==Xn?MW+^0n%e~6vbqJ;Kpam)xB z43@P*^(u%ckB0c0*~*(G1nTWY4Q`_Wc0eoKuTjK< z60A#8rjm6le^%EN{GlL8EF)Rxb#6F4YoSGz3FeI4FlWHd)d?D>tZlB@eKzfFZ%I21 zg^I26`*Uf>^}1J~f66H1nyX7!Pb<~s`wgTf4;R~VERE(xE_d8e?5|SR2KGSV7Wbe} zh1~Z+B4czR8>s6l+Y<6gpiMQ!`;KG8qGOw=t|{lP)%_Jv@3gheN1-oitiIn+S66zx z(j?Y1Y)}h${!E^K#noffL$+?HfwwK}1&s^s%DJ3esz+RxfBglPjR)Z=EJ*OWKqR@K zEPpYC4n2X>JBS%z)u081+`G2rp)V%U9-!)HU}sHxuevXbXk3&W*nmGs4ezNb(ix?3 zfRLf|Z0+<8(yYJBl5|;=yXkeEpf`>Cf{A0dr|Q+Jw$o3F(Uqepv9ai@#C5p(=!9S! z0pEZ-D)0DIf5nYD`XAO>mEW9t-|)!=lQX#*RwF~Km0e4hnj*>ry zvzcXC@i!9O5m9G3vOhq=Lgxp8w&|%vp9zVhjU@p_(NQ`F0;n0AT{%|nIzOytHAhJg7U4| i<#rH?_}%9b;;OYLQ&-e9e!%}8+%_8jx%)q1REOw-jy_`m diff --git a/docs/manual/reference.html b/docs/manual/reference.html index 9d94aa2..81c0e10 100644 --- a/docs/manual/reference.html +++ b/docs/manual/reference.html @@ -7,7 +7,7 @@ - API Reference - Reticulum Network Stack 1.0.5 documentation + API Reference - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
    @@ -204,7 +204,7 @@
    - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -398,7 +398,7 @@ can remotely query and manage this instance.

    static required_discovery_value()
    -

    Returns the required stam value for a discovered interface +

    Returns the required stamp value for a discovered interface to be considered valid and remembered.

    Returns:
    @@ -407,6 +407,42 @@ to be considered valid and remembered.

    +
    +
    +static publish_blackhole_enabled()
    +

    Returns whether blackhole list publishing is enabled for the +running instance.

    +
    +
    Returns:
    +

    True if blackhole list publishing is enabled, False if not.

    +
    +
    +
    + +
    +
    +static blackhole_sources()
    +

    Returns the list of transport identity hashes from which +blackhole lists are sourced.

    +
    +
    Returns:
    +

    A list of identity hashes.

    +
    +
    +
    + +
    +
    +static interface_discovery_sources()
    +

    Returns the list of network identity hashes from which +interfaces are discovered.

    +
    +
    Returns:
    +

    A list of identity hashes.

    +
    +
    +
    +

    Identity

    @@ -2137,6 +2173,25 @@ announces. See the +
    +static await_path(destination_hash, timeout=None, on_interface=None)
    +

    Requests a path to the destination from the network and +blocks until the path is available, or the timeout is reached.

    +
    +
    Parameters:
    +
      +
    • destination_hash – A destination hash as bytes.

    • +
    • timeout – An optional timeout in seconds.

    • +
    • on_interface – If specified, the path request will only be sent on this interface. In normal use, Reticulum handles this automatically, and this parameter should not be used.

    • +
    +
    +
    Returns:
    +

    True if a path to the destination is found, otherwise False.

    +
    +
    +
    +
    static request_path(destination_hash, on_interface=None, tag=None, recursive=False)
    @@ -2215,6 +2270,9 @@ will announce it.

  • link_mtu_discovery()
  • remote_management_enabled()
  • required_discovery_value()
  • +
  • publish_blackhole_enabled()
  • +
  • blackhole_sources()
  • +
  • interface_discovery_sources()
  • Identity
  • @@ -2398,7 +2457,7 @@ will announce it.

    - + diff --git a/docs/manual/search.html b/docs/manual/search.html index c286409..9bbaf07 100644 --- a/docs/manual/search.html +++ b/docs/manual/search.html @@ -8,7 +8,7 @@ -Search - Reticulum Network Stack 1.0.5 documentation +Search - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
    @@ -204,7 +204,7 @@
    - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -299,7 +299,7 @@
    - + diff --git a/docs/manual/searchindex.js b/docs/manual/searchindex.js index 57ab276..53c2b25 100644 --- a/docs/manual/searchindex.js +++ b/docs/manual/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles":{"API Reference":[[7,null]],"ARM64":[[2,"arm64"]],"AX.25 KISS Interface":[[5,"ax-25-kiss-interface"]],"Adding Radio Interfaces":[[2,"adding-radio-interfaces"]],"An Explanation of Reticulum for Human Beings":[[1,null]],"Android":[[2,"android"]],"Announce":[[0,"announce"]],"Announce Propagation Rules":[[9,"announce-propagation-rules"]],"Announce Rate Control":[[5,"announce-rate-control"]],"Auto Interface":[[5,"auto-interface"]],"Backbone Interface":[[5,"backbone-interface"]],"Bridging Over the Internet":[[6,"bridging-over-the-internet"]],"Broadcast":[[0,"broadcast"]],"Buffer":[[0,"buffer"]],"Building Networks":[[6,null]],"Caveat Emptor":[[11,"caveat-emptor"]],"Channel":[[0,"channel"]],"Code Examples":[[0,null]],"Combining Hardware Types":[[3,"combining-hardware-types"]],"Common Interface Options":[[5,"common-interface-options"]],"Communications Hardware":[[3,null]],"Concepts & Overview":[[6,"concepts-overview"]],"Configuration & Data":[[10,"configuration-data"]],"Configuring Interfaces":[[5,null]],"Connect to the Public Testnet":[[2,"connect-to-the-public-testnet"]],"Connecting Remotes":[[5,"connecting-remotes"]],"Connecting Reticulum Instances Over the Internet":[[2,"connecting-reticulum-instances-over-the-internet"]],"Contribute Code":[[8,"contribute-code"]],"Creating RNodes":[[3,"creating-rnodes"]],"Creating a Network With Reticulum":[[2,"creating-a-network-with-reticulum"]],"Creating and Using Custom Interfaces":[[2,"creating-and-using-custom-interfaces"]],"Cryptographic Primitives":[[9,"cryptographic-primitives"]],"Current Status":[[11,"current-status"]],"Custom Interfaces":[[0,"custom-interfaces"],[5,"custom-interfaces"]],"Debian Bookworm":[[2,"debian-bookworm"]],"Destination Naming":[[9,"destination-naming"]],"Destinations":[[9,"destinations"]],"Develop a Program with Reticulum":[[2,"develop-a-program-with-reticulum"]],"Donations":[[8,"donations"]],"Echo":[[0,"echo"]],"Ethernet-based Hardware":[[3,"ethernet-based-hardware"]],"Example Scenarios":[[6,"example-scenarios"]],"Filetransfer":[[0,"filetransfer"]],"Fixed Serial Port Names":[[10,"fixed-serial-port-names"]],"Getting Further":[[9,"getting-further"]],"Getting Started Fast":[[2,null]],"Goals":[[9,"goals"]],"Growth and Convergence":[[6,"growth-and-convergence"]],"Heltec LoRa32 v2.0":[[3,"heltec-lora32-v2-0"]],"Heltec LoRa32 v3.0":[[3,"heltec-lora32-v3-0"]],"Heltec LoRa32 v4.0":[[3,"heltec-lora32-v4-0"]],"Heltec T114":[[3,"heltec-t114"]],"Hosting Public Entrypoints":[[2,"hosting-public-entrypoints"]],"I2P Interface":[[5,"i2p-interface"]],"Identification":[[0,"example-identify"]],"Identities":[[9,"understanding-identities"]],"Improving System Configuration":[[10,"improving-system-configuration"]],"Included Utility Programs":[[10,"included-utility-programs"]],"Indices and Tables":[[4,"indices-and-tables"]],"Installation":[[3,"installation"]],"Interconnected LoRa Sites":[[6,"interconnected-lora-sites"]],"Interface Access Codes":[[9,"interface-access-codes"]],"Interface Modes":[[5,"interface-modes"]],"Interface Types and Devices":[[11,"interface-types-and-devices"]],"Introduction & Basic Functionality":[[9,"introduction-basic-functionality"]],"KISS Interface":[[5,"kiss-interface"]],"LilyGO LoRa32 v1.0":[[3,"lilygo-lora32-v1-0"]],"LilyGO LoRa32 v2.0":[[3,"lilygo-lora32-v2-0"]],"LilyGO LoRa32 v2.1":[[3,"lilygo-lora32-v2-1"]],"LilyGO T-Beam":[[3,"lilygo-t-beam"]],"LilyGO T-Beam Supreme":[[3,"lilygo-t-beam-supreme"]],"LilyGO T-Deck":[[3,"lilygo-t-deck"]],"LilyGO T-Echo":[[3,"lilygo-t-echo"]],"LilyGO T3S3":[[3,"lilygo-t3s3"]],"Link":[[0,"link"]],"Link Establishment in Detail":[[9,"link-establishment-in-detail"]],"Listeners":[[5,"listeners"]],"MacOS":[[2,"macos"]],"MeshChat":[[2,"meshchat"]],"Minimal":[[0,"minimal"]],"Motivation":[[9,"motivation"]],"New Destination Rate Limiting":[[5,"new-destination-rate-limiting"]],"Node Types":[[9,"node-types"]],"Nomad Network":[[2,"nomad-network"]],"OpenCom XL":[[3,"opencom-xl"]],"OpenWRT":[[2,"openwrt"]],"Packet Prioritisation":[[9,"packet-prioritisation"]],"Packet Radio Modems":[[3,"packet-radio-modems"]],"Participate in Reticulum Development":[[2,"participate-in-reticulum-development"]],"Pipe Interface":[[5,"pipe-interface"]],"Platform-Specific Install Notes":[[2,"platform-specific-install-notes"]],"Protocol Specifics":[[9,"protocol-specifics"]],"Provide Feedback":[[8,"provide-feedback"]],"Public Key Announcements":[[9,"public-key-announcements"]],"Pure-Python Reticulum":[[2,"pure-python-reticulum"]],"RAK4631-based Boards":[[3,"rak4631-based-boards"]],"RISC-V":[[2,"risc-v"]],"RNode":[[3,"rnode"]],"RNode LoRa Interface":[[5,"rnode-lora-interface"]],"RNode Multi Interface":[[5,"rnode-multi-interface"]],"Raspberry Pi":[[2,"raspberry-pi"]],"Reaching the Destination":[[9,"reaching-the-destination"]],"Reference Setup":[[9,"reference-setup"]],"Remote Management":[[10,"remote-management"]],"Remote Shell":[[2,"remote-shell"]],"Requests & Responses":[[0,"requests-responses"]],"Resolving Dependency & Installation Issues":[[2,"resolving-dependency-installation-issues"]],"Resources":[[9,"resources"]],"Reticulum Network Stack Manual":[[4,null]],"Reticulum Transport":[[9,"reticulum-transport"]],"Reticulum as a System Service":[[10,"reticulum-as-a-system-service"]],"Serial Interface":[[5,"serial-interface"]],"Serial Lines & Devices":[[3,"serial-lines-devices"]],"Sideband":[[2,"sideband"]],"Standalone Reticulum Installation":[[2,"standalone-reticulum-installation"]],"Support Reticulum":[[8,null]],"Supported Boards and Devices":[[3,"supported-boards-and-devices"]],"Systemwide Service":[[10,"systemwide-service"]],"TCP Client Interface":[[5,"tcp-client-interface"]],"TCP Server Interface":[[5,"tcp-server-interface"]],"Table Of Contents":[[4,"table-of-contents"]],"The Announce Mechanism in Detail":[[9,"the-announce-mechanism-in-detail"]],"The rncp Utility":[[10,"the-rncp-utility"]],"The rnid Utility":[[10,"the-rnid-utility"]],"The rnodeconf Utility":[[10,"the-rnodeconf-utility"]],"The rnpath Utility":[[10,"the-rnpath-utility"]],"The rnprobe Utility":[[10,"the-rnprobe-utility"]],"The rnsd Utility":[[10,"the-rnsd-utility"]],"The rnstatus Utility":[[10,"the-rnstatus-utility"]],"The rnx Utility":[[10,"the-rnx-utility"]],"Try Using a Reticulum-based Program":[[2,"try-using-a-reticulum-based-program"]],"UDP Interface":[[5,"udp-interface"]],"Ubuntu Lunar":[[2,"ubuntu-lunar"]],"Understanding Reticulum":[[9,null]],"Unsigned RNode v2.x":[[3,"unsigned-rnode-v2-x"]],"Usage with Reticulum":[[3,"usage-with-reticulum"]],"Userspace Service":[[10,"userspace-service"]],"Using Reticulum on Your System":[[10,null]],"Using the Included Utilities":[[2,"using-the-included-utilities"]],"What does Reticulum Offer?":[[11,"what-does-reticulum-offer"]],"What is Reticulum?":[[11,null]],"Where can Reticulum be Used?":[[11,"where-can-reticulum-be-used"]],"WiFi-based Hardware":[[3,"wifi-based-hardware"]],"Windows":[[2,"windows"]],"Wire Format":[[9,"wire-format"]]},"docnames":["examples","forhumans","gettingstartedfast","hardware","index","interfaces","networks","reference","support","understanding","using","whatis"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["examples.rst","forhumans.rst","gettingstartedfast.rst","hardware.rst","index.rst","interfaces.rst","networks.rst","reference.rst","support.rst","understanding.rst","using.rst","whatis.rst"],"indexentries":{"__init__() (rns.rawchannelreader method)":[[7,"RNS.RawChannelReader.__init__",false]],"__init__() (rns.rawchannelwriter method)":[[7,"RNS.RawChannelWriter.__init__",false]],"accepts_links() (rns.destination method)":[[7,"RNS.Destination.accepts_links",false]],"add_message_handler() (rns.channel.channel method)":[[7,"RNS.Channel.Channel.add_message_handler",false]],"add_ready_callback() (rns.rawchannelreader method)":[[7,"RNS.RawChannelReader.add_ready_callback",false]],"advertise() (rns.resource method)":[[7,"RNS.Resource.advertise",false]],"announce() (rns.destination method)":[[7,"RNS.Destination.announce",false]],"announce_cap (rns.reticulum attribute)":[[7,"RNS.Reticulum.ANNOUNCE_CAP",false]],"app_and_aspects_from_name() (rns.destination static method)":[[7,"RNS.Destination.app_and_aspects_from_name",false]],"buffer (class in rns)":[[7,"RNS.Buffer",false]],"cancel() (rns.resource method)":[[7,"RNS.Resource.cancel",false]],"channel (class in rns.channel)":[[7,"RNS.Channel.Channel",false]],"clear_default_app_data() (rns.destination method)":[[7,"RNS.Destination.clear_default_app_data",false]],"concluded() (rns.requestreceipt method)":[[7,"RNS.RequestReceipt.concluded",false]],"create_bidirectional_buffer() (rns.buffer static method)":[[7,"RNS.Buffer.create_bidirectional_buffer",false]],"create_keys() (rns.destination method)":[[7,"RNS.Destination.create_keys",false]],"create_reader() (rns.buffer static method)":[[7,"RNS.Buffer.create_reader",false]],"create_writer() (rns.buffer static method)":[[7,"RNS.Buffer.create_writer",false]],"current_ratchet_id() (rns.identity static method)":[[7,"RNS.Identity.current_ratchet_id",false]],"curve (rns.identity attribute)":[[7,"RNS.Identity.CURVE",false]],"curve (rns.link attribute)":[[7,"RNS.Link.CURVE",false]],"decrypt() (rns.destination method)":[[7,"RNS.Destination.decrypt",false]],"decrypt() (rns.identity method)":[[7,"RNS.Identity.decrypt",false]],"deregister_announce_handler() (rns.transport static method)":[[7,"RNS.Transport.deregister_announce_handler",false]],"deregister_request_handler() (rns.destination method)":[[7,"RNS.Destination.deregister_request_handler",false]],"destination (class in rns)":[[7,"RNS.Destination",false]],"enable_ratchets() (rns.destination method)":[[7,"RNS.Destination.enable_ratchets",false]],"encrypt() (rns.destination method)":[[7,"RNS.Destination.encrypt",false]],"encrypt() (rns.identity method)":[[7,"RNS.Identity.encrypt",false]],"encrypted_mdu (rns.packet attribute)":[[7,"RNS.Packet.ENCRYPTED_MDU",false]],"enforce_ratchets() (rns.destination method)":[[7,"RNS.Destination.enforce_ratchets",false]],"establishment_timeout_per_hop (rns.link attribute)":[[7,"RNS.Link.ESTABLISHMENT_TIMEOUT_PER_HOP",false]],"expand_name() (rns.destination static method)":[[7,"RNS.Destination.expand_name",false]],"from_bytes() (rns.identity static method)":[[7,"RNS.Identity.from_bytes",false]],"from_file() (rns.identity static method)":[[7,"RNS.Identity.from_file",false]],"full_hash() (rns.identity static method)":[[7,"RNS.Identity.full_hash",false]],"get_age() (rns.link method)":[[7,"RNS.Link.get_age",false]],"get_channel() (rns.link method)":[[7,"RNS.Link.get_channel",false]],"get_data_size() (rns.resource method)":[[7,"RNS.Resource.get_data_size",false]],"get_establishment_rate() (rns.link method)":[[7,"RNS.Link.get_establishment_rate",false]],"get_expected_rate() (rns.link method)":[[7,"RNS.Link.get_expected_rate",false]],"get_hash() (rns.resource method)":[[7,"RNS.Resource.get_hash",false]],"get_instance() (rns.reticulum static method)":[[7,"RNS.Reticulum.get_instance",false]],"get_mdu() (rns.link method)":[[7,"RNS.Link.get_mdu",false]],"get_mode() (rns.link method)":[[7,"RNS.Link.get_mode",false]],"get_mtu() (rns.link method)":[[7,"RNS.Link.get_mtu",false]],"get_parts() (rns.resource method)":[[7,"RNS.Resource.get_parts",false]],"get_private_key() (rns.destination method)":[[7,"RNS.Destination.get_private_key",false]],"get_private_key() (rns.identity method)":[[7,"RNS.Identity.get_private_key",false]],"get_progress() (rns.requestreceipt method)":[[7,"RNS.RequestReceipt.get_progress",false]],"get_progress() (rns.resource method)":[[7,"RNS.Resource.get_progress",false]],"get_public_key() (rns.identity method)":[[7,"RNS.Identity.get_public_key",false]],"get_q() (rns.link method)":[[7,"RNS.Link.get_q",false]],"get_q() (rns.packet method)":[[7,"RNS.Packet.get_q",false]],"get_random_hash() (rns.identity static method)":[[7,"RNS.Identity.get_random_hash",false]],"get_remote_identity() (rns.link method)":[[7,"RNS.Link.get_remote_identity",false]],"get_request_id() (rns.requestreceipt method)":[[7,"RNS.RequestReceipt.get_request_id",false]],"get_response() (rns.requestreceipt method)":[[7,"RNS.RequestReceipt.get_response",false]],"get_response_time() (rns.requestreceipt method)":[[7,"RNS.RequestReceipt.get_response_time",false]],"get_rssi() (rns.link method)":[[7,"RNS.Link.get_rssi",false]],"get_rssi() (rns.packet method)":[[7,"RNS.Packet.get_rssi",false]],"get_rtt() (rns.packetreceipt method)":[[7,"RNS.PacketReceipt.get_rtt",false]],"get_segments() (rns.resource method)":[[7,"RNS.Resource.get_segments",false]],"get_snr() (rns.link method)":[[7,"RNS.Link.get_snr",false]],"get_snr() (rns.packet method)":[[7,"RNS.Packet.get_snr",false]],"get_status() (rns.packetreceipt method)":[[7,"RNS.PacketReceipt.get_status",false]],"get_status() (rns.requestreceipt method)":[[7,"RNS.RequestReceipt.get_status",false]],"get_transfer_size() (rns.resource method)":[[7,"RNS.Resource.get_transfer_size",false]],"has_path() (rns.transport static method)":[[7,"RNS.Transport.has_path",false]],"hash() (rns.destination static method)":[[7,"RNS.Destination.hash",false]],"hash_from_name_and_identity() (rns.destination static method)":[[7,"RNS.Destination.hash_from_name_and_identity",false]],"hops_to() (rns.transport static method)":[[7,"RNS.Transport.hops_to",false]],"identify() (rns.link method)":[[7,"RNS.Link.identify",false]],"identity (class in rns)":[[7,"RNS.Identity",false]],"inactive_for() (rns.link method)":[[7,"RNS.Link.inactive_for",false]],"is_compressed() (rns.resource method)":[[7,"RNS.Resource.is_compressed",false]],"is_ready_to_send() (rns.channel.channel method)":[[7,"RNS.Channel.Channel.is_ready_to_send",false]],"keepalive (rns.link attribute)":[[7,"RNS.Link.KEEPALIVE",false]],"keepalive_timeout_factor (rns.link attribute)":[[7,"RNS.Link.KEEPALIVE_TIMEOUT_FACTOR",false]],"keysize (rns.identity attribute)":[[7,"RNS.Identity.KEYSIZE",false]],"link (class in rns)":[[7,"RNS.Link",false]],"link_mtu_discovery (rns.reticulum attribute)":[[7,"RNS.Reticulum.LINK_MTU_DISCOVERY",false]],"link_mtu_discovery() (rns.reticulum static method)":[[7,"RNS.Reticulum.link_mtu_discovery",false]],"load_private_key() (rns.destination method)":[[7,"RNS.Destination.load_private_key",false]],"load_private_key() (rns.identity method)":[[7,"RNS.Identity.load_private_key",false]],"load_public_key() (rns.identity method)":[[7,"RNS.Identity.load_public_key",false]],"mdu (rns.channel.channel property)":[[7,"RNS.Channel.Channel.mdu",false]],"messagebase (class in rns)":[[7,"RNS.MessageBase",false]],"minimum_bitrate (rns.reticulum attribute)":[[7,"RNS.Reticulum.MINIMUM_BITRATE",false]],"msgtype (rns.messagebase attribute)":[[7,"RNS.MessageBase.MSGTYPE",false]],"mtu (rns.reticulum attribute)":[[7,"RNS.Reticulum.MTU",false]],"next_hop() (rns.transport static method)":[[7,"RNS.Transport.next_hop",false]],"next_hop_interface() (rns.transport static method)":[[7,"RNS.Transport.next_hop_interface",false]],"no_data_for() (rns.link method)":[[7,"RNS.Link.no_data_for",false]],"no_inbound_for() (rns.link method)":[[7,"RNS.Link.no_inbound_for",false]],"no_outbound_for() (rns.link method)":[[7,"RNS.Link.no_outbound_for",false]],"pack() (rns.messagebase method)":[[7,"RNS.MessageBase.pack",false]],"packet (class in rns)":[[7,"RNS.Packet",false]],"packetreceipt (class in rns)":[[7,"RNS.PacketReceipt",false]],"pathfinder_m (rns.transport attribute)":[[7,"RNS.Transport.PATHFINDER_M",false]],"plain_mdu (rns.packet attribute)":[[7,"RNS.Packet.PLAIN_MDU",false]],"ratchet_count (rns.destination attribute)":[[7,"RNS.Destination.RATCHET_COUNT",false]],"ratchet_expiry (rns.identity attribute)":[[7,"RNS.Identity.RATCHET_EXPIRY",false]],"ratchet_interval (rns.destination attribute)":[[7,"RNS.Destination.RATCHET_INTERVAL",false]],"ratchetsize (rns.identity attribute)":[[7,"RNS.Identity.RATCHETSIZE",false]],"rawchannelreader (class in rns)":[[7,"RNS.RawChannelReader",false]],"rawchannelwriter (class in rns)":[[7,"RNS.RawChannelWriter",false]],"recall() (rns.identity static method)":[[7,"RNS.Identity.recall",false]],"recall_app_data() (rns.identity static method)":[[7,"RNS.Identity.recall_app_data",false]],"register_announce_handler() (rns.transport static method)":[[7,"RNS.Transport.register_announce_handler",false]],"register_message_type() (rns.channel.channel method)":[[7,"RNS.Channel.Channel.register_message_type",false]],"register_request_handler() (rns.destination method)":[[7,"RNS.Destination.register_request_handler",false]],"remote_management_enabled() (rns.reticulum static method)":[[7,"RNS.Reticulum.remote_management_enabled",false]],"remove_message_handler() (rns.channel.channel method)":[[7,"RNS.Channel.Channel.remove_message_handler",false]],"remove_ready_callback() (rns.rawchannelreader method)":[[7,"RNS.RawChannelReader.remove_ready_callback",false]],"request() (rns.link method)":[[7,"RNS.Link.request",false]],"request_path() (rns.transport static method)":[[7,"RNS.Transport.request_path",false]],"requestreceipt (class in rns)":[[7,"RNS.RequestReceipt",false]],"required_discovery_value() (rns.reticulum static method)":[[7,"RNS.Reticulum.required_discovery_value",false]],"resend() (rns.packet method)":[[7,"RNS.Packet.resend",false]],"resource (class in rns)":[[7,"RNS.Resource",false]],"reticulum (class in rns)":[[7,"RNS.Reticulum",false]],"send() (rns.channel.channel method)":[[7,"RNS.Channel.Channel.send",false]],"send() (rns.packet method)":[[7,"RNS.Packet.send",false]],"set_default_app_data() (rns.destination method)":[[7,"RNS.Destination.set_default_app_data",false]],"set_delivery_callback() (rns.packetreceipt method)":[[7,"RNS.PacketReceipt.set_delivery_callback",false]],"set_link_closed_callback() (rns.link method)":[[7,"RNS.Link.set_link_closed_callback",false]],"set_link_established_callback() (rns.destination method)":[[7,"RNS.Destination.set_link_established_callback",false]],"set_packet_callback() (rns.destination method)":[[7,"RNS.Destination.set_packet_callback",false]],"set_packet_callback() (rns.link method)":[[7,"RNS.Link.set_packet_callback",false]],"set_proof_requested_callback() (rns.destination method)":[[7,"RNS.Destination.set_proof_requested_callback",false]],"set_proof_strategy() (rns.destination method)":[[7,"RNS.Destination.set_proof_strategy",false]],"set_ratchet_interval() (rns.destination method)":[[7,"RNS.Destination.set_ratchet_interval",false]],"set_remote_identified_callback() (rns.link method)":[[7,"RNS.Link.set_remote_identified_callback",false]],"set_resource_callback() (rns.link method)":[[7,"RNS.Link.set_resource_callback",false]],"set_resource_concluded_callback() (rns.link method)":[[7,"RNS.Link.set_resource_concluded_callback",false]],"set_resource_started_callback() (rns.link method)":[[7,"RNS.Link.set_resource_started_callback",false]],"set_resource_strategy() (rns.link method)":[[7,"RNS.Link.set_resource_strategy",false]],"set_retained_ratchets() (rns.destination method)":[[7,"RNS.Destination.set_retained_ratchets",false]],"set_timeout() (rns.packetreceipt method)":[[7,"RNS.PacketReceipt.set_timeout",false]],"set_timeout_callback() (rns.packetreceipt method)":[[7,"RNS.PacketReceipt.set_timeout_callback",false]],"should_use_implicit_proof() (rns.reticulum static method)":[[7,"RNS.Reticulum.should_use_implicit_proof",false]],"sign() (rns.destination method)":[[7,"RNS.Destination.sign",false]],"sign() (rns.identity method)":[[7,"RNS.Identity.sign",false]],"stale_grace (rns.link attribute)":[[7,"RNS.Link.STALE_GRACE",false]],"stale_time (rns.link attribute)":[[7,"RNS.Link.STALE_TIME",false]],"teardown() (rns.link method)":[[7,"RNS.Link.teardown",false]],"to_file() (rns.identity method)":[[7,"RNS.Identity.to_file",false]],"track_phy_stats() (rns.link method)":[[7,"RNS.Link.track_phy_stats",false]],"transport (class in rns)":[[7,"RNS.Transport",false]],"transport_enabled() (rns.reticulum static method)":[[7,"RNS.Reticulum.transport_enabled",false]],"truncated_hash() (rns.identity static method)":[[7,"RNS.Identity.truncated_hash",false]],"truncated_hashlength (rns.identity attribute)":[[7,"RNS.Identity.TRUNCATED_HASHLENGTH",false]],"unpack() (rns.messagebase method)":[[7,"RNS.MessageBase.unpack",false]],"validate() (rns.identity method)":[[7,"RNS.Identity.validate",false]]},"objects":{"RNS":[[7,0,1,"","Buffer"],[7,0,1,"","Destination"],[7,0,1,"","Identity"],[7,0,1,"","Link"],[7,0,1,"","MessageBase"],[7,0,1,"","Packet"],[7,0,1,"","PacketReceipt"],[7,0,1,"","RawChannelReader"],[7,0,1,"","RawChannelWriter"],[7,0,1,"","RequestReceipt"],[7,0,1,"","Resource"],[7,0,1,"","Reticulum"],[7,0,1,"","Transport"]],"RNS.Buffer":[[7,1,1,"","create_bidirectional_buffer"],[7,1,1,"","create_reader"],[7,1,1,"","create_writer"]],"RNS.Channel":[[7,0,1,"","Channel"]],"RNS.Channel.Channel":[[7,1,1,"","add_message_handler"],[7,1,1,"","is_ready_to_send"],[7,2,1,"","mdu"],[7,1,1,"","register_message_type"],[7,1,1,"","remove_message_handler"],[7,1,1,"","send"]],"RNS.Destination":[[7,3,1,"","RATCHET_COUNT"],[7,3,1,"","RATCHET_INTERVAL"],[7,1,1,"","accepts_links"],[7,1,1,"","announce"],[7,1,1,"","app_and_aspects_from_name"],[7,1,1,"","clear_default_app_data"],[7,1,1,"","create_keys"],[7,1,1,"","decrypt"],[7,1,1,"","deregister_request_handler"],[7,1,1,"","enable_ratchets"],[7,1,1,"","encrypt"],[7,1,1,"","enforce_ratchets"],[7,1,1,"","expand_name"],[7,1,1,"","get_private_key"],[7,1,1,"","hash"],[7,1,1,"","hash_from_name_and_identity"],[7,1,1,"","load_private_key"],[7,1,1,"","register_request_handler"],[7,1,1,"","set_default_app_data"],[7,1,1,"","set_link_established_callback"],[7,1,1,"","set_packet_callback"],[7,1,1,"","set_proof_requested_callback"],[7,1,1,"","set_proof_strategy"],[7,1,1,"","set_ratchet_interval"],[7,1,1,"","set_retained_ratchets"],[7,1,1,"","sign"]],"RNS.Identity":[[7,3,1,"","CURVE"],[7,3,1,"","KEYSIZE"],[7,3,1,"","RATCHETSIZE"],[7,3,1,"","RATCHET_EXPIRY"],[7,3,1,"","TRUNCATED_HASHLENGTH"],[7,1,1,"","current_ratchet_id"],[7,1,1,"","decrypt"],[7,1,1,"","encrypt"],[7,1,1,"","from_bytes"],[7,1,1,"","from_file"],[7,1,1,"","full_hash"],[7,1,1,"","get_private_key"],[7,1,1,"","get_public_key"],[7,1,1,"","get_random_hash"],[7,1,1,"","load_private_key"],[7,1,1,"","load_public_key"],[7,1,1,"","recall"],[7,1,1,"","recall_app_data"],[7,1,1,"","sign"],[7,1,1,"","to_file"],[7,1,1,"","truncated_hash"],[7,1,1,"","validate"]],"RNS.Link":[[7,3,1,"","CURVE"],[7,3,1,"","ESTABLISHMENT_TIMEOUT_PER_HOP"],[7,3,1,"","KEEPALIVE"],[7,3,1,"","KEEPALIVE_TIMEOUT_FACTOR"],[7,3,1,"","STALE_GRACE"],[7,3,1,"","STALE_TIME"],[7,1,1,"","get_age"],[7,1,1,"","get_channel"],[7,1,1,"","get_establishment_rate"],[7,1,1,"","get_expected_rate"],[7,1,1,"","get_mdu"],[7,1,1,"","get_mode"],[7,1,1,"","get_mtu"],[7,1,1,"","get_q"],[7,1,1,"","get_remote_identity"],[7,1,1,"","get_rssi"],[7,1,1,"","get_snr"],[7,1,1,"","identify"],[7,1,1,"","inactive_for"],[7,1,1,"","no_data_for"],[7,1,1,"","no_inbound_for"],[7,1,1,"","no_outbound_for"],[7,1,1,"","request"],[7,1,1,"","set_link_closed_callback"],[7,1,1,"","set_packet_callback"],[7,1,1,"","set_remote_identified_callback"],[7,1,1,"","set_resource_callback"],[7,1,1,"","set_resource_concluded_callback"],[7,1,1,"","set_resource_started_callback"],[7,1,1,"","set_resource_strategy"],[7,1,1,"","teardown"],[7,1,1,"","track_phy_stats"]],"RNS.MessageBase":[[7,3,1,"","MSGTYPE"],[7,1,1,"","pack"],[7,1,1,"","unpack"]],"RNS.Packet":[[7,3,1,"","ENCRYPTED_MDU"],[7,3,1,"","PLAIN_MDU"],[7,1,1,"","get_q"],[7,1,1,"","get_rssi"],[7,1,1,"","get_snr"],[7,1,1,"","resend"],[7,1,1,"","send"]],"RNS.PacketReceipt":[[7,1,1,"","get_rtt"],[7,1,1,"","get_status"],[7,1,1,"","set_delivery_callback"],[7,1,1,"","set_timeout"],[7,1,1,"","set_timeout_callback"]],"RNS.RawChannelReader":[[7,1,1,"","__init__"],[7,1,1,"","add_ready_callback"],[7,1,1,"","remove_ready_callback"]],"RNS.RawChannelWriter":[[7,1,1,"","__init__"]],"RNS.RequestReceipt":[[7,1,1,"","concluded"],[7,1,1,"","get_progress"],[7,1,1,"","get_request_id"],[7,1,1,"","get_response"],[7,1,1,"","get_response_time"],[7,1,1,"","get_status"]],"RNS.Resource":[[7,1,1,"","advertise"],[7,1,1,"","cancel"],[7,1,1,"","get_data_size"],[7,1,1,"","get_hash"],[7,1,1,"","get_parts"],[7,1,1,"","get_progress"],[7,1,1,"","get_segments"],[7,1,1,"","get_transfer_size"],[7,1,1,"","is_compressed"]],"RNS.Reticulum":[[7,3,1,"","ANNOUNCE_CAP"],[7,3,1,"","LINK_MTU_DISCOVERY"],[7,3,1,"","MINIMUM_BITRATE"],[7,3,1,"","MTU"],[7,1,1,"","get_instance"],[7,1,1,"","link_mtu_discovery"],[7,1,1,"","remote_management_enabled"],[7,1,1,"","required_discovery_value"],[7,1,1,"","should_use_implicit_proof"],[7,1,1,"","transport_enabled"]],"RNS.Transport":[[7,3,1,"","PATHFINDER_M"],[7,1,1,"","deregister_announce_handler"],[7,1,1,"","has_path"],[7,1,1,"","hops_to"],[7,1,1,"","next_hop"],[7,1,1,"","next_hop_interface"],[7,1,1,"","register_announce_handler"],[7,1,1,"","request_path"]]},"objnames":{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","property","Python property"],"3":["py","attribute","Python attribute"]},"objtypes":{"0":"py:class","1":"py:method","2":"py:property","3":"py:attribute"},"terms":{"":[0,2,5,6,9,10,11],"0":[0,2,5,7,9,10,11],"00":[9,10],"00000000":9,"00000100":9,"00000111":9,"01":9,"01010000":9,"02":2,"05":0,"08":[0,10],"0f4259fef4521ab75a3409e353fe9073eb10783b4912a6a9937c57bf44a62c1":10,"0x0101":0,"0x20":0,"0x7d":0,"0x7e":0,"0x91c421ddfb8a30a49a71d63447ddb54cebe3465":8,"0xf000":[0,7],"1":[0,2,5,7,9,10],"10":[5,9,10],"100":[0,5,9],"1000":0,"10000000":9,"1024":0,"11":9,"115":9,"115200":[0,5,10],"12":[2,5,10],"1200":9,"125":5,"125000":5,"127":5,"128":[7,9],"13":10,"13425ec15b621c1d928589718000d814":9,"15":5,"150":[5,10],"150m":5,"16":[5,9,10],"1625":5,"1625000":5,"167":9,"17":10,"1726dbad538775b5bf9b0ea25a4079c8":10,"174a64852a75682259ad8b921b8bf416":2,"18":10,"1800":7,"187":10,"1b03013c25f1c2ca068a4f080b844a10":10,"2":[0,2,5,7,9,10],"20":[5,9,10],"200":[5,10],"201":5,"2023":[2,10],"21":2,"2225fdeecaf6e2db4556c3c2d7637294":10,"23":10,"24":5,"2400000000":5,"25":[0,4,11],"255":[5,10],"25519":7,"256":[5,7,9,10,11],"2592000":7,"27":10,"29":5,"297":[9,11],"29716":5,"2b489d06eaf7c543808c76a5332a447d":10,"2d03725b327348980d570f739a3a5708":10,"2d882c5586e548d79b5af27bca1776dc":10,"2f":0,"2owjajquafianpecac":2,"3":[0,2,5,9,10,11],"30":[5,7,10],"30602def3b3506a28ed33db6f60cc6c9":10,"32":[2,7,9],"3278":5,"33":5,"360":7,"3600":[0,5],"37428":10,"37429":10,"38":10,"383":7,"3b87":5,"4":[7,9,10],"4242":[2,5],"4251":5,"42671":5,"430":9,"4343":5,"44":11,"45":[0,9],"464":7,"465":9,"469":10,"48555":5,"49":10,"49555":5,"4965":10,"4e":5,"4faf1b2e0a077e6a9d92fa051f256038":9,"4ghz":5,"5":[0,5,7,9,10,11],"500":[5,7,9,11],"5001":5,"51":9,"512":[5,7,9,11],"5245a8efe1788c6a1cd36144a270e13b":10,"55":5,"56":10,"564":0,"5757":5,"59":10,"5caf":5,"5d78":5,"5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq":5,"6":[5,7,10],"60":[0,5],"600":5,"63":10,"64":[2,9,10],"7":[2,5,9,10],"71e5":5,"72":5,"720":7,"7200":5,"73":[5,10],"73cbd378bb0286ed11a707c13447bb1":10,"74":10,"781":10,"7a55144adf826958a9529a3bcf08b149":10,"8":[0,5,10],"80":10,"8001":5,"809":10,"83":[9,10],"84fpy1qbxhcgdseepynmhthcrgmx4nffbytz2gkytoqhvvhjp8eaw1z1eedrnkd19b3b8nilcgvxzkv17ummmeescrpya5w":8,"86":10,"865":5,"865600000":5,"867":5,"867200000":5,"868":9,"88":5,"89":5,"8dd57a738226809646089335a6b03695":10,"9":[2,7,10],"900":9,"921600":10,"941bed5e228775e5a8079fc38b1ccf3f":10,"96":9,"9600":0,"984b74a3f768bef236af4371e6f248cd":10,"99":9,"9fb6d773498fb3feda407ed8ef2c3229":10,"A":[0,2,5,6,7,9,10],"And":0,"As":[2,3,5,6,7,9,11],"At":[2,6,9],"Be":[7,10],"But":9,"By":[0,2,5,7,9,10],"For":[2,5,6,7,9,10,11],"IN":[0,7],"If":[0,2,3,5,6,7,9,10,11],"In":[0,2,3,5,6,7,9,10,11],"It":[0,2,3,5,7,9,10,11],"No":[0,2,5,9,10,11],"On":[0,2,5,10],"One":[3,7,9],"Or":[5,10,11],"That":9,"The":[0,2,3,4,5,6,7,11],"Then":[0,2],"There":[2,6,9],"These":[2,5,7,9,10],"To":[0,2,3,5,6,9,10,11],"Will":7,"With":[4,5,6,9,10],"_":9,"__":9,"______":9,"_______":9,"________":9,"________________":9,"__future__":0,"__init__":[0,7],"__main__":0,"__name__":0,"__str__":0,"a4d":5,"a79f":5,"aarch64":2,"ab":0,"abil":[2,3,11],"abl":[0,2,5,6,7,9,10],"abort":0,"about":[0,2,3,5,6,7,9],"abov":[2,3,5,9,10],"absolut":[2,8,11],"abstract":[7,9],"abstractmethod":7,"abund":3,"accept":[7,8,9,10],"accept_al":[0,7],"accept_app":7,"accept_non":7,"accepts_link":7,"access":[2,4,5,6,7,10],"access_point":5,"accommod":[7,9],"accord":[0,2,9],"accordingli":[0,5],"achiev":[5,7,9],"acknowledg":11,"across":[0,3,6,7],"act":[2,7,9,10],"action":0,"activ":[0,2,5,7,9],"actor":9,"actual":[0,2,5,9],"ad":[0,3,4,5,6,7,9,10,11],"adapt":[3,6],"add":[0,2,5,6,7,10],"add_argu":0,"add_message_handl":[0,7],"add_ready_callback":7,"addit":[2,3,5,7,9,10,11],"addition":[2,3,5,9],"addr":10,"address":[0,2,5,6,7,9,10,11],"adher":7,"adjust":[2,7],"admin":5,"administr":10,"adress":[7,9],"advanc":9,"advantag":7,"advers":11,"adversari":2,"advertis":[0,7],"advis":9,"ae":[7,9,11],"af73":5,"affect":[2,5],"after":[0,2,5,6,7,9,10],"again":[2,5,9],"against":9,"agenc":9,"agent":9,"agnost":[6,9],"agnostic":9,"aim":[4,9],"air":3,"airmax":3,"airtim":5,"airtime_limit_long":5,"airtime_limit_short":5,"aliv":[7,9],"all":[0,2,3,4,5,6,7,8,9,10,11],"allevi":3,"alloc":[5,7,9,10],"allow":[0,2,3,5,6,7,9,10,11],"allow_al":[0,7],"allow_list":7,"allow_non":7,"allowed_hash":10,"allowed_ident":10,"allowed_list":7,"almost":[3,5,9,10],"alon":5,"along":[5,6,7,9,10],"alreadi":[0,2,3,6,7,9,10],"also":[0,2,3,4,5,6,7,9,10,11],"alter":[2,7,9],"altern":[0,2,5,10],"although":[2,9,11],"alwai":[2,5,7,9,10],"amateur":[5,11],"amount":[0,5,6,7,9,11],"amsterdam":5,"an":[0,2,3,5,6,7,9,10,11],"analyt":8,"android":[4,5,10],"ani":[0,2,3,5,6,7,8,9,10,11],"annot":0,"annouce_cap":5,"announc":[4,7,10],"announce_cap":[5,7],"announce_handl":0,"announce_packet_hash":7,"announce_rate_grac":5,"announce_rate_penalti":5,"announce_rate_target":5,"announced_ident":[0,7],"announceloop":0,"announcesampl":0,"anonym":[2,6,7,9,11],"anoth":[2,7,9,10],"answer":[9,10],"antenna":3,"anymor":2,"anyon":[0,2,3,5,6,7,9,10],"anyth":[2,3,5,9,10,11],"anywher":[0,5],"ap":5,"api":[2,4,9,11],"apk":2,"app":[0,2,7,9],"app_and_aspects_from_nam":7,"app_data":[0,7],"app_nam":[0,7],"app_timeout":0,"append":[0,9],"appli":[5,7,9],"applic":[0,2,5,6,7,9,10,11],"approach":[3,9,10],"approv":9,"approxim":5,"april":2,"apt":2,"ar":[0,2,3,5,6,7,8,9,10,11],"arbitrari":[7,9,10,11],"arch":2,"architectur":2,"area":[3,5,6,9,11],"arg":0,"argon":0,"argpars":0,"argument":[0,7,10],"argumentpars":0,"arm64":4,"around":[5,9],"arriv":[0,9],"arx":10,"ask":[0,2,3,7],"aspect":[0,3,5,7,9,10],"aspect_filt":[0,7],"assign":[0,9,10],"associ":[2,7,9],"assum":[5,9],"asymmetr":[9,10,11],"attach":10,"attached_interfac":7,"attack":2,"attempt":[0,2,3,7],"attribut":7,"atx":10,"audit":11,"auth":10,"authent":[2,5,6,7,9,10,11],"author":[9,10],"authorit":9,"auto":[2,3,4,7,9],"auto_compress":7,"autoconfigur":11,"autodiscov":5,"autoinstal":[3,10],"autointerfac":[2,3,5,10],"autom":[3,8,9],"automat":[0,2,5,6,7,9,10,11],"autonom":[6,9],"autonomi":11,"avail":[0,2,3,4,5,6,7,9,10,11],"averag":9,"avoid":[3,9,10],"awai":[0,5,6,9,10],"awar":[2,5,9],"ax":[4,11],"ax25kissinterfac":5,"b":[0,6,10],"b32":5,"back":[0,5,9,11],"backbon":[2,3,4],"backboneinterfac":[2,5],"backend":[5,9],"background":[2,5],"backhaul":[3,6],"backup":10,"balanc":5,"band":[3,9],"bandwidth":[2,5,6,7,9,10,11],"bare":[0,5],"barrier":9,"base":[4,5,6,7,9,10,11],"base32":[5,10],"base64":10,"basi":[5,7,9,10,11],"basic":[0,2,4,5,7,10],"baud":[5,10],"baud_flash":10,"baudrat":0,"bc1pgqgu8h8xvj4jtafslq396v7ju7hkgymyrzyqft4llfslz5vp99psqfk3a6":8,"bc7291552be7a58f361522990465165c":10,"beacon":5,"becaus":[6,9],"becki":0,"becom":[0,2,6,7,9],"been":[0,2,3,5,6,7,9,11],"befor":[0,2,5,7,9,10],"begin":[0,3,7],"begun":7,"behalf":5,"behav":3,"behaviour":[2,5,10],"behind":[2,9],"being":[2,5,7,9],"beings":9,"belief":9,"below":[2,3,5],"benefici":[5,10],"best":[2,9,11],"better":[5,9],"between":[0,5,6,7,9,10],"betweenthebord":2,"bi":[7,9],"bidirect":9,"billion":[6,9],"bin":[2,10],"binari":[0,2,7,9,10],"bind":5,"bit":[0,2,5,7,9,10,11],"bitcoin":8,"bitrat":[0,5,7],"ble":5,"blob":[0,9],"block":5,"bluetooth":10,"board":[2,4,5,9,11],"bogu":5,"boil":3,"bookworm":4,"bool":7,"boot":[2,10],"bootstrap":10,"both":[0,2,3,5,6,7,9,10,11],"boundari":5,"box":3,"break":[2,7,9,11],"breviti":10,"bridg":[3,4],"briefli":[3,9],"bring":5,"broad":[2,3],"broadcast":[2,4,5,7,9],"broadcast_destin":0,"broadcastloop":0,"brought":[5,10],"browser":2,"buffer":[4,5,7,11],"bufferedread":7,"bufferedrwpair":7,"bufferedwrit":7,"bufferexampl":0,"bug":11,"build":[0,2,3,4,5,9,11],"built":[2,5,9,10,11],"bundl":0,"bureaucrat":11,"burst":5,"bw":10,"byte":[0,7,9,10,11],"bytes":0,"c":[0,6,10],"c50cc4e4f7838b6c31f60ab9032cbc62":10,"c89b4da064bf66d280f0e4d8abfd9806":10,"cabl":[5,6],"cach":10,"calcul":[7,9,10],"call":[0,6,7,9,11],"callabl":[0,7],"callback":[0,7],"callsign":5,"can":[0,2,3,4,5,6,7,8,9,10],"cancel":7,"candid":6,"cannot":[0,2,5,11],"cap":5,"capabl":[0,9],"capac":[3,5,7,9],"carambola":0,"care":[2,7,11],"carefulli":2,"cargo_build_target":2,"carri":[5,7,9,10,11],"carrier":[6,11],"case":[0,2,3,5,6,9,10],"cat":10,"categori":3,"caution":5,"caveat":4,"cb":[7,9],"cbc":[9,11],"cd":2,"cdma":5,"censor":9,"censorship":[9,11],"central":[3,6,9],"centralis":9,"certain":[0,5,6,8,9],"chain":5,"challeng":9,"chanc":3,"chang":[0,2,5,7,9,10,11],"channel":[2,4,5,6,7,8,9,11],"channelarg":0,"channelexampl":0,"chapter":[2,3,5,6,7,9,10,11],"charact":0,"characterist":9,"cheap":[3,5,9],"cheapli":2,"check":[0,2,7,9,10],"checksum":[7,11],"choic":2,"choos":[0,2,5,9],"chose":9,"chosen":[6,9],"chunk":0,"cific":5,"ciphertext":7,"ciphertext_token":7,"circumst":[8,9],"cl":0,"claim":9,"class":[0,6,7,11],"clear":[0,5,7,9,10],"clear_default_app_data":7,"clear_screen":0,"client":[0,2,3,4,7,10],"client_buffer_readi":0,"client_connect":0,"client_disconnect":0,"client_ident":0,"client_loop":0,"client_message_receiv":0,"client_packet_receiv":0,"client_request":0,"clone":[2,9],"close":[0,6,7,10],"closed_callback":7,"closer":9,"closest":9,"cluster":9,"co":[3,5,11],"code":[2,3,4,5,10],"codingr":5,"collect":8,"com":[0,2,8],"combin":[2,4,6,9],"come":[2,5,9],"comma":5,"command":[0,2,5,10],"comment":[5,10],"common":[0,3,4,6,9,10,11],"commonli":[3,5],"commun":[0,2,4,5,6,7,8,9,10,11],"communica":5,"compat":[0,2,3,5,7,9],"compil":2,"complet":[0,2,3,5,6,7,9,10,11],"complex":[5,9],"compon":[3,8,9],"compos":9,"compress":[0,7,9,10,11],"compromis":9,"comput":[2,5,9,11],"concaten":7,"conceiv":[2,3],"concept":[4,9,10],"conceptu":9,"conclud":[0,7],"concurr":[3,9,10],"condit":[9,11],"conf":2,"config":[0,2,5,6,10],"configarg":0,"configdir":7,"configpath":0,"configur":[0,2,3,4,6,7,9,11],"configuraion":3,"configure_devic":0,"confirm":[9,11],"conflict":2,"confus":[3,9],"congest":9,"conjunct":5,"connect":[0,3,4,6,7,9,10,11],"consequ":9,"conserv":5,"consid":[0,5,7,9,11],"consider":9,"consist":9,"consol":10,"constant":7,"constantli":9,"constrain":7,"construct":[9,11],"constructor":0,"consum":7,"contact":9,"contain":[0,6,7,9,10],"contend":9,"content":[0,2,6,10],"context":9,"contin":0,"continu":[5,7,8,10,11],"contribut":4,"control":[0,2,3,4,6,7,9,11],"convei":0,"conveni":0,"convent":0,"converg":[2,4,9],"coordin":[6,7,9,11],"copi":10,"core":[6,9,10,11],"correct":[0,9],"correctli":0,"correspond":9,"cost":[3,9,11],"could":[0,2,5,6,7,9,11],"count":9,"counter":0,"coupl":2,"cours":[2,5,9],"cover":[2,3,9,11],"coverag":6,"cpu":[0,9],"cpuinfo":10,"cr":10,"creat":[0,4,5,6,7,9,10,11],"create_bidirectional_buff":[0,7],"create_kei":7,"create_read":7,"create_receipt":[0,7],"create_writ":7,"creation":[9,11],"creator":9,"critic":[9,10],"cross":5,"cryptograph":[2,4,6,10,11],"cryptographi":[2,9,11],"ctrl":0,"cull":7,"current":[0,2,4,5,7,9],"current_download":0,"current_filenam":0,"current_ratchet_id":7,"curv":[6,7,9,11],"curve25519":[6,7,9,11],"custom":[3,4,7,9,11],"custom_network_nam":5,"customis":5,"d":[6,10],"daemon":[0,2,5,7,10],"dai":[6,7],"data":[0,2,3,4,5,6,7,9,11],"data_buff":0,"data_port":5,"databit":[0,5,10],"datar":5,"date":[0,2],"datetim":0,"db":[0,10],"dbm":[0,5,10],"debian":[4,9,10],"debug":[2,10],"decad":3,"decentralis":11,"decid":[5,6,7,9],"decis":[5,9],"decod":0,"decreas":10,"decrypt":[7,9,10],"dedic":[5,9],"deep":2,"def":0,"default":[0,2,3,5,6,7,9,10],"default_ifac_s":0,"defin":[0,5,7,9,10],"definit":[0,2,9],"degrad":6,"degre":5,"delai":[2,5,9,10],"delimit":0,"deliv":[0,7],"deliveri":[0,2,7,11],"demand":7,"demonstr":[0,2,5],"depend":[0,3,4,6,7,9,10],"deploi":9,"deregist":7,"deregister_announce_handl":7,"deregister_request_handl":7,"deriv":[2,7,9,11],"describ":[3,5,7,9],"descript":[0,10],"descriptor":0,"deseri":0,"deserializ":0,"design":[2,3,6,9,11],"desir":[0,3,5,9],"desktop":5,"dest_len":0,"destin":[0,2,4,6,7,10],"destination_1":0,"destination_2":0,"destination_clos":0,"destination_hash":[0,7,10],"destination_hexhash":0,"detail":[0,2,4,5,7,10,11],"detect":0,"determin":[2,7,9],"dev":[0,2,5,10],"devel":2,"develop":[3,4,7,8,9,11],"devic":[0,2,4,5,6,7,9,10],"dh":7,"dhcp":[3,5,10],"dict":0,"did":0,"differ":[0,2,3,5,6,7,9,10,11],"diffi":[6,9],"difficult":[2,3],"digit":[2,3,9,11],"dir":0,"dire":3,"direct":[0,2,3,6,7,9,10],"direction":9,"directli":[2,3,5,7,9,10,11],"directori":[0,2,10],"disabl":[5,9,10],"disappear":[5,10],"disassoci":9,"discard":[7,9],"disconnect":[0,5],"discov":[2,5,7],"discover":5,"discoveri":[5,7,9,10],"discovery_port":5,"discovery_scop":5,"discrimin":6,"discuss":[2,3,9],"disk":[0,7],"displai":[0,9,10],"disrupt":5,"dissolv":6,"distanc":[3,9],"distant":7,"distinct":[5,9],"distinguish":9,"distribut":[0,2,6,7,9,10,11],"disucss":2,"divid":7,"divmod":0,"dn":3,"dnf":2,"do":[0,2,3,5,7,9,10,11],"document":[2,7,9],"doe":[0,2,3,4,5,6,7,9,10],"doesn":5,"domain":[2,5,10],"don":[0,2,6,7,9,10],"donat":4,"done":[0,2,5,6,9,10],"dori":6,"dot":[9,10],"doubt":2,"dowload":2,"down":[0,2,3,5,7],"download":[0,2,5,10],"download_began":0,"download_conclud":0,"download_finish":0,"download_start":0,"download_tim":0,"driver":[10,11],"droid":2,"drop":[5,7,9,10],"dsrdtr":0,"dual":3,"dublin":10,"due":[0,6],"dump":10,"duplex":[9,11],"dynam":[2,10],"dysfunct":8,"e":[0,6,10],"e5c032d3ec4e64a6aca9927ba8ab73336780f6d71790":10,"e702c42ba8":10,"e7536ee90bd4a440e130490b87a25124":10,"each":[0,2,5,6,7,9,10],"earlier":9,"eas":[5,9],"easi":[2,3,5,9,10,11],"easier":[2,5,6,10,11],"easiest":[2,3,5,9],"easili":[2,5,6,9,10,11],"ecdh":[9,11],"echo":[2,4],"echo_destin":0,"echo_request":0,"ed25519":[9,11],"edit":[2,10],"eeprom":10,"effect":5,"effici":[0,2,5,7,9,11],"effort":3,"eg":10,"ei":0,"either":[2,3,6,7,9,10],"elaps":5,"elif":0,"ellipt":[6,7,9,11],"els":[0,2,6,9,11],"embed":3,"emploi":[3,9],"empow":11,"empti":0,"emptor":4,"emul":2,"enabl":[0,2,3,5,6,7,9,10,11],"enable_ratchet":7,"enable_remote_manag":10,"enable_transport":[9,10],"encapsul":[5,11],"encod":[0,7,10],"encrypt":[0,2,6,7,9,10,11],"encrypted_mdu":7,"end":[0,5,6,7,9,11],"endless":5,"endpoint":[0,6,7,9],"energi":2,"enforc":[5,7],"enforce_ratchet":7,"enhanc":9,"enough":[2,3,9],"ensur":[0,5,7,9,10,11],"ensurepath":2,"enter":[0,10],"entir":[0,2,6,7,9,10],"entiti":9,"entri":[0,2,9],"entrypoint":4,"enumer":0,"envelop":7,"environ":[2,6,9],"environment":9,"environmentlogg":9,"eof":5,"ephemer":[6,7,9,11],"epub":4,"equal":[6,7,9],"equip":[5,6,9],"equival":5,"error":[0,2,8,10],"esc":0,"esc_mask":0,"escap":0,"esp32":3,"especi":[2,3,5],"essenti":[2,5,9],"establish":[0,2,5,6,7,11],"established_callback":7,"establishment_timeout_per_hop":7,"etc":10,"eth0":5,"eth1":5,"ethereum":8,"ethernet":[2,4,5,6,9,11],"even":[0,2,5,6,7,9,10,11],"event":5,"eventu":7,"ever":9,"everi":[0,2,5,6,7,9],"everyon":[6,9],"everyth":[0,6,9],"evolv":6,"exact":[3,5,9],"exactli":[7,9],"exampl":[2,3,4,5,7,9,10,11],"example_util":0,"exampleannouncehandl":0,"exampleconfig":[2,10],"exampleinterfac":0,"exce":[0,5,7],"except":[0,5,7],"excess":5,"exchang":[6,7,9,11],"exclud":[7,9],"execstart":10,"execstartpr":10,"execut":[0,2,5,7,10],"exhaust":[3,9],"exist":[0,2,3,5,9,10,11],"exit":[0,2,7,10],"expand":[9,11],"expand_nam":7,"expect":[0,2,5,7,9,10],"expens":3,"experi":[2,9],"experienc":0,"experiment":[2,11],"expir":5,"expiri":[5,7],"explain":[3,7],"explan":[9,10],"explicit":7,"explicitli":10,"explor":[0,9,11],"export":[2,10],"expos":[5,7],"extend":[0,7],"extens":[5,11],"extern":[0,2,5,7,11],"extra":[2,5,6,10],"extract":10,"extrem":[2,9,10,11],"f":[0,2,10],"f4":5,"f53a1c4278e0726bb73fcc623d6ce763":10,"face":[2,5],"facilit":2,"fact":11,"factor":[5,7,10],"fail":[0,2,7],"failed_callback":[0,7],"failur":[2,5,7],"fals":[0,5,7],"far":[6,9],"fashion":8,"fast":[4,5,7,9],"faster":[2,5,9],"fastest":[5,9],"fe80":2,"featur":[2,5,7,8,9,11],"fedora":2,"feed":[2,7],"feedback":[0,4],"feel":2,"fernet":9,"fetch":10,"few":[2,3,5,6,9,10,11],"fewer":7,"ff":10,"fi":8,"fiber":3,"fibr":11,"field":9,"file":[0,2,3,5,6,7,9,10,11],"file_resourc":0,"file_s":0,"filelist":0,"filelist_data":0,"filelist_receiv":0,"filelist_timeout_job":0,"filenam":0,"filetransf":[2,4,7],"filter":[0,6,9,10],"final":[0,7,9],"find":[2,6,9],"find_spec":0,"firewal":[2,5],"firmwar":[2,3,9,10],"firmware_hash":10,"first":[0,2,5,7,9,10],"fit":0,"five":0,"fix":[4,9],"fixed_mtu":5,"flag":[0,2,7,9],"flash":10,"flexibl":[2,3,5,11],"flight":7,"float":[0,7],"flow":[0,5,6],"flow_control":5,"flush":0,"folder":[0,2],"follow":[0,2,3,5,7,8,9,10,11],"forc":[0,10],"forcibli":[7,10],"foreground":2,"foremost":11,"form":[2,5,6,7,9],"format":[0,4,10,11],"forth":0,"forum":2,"forward":[5,7,9,11],"forward_ip":5,"forward_port":5,"found":[0,2,5,6,9,10],"foundat":11,"four":6,"frame":[0,5],"free":[2,6,8,11],"freedom":9,"freedv":3,"freeli":9,"freq":10,"frequenc":[3,5,9,10],"frequent":5,"friendli":2,"from":[0,2,3,5,6,7,9,10,11],"from_byt":7,"from_fil":7,"from_identity_hash":7,"fromhex":0,"fruit":0,"ftdi_ft230x_basic_uart_43891ckm":10,"full":[0,2,5,7,9,10,11],"full_hash":7,"full_nam":[7,10],"fulli":[0,2,3,5,9,10,11],"funcion":7,"function":[0,2,3,4,5,6,7,8,10,11],"fundament":[3,9],"further":[2,4,5],"futur":[6,7,9],"fw":10,"g":[0,10],"ga":0,"gain":[2,3,7,9],"galact":9,"gatekeep":9,"gatewai":[0,2,5,6,9],"gbp":10,"gener":[0,2,3,5,6,7,9,10,11],"generalis":11,"geograph":6,"get":[0,3,4,5,7,10,11],"get_ag":7,"get_channel":[0,7],"get_config_obj":0,"get_data_s":7,"get_establishment_r":7,"get_expected_r":7,"get_hash":7,"get_inst":7,"get_mdu":7,"get_mod":7,"get_mtu":7,"get_packet_rssi":0,"get_packet_snr":0,"get_part":7,"get_private_kei":7,"get_progress":[0,7],"get_public_kei":7,"get_q":7,"get_random_hash":[0,7],"get_remote_ident":[0,7],"get_request_id":7,"get_respons":7,"get_response_tim":7,"get_rssi":7,"get_rtt":[0,7],"get_seg":7,"get_snr":7,"get_statu":7,"get_transfer_s":7,"geti2p":5,"ghz":9,"gi":0,"gigabyt":11,"git":2,"github":[0,2,8],"give":[5,9,10],"given":[5,6,7,9],"global":[0,2,5,6,7,9,11],"glue":3,"go":[0,2,5,9],"goal":[4,5],"goe":2,"good":[2,3,6,9,10],"got":0,"got_respons":0,"govern":9,"grace":7,"gracefulli":5,"grape":0,"graphic":2,"gratefulli":8,"great":9,"greater":[7,9,11],"greatli":[2,5],"group":[5,7,9],"group_id":5,"groupinstal":2,"grow":6,"growth":4,"guarante":[2,9],"guess":5,"guid":[2,3,9],"gw":5,"h":[2,10],"ha":[0,2,3,5,6,7,9,11],"hack":11,"had":9,"half":[9,11],"hand":0,"handheld":9,"handl":[0,2,3,5,6,7,9,10,11],"handler":[0,7],"happen":[0,2,7,9],"hard":3,"hardcod":2,"hardlin":6,"hardwar":[0,2,4,5,6,7,9,10,11],"has_path":[0,7],"hasattr":0,"hash":[0,2,7,9,10],"hash1":9,"hash2":9,"hash_from_name_and_ident":7,"hashlib":9,"hashmap":0,"have":[0,2,3,5,6,7,9,10],"hazard":7,"hdlc":0,"head":2,"header":[0,7,9],"header_1":9,"header_2":9,"hear":9,"heard":[7,9],"held":[5,10],"helium":0,"hellman":[6,9],"help":[0,2,6,8,9,10,11],"helper":0,"her":6,"here":[0,2,5,9,10],"heterogen":11,"hex":[0,10],"hexadecim":[0,9,10],"hexbyt":10,"hidden":10,"hide":2,"hierarch":11,"high":[3,5,9,11],"higher":[6,11],"highest":7,"highli":9,"hill":6,"hint":0,"hit":0,"hkdf":9,"hmac":[9,11],"hoc":11,"hold":[5,7,9],"home":[6,10],"homebrew":5,"hop":[5,6,7,9,10,11],"hops_to":7,"host":[0,4,5,9,10],"hostnam":5,"hour":[0,5],"how":[0,2,3,5,6,9,10,11],"howev":[2,6,9],"http":[0,2,8],"hub":[2,5],"human":[0,7,8,9],"hundr":2,"hungri":3,"hw_mtu":0,"hwrev":10,"hz":10,"i":[0,2,3,4,5,6,7,8,9,10],"i2p":[2,4,11],"i2p_tunnel":5,"i2pd":[2,5],"i2pinterfac":[2,5],"ia":10,"ic":3,"ic_burst_freq":5,"ic_burst_freq_new":5,"ic_burst_hold":5,"ic_burst_penalti":5,"ic_held_release_interv":5,"ic_max_held_announc":5,"ic_new_tim":5,"id":[5,7,9,10],"id_callsign":5,"id_interv":5,"idea":[2,9,10],"ideal":[2,11],"ident":[0,2,4,7,10,11],"identif":[4,5,11],"identifi":[0,5,7,9,10],"identifyexampl":0,"identity_data":10,"ie":10,"if00":10,"ifac":[0,2,9,10],"ifac_s":5,"ifconf":0,"ifconfig":10,"ignor":[5,7,9],"ignored_devic":5,"illustr":[0,5,6,9],"immedi":[2,5,10],"impact":[5,7,9],"implement":[0,5,6,7,8,9,11],"implic":5,"implicit":[7,9],"import":[0,2,3,5,6,7,8,9,10],"importlib":0,"imposs":9,"improv":[2,4,5,8],"in_fram":0,"in_wait":0,"inactive_for":7,"inbound":[0,5,7],"includ":[0,3,4,5,7,9,11],"incom":[0,5,7,10],"incompat":[7,9],"increas":[5,7,10],"incur":5,"independ":[7,9,11],"index":[0,2,4],"indic":[0,7],"indirectli":9,"individu":[5,7,9,11],"inevit":9,"infer":9,"influx":5,"info":[7,9,10],"inform":[0,2,4,5,6,7,9,10],"infrastructur":[2,3,5,6,9,10],"ingo":7,"ingress":[0,5],"ingress_control":5,"init":2,"initi":[0,5,6,7,9,11],"initialis":[0,7,10],"input":[0,10],"insert":9,"insid":9,"inspect":[2,5,6,9,10],"instal":[0,4,5,6,9,10,11],"instanc":[0,4,5,7,9,10],"instance_control_port":10,"instance_nam":10,"instanti":7,"instead":[0,2,5,7,9,10],"instruct":2,"int":[0,7],"integ":[0,7],"integr":[2,6,9],"intend":[2,5,6,9],"intens":10,"intention":9,"inter":7,"inter_byte_timeout":0,"interact":[0,2,7,9,10],"interchang":5,"interconnect":[4,5,9],"interest":[2,9],"interfac":[3,4,6,7,10],"interface_class":0,"interface_en":10,"interfer":10,"intermediari":[5,7,9],"intermitt":5,"intern":[0,5,7,9],"internet":[4,5,9,11],"interoper":[2,3,6,9,11],"interrupt":5,"interv":[5,7,10],"intiat":0,"introduc":[2,9],"introduct":4,"intuit":11,"invalid":[0,7],"invers":9,"investig":6,"invis":[2,5],"involv":6,"io":3,"ioerror":0,"iot":3,"ip":[2,3,5,9,10,11],"ipv4":5,"ipv6":[2,5,10],"is_compress":7,"is_connected_to_shared_inst":0,"is_open":0,"is_path_respons":7,"is_ready_to_send":[0,7],"isdir":0,"isfil":0,"isinst":0,"island":6,"ism":[3,9],"isol":[2,5,10],"isp":5,"issu":[4,5,6,8],"its":[3,5,7,9],"itself":[4,9],"iv":[9,11],"j":10,"jail":10,"job":0,"join":[0,2,6,8,9],"json":10,"just":[0,2,3,5,6,9,11],"k":[0,10],"kb":10,"kbp":10,"keep":[0,6,7,9,10,11],"keepal":[7,9],"keepalive_timeout_factor":7,"kei":[0,4,6,7,10,11],"kept":[5,6,7,9],"kernel":[5,10,11],"keyboardinterrupt":0,"keyerror":7,"keypair":9,"keyset":11,"keysiz":7,"keystor":6,"khz":5,"ki":0,"kill":[7,9],"kind":[3,5,6,9],"kiss":[3,4,10,11],"kiss_fram":5,"kissinterfac":[5,10],"know":[0,2,3,6,7,9],"knowledg":[6,9],"known":[0,5,7,9,10],"ko":8,"krypton":0,"l":[5,10],"lack":9,"laid":9,"lan":5,"larg":[0,3,5,6,7,9,11],"larger":[6,9,10],"laser":5,"last":[0,5,7],"last_read_m":0,"last_unit":0,"latenc":[2,9,11],"later":[0,2,5,10],"latest":[0,2,5,7,10],"latest_buff":0,"latest_client_link":0,"laucnh":2,"launch":[2,10],"layer":[3,5,6,7,9,10,11],"lead":[2,9],"leak":2,"learn":[0,2,8,9],"least":[3,5,9,10,11],"leav":[2,6,9],"ledger":9,"left":[5,7,9,10],"legaci":6,"legal":5,"legisl":5,"len":0,"length":[0,5,7,9],"less":[0,2,3,5,7,9,11],"let":[0,2,5,6,9,10],"level":[3,5,9,10],"liber":3,"liberapai":8,"libffi":2,"librari":2,"licens":9,"light":10,"lightweight":11,"like":[0,2,3,5,6,7,9,10,11],"limit":[0,2,3,4,6,9],"line":[0,2,4,5,6,9,10,11],"linger":10,"link":[2,3,4,5,6,7,10,11],"link_clos":0,"link_establish":0,"link_id":[0,7],"link_mtu_discoveri":7,"linkexampl":0,"linux":[2,3,5,9],"list":[0,2,3,5,7,9,11],"list_deliv":0,"list_fil":0,"list_packet":0,"list_receipt":0,"list_timeout":0,"listdir":0,"listen":[0,4,9,10],"listen_ip":5,"listen_on":[2,5],"listen_port":5,"littl":[3,9],"live":7,"lki":9,"lkr":9,"ll":[0,2,11],"ln":[2,10],"load":[0,2,3,7,10,11],"load_private_kei":7,"load_public_kei":7,"local":[0,2,5,6,7,9,10,11],"locat":[2,5,6,9,10],"log":[0,2,5,10],"log_crit":0,"log_error":0,"log_info":0,"log_verbos":0,"logdest":7,"loginctl":10,"loglevel":[0,7,10],"long":[0,2,3,5,7,9],"longer":[0,2,6,9,10],"longest":5,"look":[0,2,5,9,10],"loop":0,"lora":[2,3,4,9,11],"lorawan":[3,9],"loss":[5,9],"lot":9,"low":[2,3,5,6,9,11],"lower":[0,2,5,10],"ltu":3,"lunar":4,"lxmf":[2,7,10],"m":[0,2,9,10],"mac":[5,9],"machin":[2,9],"maco":4,"made":[2,7,9],"mai":[2,5,7,9,10],"main":0,"mainli":6,"maintain":[2,9],"mainten":9,"make":[0,2,3,5,8,9,10,11],"malici":9,"manag":[2,4,6,7,9,11],"mani":[0,2,3,5,6,7,9,10,11],"manipul":[9,11],"manjaro":2,"manner":6,"manual":[0,2,5,6,7,9,10],"manufactur":[3,5],"mark":[7,9],"markqvist":[0,2,8],"master":[0,7],"match":[0,5,9,10],"matter":[2,5],"max":10,"maximum":[0,5,7,9,10],"mbp":10,"mdu":[0,7],"mean":[3,5,6,7,9,10],"meantim":7,"measur":9,"mechan":[4,5,11],"medium":[0,3,5,6,7,9,11],"member":6,"memori":[2,9],"mention":[5,9],"menu":0,"menu_mod":0,"mesh":[2,5,6,11],"meshchat":4,"messag":[0,2,7,9,10],"message_class":7,"messagebas":[0,4,7],"messagecallbacktyp":7,"messeng":9,"metadata":[2,9],"metavar":0,"meth":0,"method":[0,2,5,7,9],"methodologi":[9,10],"mhz":[5,9],"mi":[0,10],"microcontrol":9,"might":[2,5,6,9,10],"mikrotik":3,"millimet":3,"millisecond":[0,10],"mind":[6,11],"minim":[3,4,9],"minimalsampl":0,"minimum":[0,5,6,7,9],"minimum_bitr":7,"minut":[0,2,5,9],"mirror":10,"mislead":2,"miss":[0,2],"mix":[2,5,6,10],"mixtur":11,"mobil":[5,9],"mode":[0,2,3,4,7,9,10,11],"model":10,"modem":[4,5,6,7,9,11],"moder":5,"modern":3,"modifi":[5,9,10],"modul":[0,2,3,5,9,10,11],"moment":9,"momentarili":5,"monero":8,"monitor":[9,10],"moon":0,"more":[0,2,3,5,6,7,9,10,11],"most":[2,3,5,6,7,9,10],"mostli":[5,6,9],"motiv":4,"move":[2,5,9,10],"msgtype":[0,7],"mtu":[0,5,7,9,11],"much":[2,5,6,9,10,11],"multi":[4,9,10,11],"multicast":5,"multicast_address_typ":5,"multilater":9,"multipl":[0,5,6,9,10],"multiplex":0,"multipoint":9,"must":[0,2,5,6,7,9,10],"mw":5,"my":9,"my_fil":10,"my_ident":10,"mycal":5,"myriad":9,"n":[0,9,10],"name":[0,2,4,5,6,7],"namespac":0,"nano":2,"narg":0,"nat":2,"nativ":0,"natur":5,"nearbi":5,"nears":9,"neccessari":5,"necesarri":5,"necessari":[2,3,5,6,7,9],"necessarili":9,"need":[0,2,3,4,5,6,7,9,10,11],"neg":2,"neglig":9,"neither":[7,9],"neon":0,"neopixel":10,"net":5,"netcat":5,"network":[0,3,5,7,9,10,11],"network_nam":[2,5],"never":[5,7,9],"new":[0,4,6,7,9,10],"new_id":10,"new_ident":10,"newer":[7,9],"newest":9,"newli":[5,6,7,9],"next":[2,6,7,9],"next_hop":7,"next_hop_interfac":7,"nicknam":9,"no1cll":5,"no_data_for":7,"no_inbound_for":7,"no_outbound_for":7,"noauth":10,"nobl":0,"noble_ga":0,"noble_gas":0,"nocheck":10,"node":[2,4,5,6,10,11],"noid":10,"nois":7,"nomad":4,"nomadnet":2,"non":[2,7,9],"none":[0,2,5,7,9,10],"normal":[0,2,5,7,9,10],"notat":[9,10],"note":[0,3,4,5,7,9,10],"noth":[3,11],"notic":[9,10],"notif":[0,7],"now":[0,2,6,9,10],"np":10,"nrf52":3,"nt":0,"num":0,"number":[0,2,5,6,7,9,10],"o":[0,2,5,9,10,11],"object":[0,7],"obscur":2,"obtain":[3,7,9],"obvious":9,"occasion":2,"occur":[0,5,10,11],"ocur":7,"odd":0,"off":[5,9,10,11],"offer":[2,4,5,7,9],"offlin":[0,2],"often":[2,5,6,9,10],"oganesson":0,"old":[0,3,8,9],"older":10,"omit":7,"on_interfac":7,"onc":[0,2,3,5,6,7,9,10,11],"one":[0,2,3,5,6,7,9,10,11],"ones":[5,10],"oneself":9,"onli":[0,2,3,5,6,7,9,10,11],"onlin":[0,10],"onto":[2,9],"open":[0,2,3,5,6,7,8,9,10,11],"open_port":0,"openmodem":[5,11],"openssl":[2,9],"openwrt":4,"oper":[2,3,5,6,7,9,10,11],"opkg":2,"opposit":[0,5],"opt":9,"optic":[3,11],"optim":6,"option":[0,2,3,4,6,7,9,10],"ord":0,"order":[0,7,10],"organ":6,"organis":[5,6,8],"orient":9,"origin":[0,6,9],"os":2,"other":[0,2,3,5,6,7,9,10],"otherwis":[0,7],"our":[0,9],"out":[0,2,3,5,6,7,9,10,11],"outbound":[7,9],"outgo":[0,5,7,9,10],"outli":6,"outlier":6,"outlin":[2,3,9],"output":[5,10],"outsid":[7,11],"over":[0,3,4,5,7,9,10,11],"overal":9,"overcom":9,"overhead":[2,3,5,9],"overlai":2,"overrid":0,"oversight":9,"overview":[4,5,9],"overwhelm":[5,7],"overwrit":10,"own":[0,2,6,7,9,10,11],"owner":0,"p":[0,10],"pack":[0,7],"packag":[0,2,5,9],"packb":0,"packed_s":0,"packet":[0,2,4,5,6,7,10,11],"packet_callback":0,"packet_deliv":0,"packet_hash":0,"packet_receipt":[0,7],"packet_timed_out":0,"packetreceipt":[0,4,7],"pad":[9,11],"page":[2,4,9],"pair":[5,7,9,10],"pamac":2,"panic":[0,10],"panic_on_interface_error":[0,10],"paper":2,"par":[0,2],"parallel":2,"param":0,"paramet":[0,3,5,6,7,9,10],"pariti":[0,5,10],"parity_even":0,"parity_non":0,"parity_odd":0,"pars":0,"parse_arg":0,"parser":0,"part":[0,5,6,7,9,10],"particip":[4,6,9],"particular":[0,3,5,9],"pass":[0,3,5,6,7,9,10],"passphras":[2,5,9],"path":[0,2,3,5,7,9,10],"path_respons":7,"pathfinder_m":7,"pattern":[3,9],"payload":[0,7,9,10],"pdf":4,"peach":0,"peer":[0,2,5,7,9,10],"penalti":5,"pend":[0,9],"peopl":[2,9],"per":[5,7,9,10,11],"percent":[0,5],"percentag":7,"perfectli":2,"perform":[0,2,5,6,7,9,10],"period":[0,5,7,9],"perman":[5,10],"permissionless":9,"persecut":9,"persist":[5,10],"person":[5,9],"perspect":[5,7,9,11],"pet":0,"philosophi":9,"phy":10,"physic":[0,2,3,5,7,9,10,11],"pi":[0,4,6,9,10,11],"pick":9,"piec":9,"ping":[2,10],"pip":[0,2,3,10],"pip3":2,"pipe":[2,4,11],"pipeinterfac":[3,5],"pipx":2,"pitfal":9,"pkcs7":[9,11],"pkg":2,"place":[0,2,5,6,9,10],"plaform":3,"plain":[0,3,5,7,9],"plain_mdu":7,"plaintext":[0,7],"plan":[6,9],"planetari":11,"platform":[0,3,4,9,10],"pleas":[0,2,5,7,10,11],"plenti":9,"plug":10,"pmr":9,"point":[2,3,5,6,9,10],"pointer":2,"pomelo":0,"poorli":6,"popul":7,"popular":11,"port":[0,2,3,4,5,6,9,11],"port0":10,"portabl":[5,9],"pose":[2,9],"posit":[0,10],"posix":2,"possess":9,"possibl":[2,3,5,6,7,9,10,11],"possibli":[2,9],"post":0,"postfix":10,"potenti":[0,2,5,8,9,10,11],"power":[2,3,5,9,10,11],"powershel":2,"ppp":0,"practic":[2,9,11],"pre":[2,7,9],"preambl":[5,10],"preced":0,"precompil":2,"predict":9,"prefer":[2,9],"prefer_ipv6":5,"prepar":[0,6],"prerequisit":7,"presenc":7,"present":5,"preserv":[2,7],"preshar":9,"press":0,"pretend":9,"pretti":9,"prettyhexrep":0,"previou":0,"previous":[5,6,7,9],"primari":9,"primarili":5,"primit":[2,4],"principl":[9,11],"print":[0,5,10],"print_filelist":0,"print_help":0,"print_menu":0,"priorit":9,"prioriti":9,"prioritis":[4,5,6,7],"privaci":11,"privat":[2,5,7,8,9,10,11],"private_ret":2,"privileg":10,"probabl":[0,2,6,9,10,11],"probe":10,"problem":[2,9],"proc":10,"procedur":[2,7,9],"process":[0,2,3,5,7,9],"process_incom":0,"process_outgo":0,"product":10,"program":[0,3,4,5,7,9,11],"program_setup":0,"programm":9,"programmat":9,"progress":[0,7,10,11],"progress_callback":7,"project":2,"prompt":[0,2],"proof":[0,7,9,10],"proof_packet":0,"proof_requested_callback":7,"proof_strategi":7,"propag":[4,5,7],"proper":2,"properti":[0,6,7],"proport":9,"propos":2,"protocol":[2,3,4,5,11],"prove":[0,9],"prove_al":[0,7],"prove_app":7,"prove_non":7,"proven":[7,9],"provid":[0,2,3,4,5,6,7,9,11],"provis":[3,10],"prv_byte":7,"pseudo":10,"pub_byt":7,"public":[0,4,5,7,10],"public_inform":0,"publicli":[2,5],"pull":2,"purchas":[2,6,9,11],"pure":[4,9],"purg":7,"purpos":[2,3,5,7,9,10],"put":[0,3,5,10],"py":[0,2,9,10],"py3":2,"pyca":[2,9],"pyseri":[0,2],"python":[0,4,7,9,10,11],"python3":[0,2,3],"q":[0,10],"qr":2,"qualiti":7,"queri":[0,2,7,10],"question":[2,3,5],"queu":[7,10],"queue":[5,9],"quickli":[8,9,11],"quiet":[5,10],"quinc":0,"quirk":2,"quit":[0,2],"r":[0,5,9,10],"radio":[4,5,6,7,9,10,11],"radon":0,"rais":[0,7],"rak":3,"ram":[2,5],"randint":0,"random":[0,7,9],"random_text_gener":0,"randomis":9,"randomli":[0,9],"rang":[0,2,3,5,6,9,10,11],"rapidli":5,"rare":[2,5],"raspberri":[4,6,9,10,11],"rasperri":2,"ratchet":[7,9],"ratchet_count":7,"ratchet_expiri":7,"ratchet_id_receiv":7,"ratchet_interv":7,"ratchets":7,"ratchets_path":7,"rate":[0,4,7,10],"rather":[2,7],"ratio":7,"raw":[0,3,7],"rawchannelread":[4,7],"rawchannelwrit":[4,7],"rawiobas":7,"rb":0,"re":[0,5,7,9],"reach":[2,4,5,6],"reachabl":[0,2,5,6,7,9,10],"read":[0,2,5,7,9,10],"read_loop":0,"readabl":[0,7,9],"reader":[0,7],"readi":[0,2,3,5,6,7,11],"readili":11,"ready_byt":[0,7],"ready_callback":7,"real":[3,6,11],"realiti":8,"realli":[5,7],"reappear":5,"reason":[2,5,9],"reassembl":9,"reboot":2,"recal":[0,7,10],"recall_app_data":7,"recap":9,"receipt":[0,7,9],"receiv":[0,2,5,7,9,10],"receive_path_respons":7,"receive_stream_id":7,"received_announc":[0,7],"recent":[7,9],"recept":7,"reception_rssi":0,"reception_snr":0,"reception_stat":0,"recip":2,"recipi":9,"recommend":[0,2,5,9],"recondit":10,"reconnect":0,"reconnect_port":0,"reconstruct":9,"record":[2,9],"recoveri":5,"recreat":9,"recurs":[7,9],"redund":2,"refer":[0,2,4],"refresh":10,"regard":9,"regist":[0,7],"register_announce_handl":[0,7],"register_message_typ":[0,7],"register_request_handl":[0,7],"regul":5,"regular":10,"rel":[3,5,9],"relai":2,"relat":2,"releas":[2,5,7,9],"relev":[0,3,5,7,9,10],"reli":[8,9],"reliabl":[3,5,6,7,9,11],"reload":10,"rem":0,"remain":[5,7,9],"rememb":[7,9],"remot":[0,4,7],"remote_ident":[0,7],"remote_identifi":0,"remote_management_allow":10,"remote_management_en":7,"remote_p":0,"remotesensor":9,"remov":[7,10],"remove_message_handl":7,"remove_ready_callback":7,"render":2,"repeat":2,"replac":[0,2,7,9,10],"repli":[0,10],"replic":[3,9],"reply_data":0,"reply_messag":0,"reply_text":0,"report":[5,7,8,10],"repositori":[2,8,9],"repres":9,"represent":[0,7],"request":[2,4,5,7,9,10,11],"request_destin":0,"request_fail":0,"request_id":[0,7],"request_packet":0,"request_path":[0,7],"request_receipt":[0,7],"request_receiv":0,"requested_at":[0,7],"requestexampl":0,"requestor":5,"requestreceipt":[4,7],"requir":[0,2,5,6,7,9,10,11],"require_shared_inst":7,"required_discovery_valu":7,"research":11,"resend":7,"reserv":[0,7],"resid":5,"resili":11,"resolut":2,"resolv":[4,5,9,10],"resourc":[0,2,4,5,7,8],"resource_callback":7,"resource_sending_conclud":0,"resource_strategi":7,"respawn":5,"respawn_delai":5,"respawn_interv":5,"respect":[5,11],"respond":[0,7,10],"respond_to_prob":10,"respons":[4,5,7,9,11],"response_callback":[0,7],"response_gener":[0,7],"rest":[6,11],"restart":10,"restartsec":10,"restor":[2,5],"restrict":[6,10],"result":[0,5,9,10],"retain":[5,7],"retained_ratchet":7,"reticulum":[0,5,6,7],"retransmiss":9,"retransmit":[5,9],"retri":[0,7,9],"retriev":7,"return":[0,7,10],"reveal":[2,7,9,11],"revers":10,"review":[9,11],"revis":10,"rfe":10,"ridicul":9,"right":[5,6],"risc":4,"risk":9,"rn":[0,2,3,7,9,10],"rncp":4,"rnid":4,"rnode":[2,4,9,10,11],"rnodeconf":[3,4],"rnodef3b9":5,"rnodeinterfac":[3,5,10],"rnodemultiinterfac":5,"rnpath":[2,4,5],"rnprobe":[2,4],"rns_bin_dir":10,"rnsd":[2,4],"rnsh":[2,10],"rnspure":[2,9],"rnstatu":[2,4,5,9],"rnstransport":10,"rnx":4,"roadmap":8,"roam":5,"robot":9,"roll":5,"rom":10,"rotat":[7,9,10],"round":[0,7,10],"rout":[2,3,5,6,7,9,10,11],"router":[5,10],"rpc":10,"rpc_kei":10,"rprogress":0,"rssi":[0,7,10],"rtsct":0,"rtt":[0,7,9],"rttstring":0,"rule":[2,4,5],"run":[0,2,3,5,6,7,9,10,11],"runtim":[0,9],"rust":2,"rx":[5,10],"rxb":0,"safe":9,"sai":2,"said":9,"same":[0,2,3,5,6,7,9,10],"satisfi":9,"save":[7,9,10],"save_error":0,"saved_filenam":0,"scalabl":11,"scale":[9,11],"scan":5,"scenario":[2,4,9],"schedul":7,"scheme":3,"scope":5,"scratch":3,"screen":0,"script":[2,3],"scrutini":9,"seamlessli":5,"search":[4,7],"second":[0,5,7,9,10,11],"secreci":[7,9,11],"section":[2,3,5,6,9,10],"secur":[2,9,11],"see":[0,2,5,6,7,9,10,11],"seek":9,"seen":[5,9],"segment":[0,5,6,7,9,11],"select":[0,5],"self":[0,6,11],"semtech":3,"send":[0,5,7,9,10],"send_stream_id":7,"sender":[0,2,6,9,10],"sensibl":[2,3,5],"sensor":9,"sent":[0,2,7,9,10],"sentiment":9,"separ":[0,2,5,6,9,10],"sequenc":[0,7,9,11],"sequenti":11,"seri":3,"serial":[0,2,4,9,11],"serialinterfac":[3,5],"serv":[0,3,5,6,9,10],"serve_path":0,"server":[0,2,3,4,7,10],"server_buffer_readi":0,"server_callback":0,"server_client_connect":0,"server_destin":0,"server_fil":0,"server_ident":0,"server_link":0,"server_loop":0,"server_message_receiv":0,"server_packet_receiv":0,"servic":[2,4,6],"session":[2,9],"set":[0,2,3,5,6,7,9,10,11],"set_default_app_data":7,"set_delivery_callback":[0,7],"set_link_closed_callback":[0,7],"set_link_established_callback":[0,7],"set_packet_callback":[0,7],"set_proof_requested_callback":7,"set_proof_strategi":[0,7],"set_ratchet_interv":7,"set_remote_identified_callback":[0,7],"set_resource_callback":7,"set_resource_concluded_callback":[0,7],"set_resource_started_callback":[0,7],"set_resource_strategi":[0,7],"set_retained_ratchet":7,"set_timeout":[0,7],"set_timeout_callback":[0,7],"setup":[0,2,4,5,10],"sever":[2,6,7,10],"sf":10,"sha":[7,9],"sha256":[9,11],"shall":9,"share":[0,2,6,7,9,10],"share_inst":10,"shared_instance_port":10,"shared_instance_typ":[7,10],"she":6,"shelf":[9,11],"shell":[4,10],"ship":2,"shop":0,"short":[3,5,9,10],"shorter":5,"shorthand":[5,10],"shot":2,"should":[0,2,5,6,7,9,10,11],"should_ingress_limit":0,"should_quit":0,"should_use_implicit_proof":7,"show":[2,10],"shown":0,"side":[5,11],"sideband":4,"sight":6,"sign":[7,9,10],"signal":[0,7,9],"signatur":[7,9,10,11],"significantli":[5,7],"silent":10,"similar":[0,2,3,5,6,7,10,11],"simpl":[0,3,7,9,10,11],"simpler":[5,11],"simplest":[5,9],"simpli":[0,2,3,5,6,9,10],"simplic":9,"simplifi":0,"simplyequip":3,"simultan":[2,9],"sinc":[0,2,5,6,7,9],"singl":[0,5,7,9,10,11],"singular":9,"site":[4,5],"situat":[2,3,5,6,9],"size":[0,2,5,7,9,10],"size_str":0,"skip":0,"sleep":[0,10],"slice":0,"slightli":[0,2],"slottim":[5,10],"slow":[0,5,9],"slower":[5,7,9],"small":[0,2,5,6,7,9,11],"smaller":7,"snippet":2,"snr":[0,7,10],"so":[0,2,3,5,6,7,8,9,10,11],"socket":[5,10,11],"softwar":[2,3,5,9],"solut":[2,9,10],"solv":9,"some":[0,2,3,5,6,7,9,10],"someon":[2,5],"someth":9,"somethign":0,"sometim":[3,5],"somewhat":2,"soon":7,"sort":[5,9,10],"soundmodem":5,"sourc":[0,2,3,6,9,11],"sovereignti":11,"space":[0,2,3,6,9,11],"spam":5,"span":[5,9],"spawn":5,"spe":5,"spec":9,"special":[9,10],"specif":[0,3,4,5,7,10],"specifi":[0,2,3,5,6,7,9,10],"spectrum":[5,9],"speed":[0,5,7,9,10],"split":0,"sponsor":[8,11],"spread":[5,10],"spreadingfactor":5,"squelch":5,"ssh":2,"ssid":5,"stabl":[9,11],"stack":[0,2,6,7,9,10,11],"stage":9,"stai":[0,9,10],"stale":7,"stale_grac":7,"stale_tim":7,"stam":7,"stamp":7,"standalon":4,"standard":[3,9],"start":[0,3,4,5,7,9,10],"startup":[0,2,10],"stat":[7,10],"state":0,"static":7,"staticmethod":0,"station":5,"stationari":[6,10],"statist":[0,5,7,8],"statu":[0,2,4,5,7,9,10],"stderr":10,"stdin":[5,10],"stdio":11,"stdout":[0,5,10],"step":[0,2,3],"still":[0,2,5,6,9,10],"stock":0,"stop":[7,11],"stopbit":[0,5,10],"storag":2,"store":[0,7,9,10],"store_tru":0,"str":0,"straightforward":5,"strategi":[5,7],"stream":[0,7,9],"stream_id":[0,7],"strength":[7,11],"strictli":[5,9],"string":[0,7],"stringmessag":0,"strong":9,"struct":0,"structur":[0,7,9,11],"sub":[0,5],"subclass":[0,7],"subinterfac":5,"subject":[2,11],"submit":2,"subnet":[2,6],"subsequ":[0,9],"subset":5,"subsid":5,"succe":2,"succeed":[0,7],"successful":7,"successfulli":[0,7,9],"sudo":[2,10],"suffic":9,"suffici":[2,5,9,10],"suffix":0,"suggest":8,"suit":[2,3,9,10],"suitabl":[0,2,5,6,9,11],"super":0,"suppli":[0,5,6,7,9,11],"supplier":2,"support":[0,2,4,5,6,7,9,10,11],"sure":[0,2,3,10],"surveil":9,"surviv":9,"switch":[3,5,9,10],"sx1262":3,"sx1268":3,"sx1276":3,"sx1278":3,"sx1280":3,"sy":0,"symlink":[2,10],"symmetr":[7,9],"system":[0,2,3,4,5,6,7,8,9,11],"systemctl":10,"systemd":10,"t":[0,2,5,6,7,9,10],"tabl":[2,5,6,9,10],"tag":7,"tail":5,"tailor":9,"take":[0,2,5,9,10,11],"taken":[0,9],"tangerin":0,"tap":3,"target":[0,5,10],"target_hash":7,"target_host":[2,5],"target_port":[2,5],"task":10,"tcp":[2,3,4,6,9,10,11],"tcpclientinterfac":[2,3,5],"tcpinterfac":10,"tcpserverinterfac":[2,5],"tdata":0,"teach":10,"teardown":[0,7],"teardown_reason":0,"teffect":0,"telemetri":8,"tell":[0,5],"temperatur":9,"temporari":5,"temporarili":5,"ten":9,"tend":5,"term":[5,6,9],"termin":[0,2,7],"terminologi":[6,9],"termux":2,"test":[2,9,10],"testnet":[4,10],"text":[0,2,6,9],"tfile":0,"tgz":10,"than":[0,2,5,6,7,9,10,11],"thei":[0,2,5,6,7,9,10],"them":[0,2,3,5,6,8,9,10,11],"themselv":5,"thereaft":9,"therefor":[2,9,11],"thi":[0,2,3,4,5,6,7,9,10,11],"thing":[0,2],"think":[2,3],"thorough":11,"those":[6,9],"though":[2,5,9],"thousand":[2,5,9],"thread":0,"three":[2,6,9],"threshold":5,"throough":5,"throttl":6,"through":[0,2,3,5,6,7,9,10,11],"throughout":9,"throughput":[7,9,11],"thrown":7,"thu":[6,7,9],"ti":[0,9],"time":[0,2,3,5,6,7,9,10],"time_since_last":0,"timeout":[0,7,10],"timeoutarg":0,"timestamp":[0,9],"timestr":0,"tion":5,"tnc":[3,5,7,10,11],"to_fil":7,"todai":9,"togeth":[3,9,10],"token":[7,9,11],"toler":5,"too":[0,6],"tool":[2,3,9,10,11],"top":[6,9],"topic":9,"topographi":[2,6,9],"topologi":[5,9,11],"torn":7,"total":[7,9,11],"total_s":0,"touch":11,"toward":[0,5,9],"track":7,"track_phy_stat":7,"trade":9,"tradit":[6,9],"traffic":[0,2,5,6,7,9,10],"transceiv":[2,3,5,9,11],"transfer":[0,7,9,10,11],"transfer_s":0,"transform":11,"transmiss":[2,5,7,9],"transmit":[0,5,9],"transpar":[3,5,9,10],"transport":[0,2,4,5,6,7,10,11],"transport_en":7,"travers":[7,9],"treat":9,"tri":0,"trip":[0,7,10],"trivial":[9,11],"true":[0,2,5,7,10],"truli":[3,9],"truncat":[7,9,10],"truncated_hash":7,"truncated_hashlength":[0,7],"trust":[9,10],"trustless":[6,9,11],"try":[0,4,5,7],"ttime":0,"ttransfer":0,"ttyacm0":5,"ttyusb0":[0,5,10],"ttyusb1":5,"ttyusb2":5,"tun":[3,5],"tun0":5,"tunnel":[5,9,11],"tupl":7,"turn":[0,5,10],"turnaround":5,"tutori":2,"two":[0,3,5,6,7,9],"tx":[5,10],"txb":0,"txp":10,"txpower":5,"txt":10,"txtail":[5,10],"type":[0,2,4,5,6,7,10],"typeerror":7,"u":[8,9,10],"ubiqu":3,"ubuntu":[4,10],"uci":2,"udp":[4,6,9,10,11],"udpinterfac":5,"uhf":[10,11],"ultim":9,"umsgpack":0,"uncencrypt":0,"uncensor":2,"under":[7,8,10,11],"underli":[0,5,6,7,9,11],"understand":[2,4,7,10],"underwai":2,"unencrypt":[0,7,9],"unequivoc":9,"unexplor":6,"unforg":11,"unfortun":2,"unidentifi":0,"unidirect":0,"unifi":6,"uninterest":0,"uniqu":[0,5,7,9,10,11],"unit":[0,2,7,10],"unknown":[0,5,7,9,10],"unless":[0,2,5,7,9],"unlicens":9,"unlik":9,"unlock":10,"unorganis":6,"unpack":[0,7],"unpackb":0,"unplug":10,"unrecover":[0,10],"unreli":5,"unset":9,"unsupport":7,"until":[0,2,5,7],"unus":10,"unwant":9,"up":[0,2,3,5,6,7,9,10,11],"updat":[0,2,7,9,10],"upgrad":[2,7,9],"upkeep":5,"upon":[0,5,9],"upset":0,"urandom":[9,11],"url":10,"us":[0,3,4,5,6,7,9],"usabl":[5,9],"usag":[2,4,5,7,8,10],"usb":[3,6,9,10],"useabl":9,"user":[0,2,5,6,9,10,11],"user_input":0,"userland":11,"usernameher":10,"usr":10,"usual":2,"utf":0,"util":[0,3,4,5,9],"utilis":[0,2,5,6,7,9,10,11],"v":[4,10],"valid":[0,5,7,9,10],"valu":[0,5,7,9,10],"valuabl":[3,8],"valueerror":[0,7],"vari":[2,5,9,10],"variabl":[0,2,7],"varieti":[5,9,10,11],"variou":[0,2,5,6,9,10,11],"vast":9,"ve":2,"vehicl":5,"vendor":[0,3,11],"verbos":[7,10],"veri":[2,3,5,6,7,8,9,10,11],"verif":[7,9,10],"verifi":[0,2,7,9,10,11],"versa":[6,11],"version":[0,2,7,9,10],"vhf":[6,9,11],"via":[2,3,5,8,9,10,11],"vice":[6,11],"view":[2,5,9,10],"violat":5,"virtual":[2,3,5,6,9,10,11],"visibl":0,"volunt":2,"vport":5,"vvv":2,"w":10,"wa":[0,3,5,6,7,9,10,11],"wai":[0,2,5,6,7,9,10],"wait":[0,5,9,10],"want":[0,2,5,6,9,10,11],"wantedbi":10,"warn":10,"warrant":11,"wast":5,"wave":3,"wb":0,"we":[0,2,3,5,8,9],"weaken":9,"websit":[2,5],"weight":10,"weird":2,"welcom":2,"well":[2,3,5,6,7,9,10,11],"went":0,"were":[0,6],"what":[0,2,4,5,7,9],"whatev":[7,9],"wheel":2,"when":[0,2,3,5,6,7,9,10],"whenev":[0,7,9],"where":[2,3,4,5,6,7,9,10],"whereupon":9,"whether":[0,2,5,7,9],"which":[0,2,5,6,7,9,10],"while":[0,2,3,5,6,7,9,11],"whl":2,"who":[2,5,9],"whole":10,"wide":[2,3,5,9,10,11],"wider":[2,5,9,10],"wifi":[2,4,5,6,9,10,11],"wiki":2,"wildcard":0,"willing":6,"window":[4,5],"wipe":10,"wire":[2,3,4,5,11],"wireless":[3,6],"wirelessli":5,"wish":[0,9,10],"within":[0,2,5,6,7,9],"without":[0,2,3,5,6,9,10,11],"wlan0":5,"wolf":3,"won":0,"word":2,"work":[2,3,5,6,9,10,11],"world":[3,5,6,11],"worri":6,"worth":2,"would":[2,5,6,7,9],"write":[0,2,3,5,7,9,10],"write_timeout":0,"writer":[0,7],"written":[0,9,11],"wrong":[0,5],"wrote":[0,5],"x":[7,9,10],"x25519":[9,11],"xenon":0,"xonxoff":0,"y":0,"ye":[2,5,9,10],"year":9,"yet":[0,5,9,11],"yggdrasil":5,"yi":0,"you":[0,2,3,4,5,6,7,8,9,10,11],"your":[0,2,3,4,5,6,7,8,9,11],"yourself":[2,9,11],"z":0,"zero":[7,11],"zi":0,"zshrc":2},"titles":["Code Examples","An Explanation of Reticulum for Human Beings","Getting Started Fast","Communications Hardware","Reticulum Network Stack Manual","Configuring Interfaces","Building Networks","API Reference","Support Reticulum","Understanding Reticulum","Using Reticulum on Your System","What is Reticulum?"],"titleterms":{"0":3,"1":3,"25":5,"Beings":1,"Of":4,"The":[9,10],"With":2,"access":9,"ad":2,"an":1,"android":2,"announc":[0,5,9],"api":7,"arm64":2,"auto":5,"ax":5,"backbon":5,"base":[2,3],"basic":9,"beam":3,"board":3,"bookworm":2,"bridg":6,"broadcast":0,"buffer":0,"build":6,"can":11,"caveat":11,"channel":0,"client":5,"code":[0,8,9],"combin":3,"common":5,"commun":3,"concept":6,"configur":[5,10],"connect":[2,5],"content":4,"contribut":8,"control":5,"converg":6,"creat":[2,3],"cryptograph":9,"current":11,"custom":[0,2,5],"data":10,"debian":2,"deck":3,"depend":2,"destin":[5,9],"detail":9,"develop":2,"devic":[3,11],"doe":11,"donat":8,"echo":[0,3],"emptor":11,"entrypoint":2,"establish":9,"ethernet":3,"exampl":[0,6],"explan":1,"fast":2,"feedback":8,"filetransf":0,"fix":10,"format":9,"function":9,"further":9,"get":[2,9],"goal":9,"growth":6,"hardwar":3,"heltec":3,"host":2,"human":1,"i":11,"i2p":5,"ident":9,"identif":0,"improv":10,"includ":[2,10],"indic":4,"instal":[2,3],"instanc":2,"interconnect":6,"interfac":[0,2,5,9,11],"internet":[2,6],"introduct":9,"issu":2,"kei":9,"kiss":5,"lilygo":3,"limit":5,"line":3,"link":[0,9],"listen":5,"lora":[5,6],"lora32":3,"lunar":2,"maco":2,"manag":10,"manual":4,"mechan":9,"meshchat":2,"minim":0,"mode":5,"modem":3,"motiv":9,"multi":5,"name":[9,10],"network":[2,4,6],"new":5,"node":9,"nomad":2,"note":2,"offer":11,"opencom":3,"openwrt":2,"option":5,"over":[2,6],"overview":6,"packet":[3,9],"particip":2,"pi":2,"pipe":5,"platform":2,"port":10,"primit":9,"prioritis":9,"program":[2,10],"propag":9,"protocol":9,"provid":8,"public":[2,9],"pure":2,"python":2,"radio":[2,3],"rak4631":3,"raspberri":2,"rate":5,"reach":9,"refer":[7,9],"remot":[2,5,10],"request":0,"resolv":2,"resourc":9,"respons":0,"reticulum":[1,2,3,4,8,9,10,11],"risc":2,"rncp":10,"rnid":10,"rnode":[3,5],"rnodeconf":10,"rnpath":10,"rnprobe":10,"rnsd":10,"rnstatu":10,"rnx":10,"rule":9,"scenario":6,"serial":[3,5,10],"server":5,"servic":10,"setup":9,"shell":2,"sideband":2,"site":6,"specif":[2,9],"stack":4,"standalon":2,"start":2,"statu":11,"support":[3,8],"suprem":3,"system":10,"systemwid":10,"t":3,"t114":3,"t3s3":3,"tabl":4,"tcp":5,"testnet":2,"transport":9,"try":2,"type":[3,9,11],"ubuntu":2,"udp":5,"understand":9,"unsign":3,"us":[2,10,11],"usag":3,"userspac":10,"util":[2,10],"v":2,"v1":3,"v2":3,"v3":3,"v4":3,"what":11,"where":11,"wifi":3,"window":2,"wire":9,"x":3,"xl":3,"your":10}}) \ No newline at end of file +Search.setIndex({"alltitles":{"API Reference":[[7,null]],"ARM64":[[2,"arm64"]],"AX.25 KISS Interface":[[5,"ax-25-kiss-interface"]],"Adding Radio Interfaces":[[2,"adding-radio-interfaces"]],"An Explanation of Reticulum for Human Beings":[[1,null]],"Android":[[2,"android"]],"Announce":[[0,"announce"]],"Announce Propagation Rules":[[9,"announce-propagation-rules"]],"Announce Rate Control":[[5,"announce-rate-control"]],"Auto Interface":[[5,"auto-interface"]],"Automated List Sourcing":[[10,"automated-list-sourcing"]],"Backbone Interface":[[5,"backbone-interface"]],"Blackhole Management":[[10,"blackhole-management"]],"Bootstrapping Connectivity":[[2,"bootstrapping-connectivity"]],"Bridging Over the Internet":[[6,"bridging-over-the-internet"]],"Broadcast":[[0,"broadcast"]],"Buffer":[[0,"buffer"]],"Building Networks":[[6,null]],"Building Personal Infrastructure":[[2,"building-personal-infrastructure"]],"Caveat Emptor":[[11,"caveat-emptor"]],"Channel":[[0,"channel"]],"Code Examples":[[0,null]],"Combining Hardware Types":[[3,"combining-hardware-types"]],"Common Interface Options":[[5,"common-interface-options"]],"Communications Hardware":[[3,null]],"Concepts & Overview":[[6,"concepts-overview"]],"Conceptual Overview":[[9,"conceptual-overview"]],"Configuration & Data":[[10,"configuration-data"]],"Configuring Interfaces":[[5,null]],"Connect to the Public Testnet":[[2,"connect-to-the-public-testnet"]],"Connecting Remotes":[[5,"connecting-remotes"]],"Connecting Reticulum Instances Over the Internet":[[2,"connecting-reticulum-instances-over-the-internet"]],"Contribute Code":[[8,"contribute-code"]],"Contributing to the Global Ret":[[2,"contributing-to-the-global-ret"]],"Creating RNodes":[[3,"creating-rnodes"]],"Creating a Network With Reticulum":[[2,"creating-a-network-with-reticulum"]],"Creating and Using Custom Interfaces":[[2,"creating-and-using-custom-interfaces"]],"Creating and Using a Network Identity":[[9,"creating-and-using-a-network-identity"]],"Cryptographic Primitives":[[9,"cryptographic-primitives"]],"Current Status":[[11,"current-status"]],"Current Usage":[[9,"current-usage"]],"Custom Interfaces":[[0,"custom-interfaces"],[5,"custom-interfaces"]],"Debian Bookworm":[[2,"debian-bookworm"]],"Destination Naming":[[9,"destination-naming"]],"Destinations":[[9,"destinations"]],"Develop a Program with Reticulum":[[2,"develop-a-program-with-reticulum"]],"Discoverable Interfaces":[[5,"discoverable-interfaces"]],"Discovering Interfaces":[[10,"discovering-interfaces"]],"Discovery Parameters":[[5,"discovery-parameters"]],"Donations":[[8,"donations"]],"Echo":[[0,"echo"]],"Enabling Discovery":[[5,"enabling-discovery"]],"Ethernet-based Hardware":[[3,"ethernet-based-hardware"]],"Example Configuration":[[5,"example-configuration"]],"Example Scenarios":[[6,"example-scenarios"]],"Filetransfer":[[0,"filetransfer"]],"Finding Your Way":[[2,"finding-your-way"]],"Fixed Serial Port Names":[[10,"fixed-serial-port-names"]],"Future Implications":[[9,"future-implications"]],"Getting Further":[[9,"getting-further"]],"Getting Started Fast":[[2,null]],"Goals":[[9,"goals"]],"Growth and Convergence":[[6,"growth-and-convergence"]],"Heltec LoRa32 v2.0":[[3,"heltec-lora32-v2-0"]],"Heltec LoRa32 v3.0":[[3,"heltec-lora32-v3-0"]],"Heltec LoRa32 v4.0":[[3,"heltec-lora32-v4-0"]],"Heltec T114":[[3,"heltec-t114"]],"Hosting Public Entrypoints":[[2,"hosting-public-entrypoints"]],"I2P Interface":[[5,"i2p-interface"]],"Identification":[[0,"example-identify"]],"Identities":[[9,"understanding-identities"]],"Improving System Configuration":[[10,"improving-system-configuration"]],"Included Utility Programs":[[10,"included-utility-programs"]],"Indices and Tables":[[4,"indices-and-tables"]],"Installation":[[3,"installation"]],"Interconnected LoRa Sites":[[6,"interconnected-lora-sites"]],"Interface Access Codes":[[9,"interface-access-codes"]],"Interface Modes":[[5,"interface-modes"],[5,"interfaces-modes"]],"Interface Types and Devices":[[11,"interface-types-and-devices"]],"Introduction & Basic Functionality":[[9,"introduction-basic-functionality"]],"KISS Interface":[[5,"kiss-interface"]],"LilyGO LoRa32 v1.0":[[3,"lilygo-lora32-v1-0"]],"LilyGO LoRa32 v2.0":[[3,"lilygo-lora32-v2-0"]],"LilyGO LoRa32 v2.1":[[3,"lilygo-lora32-v2-1"]],"LilyGO T-Beam":[[3,"lilygo-t-beam"]],"LilyGO T-Beam Supreme":[[3,"lilygo-t-beam-supreme"]],"LilyGO T-Deck":[[3,"lilygo-t-deck"]],"LilyGO T-Echo":[[3,"lilygo-t-echo"]],"LilyGO T3S3":[[3,"lilygo-t3s3"]],"Link":[[0,"link"]],"Link Establishment in Detail":[[9,"link-establishment-in-detail"]],"Listeners":[[5,"listeners"]],"Local Blackhole Management":[[10,"local-blackhole-management"]],"MacOS":[[2,"macos"]],"MeshChat":[[2,"meshchat"]],"Minimal":[[0,"minimal"]],"Mixing Strategies":[[2,"mixing-strategies"]],"Motivation":[[9,"motivation"]],"Network Health & Responsibility":[[2,"network-health-responsibility"]],"Network Identities":[[9,"network-identities"]],"New Destination Rate Limiting":[[5,"new-destination-rate-limiting"]],"Node Types":[[9,"node-types"]],"Nomad Network":[[2,"nomad-network"]],"OpenCom XL":[[3,"opencom-xl"]],"OpenWRT":[[2,"openwrt"]],"Packet Prioritisation":[[9,"packet-prioritisation"]],"Packet Radio Modems":[[3,"packet-radio-modems"]],"Pipe Interface":[[5,"pipe-interface"]],"Platform-Specific Install Notes":[[2,"platform-specific-install-notes"]],"Protocol Specifics":[[9,"protocol-specifics"]],"Provide Feedback":[[8,"provide-feedback"]],"Public Key Announcements":[[9,"public-key-announcements"]],"Publishing Blackhole Lists":[[10,"publishing-blackhole-lists"]],"Pure-Python Reticulum":[[2,"pure-python-reticulum"]],"RAK4631-based Boards":[[3,"rak4631-based-boards"]],"RISC-V":[[2,"risc-v"]],"RNode":[[3,"rnode"]],"RNode LoRa Interface":[[5,"rnode-lora-interface"]],"RNode Multi Interface":[[5,"rnode-multi-interface"]],"Raspberry Pi":[[2,"raspberry-pi"]],"Reaching the Destination":[[9,"reaching-the-destination"]],"Reference Setup":[[9,"reference-setup"]],"Remote Management":[[10,"remote-management"]],"Remote Shell":[[2,"remote-shell"]],"Requests & Responses":[[0,"requests-responses"]],"Resolving Dependency & Installation Issues":[[2,"resolving-dependency-installation-issues"]],"Resources":[[9,"resources"]],"Reticulum Network Stack Manual":[[4,null]],"Reticulum Transport":[[9,"reticulum-transport"]],"Reticulum as a System Service":[[10,"reticulum-as-a-system-service"]],"Security Considerations":[[5,"security-considerations"]],"Serial Interface":[[5,"serial-interface"]],"Serial Lines & Devices":[[3,"serial-lines-devices"]],"Sideband":[[2,"sideband"]],"Standalone Reticulum Installation":[[2,"standalone-reticulum-installation"]],"Support Reticulum":[[8,null]],"Supported Boards and Devices":[[3,"supported-boards-and-devices"]],"Systemwide Service":[[10,"systemwide-service"]],"TCP Client Interface":[[5,"tcp-client-interface"]],"TCP Server Interface":[[5,"tcp-server-interface"]],"Table Of Contents":[[4,"table-of-contents"]],"The Announce Mechanism in Detail":[[9,"the-announce-mechanism-in-detail"]],"The rncp Utility":[[10,"the-rncp-utility"]],"The rnid Utility":[[10,"the-rnid-utility"]],"The rnodeconf Utility":[[10,"the-rnodeconf-utility"]],"The rnpath Utility":[[10,"the-rnpath-utility"]],"The rnprobe Utility":[[10,"the-rnprobe-utility"]],"The rnsd Utility":[[10,"the-rnsd-utility"]],"The rnstatus Utility":[[10,"the-rnstatus-utility"]],"The rnx Utility":[[10,"the-rnx-utility"]],"Try Using a Reticulum-based Program":[[2,"try-using-a-reticulum-based-program"]],"UDP Interface":[[5,"udp-interface"]],"Ubuntu Lunar":[[2,"ubuntu-lunar"]],"Understanding Reticulum":[[9,null]],"Unsigned RNode v2.x":[[3,"unsigned-rnode-v2-x"]],"Usage with Reticulum":[[3,"usage-with-reticulum"]],"Userspace Service":[[10,"userspace-service"]],"Using Reticulum on Your System":[[10,null]],"Using the Included Utilities":[[2,"using-the-included-utilities"]],"What does Reticulum Offer?":[[11,"what-does-reticulum-offer"]],"What is Reticulum?":[[11,null]],"Where can Reticulum be Used?":[[11,"where-can-reticulum-be-used"]],"WiFi-based Hardware":[[3,"wifi-based-hardware"]],"Windows":[[2,"windows"]],"Wire Format":[[9,"wire-format"]]},"docnames":["examples","forhumans","gettingstartedfast","hardware","index","interfaces","networks","reference","support","understanding","using","whatis"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["examples.rst","forhumans.rst","gettingstartedfast.rst","hardware.rst","index.rst","interfaces.rst","networks.rst","reference.rst","support.rst","understanding.rst","using.rst","whatis.rst"],"indexentries":{},"objects":{"RNS":[[7,0,1,"","Buffer"],[7,0,1,"","Destination"],[7,0,1,"","Identity"],[7,0,1,"","Link"],[7,0,1,"","MessageBase"],[7,0,1,"","Packet"],[7,0,1,"","PacketReceipt"],[7,0,1,"","RawChannelReader"],[7,0,1,"","RawChannelWriter"],[7,0,1,"","RequestReceipt"],[7,0,1,"","Resource"],[7,0,1,"","Reticulum"],[7,0,1,"","Transport"]],"RNS.Buffer":[[7,1,1,"","create_bidirectional_buffer"],[7,1,1,"","create_reader"],[7,1,1,"","create_writer"]],"RNS.Channel":[[7,0,1,"","Channel"]],"RNS.Channel.Channel":[[7,1,1,"","add_message_handler"],[7,1,1,"","is_ready_to_send"],[7,2,1,"","mdu"],[7,1,1,"","register_message_type"],[7,1,1,"","remove_message_handler"],[7,1,1,"","send"]],"RNS.Destination":[[7,3,1,"","RATCHET_COUNT"],[7,3,1,"","RATCHET_INTERVAL"],[7,1,1,"","accepts_links"],[7,1,1,"","announce"],[7,1,1,"","app_and_aspects_from_name"],[7,1,1,"","clear_default_app_data"],[7,1,1,"","create_keys"],[7,1,1,"","decrypt"],[7,1,1,"","deregister_request_handler"],[7,1,1,"","enable_ratchets"],[7,1,1,"","encrypt"],[7,1,1,"","enforce_ratchets"],[7,1,1,"","expand_name"],[7,1,1,"","get_private_key"],[7,1,1,"","hash"],[7,1,1,"","hash_from_name_and_identity"],[7,1,1,"","load_private_key"],[7,1,1,"","register_request_handler"],[7,1,1,"","set_default_app_data"],[7,1,1,"","set_link_established_callback"],[7,1,1,"","set_packet_callback"],[7,1,1,"","set_proof_requested_callback"],[7,1,1,"","set_proof_strategy"],[7,1,1,"","set_ratchet_interval"],[7,1,1,"","set_retained_ratchets"],[7,1,1,"","sign"]],"RNS.Identity":[[7,3,1,"","CURVE"],[7,3,1,"","KEYSIZE"],[7,3,1,"","RATCHETSIZE"],[7,3,1,"","RATCHET_EXPIRY"],[7,3,1,"","TRUNCATED_HASHLENGTH"],[7,1,1,"","current_ratchet_id"],[7,1,1,"","decrypt"],[7,1,1,"","encrypt"],[7,1,1,"","from_bytes"],[7,1,1,"","from_file"],[7,1,1,"","full_hash"],[7,1,1,"","get_private_key"],[7,1,1,"","get_public_key"],[7,1,1,"","get_random_hash"],[7,1,1,"","load_private_key"],[7,1,1,"","load_public_key"],[7,1,1,"","recall"],[7,1,1,"","recall_app_data"],[7,1,1,"","sign"],[7,1,1,"","to_file"],[7,1,1,"","truncated_hash"],[7,1,1,"","validate"]],"RNS.Link":[[7,3,1,"","CURVE"],[7,3,1,"","ESTABLISHMENT_TIMEOUT_PER_HOP"],[7,3,1,"","KEEPALIVE"],[7,3,1,"","KEEPALIVE_TIMEOUT_FACTOR"],[7,3,1,"","STALE_GRACE"],[7,3,1,"","STALE_TIME"],[7,1,1,"","get_age"],[7,1,1,"","get_channel"],[7,1,1,"","get_establishment_rate"],[7,1,1,"","get_expected_rate"],[7,1,1,"","get_mdu"],[7,1,1,"","get_mode"],[7,1,1,"","get_mtu"],[7,1,1,"","get_q"],[7,1,1,"","get_remote_identity"],[7,1,1,"","get_rssi"],[7,1,1,"","get_snr"],[7,1,1,"","identify"],[7,1,1,"","inactive_for"],[7,1,1,"","no_data_for"],[7,1,1,"","no_inbound_for"],[7,1,1,"","no_outbound_for"],[7,1,1,"","request"],[7,1,1,"","set_link_closed_callback"],[7,1,1,"","set_packet_callback"],[7,1,1,"","set_remote_identified_callback"],[7,1,1,"","set_resource_callback"],[7,1,1,"","set_resource_concluded_callback"],[7,1,1,"","set_resource_started_callback"],[7,1,1,"","set_resource_strategy"],[7,1,1,"","teardown"],[7,1,1,"","track_phy_stats"]],"RNS.MessageBase":[[7,3,1,"","MSGTYPE"],[7,1,1,"","pack"],[7,1,1,"","unpack"]],"RNS.Packet":[[7,3,1,"","ENCRYPTED_MDU"],[7,3,1,"","PLAIN_MDU"],[7,1,1,"","get_q"],[7,1,1,"","get_rssi"],[7,1,1,"","get_snr"],[7,1,1,"","resend"],[7,1,1,"","send"]],"RNS.PacketReceipt":[[7,1,1,"","get_rtt"],[7,1,1,"","get_status"],[7,1,1,"","set_delivery_callback"],[7,1,1,"","set_timeout"],[7,1,1,"","set_timeout_callback"]],"RNS.RawChannelReader":[[7,1,1,"","__init__"],[7,1,1,"","add_ready_callback"],[7,1,1,"","remove_ready_callback"]],"RNS.RawChannelWriter":[[7,1,1,"","__init__"]],"RNS.RequestReceipt":[[7,1,1,"","concluded"],[7,1,1,"","get_progress"],[7,1,1,"","get_request_id"],[7,1,1,"","get_response"],[7,1,1,"","get_response_time"],[7,1,1,"","get_status"]],"RNS.Resource":[[7,1,1,"","advertise"],[7,1,1,"","cancel"],[7,1,1,"","get_data_size"],[7,1,1,"","get_hash"],[7,1,1,"","get_parts"],[7,1,1,"","get_progress"],[7,1,1,"","get_segments"],[7,1,1,"","get_transfer_size"],[7,1,1,"","is_compressed"]],"RNS.Reticulum":[[7,3,1,"","ANNOUNCE_CAP"],[7,3,1,"","LINK_MTU_DISCOVERY"],[7,3,1,"","MINIMUM_BITRATE"],[7,3,1,"","MTU"],[7,1,1,"","blackhole_sources"],[7,1,1,"","get_instance"],[7,1,1,"","interface_discovery_sources"],[7,1,1,"","link_mtu_discovery"],[7,1,1,"","publish_blackhole_enabled"],[7,1,1,"","remote_management_enabled"],[7,1,1,"","required_discovery_value"],[7,1,1,"","should_use_implicit_proof"],[7,1,1,"","transport_enabled"]],"RNS.Transport":[[7,3,1,"","PATHFINDER_M"],[7,1,1,"","await_path"],[7,1,1,"","deregister_announce_handler"],[7,1,1,"","has_path"],[7,1,1,"","hops_to"],[7,1,1,"","next_hop"],[7,1,1,"","next_hop_interface"],[7,1,1,"","register_announce_handler"],[7,1,1,"","request_path"]]},"objnames":{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","property","Python property"],"3":["py","attribute","Python attribute"]},"objtypes":{"0":"py:class","1":"py:method","2":"py:property","3":"py:attribute"},"terms":{"":[0,2,5,6,9,10,11],"0":[0,2,5,7,9,10,11],"00":[9,10],"00000000":9,"00000100":9,"00000111":9,"01":9,"01010000":9,"02":2,"05":0,"0536":10,"06915":5,"08":[0,10],"0f4259fef4521ab75a3409e353fe9073eb10783b4912a6a9937c57bf44a62c1":10,"0x0101":0,"0x20":0,"0x7d":0,"0x7e":0,"0x91c421ddfb8a30a49a71d63447ddb54cebe3465":8,"0xf000":[0,7],"1":[0,2,5,7,9,10],"10":[5,9,10],"100":[0,5,9],"1000":0,"10000000":9,"1024":0,"10h":[],"11":9,"115":9,"115200":[0,5,10],"1178a8f1fad405bf2ad153bf5036bdfd":10,"118":5,"12":[2,5,10],"1200":9,"125":5,"125000":5,"127":5,"128":[7,9],"13":10,"13425ec15b621c1d928589718000d814":9,"14":5,"15":5,"150":[5,10],"150m":5,"15m":10,"16":[5,9,10],"1625":5,"1625000":5,"167":9,"17":10,"1726dbad538775b5bf9b0ea25a4079c8":10,"174a64852a75682259ad8b921b8bf416":[],"18":10,"1800":7,"187":10,"1b03013c25f1c2ca068a4f080b844a10":10,"1h":10,"2":[0,2,5,7,9,10],"20":[5,9,10],"200":[5,10],"201":5,"2023":[2,10],"2026":2,"21":2,"22":5,"2225fdeecaf6e2db4556c3c2d7637294":10,"23":10,"2316":10,"23h":10,"24":[5,10],"2400000000":5,"25":[0,4,11],"255":[5,10],"25519":7,"256":[5,7,9,10,11],"2592000":7,"27":10,"29":5,"297":[9,11],"29716":5,"2b489d06eaf7c543808c76a5332a447d":10,"2b9ec651326d9bc274119054c70fb75":10,"2d03725b327348980d570f739a3a5708":10,"2d882c5586e548d79b5af27bca1776dc":10,"2f":0,"2owjajquafianpecac":2,"3":[0,2,5,9,10,11],"30":[5,7,10],"30602def3b3506a28ed33db6f60cc6c9":10,"32":[2,7,9],"3278":5,"32m":10,"33":5,"34":5,"360":[5,7],"3600":[0,5],"37428":10,"37429":10,"38":10,"383":7,"3865":10,"399ea050ce0eed1816c300bcb0840938":10,"3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o":10,"3b87":5,"4":[7,9,10],"40m":10,"4242":[2,5],"4251":5,"42671":5,"430":9,"4343":5,"44":11,"44318":5,"45":[0,9],"46":10,"464":7,"465":9,"469":10,"48555":5,"49":10,"49555":5,"4965":[2,10],"4e":5,"4faf1b2e0a077e6a9d92fa051f256038":9,"4ghz":5,"5":[0,5,7,9,10,11],"500":[5,7,9,11],"5001":5,"51":[5,9],"512":[5,7,9,11],"52":10,"521c87a83afb8f29e4455e77930b973b":10,"5245a8efe1788c6a1cd36144a270e13b":10,"55":5,"56":10,"564":0,"5683":[],"56m":10,"5757":5,"5858":5,"59":10,"5caf":5,"5d78":5,"5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq":5,"6":[5,7,10],"60":[0,5],"600":5,"63":10,"64":[2,9,10],"6761":[],"68a4aa91ac350c4087564e8a69f84e86":10,"7":[2,5,9,10],"71e5":5,"72":5,"720":[5,7],"7200":5,"73":[5,10],"73cbd378bb0286ed11a707c13447bb1":10,"74":10,"74195":5,"781":10,"7822":10,"7a55144adf826958a9529a3bcf08b149":10,"8":[0,5,10],"80":10,"8001":5,"809":10,"83":[9,10],"84fpy1qbxhcgdseepynmhthcrgmx4nffbytz2gkytoqhvvhjp8eaw1z1eedrnkd19b3b8nilcgvxzkv17ummmeescrpya5w":8,"86":10,"865":5,"865600000":5,"867":5,"867200000":5,"868":9,"88":5,"89":5,"8dd57a738226809646089335a6b03695":10,"9":[2,7,10],"900":9,"9037":10,"921600":10,"941bed5e228775e5a8079fc38b1ccf3f":10,"96":9,"9600":0,"984b74a3f768bef236af4371e6f248cd":10,"99":9,"99714":5,"9fb6d773498fb3feda407ed8ef2c3229":10,"9h":10,"A":[0,2,5,6,7,9,10],"And":0,"As":[2,3,5,6,7,9,10,11],"At":[2,6,9],"Be":[7,10],"But":9,"By":[0,2,5,7,9,10],"For":[2,5,6,7,9,10,11],"IN":[0,7],"If":[0,2,3,5,6,7,9,10,11],"In":[0,2,3,5,6,7,9,10,11],"It":[0,2,3,5,7,9,10,11],"No":[0,2,5,9,10,11],"Of":9,"On":[0,2,5,10],"One":[2,3,7,9],"Or":[5,10,11],"That":9,"The":[0,2,3,4,5,6,7,11],"Then":[0,2],"There":[2,6,9,10],"These":[2,5,7,9,10],"To":[0,2,3,5,6,9,10,11],"Will":7,"With":[4,5,6,9,10],"_":9,"__":9,"______":9,"_______":9,"________":9,"________________":9,"__future__":0,"__init__":[0,7],"__main__":0,"__name__":0,"__str__":0,"a4d":5,"a79f":5,"aarch64":2,"ab":0,"abil":[2,3,10,11],"abl":[0,2,5,6,7,9,10],"abort":[0,5],"about":[0,2,3,5,6,7,9,10],"abov":[2,3,5,9,10],"absolut":[5,8,11],"abstract":[7,9],"abstractmethod":7,"abund":3,"abus":10,"accept":[5,7,8,9,10],"accept_al":[0,7],"accept_app":7,"accept_non":7,"accepts_link":7,"access":[2,4,5,6,7,10],"access_point":5,"accommod":[7,9],"accord":[0,2,9],"accordingli":[0,5],"achiev":[2,5,7,9],"acknowledg":11,"across":[0,3,6,7,9,10],"act":[2,5,7,9,10],"action":[0,10],"activ":[0,2,5,7,9],"actor":[9,10],"actual":[0,2,5,9,10],"ad":[0,3,4,5,6,7,9,10,11],"adapt":[2,3,6],"add":[0,2,5,6,7,10],"add_argu":0,"add_message_handl":[0,7],"add_ready_callback":7,"addit":[2,3,5,7,9,10,11],"addition":[2,3,5,9],"addr":10,"address":[0,2,5,6,7,9,10,11],"adher":7,"adjust":[2,7],"admin":5,"administr":[9,10],"adopt":9,"adress":[7,9],"advanc":9,"advantag":7,"advers":11,"adversari":2,"advertis":[0,5,7],"advis":[5,9],"ae":[7,9,11],"af73":5,"affect":[2,5],"after":[0,2,5,6,7,9,10],"again":[2,5,9,10],"against":[2,5,9],"agenc":9,"agent":9,"agnost":[6,9],"agnostic":9,"ago":10,"aim":[2,4,9],"air":[2,3],"airmax":3,"airtim":5,"airtime_limit_long":5,"airtime_limit_short":5,"akin":9,"alic":9,"align":[2,10],"aliv":[7,9],"all":[0,2,3,4,5,6,7,8,9,10,11],"allevi":3,"alloc":[5,7,9,10],"allow":[0,2,3,5,6,7,9,10,11],"allow_al":[0,7],"allow_list":7,"allow_non":7,"allowed_hash":10,"allowed_ident":10,"allowed_list":7,"almost":[3,5,9,10],"alon":5,"along":[5,6,7,9,10],"alreadi":[0,2,3,6,7,9,10],"also":[0,2,3,4,5,6,7,9,10,11],"alter":[2,7,9],"altern":[0,2,5,10],"although":[2,9,11],"alwai":[2,5,7,9,10],"amateur":[5,11],"amount":[0,2,5,6,7,9,11],"amsterdam":[2,5,10],"an":[0,2,3,5,6,7,9,10,11],"analyt":8,"android":[4,5,10],"ani":[0,2,3,5,6,7,8,9,10,11],"annot":0,"annouce_cap":5,"announc":[4,7,10],"announce_cap":[5,7],"announce_handl":0,"announce_interv":5,"announce_packet_hash":7,"announce_rate_grac":5,"announce_rate_penalti":5,"announce_rate_target":5,"announced_ident":[0,7],"announceloop":0,"announcesampl":0,"anonym":[2,6,7,9,11],"anoth":[2,7,9,10],"answer":[9,10],"antenna":3,"anymor":2,"anyon":[0,2,3,5,6,7,9,10],"anyth":[2,3,5,9,10,11],"anywher":[0,5],"ap":5,"api":[2,4,9,11],"apk":2,"app":[0,2,7,9],"app_and_aspects_from_nam":7,"app_data":[0,7],"app_nam":[0,7],"app_timeout":0,"append":[0,9],"appli":[5,7,9],"applic":[0,2,5,6,7,9,10,11],"approach":[2,3,9,10],"appropri":5,"approv":9,"approxim":[5,10],"april":2,"apt":2,"ar":[0,2,3,5,6,7,8,9,10,11],"arbitrari":[7,9,10,11],"arch":2,"architectur":2,"area":[2,3,5,6,9,11],"arg":0,"argon":0,"argpars":0,"argument":[0,7,10],"argumentpars":0,"arm64":4,"around":[5,9],"arrai":2,"arriv":[0,9],"arx":10,"ask":[0,2,3,7],"aspect":[0,2,3,5,7,9,10],"aspect_filt":[0,7],"assign":[0,9,10],"associ":[7,9,10],"assum":[5,9],"asymmetr":[9,10,11],"attach":10,"attached_interfac":7,"attack":2,"attain":2,"attempt":[0,2,3,7,10],"attribut":7,"atx":10,"audit":11,"auth":10,"authent":[2,5,6,7,9,10,11],"author":[9,10],"authorit":9,"auto":[2,3,4,7,9,10],"auto_compress":7,"autoconfigur":11,"autoconnect":[],"autoconnect_discovered_interfac":[5,10],"autodiscov":5,"autoinstal":[3,10],"autointerfac":[2,3,5,10],"autom":[2,3,4,8,9],"automat":[0,2,5,6,7,9,10,11],"autonom":[6,9],"autonomi":11,"avail":[0,2,3,4,5,6,7,9,10,11],"averag":9,"avoid":[3,9,10],"awai":[0,2,5,6,9,10],"await_path":7,"awar":[2,5,9],"ax":[4,11],"ax25kissinterfac":5,"b":[0,6,10],"b32":5,"back":[0,5,9,11],"backbon":[2,3,4,10],"backboneinterfac":[2,5,10],"backend":[5,9],"background":[2,5,10],"backhaul":[3,6],"backup":10,"balanc":5,"band":[3,9],"bandwidth":[2,5,6,7,9,10,11],"bare":[0,5],"barrier":[5,9],"base":[4,5,6,7,9,10,11],"base32":[5,10],"base64":10,"basi":[5,7,9,10,11],"basic":[0,2,4,5,7,10],"baud":[5,10],"baud_flash":10,"baudrat":0,"bc1pgqgu8h8xvj4jtafslq396v7ju7hkgymyrzyqft4llfslz5vp99psqfk3a6":8,"bc7291552be7a58f361522990465165c":10,"beacon":5,"becaus":[6,9],"becki":0,"becom":[0,2,5,6,7,9],"been":[0,2,3,5,6,7,9,10,11],"befor":[0,2,5,7,9,10],"begin":[0,3,7],"begun":7,"behalf":5,"behav":3,"behaviour":[2,5,10],"behind":[2,5,9],"being":[2,5,7,9],"beings":9,"belief":9,"belong":[9,10],"below":[2,3,5,10],"benefici":[5,10],"best":[2,9,11],"better":[2,5,9],"between":[0,5,6,7,9,10],"betweenthebord":[],"bi":[7,9],"bidirect":9,"billion":[6,9],"bin":[2,5,10],"binari":[0,2,5,7,9,10],"bind":5,"bit":[0,2,5,7,9,10,11],"bitcoin":8,"bitrat":[0,5,7],"blackhol":[2,4,7,9],"blackhole_sourc":[7,10],"blackholed_ident":10,"blackholeupdat":10,"ble":5,"blindli":10,"blob":[0,9],"block":[2,5,7,9,10],"blocklist":10,"bluetooth":10,"board":[2,4,5,9,11],"bogu":5,"boil":3,"bookworm":4,"bool":7,"boot":[2,10],"bootstrap":[4,5,10],"bootstrap_onli":[2,5],"both":[0,2,3,5,6,7,9,10,11],"bounc":2,"boundari":[5,9],"box":3,"break":[2,7,9,11],"breath":2,"breviti":10,"bridg":[3,4,5],"briefli":[3,9],"bring":[5,10],"brittl":2,"broad":[2,3],"broadcast":[2,4,5,7,9,10],"broadcast_destin":0,"broadcastloop":0,"broader":9,"broken":2,"brought":[5,10],"browser":2,"buffer":[4,5,7,11],"bufferedread":7,"bufferedrwpair":7,"bufferedwrit":7,"bufferexampl":0,"bug":11,"build":[0,3,4,5,9,11],"built":[2,5,9,10,11],"bundl":0,"bureaucrat":11,"burst":5,"bw":10,"byte":[0,7,9,10,11],"bytes":0,"c":[0,6,10],"c50cc4e4f7838b6c31f60ab9032cbc62":10,"c89b4da064bf66d280f0e4d8abfd9806":10,"cabl":[5,6],"cach":[5,10],"calcul":[7,9,10],"call":[0,6,7,9,11],"callabl":[0,7],"callback":[0,7],"callsign":5,"can":[0,2,3,4,5,6,7,8,9,10],"cancel":7,"candid":6,"cannot":[0,2,5,11],"cap":5,"capabl":[0,5,9],"capac":[2,3,5,7,9],"carambola":0,"care":[2,7,10,11],"carefulli":2,"cargo_build_target":2,"carri":[5,7,9,10,11],"carrier":[6,11],"case":[0,2,3,5,6,9,10],"cat":10,"categori":3,"caus":[2,5],"caution":5,"caveat":4,"cb":[7,9],"cb127015e13aa6ea1e0a606cdc9123d0":[],"cbc":[9,11],"cd":[],"cdma":5,"censor":[9,10],"censorship":[9,11],"central":[2,3,5,6,9,10],"centralis":9,"certain":[0,5,6,8,9,10],"chain":5,"challeng":[2,9],"chanc":3,"chang":[0,2,5,7,9,10,11],"channel":[2,4,5,6,7,8,9,11],"channelarg":0,"channelexampl":0,"chapter":[2,3,5,6,7,9,10,11],"charact":[0,5],"characterist":[5,9],"charter":9,"cheap":[3,5,9],"cheapli":2,"check":[0,2,7,9,10],"checksum":[7,11],"choic":2,"choos":[0,2,5,9],"chose":9,"chosen":[6,9],"chunk":0,"cific":5,"ciphertext":7,"ciphertext_token":7,"circumst":[8,9],"cl":0,"claim":9,"class":[0,6,7,11],"clear":[0,5,7,9,10],"clear_default_app_data":7,"clear_screen":0,"client":[0,2,3,4,7,10],"client_buffer_readi":0,"client_connect":0,"client_disconnect":0,"client_ident":0,"client_loop":0,"client_message_receiv":0,"client_packet_receiv":0,"client_request":0,"clone":9,"close":[0,6,7,10],"closed_callback":7,"closer":9,"closest":9,"cloud":5,"cluster":9,"co":[3,5,11],"code":[2,3,4,5,10],"codingr":5,"collabor":9,"collaps":2,"collect":8,"com":[0,8],"combin":[2,4,6,9],"come":[2,5,9],"comma":[5,10],"command":[0,2,5,10],"comment":[5,10],"commis":2,"commit":2,"common":[0,2,3,4,6,9,10,11],"commonli":[3,5],"commun":[0,2,4,5,6,7,8,9,10,11],"communica":5,"compat":[0,2,3,5,7,9,10],"compil":2,"complet":[0,2,3,5,6,7,9,10,11],"complex":[2,5,9],"compon":[3,8,9],"compos":9,"comprehens":[],"compress":[0,7,9,10,11],"compromis":9,"comput":[2,5,9,11],"computation":[5,10],"concaten":7,"conceiv":[2,3],"concept":[4,9,10],"conceptu":4,"concert":9,"conclud":[0,7],"concurr":[3,9,10],"condit":[2,9,11],"conf":2,"config":[0,2,5,6,10],"configarg":0,"configdir":7,"configpath":0,"configur":[0,2,3,4,6,7,9,11],"configuraion":3,"configure_devic":0,"confirm":[9,11],"conflict":2,"confus":[3,9],"congest":9,"conjunct":5,"connect":[0,3,4,6,7,9,10,11],"consequ":9,"conserv":5,"consid":[0,2,5,7,9,10,11],"consider":[4,9],"consist":9,"consol":10,"constant":7,"constantli":9,"constitut":9,"constrain":7,"construct":[9,11],"constructor":0,"consum":7,"contact":9,"contain":[0,5,6,7,9,10],"contend":9,"content":[0,2,6,10],"context":[2,9,10],"contin":0,"continu":[5,7,8,10,11],"contribut":4,"control":[0,2,3,4,6,7,9,10,11],"convei":0,"conveni":[0,10],"convent":0,"converg":[2,4,9],"convers":9,"cook":2,"coordin":[5,6,7,9,11],"copi":10,"core":[6,9,10,11],"correct":[0,5,9],"correctli":0,"correspond":9,"cost":[3,5,9,11],"could":[0,2,5,6,7,9,10,11],"count":9,"counter":0,"coupl":[],"cours":[2,5,9],"cover":[2,3,9,11],"coverag":6,"cpu":[0,5,9],"cpuinfo":10,"cr":10,"creat":[0,4,5,6,7,10,11],"create_bidirectional_buff":[0,7],"create_kei":7,"create_read":7,"create_receipt":[0,7],"create_writ":7,"creation":[9,10,11],"creator":9,"credenti":[5,9],"critic":[9,10],"cross":5,"cryptograph":[2,4,5,6,10,11],"cryptographi":[2,9,11],"ctrl":0,"cull":7,"current":[0,2,4,5,7,10],"current_download":0,"current_filenam":0,"current_ratchet_id":7,"curv":[6,7,9,11],"curve25519":[6,7,9,11],"custom":[3,4,7,9,11],"custom_network_nam":5,"customis":5,"d":[6,10],"d56a4fa02c0a77b3575935aedd90bdb2":10,"daemon":[0,2,5,7,10],"dai":[6,7],"data":[0,2,3,4,5,6,7,9,11],"data_buff":0,"data_port":5,"databas":10,"databit":[0,5,10],"datacent":2,"datar":5,"date":[0,2,10],"datetim":0,"db":[0,10],"dbm":[0,5,10],"de":2,"debian":[4,9,10],"debug":[2,10],"decad":3,"decentr":[2,5,10],"decentralis":11,"decid":[5,6,7,9],"decim":5,"decis":[5,9],"declar":9,"decod":[0,5,10],"decreas":10,"decrypt":[5,7,9,10],"dedic":[5,9],"deep":2,"deepli":[],"def":0,"default":[0,2,3,5,6,7,9,10],"default_ifac_s":0,"defin":[0,5,7,9,10],"definit":[0,2,9,10],"defunct":10,"degrad":6,"degre":5,"delai":[2,5,9,10],"deleg":9,"delimit":0,"deliv":[0,2,7],"deliveri":[0,2,7,11],"demand":7,"demonstr":[0,2,5],"depend":[0,3,4,5,6,7,9,10],"deploi":9,"deregist":7,"deregister_announce_handl":7,"deregister_request_handl":7,"deriv":[2,7,9,11],"describ":[3,5,7,9],"descript":[0,10],"descriptor":0,"deseri":0,"deserializ":0,"design":[2,3,5,6,9,10,11],"desir":[0,3,5,9],"desktop":5,"dest_len":0,"destin":[0,2,4,6,7,10],"destination_1":0,"destination_2":0,"destination_clos":0,"destination_hash":[0,7,10],"destination_hexhash":0,"detach":5,"detail":[0,2,4,5,7,10,11],"detect":0,"determin":[2,7,9],"detriment":10,"dev":[0,2,5,10],"devel":2,"develop":[3,4,7,8,9,11],"devic":[0,2,4,5,6,7,9,10],"dh":7,"dhcp":[3,5,10],"dict":0,"dictat":10,"dictionari":10,"did":0,"differ":[0,2,3,5,6,7,9,10,11],"diffi":[6,9],"difficult":[2,3,10],"difficulti":[5,10],"digit":[2,3,9,11],"dir":0,"dire":3,"direct":[0,2,3,6,7,9,10],"direction":9,"directli":[2,3,5,7,9,10,11],"directori":[0,2,5,10],"disabl":[5,9,10],"disappear":[5,10],"disassoci":9,"discard":[2,7,9],"disconnect":[0,5],"discov":[2,4,5,7,9],"discover":[2,4,10],"discover_interfac":10,"discoverable_nam":[],"discoveri":[2,4,7,9,10],"discovery_bandwidth":5,"discovery_encrypt":5,"discovery_frequ":5,"discovery_modul":5,"discovery_nam":5,"discovery_port":5,"discovery_scop":5,"discovery_stamp_valu":5,"discrimin":6,"discuss":[2,3,9],"disk":[0,7,10],"displai":[0,5,9,10],"disrupt":5,"dissolv":6,"distanc":[3,9,10],"distant":[2,7,9],"distinct":[5,9],"distinguish":9,"distribut":[0,2,6,7,9,10,11],"disucss":[],"dive":2,"divid":7,"divmod":0,"dn":[3,5],"dnf":2,"do":[0,2,3,5,7,9,10,11],"document":[2,7,9,10],"doe":[0,2,3,4,5,6,7,9,10],"doesn":5,"domain":[2,5,9,10],"don":[0,2,6,7,9,10],"donat":4,"done":[0,2,5,6,9,10],"dori":6,"dot":[9,10],"doubt":2,"dowload":2,"down":[0,3,5,7,10],"download":[0,2,5,10],"download_began":0,"download_conclud":0,"download_finish":0,"download_start":0,"download_tim":0,"downstream":10,"drastic":10,"driver":[10,11],"droid":2,"drop":[5,7,9,10],"dsrdtr":0,"dual":[3,10],"dublin":10,"due":[0,6],"dump":10,"duplex":[9,11],"durat":10,"dynam":[2,5,10],"dysfunct":8,"e":[0,6,10],"e5c032d3ec4e64a6aca9927ba8ab73336780f6d71790":10,"e702c42ba8":10,"e7536ee90bd4a440e130490b87a25124":10,"each":[0,2,5,6,7,9,10],"earlier":9,"eas":[5,9],"easi":[2,3,5,9,10,11],"easier":[2,5,6,10,11],"easiest":[2,3,5,9],"easili":[2,5,6,9,10,11],"eastern":9,"ecdh":[9,11],"echo":4,"echo_destin":0,"echo_request":0,"ecosystem":[2,5,9,10],"ed25519":[9,11],"edit":[2,10],"eeprom":10,"effect":[5,9,10],"effici":[0,2,5,7,9,10,11],"effort":3,"eg":10,"ei":0,"either":[2,3,6,7,9,10],"elaps":5,"elif":0,"ellipt":[6,7,9,11],"els":[0,2,6,9,11],"elsewher":2,"embed":3,"emerg":[],"emploi":[3,9],"empow":11,"empti":0,"emptor":4,"emul":2,"enabl":[0,2,3,4,6,7,9,10,11],"enable_ratchet":7,"enable_remote_manag":10,"enable_transport":[5,9,10],"encapsul":[5,11],"encod":[0,7,10],"encount":2,"encourag":2,"encrypt":[0,2,5,6,7,9,10,11],"encrypted_mdu":7,"end":[0,5,6,7,9,11],"endless":5,"endpoint":[0,6,7,9],"energi":2,"enforc":[5,7,9,10],"enforce_ratchet":7,"engin":2,"enhanc":9,"enough":[2,3,9],"ensur":[0,2,5,7,9,10,11],"ensurepath":2,"enter":[0,10],"entir":[0,2,6,7,9,10],"entiti":[9,10],"entri":[0,2,9,10],"entrypoint":[4,5,10],"enumer":0,"envelop":7,"environ":[2,5,6,9],"environment":9,"environmentlogg":9,"eof":5,"ephemer":[6,7,9,11],"epub":4,"equal":[6,7,9],"equip":[5,6,9],"equival":5,"error":[0,2,5,8,10],"esc":0,"esc_mask":0,"escap":0,"esp32":3,"especi":[2,3,5],"essenti":[2,5,9,10],"establish":[0,2,5,6,7,10,11],"established_callback":7,"establishment_timeout_per_hop":7,"etc":10,"eth0":5,"eth1":5,"ethereum":8,"ethernet":[2,4,5,6,9,11],"even":[0,2,5,6,7,9,10,11],"event":5,"eventu":7,"ever":9,"everi":[0,2,5,6,7,9,10],"everydai":2,"everyon":[2,6,9],"everyth":[0,6,9],"evolv":[6,9],"exact":[3,5,9],"exactli":[7,9],"exampl":[2,3,4,7,9,10,11],"example_util":0,"exampleannouncehandl":0,"exampleconfig":[2,10],"exampleinterfac":0,"exce":[0,5,7],"except":[0,5,7],"excess":[5,10],"exchang":[6,7,9,11],"exclud":[7,9],"exclus":2,"execstart":10,"execstartpr":10,"execut":[0,2,5,7,10],"exhaust":[3,9,10],"exist":[0,2,3,5,9,10,11],"exit":[0,5,7,10],"expand":[9,11],"expand_nam":7,"expect":[0,5,7,9,10],"expens":[3,5],"experi":[2,9],"experienc":0,"experiment":[2,11],"expir":5,"expiri":[5,7],"explain":[3,7],"explan":[9,10],"explicit":7,"explicitli":[5,9,10],"explor":[0,9,11],"export":[2,10],"expos":[5,7,10],"exposur":5,"extend":[0,7],"extens":[5,11],"extern":[0,2,5,7,10,11],"extra":[2,5,6,10],"extract":10,"extrem":[2,9,10,11],"f":[0,2,10],"f4":5,"f53a1c4278e0726bb73fcc623d6ce763":10,"face":[2,5],"facilit":[2,9],"fact":[2,5,11],"factor":[5,7,10],"fail":[0,2,5,7],"failed_callback":[0,7],"failur":[2,5,7],"fake":10,"fals":[0,5,7],"famili":2,"far":[2,6,9],"fashion":8,"fast":[4,5,7,9],"faster":[2,5,9],"fastest":[5,9],"favor":2,"fe80":2,"featur":[2,5,7,8,9,11],"feder":[9,10],"fedora":2,"feed":[2,7],"feedback":[0,4],"feel":2,"fernet":9,"fetch":[5,10],"few":[2,3,5,6,9,10,11],"fewer":7,"ff":10,"fi":8,"fiber":3,"fibr":11,"field":9,"file":[0,2,3,5,6,7,9,10,11],"file_resourc":0,"file_s":0,"filelist":0,"filelist_data":0,"filelist_receiv":0,"filelist_timeout_job":0,"filenam":0,"filetransf":[4,7],"filter":[0,6,9,10],"final":[0,7,9],"find":[4,5,6,9,10],"find_spec":0,"fine":5,"firewal":[2,5],"firmwar":[2,3,9,10],"firmware_hash":10,"first":[0,2,5,7,9,10],"fit":0,"five":0,"fix":[4,9],"fixed_mtu":5,"flag":[0,2,7,9,10],"flash":10,"fleet":9,"flexibl":[2,3,5,11],"fli":9,"flight":7,"float":[0,7],"flood":[5,10],"flow":[0,2,5,6,9],"flow_control":5,"flush":0,"focu":10,"focus":9,"folder":0,"follow":[0,2,3,5,7,8,9,10,11],"forc":[0,10],"forcibli":[7,10],"foreground":2,"foremost":11,"forget":10,"form":[2,5,6,7,9,10],"format":[0,4,10,11],"forth":0,"forum":[],"forward":[5,7,9,11],"forward_ip":5,"forward_port":5,"found":[0,2,5,6,7,9,10],"foundat":[9,11],"four":6,"frame":[0,5],"free":[2,6,8,11],"freedom":9,"freedv":3,"freeli":9,"freq":10,"frequenc":[2,3,5,9,10],"frequent":5,"friend":2,"friendli":2,"from":[0,2,3,5,6,7,9,10,11],"from_byt":7,"from_fil":7,"from_identity_hash":7,"fromhex":0,"front":9,"fruit":0,"fsk":[],"ftdi_ft230x_basic_uart_43891ckm":10,"full":[0,2,5,7,9,10,11],"full_hash":7,"full_nam":[7,10],"fulli":[0,2,3,5,9,10,11],"funcion":7,"function":[0,2,3,4,5,6,7,8,10,11],"fundament":[3,9,10],"further":[2,4,5],"futur":[4,6,7,10],"fw":10,"g":[0,9,10],"ga":0,"gain":[2,3,7,9],"galact":9,"gap":2,"gatekeep":9,"gatewai":[0,2,5,6,9,10],"gbp":10,"gener":[0,2,3,5,6,7,9,10,11],"generalis":11,"genuin":10,"geograph":[2,5,6],"get":[0,3,4,5,7,10,11],"get_ag":7,"get_channel":[0,7],"get_config_obj":0,"get_data_s":7,"get_establishment_r":7,"get_expected_r":7,"get_external_ip":5,"get_hash":7,"get_inst":7,"get_mdu":7,"get_mod":7,"get_mtu":7,"get_packet_rssi":0,"get_packet_snr":0,"get_part":7,"get_private_kei":7,"get_progress":[0,7],"get_public_kei":7,"get_q":7,"get_random_hash":[0,7],"get_remote_ident":[0,7],"get_request_id":7,"get_respons":7,"get_response_tim":7,"get_rssi":7,"get_rtt":[0,7],"get_seg":7,"get_snr":7,"get_statu":7,"get_transfer_s":7,"geti2p":5,"ghz":9,"gi":0,"gigabyt":11,"git":[],"github":[0,2,8],"give":[2,5,9,10],"given":[5,6,7,9,10],"global":[0,4,5,6,7,9,10,11],"glue":3,"go":[0,5,9],"goal":[2,4,5],"goe":2,"good":[2,3,6,9,10],"got":0,"got_respons":0,"govern":9,"grace":7,"gracefulli":5,"grant":10,"grape":0,"graphic":2,"gratefulli":8,"great":[2,9],"greater":[7,9,10,11],"greatli":[2,5],"group":[5,7,9],"group_id":5,"groupinstal":2,"grow":[2,6],"grown":2,"growth":[2,4],"guarante":9,"guess":5,"guid":[2,3,9],"guidelin":2,"gw":5,"h":10,"ha":[0,2,3,5,6,7,9,11],"hack":11,"had":9,"half":[9,11],"hand":0,"handheld":9,"handl":[0,2,3,5,6,7,9,10,11],"handler":[0,7,10],"happen":[0,2,7,9],"hard":[2,3],"hardcod":2,"hardlin":6,"hardwar":[0,2,4,5,6,7,9,10,11],"has_path":[0,7],"hasattr":0,"hash":[0,7,9,10],"hash1":9,"hash2":9,"hash_from_name_and_ident":7,"hashlib":9,"hashmap":0,"have":[0,2,3,5,6,7,9,10],"hazard":7,"hdlc":0,"head":2,"header":[0,5,7,9],"header_1":9,"header_2":9,"health":4,"hear":9,"heard":[7,9,10],"height":5,"held":[5,10],"helium":0,"hellman":[6,9],"help":[0,2,6,8,9,10,11],"helper":0,"her":6,"here":[0,2,5,9,10],"heterogen":11,"hex":[0,10],"hexadecim":[0,9,10],"hexbyt":10,"hidden":10,"hide":2,"hierarch":11,"high":[2,3,5,9,10,11],"higher":[5,6,11],"highest":7,"highli":[2,5,9],"hill":6,"hint":0,"hit":0,"hkdf":9,"hmac":[9,11],"hoc":11,"hold":[5,7,9],"home":[2,6,10],"homebrew":5,"hop":[5,6,7,9,10,11],"hops_to":7,"host":[0,4,5,9,10],"hostnam":5,"hour":[0,5,10],"hous":2,"how":[0,2,3,5,6,9,10,11],"howev":[2,5,6,9],"http":[0,8],"hub":[2,5,10],"human":[0,5,7,8,9],"hundr":2,"hungri":3,"hw_mtu":0,"hwrev":10,"hygien":10,"hz":[5,10],"i":[0,2,3,4,5,6,7,8,9,10],"i2p":[2,4,11],"i2p_tunnel":5,"i2pd":[2,5],"i2pinterfac":[2,5],"ia":10,"ic":3,"ic_burst_freq":5,"ic_burst_freq_new":5,"ic_burst_hold":5,"ic_burst_penalti":5,"ic_held_release_interv":5,"ic_max_held_announc":5,"ic_new_tim":5,"id":[5,7,9,10],"id_callsign":5,"id_interv":5,"idea":[2,9,10],"ideal":11,"ident":[0,2,4,5,7,10,11],"identif":[4,5,11],"identifi":[0,5,7,9,10],"identifyexampl":0,"identity_data":10,"ie":10,"if00":10,"ifac":[0,2,5,9,10],"ifac_s":5,"ifconf":0,"ifconfig":10,"ignor":[5,7,9,10],"ignored_devic":5,"illustr":[0,5,6,9],"immedi":[5,10],"impact":[5,7,9],"implement":[0,5,6,7,8,9,11],"implic":[4,5],"implicit":[7,9],"implicitli":10,"import":[0,2,3,5,6,7,8,9,10],"importlib":0,"imposs":9,"impract":10,"improv":[2,4,5,8],"in_fram":0,"in_wait":0,"inactive_for":7,"inadvert":10,"inbound":[0,5,7],"includ":[0,3,4,5,7,9,11],"incom":[0,5,7,10],"incompat":[7,9],"increas":[5,7,10],"incur":5,"indefinit":10,"independ":[7,9,11],"index":[0,2,4],"indic":[0,7],"indirectli":9,"individu":[2,5,7,9,10,11],"inevit":[2,9],"infer":9,"influx":5,"info":[7,9,10],"inform":[0,2,4,5,6,7,9,10],"infrastructur":[3,4,5,6,9,10],"ingo":7,"ingress":[0,5],"ingress_control":5,"init":2,"initi":[0,5,6,7,9,11],"initialis":[0,7,10],"input":[0,10],"insert":9,"insid":9,"inspect":[2,5,6,9,10],"instal":[0,4,5,6,9,10,11],"instanc":[0,4,5,7,9,10],"instance_control_port":10,"instance_nam":10,"instanti":7,"instantli":10,"instead":[0,2,5,7,9,10],"instruct":2,"int":[0,7],"integ":[0,7],"integr":[2,6,9,10],"intend":[2,5,6,9,10],"intens":10,"intention":9,"inter":[7,9],"inter_byte_timeout":0,"interact":[0,2,7,9,10],"interchang":5,"interconnect":[4,5,9],"interest":[2,9],"interfac":[3,4,6,7],"interface_class":0,"interface_discovery_sourc":[7,10],"interface_en":10,"interfer":10,"intermediari":[5,7,9],"intermitt":5,"intern":[0,5,7,9],"internal_1":5,"internet":[4,5,9,10,11],"interoper":[2,3,6,9,11],"interrupt":5,"interv":[5,7,10],"intervent":10,"intiat":0,"intrefac":[],"introduc":9,"introduct":4,"intuit":11,"invalid":[0,7],"invers":9,"investig":6,"invis":[2,5],"invit":5,"involv":6,"io":3,"ioerror":0,"iot":3,"ip":[2,3,5,9,10,11],"ipsum":[],"ipv4":5,"ipv6":[2,5,10],"is_compress":7,"is_connected_to_shared_inst":0,"is_open":0,"is_path_respons":7,"is_ready_to_send":[0,7],"isdir":0,"isfil":0,"isinst":0,"island":6,"ism":[3,9],"isol":[2,5,10],"isp":5,"issu":[4,5,6,8],"its":[3,5,7,9,10],"itself":[2,4,9,10],"iv":[9,11],"j":10,"jail":10,"job":0,"join":[0,2,6,8,9],"json":10,"just":[0,2,3,5,6,9,11],"k":[0,10],"kb":10,"kbp":10,"keep":[0,2,6,7,9,10,11],"keepal":[7,9],"keepalive_timeout_factor":7,"kei":[0,4,5,6,7,10,11],"kept":[5,6,7,9],"kernel":[5,10,11],"keyboardinterrupt":0,"keyerror":7,"keypair":9,"keyset":[9,10,11],"keysiz":7,"keystor":6,"khz":5,"ki":0,"kill":[7,9],"kind":[3,5,6,9],"kiss":[3,4,10,11],"kiss_fram":5,"kissinterfac":[5,10],"know":[0,2,3,5,6,7,9],"knowledg":[6,9],"known":[0,5,7,9,10],"ko":8,"krypton":0,"l":[5,10],"lack":9,"laid":9,"lan":5,"larg":[0,3,5,6,7,9,10,11],"larger":[6,9,10],"laser":5,"last":[0,5,7,10],"last_read_m":0,"last_unit":0,"latenc":[2,9,11],"later":[0,2,5,10],"latest":[0,2,5,7,10],"latest_buff":0,"latest_client_link":0,"latitud":5,"laucnh":2,"launch":[2,10],"layer":[3,5,6,7,9,10,11],"lead":[2,9],"leak":2,"learn":[0,2,8,9],"least":[2,3,5,9,10,11],"leav":[2,6,9],"ledger":9,"left":[5,7,9,10],"legaci":6,"legal":5,"legisl":5,"legitim":[2,10],"len":0,"length":[0,5,7,9],"less":[0,2,3,5,7,9,11],"let":[0,2,5,6,9,10],"level":[3,5,9,10],"liber":3,"liberapai":8,"libffi":2,"librari":2,"licens":9,"lift":10,"light":10,"lightweight":11,"like":[0,2,3,5,6,7,9,10,11],"limit":[0,2,3,4,6,9],"line":[0,2,4,5,6,9,10,11],"linger":10,"link":[2,3,4,5,6,7,10,11],"link_clos":0,"link_establish":0,"link_id":[0,7],"link_mtu_discoveri":7,"linkexampl":0,"linux":[2,3,5,9],"list":[0,2,3,4,5,7,9,11],"list_deliv":0,"list_fil":0,"list_filt":10,"list_packet":0,"list_receipt":0,"list_timeout":0,"listdir":0,"listen":[0,2,4,9,10],"listen_ip":5,"listen_on":[2,5],"listen_port":5,"littl":[3,9],"live":[2,7],"lki":9,"lkr":9,"ll":[0,11],"ln":10,"load":[0,2,3,5,7,10,11],"load_private_kei":7,"load_public_kei":7,"local":[0,2,4,5,6,7,9,11],"locat":[2,5,6,9,10],"log":[0,2,5,10],"log_crit":0,"log_error":0,"log_info":0,"log_verbos":0,"logdest":7,"logic":9,"loginctl":10,"loglevel":[0,7,10],"long":[0,2,3,5,7,9,10],"longer":[0,2,6,9,10],"longest":5,"longitud":5,"look":[0,2,5,9,10],"loop":0,"lora":[2,3,4,9,11],"lorawan":[3,9],"lorem":[],"loss":[5,9],"lot":9,"low":[2,3,5,6,9,11],"lower":[0,2,5,10],"ltu":3,"lunar":4,"lxmf":[2,5,7,10],"m":[0,2,9,10],"mac":[5,9],"machin":[2,9,10],"maco":4,"made":[2,5,7,9],"mai":[2,5,7,9,10],"main":0,"mainli":6,"maintain":[2,9,10],"mainten":9,"make":[0,2,3,5,8,9,10,11],"malici":[2,9,10],"manag":[2,4,6,7,9,11],"mani":[0,2,3,5,6,7,9,10,11],"manipul":[9,11],"manjaro":2,"manner":6,"manual":[0,2,5,6,7,9,10],"manufactur":[3,5],"map":[5,9,10],"mark":[2,7,9],"markqvist":[0,8],"master":[0,7],"match":[0,5,9,10],"matter":[2,5],"matur":10,"max":10,"max_autoconnected_interfac":[],"maximum":[0,5,7,9,10],"mbp":10,"mdu":[0,7],"mean":[2,3,5,6,7,9,10],"meaning":2,"meantim":7,"measur":9,"mechan":[2,4,5,10,11],"medium":[0,3,5,6,7,9,11],"member":[2,6,9],"memori":[2,9],"mention":[5,9],"menu":0,"menu_mod":0,"mere":[],"merg":10,"mesh":[2,5,6,9,10,11],"meshchat":4,"messag":[0,2,7,9,10],"message_class":7,"messagebas":[0,4,7],"messagecallbacktyp":7,"messeng":9,"met":2,"metadata":[2,5,9,10],"metavar":0,"meter":5,"meth":0,"method":[0,2,5,7,9],"methodologi":[9,10],"mevpekyafshak5wr":5,"mhz":[5,9],"mi":0,"microcontrol":9,"might":[2,5,6,9,10],"mikrotik":3,"millimet":3,"millisecond":[0,10],"mind":[6,11],"minim":[3,4,9],"minimalsampl":0,"minimum":[0,5,6,7,9,10],"minimum_bitr":7,"minor":[],"minut":[0,2,5,9],"mirror":10,"misconfigur":2,"mislead":2,"miss":[0,2],"mistak":2,"mix":[4,5,6,10],"mixtur":11,"mobil":[5,9],"mode":[0,2,3,4,7,9,10,11],"model":10,"modem":[4,5,6,7,9,11],"moder":5,"modern":[2,3],"modifi":[5,9,10],"modul":[0,2,3,5,9,10,11],"moment":9,"momentarili":5,"monero":8,"monitor":[2,5,9,10],"moon":0,"more":[0,2,3,5,6,7,9,10,11],"most":[2,3,5,6,7,9,10],"mostli":[5,6,9],"motiv":4,"move":[5,9,10],"msgtype":[0,7],"mtu":[0,5,7,9,11],"much":[2,5,6,9,10,11],"multi":[4,9,10,11],"multicast":5,"multicast_address_typ":5,"multilater":9,"multipl":[0,5,6,9,10],"multiplex":0,"multipoint":9,"multitud":2,"must":[0,2,5,6,7,9,10],"mw":5,"my":[5,9],"my_fil":10,"my_ident":10,"my_network":[9,10],"my_network_ident":5,"mycal":5,"myriad":9,"n":[0,9,10],"name":[0,2,4,5,6,7],"namespac":0,"nano":[],"narg":0,"nat":[2,5],"nativ":0,"natur":5,"nearbi":5,"nearest":5,"nears":9,"neccessari":5,"necesarri":5,"necessari":[3,5,6,7,9],"necessarili":9,"need":[0,2,3,4,5,6,7,9,10,11],"neg":2,"neglig":9,"neither":[7,9],"neon":0,"neopixel":10,"net":5,"netcat":5,"network":[0,3,5,7,10,11],"network_ident":[5,9,10],"network_nam":[2,5],"never":[5,7,9],"new":[0,2,4,6,7,9,10],"new_id":10,"new_ident":10,"newer":[7,9],"newest":9,"newli":[5,6,7,9],"newlin":5,"next":[2,5,6,7,9],"next_hop":7,"next_hop_interfac":7,"nicknam":9,"no1cll":5,"no_data_for":7,"no_inbound_for":7,"no_outbound_for":7,"noauth":10,"nobl":0,"noble_ga":0,"noble_gas":0,"nocheck":10,"node":[2,4,5,6,10,11],"noid":10,"nois":7,"nomad":4,"nomadnet":2,"non":[2,7,9],"none":[0,2,5,7,9,10],"nor":2,"normal":[0,2,5,7,9,10],"notat":[9,10],"note":[0,3,4,5,7,9,10],"noth":[3,11],"notic":[5,9,10],"notif":[0,7],"now":[0,2,6,9,10],"np":10,"nrf52":3,"nt":0,"num":0,"number":[0,2,5,6,7,9,10],"o":[0,2,5,9,10,11],"object":[0,7],"obscur":2,"obtain":[2,3,7,9],"obvious":9,"occasion":[],"occur":[0,5,10,11],"ocur":7,"odd":0,"off":[2,5,9,10,11],"offer":[2,4,5,7,9,10],"offici":[],"offlin":[0,2],"often":[2,5,6,9,10],"oganesson":0,"old":[0,2,3,8,9],"older":10,"omit":7,"on_interfac":7,"onc":[0,2,3,5,6,7,9,10,11],"one":[0,2,3,5,6,7,9,10,11],"ones":[2,5,10],"oneself":9,"onli":[0,2,3,5,6,7,9,10,11],"onlin":[0,10],"onto":[2,9],"open":[0,2,3,5,6,7,8,9,10,11],"open_port":0,"openmodem":[5,11],"openssl":[2,9],"openwrt":4,"oper":[2,3,5,6,7,9,10,11],"opkg":2,"opposit":[0,5],"opt":9,"optic":[3,11],"optim":[2,6],"option":[0,2,3,4,6,7,9,10],"ord":0,"order":[0,7,10],"organ":[2,6,9,10],"organis":[5,6,8],"orient":9,"origin":[0,6,9],"os":2,"other":[0,2,3,5,6,7,9,10],"otherwis":[0,7],"our":[0,5,9],"out":[0,2,3,5,6,7,9,10,11],"outbound":[7,9],"outgo":[0,5,7,9,10],"outli":6,"outlier":6,"outlin":[2,3,9],"output":[5,10],"outsid":[7,11],"over":[0,3,4,5,7,9,10,11],"overal":[9,10],"overcom":9,"overhead":[2,3,5,9,10],"overlai":2,"overrid":0,"oversight":9,"overview":[4,5],"overwhelm":[5,7],"overwrit":10,"own":[0,2,6,7,9,10,11],"owner":0,"p":[0,10],"pack":[0,7],"packag":[0,2,5,9],"packb":0,"packed_s":0,"packet":[0,2,4,5,6,7,10,11],"packet_callback":0,"packet_deliv":0,"packet_hash":0,"packet_receipt":[0,7],"packet_timed_out":0,"packetreceipt":[0,4,7],"pad":[9,11],"page":[2,4,9,10],"pair":[5,7,9,10],"pamac":2,"panic":[0,10],"panic_on_interface_error":[0,10],"paper":2,"par":[0,2],"paradigm":[],"parallel":2,"param":0,"paramet":[0,3,4,6,7,9,10],"pariti":[0,5,10],"parity_even":0,"parity_non":0,"parity_odd":0,"pars":0,"parse_arg":0,"parser":0,"part":[0,2,5,6,7,9,10],"particip":[2,4,5,6,9,10],"particular":[0,3,5,9,10],"particularli":[5,10],"pass":[0,3,5,6,7,9,10],"passphras":[2,5,9],"passport":9,"past":10,"path":[0,2,3,5,7,9,10],"path_respons":7,"pathfinder_m":7,"pattern":[3,9],"payload":[0,5,7,9,10],"pdf":4,"peach":0,"peer":[0,2,5,7,9,10],"penalti":5,"pend":[0,9],"peopl":[2,9],"per":[5,7,9,10,11],"percent":[0,5],"percentag":7,"perfectli":2,"perform":[0,2,5,6,7,9,10],"perhap":2,"period":[0,5,7,9,10],"perman":[2,5,10],"permiss":5,"permissionless":[9,10],"persecut":9,"persist":[5,10],"person":[4,5,9],"perspect":[5,7,9,11],"pet":0,"philosophi":9,"phone":2,"phy":10,"physic":[0,2,3,5,7,9,10,11],"pi":[0,4,6,9,10,11],"pick":9,"piec":9,"ping":10,"pip":[0,2,3,5,10],"pip3":2,"pipe":[2,4,11],"pipeinterfac":[3,5],"pipx":2,"pitfal":9,"pkcs7":[9,11],"pkg":2,"place":[0,2,5,6,9,10],"plaform":3,"plain":[0,3,5,7,9],"plain_mdu":7,"plaintext":[0,7],"plan":[6,9],"planetari":11,"platform":[0,3,4,9,10],"pleas":[0,2,5,7,10,11],"plenti":9,"plug":10,"pmr":9,"point":[2,3,5,6,9,10],"pointer":2,"polici":10,"pomelo":0,"poorli":6,"popul":7,"popular":11,"port":[0,2,3,4,5,6,9,11],"port0":10,"portabl":[5,9],"pose":[2,9],"posit":[0,10],"posix":2,"possess":[5,9],"possibl":[2,3,5,6,7,9,10,11],"possibli":[2,9],"post":0,"postfix":10,"potenti":[0,2,5,8,9,10,11],"power":[2,3,5,9,10,11],"powershel":2,"ppp":0,"practic":[2,9,11],"pre":[2,7,9],"preambl":[5,10],"preced":0,"precompil":2,"predict":9,"prefer":[2,9],"prefer_ipv6":5,"prepar":[0,6,9],"prerequisit":7,"presenc":[5,7],"present":[5,9,10],"preserv":[2,7],"preshar":9,"press":0,"pretend":9,"pretti":9,"prettyhexrep":0,"prevent":[5,10],"previou":0,"previous":[5,6,7,9],"primari":9,"primarili":5,"primit":[2,4],"principl":[9,11],"print":[0,5,10],"print_filelist":0,"print_help":0,"print_menu":0,"priorit":9,"prioriti":9,"prioritis":[4,5,6,7],"privaci":[2,5,11],"privat":[2,5,7,8,9,10,11],"private_ret":2,"privileg":10,"probabl":[0,2,6,9,10,11],"probe":10,"problem":[2,9,10],"proc":10,"procedur":[2,7,9],"process":[0,2,3,5,7,9,10],"process_incom":0,"process_outgo":0,"product":10,"program":[0,3,4,5,7,9,11],"program_setup":0,"programm":9,"programmat":9,"progress":[0,7,10,11],"progress_callback":7,"project":2,"promis":2,"prompt":[0,2],"proof":[0,5,7,9,10],"proof_packet":0,"proof_requested_callback":7,"proof_strategi":7,"propag":[4,5,7,10],"proper":2,"properli":2,"properti":[0,6,7],"proport":9,"propos":2,"protect":[2,10],"protocol":[2,3,4,5,11],"prove":[0,9],"prove_al":[0,7],"prove_app":7,"prove_non":7,"proven":[7,9],"provid":[0,2,3,4,5,6,7,9,10,11],"provis":[3,10],"proxim":[],"prv_byte":7,"pseudo":10,"pub_byt":7,"public":[0,4,5,7,10],"public_inform":0,"publicli":[2,5,9,10],"publish":[2,4,5,7,9],"publish_blackhol":10,"publish_blackhole_en":7,"publish_ifac":5,"pull":[],"purchas":[2,6,9,11],"pure":[4,9],"purg":7,"purpos":[2,3,5,7,9,10],"put":[0,3,5,10],"py":[0,9,10],"py3":2,"pyca":[2,9],"pyseri":[0,2],"python":[0,4,5,7,9,10,11],"python3":[0,2,3],"q":[0,10],"qr":2,"qualiti":[7,10],"quantiti":2,"quarter":2,"queri":[0,2,7,10],"question":[2,3,5],"queu":[7,10],"queue":[5,9],"quickli":[8,9,11],"quiet":[5,10],"quinc":0,"quirk":2,"quit":[0,2],"r":[0,5,9,10],"radio":[4,5,6,7,9,10,11],"radon":0,"rais":[0,7],"rak":3,"ram":[2,5],"randint":0,"random":[0,7,9],"random_text_gener":0,"randomis":9,"randomli":[0,9],"rang":[0,2,3,5,6,9,10,11],"rapidli":5,"rare":[2,5],"raspberri":[4,6,9,10,11],"rasperri":2,"ratchet":[7,9],"ratchet_count":7,"ratchet_expiri":7,"ratchet_id_receiv":7,"ratchet_interv":7,"ratchets":7,"ratchets_path":7,"rate":[0,4,7,10],"rather":[2,7],"ratio":7,"raw":[0,3,7],"rawchannelread":[4,7],"rawchannelwrit":[4,7],"rawiobas":7,"rb":0,"re":[0,5,7,9],"reach":[2,4,5,6,7,10],"reachabl":[0,2,5,6,7,9,10],"reachable_on":5,"read":[0,2,5,7,9,10],"read_loop":0,"readabl":[0,5,7,9,10],"reader":[0,7],"readi":[0,2,3,5,6,7,11],"readili":11,"ready_byt":[0,7],"ready_callback":7,"real":[2,3,6,11],"realiti":[2,8],"realli":[5,7],"reappear":5,"reason":[2,5,9,10],"reassembl":9,"reboot":2,"recal":[0,7,10],"recall_app_data":7,"recap":9,"receipt":[0,7,9],"receiv":[0,2,5,7,9,10],"receive_path_respons":7,"receive_stream_id":7,"received_announc":[0,7],"recent":[7,9],"recept":7,"reception_rssi":0,"reception_snr":0,"reception_stat":0,"recip":[],"recipi":9,"recogn":9,"recommend":[0,2,5,9],"recondit":10,"reconnect":0,"reconnect_port":0,"reconstruct":9,"record":[2,9],"recoveri":5,"recreat":9,"recurs":[7,9],"reduc":[5,10],"redund":[],"refer":[0,2,4,5,10],"refresh":10,"regain":2,"regard":9,"region":5,"regist":[0,7,10],"register_announce_handl":[0,7],"register_message_typ":[0,7],"register_request_handl":[0,7],"regul":5,"regular":10,"rel":[3,5,9],"relai":2,"relat":2,"relationship":[9,10],"releas":[2,5,7,9],"relev":[0,2,3,5,7,9,10],"reli":[2,5,8,9,10],"reliabl":[2,3,5,6,7,9,11],"relianc":2,"reload":10,"rem":0,"remain":[5,7,9],"rememb":[7,9],"remot":[0,4,7,9],"remote_ident":[0,7],"remote_identifi":0,"remote_management_allow":10,"remote_management_en":7,"remote_p":0,"remotesensor":9,"remov":[7,10],"remove_message_handl":7,"remove_ready_callback":7,"render":2,"repeat":[],"replac":[0,2,7,9,10],"repli":[0,10],"replic":[3,9],"reply_data":0,"reply_messag":0,"reply_text":0,"report":[5,7,8,10],"repositori":[2,8,9],"repres":9,"represent":[0,7],"repurpos":2,"reput":[9,10],"request":[4,5,7,9,10,11],"request_destin":0,"request_fail":0,"request_id":[0,7],"request_packet":0,"request_path":[0,7],"request_receipt":[0,7],"request_receiv":0,"requested_at":[0,7],"requestexampl":0,"requestor":5,"requestreceipt":[4,7],"requir":[0,2,5,6,7,9,10,11],"require_shared_inst":7,"required_discovery_valu":[7,10],"research":11,"resend":7,"reserv":[0,7],"resid":5,"resili":[2,10,11],"resolut":[2,5,9],"resolv":[4,5,9,10],"resourc":[0,2,4,5,7,8,10],"resource_callback":7,"resource_sending_conclud":0,"resource_strategi":7,"respawn":5,"respawn_delai":5,"respawn_interv":5,"respect":[5,11],"respond":[0,7,10],"respond_to_prob":10,"respons":[4,5,7,9,11],"response_callback":[0,7],"response_gener":[0,7],"rest":[6,11],"restart":[5,10],"restartsec":10,"restor":[2,5],"restrict":[5,6,10],"result":[0,2,5,9,10],"ret":[4,9],"retain":[5,7],"retained_ratchet":7,"reticulum":[0,5,6,7],"retransmiss":9,"retransmit":[5,9],"retri":[0,7,9],"retriev":[7,10],"return":[0,7,10],"reveal":[2,7,9,11],"revers":10,"review":[9,11],"revis":10,"rfe":10,"ridicul":9,"right":[2,5,6],"risc":4,"risk":9,"rmap":2,"rn":[0,2,3,7,9,10],"rncp":4,"rnid":[4,9],"rnode":[2,4,9,10,11],"rnodeconf":[3,4],"rnodef3b9":5,"rnodeinterfac":[2,3,5,10],"rnodemultiinterfac":5,"rnpath":[2,4,5],"rnprobe":[2,4],"rns_bin_dir":10,"rnsd":[2,4],"rnsh":[2,10],"rnspure":[2,9],"rnstatu":[2,4,5,9],"rnstransport":[5,10],"rnx":4,"roadmap":8,"roam":5,"robot":9,"robust":[2,5],"roll":5,"rom":10,"root":9,"rotat":[7,9,10],"round":[0,7,10],"rout":[2,3,5,6,7,9,10,11],"router":[2,5,10],"rpc":10,"rpc_kei":10,"rprogress":0,"rssi":[0,7,10],"rtsct":0,"rtt":[0,7,9],"rttstring":0,"rule":[2,4,5,10],"run":[0,2,3,5,6,7,9,10,11],"runtim":[0,9],"rust":2,"rx":[5,10],"rxb":0,"safe":9,"sai":2,"said":9,"same":[0,2,3,5,6,7,9,10],"sanction":[],"satisfi":9,"save":[7,9,10],"save_error":0,"saved_filenam":0,"scalabl":[10,11],"scale":[9,11],"scan":[2,5],"scenario":[2,4,5,9],"schedul":7,"scheme":[3,5],"scope":5,"scratch":3,"screen":0,"script":[2,3,5],"scrutini":9,"seamless":[5,9],"seamlessli":5,"search":[4,7],"second":[0,5,7,9,10,11],"secreci":[5,7,9,11],"secret":9,"section":[2,3,5,6,9,10],"secur":[2,4,9,10,11],"see":[0,2,5,6,7,9,10,11],"seek":9,"seen":[5,9],"segment":[0,2,5,6,7,9,10,11],"select":[0,2,5],"self":[0,2,6,9,11],"semtech":3,"send":[0,5,7,9,10],"send_stream_id":7,"sender":[0,2,6,9,10],"sensibl":[2,3,5],"sensor":9,"sent":[0,2,7,9,10],"sentiment":9,"separ":[0,2,5,6,9,10],"sequenc":[0,7,9,11],"sequenti":11,"seri":3,"serial":[0,2,4,9,11],"serialinterfac":[3,5],"serv":[0,3,5,6,9,10],"serve_path":0,"server":[0,2,3,4,7,9,10],"server_buffer_readi":0,"server_callback":0,"server_client_connect":0,"server_destin":0,"server_fil":0,"server_ident":0,"server_link":0,"server_loop":0,"server_message_receiv":0,"server_packet_receiv":0,"servic":[2,4,6,9],"session":[2,9],"set":[0,2,3,5,6,7,9,10,11],"set_default_app_data":7,"set_delivery_callback":[0,7],"set_link_closed_callback":[0,7],"set_link_established_callback":[0,7],"set_packet_callback":[0,7],"set_proof_requested_callback":7,"set_proof_strategi":[0,7],"set_ratchet_interv":7,"set_remote_identified_callback":[0,7],"set_resource_callback":7,"set_resource_concluded_callback":[0,7],"set_resource_started_callback":[0,7],"set_resource_strategi":[0,7],"set_retained_ratchet":7,"set_timeout":[0,7],"set_timeout_callback":[0,7],"setup":[0,2,4,5,10],"sever":[2,6,7,10],"sf":10,"sh":5,"sha":[7,9],"sha256":[9,11],"shall":9,"share":[0,2,6,7,9,10],"share_inst":10,"shared_instance_port":10,"shared_instance_typ":[7,10],"she":6,"shelf":[9,11],"shell":[4,10],"ship":[2,9],"shop":0,"short":[3,5,9,10],"shorter":5,"shorthand":[5,10],"shot":2,"should":[0,2,5,6,7,9,10,11],"should_ingress_limit":0,"should_quit":0,"should_use_implicit_proof":7,"show":[2,10],"shown":0,"side":[5,11],"sideband":[4,10],"sight":6,"sign":[5,7,9,10],"signal":[0,5,7,9],"signatur":[7,9,10,11],"signifi":9,"significantli":[5,7],"silent":10,"similar":[0,2,3,5,6,7,10,11],"simpl":[0,2,3,7,9,10,11],"simpler":[5,11],"simplest":[5,9],"simpli":[0,2,3,5,6,9,10],"simplic":9,"simplifi":0,"simplyequip":3,"simultan":[2,9],"sinc":[0,2,5,6,7,9],"singl":[0,2,5,7,9,10,11],"singular":9,"sit":2,"site":[4,5],"situat":[2,3,5,6,9,10],"size":[0,2,5,7,9,10],"size_str":0,"skip":0,"slate":2,"sleep":[0,2,10],"slice":0,"slightli":[0,2],"slottim":[5,10],"slow":[0,5,9],"slower":[5,7,9],"small":[0,2,5,6,7,9,11],"smaller":7,"smallest":2,"snippet":[2,10],"snr":[0,7,10],"so":[0,2,3,5,6,7,8,9,10,11],"social":2,"socket":[5,10,11],"softwar":[2,3,5,9],"sole":5,"solut":[2,9,10],"solv":9,"some":[0,2,3,5,6,7,9,10],"someon":[2,5,10],"someth":9,"somethign":0,"sometim":[3,5],"somewhat":2,"soon":7,"sort":[5,9,10],"soundmodem":5,"sourc":[0,2,3,4,6,7,9,11],"sovereign":[2,9],"sovereignti":11,"space":[0,2,3,6,9,11],"spam":[2,5,9,10],"spammi":10,"span":[5,9],"spawn":5,"spe":5,"spec":9,"special":[9,10],"specif":[0,3,4,5,7,10],"specifi":[0,2,3,5,6,7,9,10],"spectrum":[5,9],"speed":[0,5,7,9,10],"split":0,"sponsor":[8,11],"spread":[5,10],"spreadingfactor":5,"squelch":5,"ssh":2,"ssid":5,"stabl":[2,5,9,11],"stack":[0,2,6,7,9,10,11],"stage":9,"stai":[0,9,10],"stale":7,"stale_grac":7,"stale_tim":7,"stamp":[5,7,10],"standalon":4,"standard":[3,5,9,10],"start":[0,3,4,5,7,9,10],"startup":[0,2,10],"stat":[7,10],"state":0,"static":[2,5,7],"staticmethod":0,"station":5,"stationari":[6,10],"statist":[0,5,7,8],"statu":[0,2,4,5,7,9,10],"stderr":10,"stdin":[5,10],"stdio":11,"stdout":[0,5,10],"step":[0,2,3],"still":[0,2,5,6,9,10],"stock":0,"stop":[7,11],"stopbit":[0,5,10],"storag":[2,5,9,10],"store":[0,7,9,10],"store_tru":0,"str":0,"straightforward":5,"strategi":[4,5,7],"stream":[0,7,9],"stream_id":[0,7],"strength":[7,11],"strict":[],"strictli":[5,9],"string":[0,7],"stringmessag":0,"strong":9,"stronger":2,"strongli":2,"struct":0,"structur":[0,7,9,11],"style":5,"sub":[0,5],"subclass":[0,7],"subinterfac":5,"subject":[2,10,11],"submit":[],"subnet":[2,6],"subscrib":[2,10],"subsequ":[0,9],"subset":5,"subsid":5,"substanti":2,"succe":2,"succeed":[0,7],"success":[2,5],"successful":7,"successfulli":[0,7,9],"sudo":[2,10],"suffic":9,"suffici":[2,5,9,10],"suffix":0,"suggest":8,"suit":[2,3,9,10],"suitabl":[0,2,5,6,9,10,11],"super":0,"supersed":5,"suppli":[0,5,6,7,9,11],"supplier":2,"support":[0,2,4,5,6,7,9,10,11],"sure":[0,2,3,10],"surveil":9,"surviv":[2,9,10],"switch":[3,5,9,10],"sx1262":3,"sx1268":3,"sx1276":3,"sx1278":3,"sx1280":3,"sy":0,"symlink":10,"symmetr":[7,9],"system":[0,2,3,4,5,6,7,8,9,11],"systemctl":10,"systemd":10,"t":[0,2,5,6,7,9,10],"tabl":[2,5,6,9,10],"tablet":2,"tag":7,"tail":5,"tailor":9,"take":[0,2,5,9,10,11],"taken":[0,9],"tangerin":0,"tap":3,"target":[0,5,10],"target_hash":7,"target_host":[2,5],"target_port":[2,5,10],"task":10,"tcp":[2,3,4,6,9,10,11],"tcpclientinterfac":[2,3,5],"tcpinterfac":10,"tcpserverinterfac":[2,5],"tdata":0,"teach":10,"teardown":[0,7],"teardown_reason":0,"technologi":2,"teffect":0,"telemetri":8,"tell":[0,2,5],"temperatur":9,"temporari":[2,5,10],"temporarili":5,"ten":9,"tend":5,"term":[2,5,6,9],"termin":[0,2,7],"terminologi":[6,9],"termux":2,"test":[2,9,10],"testnet":[4,10],"text":[0,2,6,9],"tfile":0,"tgz":10,"than":[0,2,5,6,7,9,10,11],"thei":[0,2,5,6,7,9,10],"them":[0,2,3,5,6,8,9,10,11],"themselv":5,"thereaft":9,"therefor":[2,9,11],"thi":[0,2,3,4,5,6,7,9,10,11],"thing":[0,2],"think":[2,3,9],"thorough":11,"those":[2,6,9,10],"though":[2,5,9],"thousand":[2,5,9,10],"thread":0,"threat":10,"three":[2,6,9],"threshold":5,"throough":5,"throttl":[5,6],"through":[0,2,3,5,6,7,9,10,11],"throughout":9,"throughput":[7,9,11],"thrown":7,"thu":[6,7,9],"ti":[0,9],"time":[0,2,3,5,6,7,9,10],"time_since_last":0,"timeout":[0,7,10],"timeoutarg":0,"timestamp":[0,9],"timestr":0,"tion":5,"tmp":[],"tnc":[3,5,7,10,11],"tnid2":[],"to_fil":7,"todai":9,"todo":[],"togeth":[3,9,10],"token":[7,9,11],"toler":5,"too":[0,6],"tool":[2,3,9,10,11],"toolkit":2,"top":[6,9],"topic":9,"topographi":[2,6,9],"topologi":[2,5,9,11],"torn":[7,10],"total":[7,9,10,11],"total_s":0,"touch":11,"toward":[0,5,9],"track":7,"track_phy_stat":7,"trade":9,"tradit":[6,9],"traffic":[0,2,5,6,7,9,10],"transceiv":[2,3,5,9,11],"transfer":[0,7,9,10,11],"transfer_s":0,"transform":11,"transit":2,"transmiss":[2,5,7,9],"transmit":[0,5,9],"transpar":[3,5,9,10],"transport":[0,2,4,5,6,7,10,11],"transport_en":7,"transport_ident":10,"travers":[2,7,9],"treat":9,"tri":0,"trip":[0,7,10],"trivial":[9,11],"true":[0,2,5,7,10],"truli":[3,9],"truncat":[7,9,10],"truncated_hash":7,"truncated_hashlength":[0,7],"trust":[2,5,9,10],"trustless":[6,9,11],"trustworthi":10,"try":[0,4,5,7],"ttime":0,"ttransfer":0,"ttyacm0":5,"ttyusb0":[0,5,10],"ttyusb1":5,"ttyusb2":5,"tun":[3,5],"tun0":5,"tune":5,"tunnel":[2,5,9,11],"tupl":7,"turn":[0,5,10],"turnaround":5,"tutori":2,"two":[0,3,5,6,7,9],"tx":[5,10],"txb":0,"txp":10,"txpower":5,"txt":10,"txtail":[5,10],"type":[0,2,4,5,6,7,10],"typeerror":7,"typic":[5,9],"u":[8,9,10],"ubiqu":3,"ubuntu":[4,10],"uci":2,"udp":[4,6,9,10,11],"udpinterfac":5,"uhf":[10,11],"ultim":[2,9],"umsgpack":0,"unblackhol":10,"unblock":10,"uncencrypt":0,"uncensor":2,"under":[7,8,9,10,11],"underli":[0,5,6,7,9,11],"understand":[2,4,5,7,10],"underwai":2,"unencrypt":[0,7,9],"unequivoc":9,"unexplor":6,"unforg":11,"unfortun":2,"unidentifi":0,"unidirect":0,"unifi":[6,9],"uninterest":0,"uniqu":[0,5,7,9,10,11],"unit":[0,2,7,10],"unknown":[0,5,7,9,10],"unless":[0,2,5,7,9],"unlicens":9,"unlik":9,"unlock":10,"unorganis":6,"unpack":[0,7],"unpackb":0,"unplug":10,"unrecover":[0,10],"unreli":5,"unset":9,"unsupport":7,"until":[0,2,5,7],"untrust":10,"unus":10,"unwant":[9,10],"up":[0,2,3,5,6,7,9,10,11],"updat":[0,2,7,9,10],"upgrad":[2,7,9],"upkeep":5,"upon":[0,5,9],"upset":0,"urandom":[9,11],"url":10,"us":[0,3,4,5,6,7],"usabl":[2,5,9],"usag":[4,5,7,8,10],"usb":[3,6,9,10],"useabl":9,"user":[0,2,5,6,9,10,11],"user_input":0,"userland":11,"usernameher":10,"usr":[5,10],"usual":[2,5],"utf":0,"util":[0,3,4,5,9],"utilis":[0,2,5,6,7,9,10,11],"v":[4,10],"valid":[0,2,5,7,9,10],"valu":[0,2,5,7,9,10],"valuabl":[3,8],"valueerror":[0,7],"vari":[2,5,9,10],"variabl":[0,2,7],"varieti":[5,9,10,11],"variou":[0,2,5,6,9,10,11],"vast":[2,9],"ve":[],"vehicl":5,"vendor":[0,3,11],"verbos":[7,10],"veri":[2,3,5,6,7,8,9,10,11],"verif":[7,9,10],"verifi":[0,2,5,7,9,10,11],"versa":[6,11],"version":[0,2,7,9,10],"vhf":[6,9,11],"via":[2,3,5,8,9,10,11],"vice":[6,11],"view":[2,5,9,10],"violat":5,"virtual":[2,3,5,6,9,10,11],"visibl":[0,5],"volunt":2,"vport":5,"vvv":2,"w":10,"wa":[0,3,5,6,7,9,10,11],"wai":[0,4,5,6,7,9,10],"wait":[0,2,5,9,10],"want":[0,2,5,6,9,10,11],"wantedbi":10,"warn":10,"warrant":11,"wast":5,"wave":3,"wb":0,"we":[0,2,3,5,8,9],"weaken":9,"web":2,"websit":[2,5],"weight":10,"weird":[],"welcom":2,"well":[2,3,5,6,7,9,10,11],"went":0,"were":[0,6],"what":[0,2,4,5,7,9,10],"whatev":[7,9],"wheel":2,"when":[0,2,3,5,6,7,9,10],"whenev":[0,7,9],"where":[2,3,4,5,6,7,9,10],"whereupon":9,"whether":[0,2,5,7,9],"which":[0,2,5,6,7,9,10],"while":[0,2,3,5,6,7,9,10,11],"whitelist":9,"whl":2,"who":[2,5,9,10],"whole":10,"wide":[2,3,5,9,10,11],"wider":[2,5,9,10],"wifi":[2,4,5,6,9,10,11],"wiki":2,"wildcard":0,"willing":[6,10],"window":[4,5],"wipe":10,"wire":[2,3,4,5,11],"wireless":[3,6],"wirelessli":5,"wish":[0,5,9,10],"within":[0,2,5,6,7,9],"without":[0,2,3,5,6,9,10,11],"wlan0":5,"wolf":3,"won":0,"word":2,"work":[2,3,5,6,9,10,11],"world":[2,3,5,6,10,11],"worri":6,"worth":2,"would":[2,5,6,7,9],"write":[0,2,3,5,7,9,10],"write_timeout":0,"writer":[0,7],"written":[0,9,11],"wrong":[0,2,5],"wrote":[0,5],"x":[7,9,10],"x25519":[9,11],"xenon":0,"xonxoff":0,"y":0,"ye":[2,5,9,10],"year":9,"yet":[0,5,9,11],"yggdrasil":5,"yi":0,"you":[0,2,3,4,5,6,7,8,9,10,11],"your":[0,3,4,5,6,7,8,9,11],"yourself":[2,9,10,11],"z":0,"zero":[7,11],"zi":0,"zone":9,"zshrc":2},"titles":["Code Examples","An Explanation of Reticulum for Human Beings","Getting Started Fast","Communications Hardware","Reticulum Network Stack Manual","Configuring Interfaces","Building Networks","API Reference","Support Reticulum","Understanding Reticulum","Using Reticulum on Your System","What is Reticulum?"],"titleterms":{"0":3,"1":3,"25":5,"Beings":1,"Of":4,"The":[9,10],"With":2,"access":9,"ad":2,"an":1,"android":2,"announc":[0,5,9],"api":7,"arm64":2,"auto":5,"autom":10,"ax":5,"backbon":5,"base":[2,3],"basic":9,"beam":3,"blackhol":10,"board":3,"bookworm":2,"bootstrap":2,"bridg":6,"broadcast":0,"buffer":0,"build":[2,6],"can":11,"caveat":11,"channel":0,"client":5,"code":[0,8,9],"combin":3,"common":5,"commun":3,"concept":6,"conceptu":9,"configur":[5,10],"connect":[2,5],"consider":5,"content":4,"contribut":[2,8],"control":5,"converg":6,"creat":[2,3,9],"cryptograph":9,"current":[9,11],"custom":[0,2,5],"data":10,"debian":2,"deck":3,"depend":2,"destin":[5,9],"detail":9,"develop":2,"devic":[3,11],"discov":10,"discover":5,"discoveri":5,"doe":11,"donat":8,"echo":[0,3],"emptor":11,"enabl":5,"entrypoint":2,"establish":9,"ethernet":3,"exampl":[0,5,6],"explan":1,"fast":2,"feedback":8,"filetransf":0,"find":2,"fix":10,"format":9,"function":9,"further":9,"futur":9,"get":[2,9],"global":2,"goal":9,"growth":6,"hardwar":3,"health":2,"heltec":3,"host":2,"human":1,"hygien":[],"i":11,"i2p":5,"ident":9,"identif":0,"implic":9,"improv":10,"includ":[2,10],"indic":4,"infrastructur":2,"instal":[2,3],"instanc":2,"interconnect":6,"interfac":[0,2,5,9,10,11],"internet":[2,6],"introduct":9,"issu":2,"kei":9,"kiss":5,"lilygo":3,"limit":5,"line":3,"link":[0,9],"list":10,"listen":5,"local":10,"lora":[5,6],"lora32":3,"lunar":2,"maco":2,"manag":10,"manual":4,"mechan":9,"meshchat":2,"minim":0,"mix":2,"mode":5,"modem":3,"motiv":9,"multi":5,"name":[9,10],"network":[2,4,6,9],"new":5,"node":9,"nomad":2,"note":2,"offer":11,"opencom":3,"openwrt":2,"option":5,"over":[2,6],"overview":[6,9],"packet":[3,9],"paramet":5,"particip":[],"person":2,"philosophi":[],"pi":2,"pipe":5,"platform":2,"port":10,"primit":9,"prioritis":9,"program":[2,10],"propag":9,"protocol":9,"provid":8,"public":[2,9],"publish":10,"pure":2,"python":2,"radio":[2,3],"rak4631":3,"raspberri":2,"rate":5,"reach":9,"refer":[7,9],"remot":[2,5,10],"request":0,"resolv":2,"resourc":9,"respons":[0,2],"ret":2,"reticulum":[1,2,3,4,8,9,10,11],"risc":2,"rncp":10,"rnid":10,"rnode":[3,5],"rnodeconf":10,"rnpath":10,"rnprobe":10,"rnsd":10,"rnstatu":10,"rnx":10,"rule":9,"scenario":6,"secur":5,"serial":[3,5,10],"server":5,"servic":10,"setup":9,"shell":2,"sideband":2,"site":6,"sourc":10,"specif":[2,9],"stack":4,"standalon":2,"start":2,"statu":11,"strategi":2,"support":[3,8],"suprem":3,"system":10,"systemwid":10,"t":3,"t114":3,"t3s3":3,"tabl":4,"tcp":5,"testnet":2,"transport":9,"try":2,"type":[3,9,11],"ubuntu":2,"udp":5,"understand":9,"unsign":3,"us":[2,9,10,11],"usag":[3,9],"userspac":10,"util":[2,10],"v":2,"v1":3,"v2":3,"v3":3,"v4":3,"wai":2,"what":11,"where":11,"wifi":3,"window":2,"wire":9,"x":3,"xl":3,"your":[2,10]}}) \ No newline at end of file diff --git a/docs/manual/support.html b/docs/manual/support.html index 9eff190..7e72c5f 100644 --- a/docs/manual/support.html +++ b/docs/manual/support.html @@ -7,7 +7,7 @@ - Support Reticulum - Reticulum Network Stack 1.0.5 documentation + Support Reticulum - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
    @@ -204,7 +204,7 @@
    - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -368,7 +368,7 @@ report issues, suggest functionality and contribute code to Reticulum.

    - + diff --git a/docs/manual/understanding.html b/docs/manual/understanding.html index ba22fea..981deb5 100644 --- a/docs/manual/understanding.html +++ b/docs/manual/understanding.html @@ -7,7 +7,7 @@ - Understanding Reticulum - Reticulum Network Stack 1.0.5 documentation + Understanding Reticulum - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
    @@ -204,7 +204,7 @@
    - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -873,6 +873,66 @@ of codes to reliably transfer any amount of data. They can be used to transfer d or stream data directly from files.

    +
    +

    Network Identities

    +

    In Reticulum, every peer and application utilizes a cryptographic Identity to verify authenticity and establish encrypted channels. While standard identities are typically used to represent a single user, device, or service, Reticulum introduces the concept of a Network Identity to represent a logical group of nodes or an entire community infrastructure.

    +

    A Network Identity is, at its core, a standard Reticulum Identity keyset. However, its purpose and usage differ from a personal identity. Instead of identifying a single entity, a Network Identity acts as a shared credential that federates multiple independent Transport Instances under a single, verifiable administrative domain.

    +
    +

    Conceptual Overview

    +

    You can think of a standard Reticulum Identity as a self-sovereign, privately created passport for a single person. A Network Identity, conversely, is akin to a cryptographic flag, or a charter that flies over a fleet of ships. It signifies that while the ships may operate independently and be physically distant, they belong to the same organization, follow the same protocols, and are expected to act in concert.

    +

    When you configure a Network Identity on one or more of your nodes, you are effectively declaring that these nodes constitute a specific “network” within a broader Reticulum mesh. This allows other peers to recognize interfaces not just as “a node named Alice”, but as “a gateway belonging to The Eastern Ret Of Freedom”.

    +
    +
    +

    Current Usage

    +

    At present, the primary function of a Network Identity is within the Interface Discovery system.

    +

    When a Transport Instance broadcasts a discovery announce for an interface, it can optionally sign that announce with a Network Identity, instead of just its local transport identity. Remote peers receiving the announce can then verify the signature. This provides functionality for two important distinctions:

    +
      +
    1. Authenticity: It proves that the interface was published by an operator who possesses the private key for that Network Identity.

    2. +
    3. Trust Boundaries: It allows users to configure their systems to only accept and connect to interfaces that belong to specific Network Identities, effectively creating “whitelisted” zones of trusted infrastructure.

    4. +
    +
    +

    Note

    +

    If you enable encryption on your discovery announces, the Network Identity is used as the shared secret. Only peers who have been explicitly provided with the Network Identity’s full keyset (and have it configured locally) will be able to decrypt and utilize the connection details.

    +

    This functionality will be expanded in the future, so that peers with delegated keys can be allowed to decrypt discovery announces without holding the root network key. Currently, the functionality is sufficient for sharing interface information privately where you control all nodes that must decrypt the discovered interfaces.

    +
    +
    +
    +

    Future Implications

    +

    While the current implementation focuses on interface discovery, the concept of Network Identities serves as the foundational building block for future Reticulum features designed to support large-scale, organic mesh formation.

    +

    As the ecosystem evolves, Network Identities will facilitate:

    +
      +
    • Distributed Name Resolution: A system where networks can publish name-to-identity mappings, allowing human-readable names to resolve without centralized servers.

    • +
    • Service Publishing: Networks will be able to announce specific capabilities, services, or information endpoints available publicly or to their members.

    • +
    • Inter-Network Federation: Trust relationships between different networks, allowing for seamless but managed flow of traffic and information across distinct administrative boundaries.

    • +
    • Distributed Blackhole Management: A reputation-based system for blackhole list distribution, where trusted Network Identities can sign and publish lists of blackholed identities. This allows communities to collaboratively enforce security standards and filter spam or malicious identities across the parts of the wider mesh that they are responsible for.

    • +
    +

    By adopting the use of Network Identities now, you are preparing your infrastructure to be compatible with this future functionality.

    +
    +
    +

    Creating and Using a Network Identity

    +

    Since a Network Identity is simply a standard Reticulum Identity, you create one using the built-in tools.

    +
      +
    1. Generate the Identity: +Use the rnid utility to generate a new identity file that will serve as your Network Identity.

      +
      $ rnid -g ~/.reticulum/storage/identities/my_network
      +
      +
      +
    2. +
    3. Distribute the Public Key: +The public key must be distributed to any Transport Instance that needs to verify your network’s announces and discovery information. By default, if your node is set up to use a network identity, this happens automatically (using the standard announce mechanism).

    4. +
    5. Configure Instances: +In the [reticulum] section of the configuration file on every node within your network, point the network_identity option to the file you created.

      +
      [reticulum]
      +...
      +network_identity = ~/.reticulum/storage/identities/my_network
      +...
      +
      +
      +
    6. +
    +

    Once configured, your instances will automatically utilize this identity for signing discovery announces (and potentially decrypting network-private information), presenting a unified front to the wider network.

    +
    +

    Reference Setup

    This section will detail a recommended Reference Setup for Reticulum. It is important to @@ -1247,6 +1307,13 @@ those risks are acceptable to you.

  • Resources
  • +
  • Network Identities +
  • Reference Setup
  • Protocol Specifics
    • Packet Prioritisation
    • @@ -1267,7 +1334,7 @@ those risks are acceptable to you.

      - + diff --git a/docs/manual/using.html b/docs/manual/using.html index 536a846..6f683aa 100644 --- a/docs/manual/using.html +++ b/docs/manual/using.html @@ -7,7 +7,7 @@ - Using Reticulum on Your System - Reticulum Network Stack 1.0.5 documentation + Using Reticulum on Your System - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
      @@ -204,7 +204,7 @@
      - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -554,8 +554,8 @@ Reticulum Transport Instance <5245a8efe1788c6a1cd36144a270e13b> running

      All Command-Line Options

      usage: rnstatus [-h] [--config CONFIG] [--version] [-a] [-A]
      -                [-l] [-s SORT] [-r] [-j] [-R hash] [-i path]
      -                [-w seconds] [-v] [-m] [-mi seconds] [filter]
      +                [-l] [-t] [-s SORT] [-r] [-j] [-R hash] [-i path]
      +                [-w seconds] [-d] [-D] [-m] [-I seconds] [-v] [filter]
       
       Reticulum Network Stack Status
       
      @@ -569,16 +569,20 @@ options:
         -a, --all             show all interfaces
         -A, --announce-stats  show announce stats
         -l, --link-stats      show link stats
      -  -s SORT, --sort SORT  sort interfaces by [rate, traffic, rx, tx, announces, arx, atx, held]
      +  -t, --totals          display traffic totals
      +  -s, --sort SORT       sort interfaces by [rate, traffic, rx, tx, rxs, txs,
      +                                            announces, arx, atx, held]
         -r, --reverse         reverse sorting
         -j, --json            output in JSON format
      -  -R hash               transport identity hash of remote instance to get status from (requires -i)
      +  -R hash               transport identity hash of remote instance to get status from
         -i path               path to identity used for remote management
         -w seconds            timeout before giving up on remote queries
      -  -v, --verbose
      +  -d, --discovered      list discovered interfaces
      +  -D                    show details and config entries for discovered interfaces
         -m, --monitor         continuously monitor status
      -  -I seconds, --monitor-interval seconds
      +  -I, --monitor-interval seconds
                               refresh interval for monitor mode (default: 1)
      +  -v, --verbose
       
      @@ -670,7 +674,7 @@ options:
  • -

    The rnpath Utility

    +

    The rnpath Utility

    With the rnpath utility, you can look up and view paths for destinations on the Reticulum network.

    Usage Examples

    @@ -681,21 +685,23 @@ Path found, destination <c89b4da064bf66d280f0e4d8abfd9806> is 4 hops away

    All Command-Line Options

    -
    usage: rnpath [-h] [--config CONFIG] [--version] [-t] [-m hops]
    -              [-r] [-d] [-D] [-x] [-w seconds] [-R hash] [-i path]
    -              [-W seconds] [-j] [-v] [destination]
    +
    usage: rnpath [-h] [--config CONFIG] [--version] [-t] [-m hops] [-r] [-d] [-D]
    +              [-x] [-w seconds] [-R hash] [-i path] [-W seconds] [-b] [-B] [-U]
    +              [--duration DURATION] [--reason REASON] [-p] [-j] [-v]
    +              [destination] [list_filter]
     
    -Reticulum Path Discovery Utility
    +Reticulum Path Management Utility
     
     positional arguments:
       destination           hexadecimal hash of the destination
    +  list_filter           filter for remote blackhole list view
     
     options:
       -h, --help            show this help message and exit
       --config CONFIG       path to alternative Reticulum config directory
       --version             show program's version number and exit
       -t, --table           show all known paths
    -  -m hops, --max hops   maximum hops to filter path table by
    +  -m, --max hops        maximum hops to filter path table by
       -r, --rates           show announce rate info
       -d, --drop            remove the path to a destination
       -D, --drop-announces  drop all queued announces
    @@ -704,6 +710,13 @@ options:
       -R hash               transport identity hash of remote instance to manage
       -i path               path to identity used for remote management
       -W seconds            timeout before giving up on remote queries
    +  -b, --blackholed      list blackholed identities
    +  -B, --blackhole       blackhole identity
    +  -U, --unblackhole     unblackhole identity
    +  --duration DURATION   duration of blackhole enforcement in hours
    +  --reason REASON       reason for blackholing identity
    +  -p, --blackholed-list
    +                        view published blackhole list for remote transport instance
       -j, --json            output in JSON format
       -v, --verbose
     
    @@ -972,6 +985,87 @@ options: section of this manual.

    +
    +

    Discovering Interfaces

    +

    Reticulum includes built-in functionality for discovering connectable interfaces over Reticulum itself. This is particularly useful in situations where you want to do one or more of the following:

    +
      +
    • Discover connectable entrypoints available on the Internet

    • +
    • Find connectable radio access points in the physical world

    • +
    • Maintain connectivity to RNS instances with unknown or changing IP addresses

    • +
    +

    Discovered interfaces can be auto-connected by Reticulum, which makes it possible to create setups where an arbitrary interface can act simply as a bootstrap connection, that can be torn down again once more suitable interfaces have been discovered and connected.

    +

    The interface discovery mechanism uses announces sent over Reticulum itself, and supports both publicly readable interfaces and private, encrypted discovery, that can only be decoded by specified network identities. It is also possible to specify which network identities should be considered valid sources for discovered interfaces, so that interfaces published by unknown entities are ignored.

    +
    +

    Note

    +

    A network identity is a normal Reticulum identity keyset that can be used by +one or more transport nodes to identify them as belonging to the same overall +network. In the context of interface discovery, this makes it easy to manage +connecting to only the particular networks you care about, even if those networks +utilize many individual physical transport node.

    +

    This also makes it convenient to auto-connect discovered interfaces only for networks you have some level of trust in.

    +
    +

    For information on how to make your interfaces discoverable, see the Discoverable Interfaces chapter of this manual. The current section will focus on how to actually discover and connect to interfaces available on the network.

    +

    In its most basic form, enabling interface discovery is as simple as setting discover_interfaces to true in your Reticulum config:

    +
    [reticulum]
    +...
    +discover_interfaces = yes
    +...
    +
    +
    +

    Once this option is enabled, your RNS instance will start listening for interface discovery announces, and store them for later use or inspection. You can list discovered interfaces with the rnstatus utility:

    +
    $ rnstatus -d
    +
    +Name           Type      Status       Last Heard   Value  Location
    +-------------------------------------------------------------------------
    +Sideband Hub   Backbone  ✓ Available  1h  ago      16     46.2316, 6.0536
    +RNS Amsterdam  Backbone  ✓ Available  32m ago      16     52.3865, 4.9037
    +
    +
    +

    You can view more detailed information about discovered interfaces, including configuration snippets for pasting directly into your [interfaces] config, by using the rnstatus -D option:

    +
    $ rnstatus -D sideband
    +
    +Transport ID : 521c87a83afb8f29e4455e77930b973b
    +Name         : Sideband Hub
    +Type         : BackboneInterface
    +Status       : Available
    +Transport    : Enabled
    +Distance     : 2 hops
    +Discovered   : 9h and 40m ago
    +Last Heard   : 1h and 15m ago
    +Location     : 46.2316, 6.0536
    +Address      : sideband.connect.reticulum.network:7822
    +Stamp Value  : 16
    +
    +Configuration Entry:
    +  [[Sideband Hub]]
    +    type = BackboneInterface
    +    enabled = yes
    +    remote = sideband.connect.reticulum.network
    +    target_port = 7822
    +    transport_identity = 521c87a83afb8f29e4455e77930b973b
    +
    +
    +

    In addition to providing local interface discovery information and control, the rnstatus utility can export discovered interface data in machine-readable JSON format using the rnstatus -d --json option. This can be useful for exporting the data to external applications such as status pages, access point maps and similar.

    +

    To control what sources are considered valid for discovered sources, additional +configuration options can be specified for the interface discovery system.

    +
      +
    • The interface_discovery_sources option is a list of the network or transport identities from which interfaces will be accepted. If this option is set, all others will be ignored. If this option is not set, discovered interfaces will be accepted from any source, but are still subject to stamp value requirements.

    • +
    • The required_discovery_value options specifies the minimum stamp value required for the interface announce to be considered valid. To make it computationally difficult to spam the network with a large number of defunct or malicious interfaces, each announced interface requires a valid cryptographical stamp, of configurable difficulty value.

    • +
    • The autoconnect_discovered_interfaces value defaults to 0, and specifies the maximum number of discovered interfaces that should be auto-connected at any given time. If set to a number greater than 0, Reticulum automatically manages discovered interface connections, and will bring discovered interfaces up and down based on availability. You can at any time add discovered interfaces to your configuration manually, to persistently keep them available.

    • +
    • The network_identity option specifies the network identity for this RNS instance. This identity is used both to sign (and potentially encrypt) outgoing interface discovery announces, and to decrypt incoming discovery information.

    • +
    +

    The configuration snippet below contains an example of setting these additional configuration options:

    +
    [reticulum]
    +...
    +discover_interfaces = yes
    +interface_discovery_sources = 521c87a83afb8f29e4455e77930b973b
    +required_discovery_value = 16
    +autoconnect_discovered_interfaces = 3
    +network_identity = ~/.reticulum/storage/identities/my_network
    +...
    +
    +
    +

    Remote Management

    It is possible to allow remote management of Reticulum @@ -993,6 +1087,98 @@ remote_management_allowed = 9fb6d773498fb3feda407ed8ef2c3229, 2d882c5586e548d79b

    For a complete example configuration, you can run rnsd --exampleconfig.

    +
    +

    Blackhole Management

    +

    Reticulum networks are fundamentally permissionless and open, allowing anyone with a compatible interface to participate. While this openness is essential for a resilient and decentralized network, it also exposes the network to potential abuse, such as peers flooding the network with excessive announce broadcasts or other forms of resource exhaustion.

    +

    The Blackhole system provides tools to help manage this problem. It allows operators and individual users to block specific identities at the Transport layer, preventing them from propagating announces through your node, and for other nodes to reach them through your network.

    +
    +

    Note

    +

    There is fundamentally no way to globally block or censor any identity or destination in Reticulum networks. The blackhole functionality will prevent announces from (and traffic to) all destinations associated with the blackholed identity on your own network segments only.

    +

    This provides users and operators with control over what they want to allow on their own network segments, but there is no way to globally censor or remove an identity, as long as someone is willing to provide transport for it.

    +
    +

    This functionality serves a dual purpose:

    +
      +
    • For Individual Users: It offers a simple way to maintain a quiet and efficient local network by manually blocking spammy or unwanted peers.

    • +
    • For Network Operators: It enables the creation of federated, community-wide security standards. By publishing and sharing blackhole lists, operators can protect large infrastructures and distribute spam filtering rules across the mesh without manual intervention.

    • +
    +
    +

    Local Blackhole Management

    +

    The most immediate way to manage unwanted identities is through manual configuration using the rnpath utility. This allows you to instantly block or unblock specific identities on your local Transport Instance.

    +

    Blackholing an Identity

    +

    To block an identity, use the -B (or --blackhole) flag followed by the identity hash. You can optionally specify a duration and a reason, which are useful for logging and future reference.

    +
    $ rnpath -B 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o
    +
    +
    +

    You can also add a duration (in hours) and a reason:

    +
    $ rnpath -B 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o --duration 24 --reason "Excessive announces"
    +
    +
    +

    Lifting Blackholes

    +

    To remove an identity from the blackhole, use the -U (or --unblackhole) flag:

    +
    $ rnpath -U 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o
    +
    +
    +

    Viewing the Blackhole List

    +

    To see all identities currently blackholed on your local instance, use the -b (or --blackholed) flag:

    +
    $ rnpath -b
    +
    +<3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o> blackholed for 23h, 56m (Excessive announces)
    +<399ea050ce0eed1816c300bcb0840938> blackholed indefinitely (Announce spam)
    +<d56a4fa02c0a77b3575935aedd90bdb2> blackholed indefinitely (Announce spam)
    +<2b9ec651326d9bc274119054c70fb75e> blackholed indefinitely (Announce spam)
    +<1178a8f1fad405bf2ad153bf5036bdfd> blackholed indefinitely (Announce spam)
    +
    +
    +
    +
    +

    Automated List Sourcing

    +

    Manually blocking identities is effective for immediate threats, but maintaining an up-to-date blocklist for a large network is impractical. Reticulum supports automated list sourcing, allowing your node to subscribe to blackhole lists maintained by trusted peers, or a central authority you manage yourself.

    +
    +

    Warning

    +

    Verify Before Subscribing! +Subscribing to a blackhole source is a powerful action that grants that source the ability to dictate who you can communicate with. Before adding a source to your configuration, verify that the maintainer aligns with your usage policy and values. Blindly subscribing to untrusted lists could inadvertently block legitimate peers or essential services.

    +
    +

    When enabled, your Transport Instance will periodically (approximately once per hour) connect to configured sources, retrieve their latest blackhole lists, and automatically merge them into your local blocklist. This provides “set-and-forget” protection for both individual users and large networks.

    +

    Configuration

    +

    To enable automated sourcing, add the blackhole_sources option to the [reticulum] section of your configuration file. This option accepts a comma-separated list of Transport Identity hashes that you trust to provide valid blackhole lists.

    +
    [reticulum]
    +...
    +# Automatically fetch blackhole lists from these trusted sources
    +blackhole_sources = 521c87a83afb8f29e4455e77930b973b, 68a4aa91ac350c4087564e8a69f84e86
    +...
    +
    +
    +

    How It Works

    +
      +
    1. The BlackholeUpdater service runs in the background.

    2. +
    3. For every identity hash listed in blackhole_sources, it attempts to establish a temporary link to the destination rnstransport.info.blackhole.

    4. +
    5. It requests the /list path, which returns a dictionary of blocked identities and their associated metadata.

    6. +
    7. The received list is merged with your local blackholed_identities database.

    8. +
    9. The lists are persisted to disk, ensuring they survive restarts.

    10. +
    +
    +

    Note

    +

    You can verify the external lists you are subscribed to, and their contents, without importing them by using rnpath -p. See the rnpath utility documentation for details on querying remote blackhole lists.

    +
    +
    +
    +

    Publishing Blackhole Lists

    +

    If you are operating a public gateway, a community hub, or simply wish to share your blocklist with others, you can configure your instance to act as a blackhole list publisher. This allows other nodes to subscribe to your definitions of unwanted traffic.

    +

    Enabling Publishing

    +

    To publish your local blackhole list, enable the publish_blackhole option in the [reticulum] section:

    +
    [reticulum]
    +...
    +publish_blackhole = yes
    +...
    +
    +
    +

    When this is enabled, your Transport Instance will register a request handler at rnstransport.info.blackhole. Any peer that connects to this destination and requests /list will receive the complete set of identities currently present in your local blackhole database.

    +

    Federation and Trust

    +

    The blackhole system relies on the trust relationship between the subscriber and the publisher. By subscribing to a source, you are implicitly trusting that source to only block identities that are genuinely detrimental to the network.

    +

    As the ecosystem matures, this system is designed to integrate with Network Identities. This allows communities to verify that a published blackhole list is actually provided by a specific network or organization with a certain level of reputation and trustworthiness, adding a layer of cryptographic trust to the federation process. This prevents malicious actors from publishing fake lists intended to censor legitimate traffic.

    +

    For operators, this creates a scalable model where maintaining a single high-quality blocklist can protect thousands of downstream peers, drastically reducing the administrative overhead of network hygiene.

    +
    +

    Improving System Configuration

    If you are setting up a system for permanent use with Reticulum, there is a @@ -1179,7 +1365,14 @@ systemctl --user enable rnsd.service

  • The rnodeconf Utility
  • +
  • Discovering Interfaces
  • Remote Management
  • +
  • Blackhole Management +
  • Improving System Configuration
    • Fixed Serial Port Names
    • Reticulum as a System Service
        @@ -1200,7 +1393,7 @@ systemctl --user enable rnsd.service - + diff --git a/docs/manual/whatis.html b/docs/manual/whatis.html index 1d3a0d5..50181c8 100644 --- a/docs/manual/whatis.html +++ b/docs/manual/whatis.html @@ -7,7 +7,7 @@ - What is Reticulum? - Reticulum Network Stack 1.0.5 documentation + What is Reticulum? - Reticulum Network Stack 1.1.0 documentation @@ -180,7 +180,7 @@
        @@ -204,7 +204,7 @@
        - Reticulum Network Stack 1.0.5 documentation + Reticulum Network Stack 1.1.0 documentation @@ -495,7 +495,7 @@ want to help out with this, or can help sponsor an audit, please do get in touch
        - + diff --git a/docs/source/gettingstartedfast.rst b/docs/source/gettingstartedfast.rst index 0ce5017..1ae7158 100644 --- a/docs/source/gettingstartedfast.rst +++ b/docs/source/gettingstartedfast.rst @@ -8,7 +8,7 @@ scenarios. Standalone Reticulum Installation -============================================= +================================= If you simply want to install Reticulum and related utilities on a system, the easiest way is via the ``pip`` package manager: @@ -254,14 +254,90 @@ In general it is recommended to use an I2P node if you want to host a publicly a instance, while preserving anonymity. If you care more about performance, and a slightly easier setup, use TCP. +.. _bootstrapping-connectivity: + +Bootstrapping Connectivity +========================== + +Reticulum is not a service you subscribe to, nor is it a single global network you "join". It is a *networking stack*; a toolkit for building communications systems that align with your specific values, requirements, and operational environment. The way you choose to connect to other Reticulum peers is entirely your own choice. + +One of the most powerful aspects of Reticulum is that it provides a multitude of tools to establish, maintain, and optimize connectivity. You can use these tools in isolation or combine them in complex configurations to achieve a vast array of goals. + +Whether your aim is to create a completely private, air-gapped network for your family; to build a resilient community mesh that survives infrastructure collapse; to connect far and wide to as many nodes as possible; or simply to maintain a reliable, encrypted link to a specific organization you care about, Reticulum provides the mechanisms to make it happen. + +There is no "right" or "wrong" way to build a Reticulum network, and you don't need to be a network engineer just to get started. If the information flows in the way you intend, and your privacy and security requirements are met, your configuration is a success. Reticulum is designed to make the most challenging and difficult scenarios attainable, even when other networking technologies fail. + + +Finding Your Way +^^^^^^^^^^^^^^^^ + +When you first start using Reticulum, you need a way to obtain connectivity with the peers you want to communicate with. This is the process of **bootstrapping**. + +A common mistake in modern networking is the reliance on a few centralized, hard-coded entrypoints. If every user simply connects to the same list of public IP addresses found on a website, the network becomes brittle, centralized, and ultimately fails to deliver on the promise of decentralization. + +Reticulum encourages the approach of *organic growth*. Instead of relying on permanent static connections to distant servers, you can use temporary bootstrap connections to *discover* better, more relevant or local infrastructure. Once discovered, your system can automatically form stronger, more direct links to these peers, and discard the temporary bootstrap links. This results in a web of connections that are geographically relevant, resilient and efficient. + +It is possible to simply add a few public entrypoints to the ``[interfaces]`` section of your Reticulum configuration and be connected, but a better option is to enable :ref:`interface discovery` and either manually select relevant, local interfaces, or enable discovered interface auto-connection. + +A relevant option in this context is the :ref:`bootstrap only` interface option. This is an automated tool for better distributing connectivity. By marking an interface as ``bootstrap_only``, you tell Reticulum: *"Use this connection to find connectivity options, and prefer discovered interfaces once they are available"*. This helps create a network topology that favors locality and resilience over the simple centralization caused by using only a few static entrypoints. + +A good place to find interface definitions for bootstrapping connectivity is `rmap.world `_. + + +Building Personal Infrastructure +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You do not need a datacenter to be a meaningful part of the Reticulum ecosystem. In fact, the most important nodes in the network are often the smallest ones. + +We strongly encourage everyone, even home users, to think in terms of building **personal infrastructure**. Don't connect every phone, tablet, and computer in your house directly to a public internet gateway. Instead, repurpose an old computer, a Raspberry Pi, or a supported router to act as your own, personal **Transport Node**: + +* Your local Transport Node sits in your home, connected to your WiFi and perhaps a radio interface (like an RNode). +* You configure this node with a ``bootstrap_only`` interface (perhaps a TCP tunnel to a wider network) and enable interface discovery. +* While you sleep, work, or cook, your node listens to the network. It discovers other local community members, validates their Network Identities, and automatically establishes direct links. +* Your personal devices now connect to your *local* node, which is integrated into a living, breathing local mesh. Your traffic flows through local paths provided by other real people in the community rather than bouncing off a distant server. + +**Don't wait for others to build the networks you want to see**. Every network is important, perhaps even most so those that support individual families and persons. Once enough of this personal, local infrastructure exist, connecting them directly to each other, without traversing the public Internet, becomes not just possible, but inevitable. + + +Mixing Strategies +^^^^^^^^^^^^^^^^^ + +There is no requirement to commit to a single strategy. The most robust setups often mix static, dynamic, and discovered interfaces. + +* **Static Interfaces:** You maintain a permanent interface to a trusted friend or organization using a static configuration. +* **Bootstrap Links:** You run a ``bootstrap_only`` TCP interface to a public gateway to scan for new connectable peers or to regain connectivity if your other interfaces fail. +* **Local Wide-Area Connectivity:** You run a ``RNodeInterface`` on a shared frequency, giving you completely self-sovereign and private wide-area access to both your own network and other Reticulum peers globally, without any "service providers" being able to control or monitor how you interact with people. + +By combining these methods, you create a system that is secure against single points of failure, adaptable to changing network conditions, and better integrated into your physical and social reality. + + +Network Health & Responsibility +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As you participate in the wider networks you discover and build, you will inevitably encounter peers that are misconfigured, malicious, or simply broken. To protect your resources and those of your local peers, you can utilize the :ref:`Blackhole Management` system. + +Whether you manually block a spamming identity or subscribe to a blackhole list maintained by a trusted Network Identity, these tools help ensure that your transport capacity is used for legitimate communication. This keeps your local segment efficient and contributes to the health of the wider network. + + +Contributing to the Global Ret +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you have the means to host a stable node with a public IP address, consider becoming a :ref:`Public Entrypoint`. By :ref:`publishing your interface as discoverable`, you provide a potential connection point for others, helping the network grow and reach new areas. + +For guidelines on how to properly configure and secure a public gateway, refer to the :ref:`Hosting Public Entrypoints` section. Connect to the Public Testnet -=========================================== +============================= An experimental public testnet has been made accessible by volunteers in the community. You can find interface definitions for adding to your ``.reticulum/config`` file on the -`Reticulum Website `_ or the -`Community Wiki `_ +`Reticulum Website `_, or the +`Community Wiki `_. + +As development of Reticulum has transitioned away from the public Internet, and is now happening exclusively over Reticulum itself, the lists on the `Reticulum Website `_ and the +`Community Wiki `_ are no longer actively maintained, and any up-to-date connectivity information will have to be found elsewhere. + +For a while, these resources will likely still be a usable way to find bootstrap connections, that will allow you to discover other entrypoints to connect to, but it is highly recommended to also check community run projects like `rmap.world `_. You can connect your devices or instances to one or more of these to gain access to any Reticulum networks they are physically connected to. Simply add one or more interface @@ -269,24 +345,18 @@ snippets to your config file in the ``[interface]`` section, like in the example .. code:: ini - # TCP/IP interface to the BetweenTheBorders Hub (community-provided) - [[RNS Testnet BetweenTheBorders]] + # TCP/IP interface to the RNS Amsterdam Hub + [[RNS Testnet Amsterdam]] type = TCPClientInterface enabled = yes - target_host = reticulum.betweentheborders.com - target_port = 4242 + target_host = amsterdam.connect.reticulum.network + target_port = 4965 .. tip:: - Ideally, set up a Reticulum Transport Node that your own devices can reach locally, and then - connect that transport node to a couple of public entrypoints. This will provide efficient - connections and redundancy in case any of them go down. + Don't rely on a single connection to a testnet entrypoint for everyday use. The testnet is often used for development and failure testing scenarios. Instead, read the :ref:`Bootstrapping Connectivity` section. -Many other Reticulum instances are connecting to this testnet, and you can also join it -via other entry points if you know them. There is absolutely no control over the network -topography, usage or what types of instances connect. It will also occasionally be used -to test various failure scenarios, and there are no availability or service guarantees. -Expect weird things to happen on this network, as people experiment and try out things. +As the amount of global Reticulum nodes and entrypoints have grown to a substantial quantity, the public Amsterdam Testnet entrypoint is slated for de-commisioning in the first quarter of 2026. If your own instances rely on this entrypoint for connectivity, it is high time to start configuring alternatives. Read the :ref:`Bootstrapping Connectivity` section for pointers. .. warning:: It probably goes without saying, but *don't use the testnet entry-points as @@ -295,12 +365,15 @@ Expect weird things to happen on this network, as people experiment and try out connectivity solutions, if needed and applicable, or in most cases, simply leave it up to the user which networks to connect to, and how. +.. _hosting-entrypoints: Hosting Public Entrypoints -=========================================== +========================== If you want to host a public (or private) entry-point to a Reticulum network over the -Internet, this section offers some helpful pointers. You will need a machine, physical or +Internet, this section offers some helpful pointers. Once you have set up your public entrypoint, it is a great idea to :ref:`make it discoverable over Reticulum`. + +You will need a machine, physical or virtual with a public IP address, that can be reached by other devices on the Internet. The most efficient and performant way to host a connectable entry-point supporting many @@ -348,7 +421,7 @@ If you are hosting an entry-point on an operating system that does not support not be as performant. Adding Radio Interfaces -============================================== +======================= Once you have Reticulum installed and working, you can add radio interfaces with any compatible hardware you have available. Reticulum supports a wide range of radio hardware, and if you already have any available, it is very likely that it will @@ -377,7 +450,7 @@ and propose adding an interface for the hardware. Creating and Using Custom Interfaces -=========================================== +==================================== While Reticulum includes a flexible and broad range of built-in interfaces, these will not cover every conceivable type of communications hardware that Reticulum @@ -404,54 +477,10 @@ ready to import and use RNS in your own programs. The next step will most likely be to look at some :ref:`Example Programs`. The entire Reticulum API is documented in the :ref:`API Reference` -chapter of this manual. +chapter of this manual. Before diving in, it's probably a good idea to read +this manual in full, but at least start with the :ref:`Understanding Reticulum` chapter. -Participate in Reticulum Development -============================================== -If you want to participate in the development of Reticulum and associated -utilities, you'll want to get the latest source from GitHub. In that case, -don't use pip, but try this recipe: - -.. code:: shell - - # Install dependencies - pip install cryptography pyserial - - # Clone repository - git clone https://github.com/markqvist/Reticulum.git - - # Move into Reticulum folder and symlink library to examples folder - cd Reticulum - ln -s ../RNS ./Examples/ - - # Run an example - python Examples/Echo.py -s - - # Unless you've manually created a config file, Reticulum will do so now, - # and immediately exit. Make any necessary changes to the file: - nano ~/.reticulum/config - - # ... and launch the example again. - python Examples/Echo.py -s - - # You can now repeat the process on another computer, - # and run the same example with -h to get command line options. - python Examples/Echo.py -h - - # Run the example in client mode to "ping" the server. - # Replace the hash below with the actual destination hash of your server. - python Examples/Echo.py 174a64852a75682259ad8b921b8bf416 - - # Have a look at another example - python Examples/Filetransfer.py -h - -When you have experimented with the basic examples, it's time to go read the -:ref:`Understanding Reticulum` chapter. Before submitting -your first pull request, it is probably a good idea to introduce yourself on -the `disucssion forum on GitHub `_, -or ask one of the developers or maintainers for a good place to start. - .. _install-guides: Platform-Specific Install Notes diff --git a/docs/source/interfaces.rst b/docs/source/interfaces.rst index 9954124..edc3ff2 100644 --- a/docs/source/interfaces.rst +++ b/docs/source/interfaces.rst @@ -911,6 +911,203 @@ beaconing functionality described above. # small internal packet buffer. flow_control = false +.. _interfaces-discoverable: + +Discoverable Interfaces +======================= + +Reticulum includes a powerful system for publishing your local interfaces to the wider network, allowing other peers to discover, validate, and automatically connect to them. This feature is particularly useful for creating decentralized networks where peers can dynamically find entrypoints, such as public Internet gateways or local radio access points, without relying on static configuration files or centralized directories. + +When an interface is made **discoverable**, your Reticulum instance will periodically broadcast an announce packet containing the connection details and parameters required for other peers to establish a connection. These announces are propagated over the network using the standard Reticulum announce mechanism using the ``rnstransport.discovery.interface`` destination type. + +.. note:: + To use the interface discovery functionality, the ``LXMF`` module must be installed in your Python environment. You can install it using pip: + + .. code:: sh + + pip install lxmf + + +Enabling Discovery +------------------ + +Interface discovery is enabled on a per-interface basis. To make a specific interface discoverable, you must add the ``discoverable`` option to that interface's configuration block and set it to ``yes``. + +.. code:: ini + + [[My Public Gateway]] + type = BackboneInterface + ... + discoverable = yes + +Once enabled, Reticulum will automatically handle the generation, signing, stamping, and broadcasting of the discovery announces. It is not *required* to enable Transport to publish interface discovery information, but for most use cases where you want others to connect to you, you will likely want ``enable_transport`` set to ``yes`` in the ``[reticulum]`` section of your configuration. + + +Discovery Parameters +-------------------- + +When ``discoverable`` is enabled, a variety of additional options become available to control how the interface is presented to the network. These parameters allow you to fine-tune the metadata, security requirements, and visibility of your interface. + +**Basic Metadata** + +``discovery_name`` + A human-readable name for the interface. This name will be displayed to users on remote systems when they list discovered interfaces. If not specified, the interface name (the section header) will be used. + +``announce_interval`` + The interval in minutes between successive discovery announces for this interface. Default is 360 minutes (6 hours). For stable, long-running infrastructure, higher intervals (12 to 22 hours) are usually sufficient and reduce network load. Minimum allowed value is 5 minutes (but expect to have your announces throttled if using intervals below one hour). + +**Connectivity Specification** + +``reachable_on`` + Specifies the address that remote peers should use to connect to this interface. + + * For TCP and Backbone interfaces, this is typically the public IP address or hostname. Do not include the port, this is fetched automatically from the interface. + * For I2P interfaces, this is usually the I2P ``b32`` address. This value is fetched automatically from the ``I2PInterface`` once it is up and connected to the I2P network, so you should not set this manually, unless you absolutely know what you're doing. + + **Dynamic Resolution:** This option also accepts a path to an external executable script or binary. If a path is provided, Reticulum will execute the script and use its ``stdout`` as the reachability address. This is useful for devices behind dynamic DNS, NATs, or complex cloud environments where the external IP is not known locally. The script must simply print the address to stdout and exit. + +.. note:: **Script Execution Requirements:** + When using an executable script for ``reachable_on``, Reticulum expects the script to output only the IP address or hostname to ``stdout``, followed by a newline character. Any additional output or errors may cause the resolution to fail. Ensure the script has executable permissions and is robust against temporary network failures. + +**Security & Cost** + +``discovery_stamp_value`` + Defines the proof-of-work difficulty for the cryptographic stamp included in the announce. This value acts as a cost barrier to prevent network flooding. The default value is ``14``. Increasing this value makes it computationally more expensive to generate an announce, which can be useful to prevent spam on very large networks, but it also increases CPU load on your system when generating announces. Stamps are cached, and only generated if interface information changes, or at instance restart. If you have the computational resources, it is generally advisable to use as high a stamp value as possible. + +**Privacy & Encryption** + +``discovery_encrypt`` + If set to ``yes``, the discovery announce payload will be encrypted. To decrypt the announce, remote peers must possess the *network identity* configured for your instance (see ``network_identity`` in the ``[reticulum]`` section). This allows you to publish private interfaces that are only discoverable to specific trusted networks. + +.. warning:: + If you enable ``discovery_encrypt`` but do not configure a valid ``network_identity`` in the ``[reticulum]`` section of your configuration, Reticulum will abort the interface discovery announce. Encryption requires a valid network identity key to function. + +``publish_ifac`` + If set to ``yes``, the Interface Access Code (IFAC) name and passphrase for this interface will be included in the discovery announce. This allows peers to automatically configure the correct authentication parameters when connecting to the interface. + +**Physical Location** + +``latitude``, ``longitude``, ``height`` + Optional physical coordinates for the interface. These are useful for mapping discovered interfaces geographically or for clients to automatically select the nearest access point. Coordinates should be in decimal degrees, height in meters. + +**Radio Parameters** + +For physical radio interfaces like ``RNodeInterface`` or ``KISSInterface``, the following optional parameters allow you to broadcast the operating frequency and characteristics, allowing clients to verify compatibility before connecting: + +``discovery_frequency`` + The operating frequency in Hz. Auto-configured on RNode interfaces. Necessary on KISS-based radio interfaces and ``TCPClientInterfaces`` connecting to radio modems. + +``discovery_bandwidth`` + The signal bandwidth in Hz. Auto-configured on RNode interfaces. Useful on KISS-based radio interfaces and ``TCPClientInterfaces`` connecting to radio modems. + +``discovery_modulation`` + The modulation type or scheme. Auto-configured on RNode interfaces, but highly advisable to include on other radio-based interfaces. + + +Interface Modes +--------------- + +When you enable discovery on an interface, Reticulum enforces certain interface modes to ensure the interface is actually useful for remote peers. + +If an interface is configured as ``discoverable``, but its mode is not explicitly set to ``gateway`` (for server-style interfaces like ``BackboneInterface`` or ``TCPServerInterface``) or ``access_point`` (for radio interfaces like ``RNodeInterface``), Reticulum will automatically configure the appropriate mode and log a notice. + +For example, if you enable discovery on a ``RNodeInterface`` without specifying the mode, Reticulum will automatically set it to ``access_point`` mode. + +Security Considerations +----------------------- + +When making interfaces discoverable, you are effectively broadcasting an invitation to connect to your system. It is important to understand the security implications of the configuration options you choose. + +**Publishing Credentials** + +If you enable ``publish_ifac = yes``, your interface's authentication passphrase will be included in the announce. If you are operating a public network and want anyone to connect, this is acceptable. However, if you wish to restrict access to a specific group of users, you **must** enable ``discovery_encrypt = yes``. This ensures that only peers possessing the correct ``network_identity`` can decode the passphrase. + +**Topology Exposure** + +A discoverable interface announces its presence, location (if configured), and capabilities to the network. Even if the connection details are encrypted, the *fact* that a connectable node exists within a certain network becomes public information. In high-security or scenarios requiring operational secrecy, consider the implications of advertising your infrastructure's existence. + +Example Configuration +--------------------- + +Below is an example configuration for a public backbone gateway. This configuration publishes a high-value, publicly discoverable interface, that anyone can connect to. + +.. code:: ini + + [[My Public Gateway]] + type = BackboneInterface + mode = gateway + listen_on = 0.0.0.0 + port = 4242 + + # Enable Discovery + discoverable = yes + + # Interface Details + discovery_name = Region A Public Entrypoint + announce_interval = 720 + + # Use external script to resolve dynamic IP + reachable_on = /usr/local/bin/get_external_ip.sh + + # Generate high stamp value + discovery_stamp_value = 24 + + # Optional location data + latitude = 51.99714 + longitude = -0.74195 + height = 15 + +The next example create an encrypted discovery-enabled interface, requiring a specific network identity to decode, and includes IFAC credentials for seamless authentication. + +.. code:: ini + + [[My Private Gateway]] + type = BackboneInterface + mode = gateway + listen_on = 0.0.0.0 + port = 5858 + network_name = internal_1 + passphrase = Mevpekyafshak5Wr + + # Enable Discovery + discoverable = yes + + # Interface Details + discovery_name = Region A Private Backbone + announce_interval = 720 + + # Use external script to resolve dynamic IP + reachable_on = /usr/local/bin/get_external_ip.sh + + # Target stamp value + discovery_stamp_value = 22 + + # Encrypt announces for our network only + discovery_encrypt = yes + + # Include credentials so trusted + # peers can connect automatically + publish_ifac = yes + + # Optional location data + latitude = 34.06915 + longitude = -118.44318 + height = 15 + +In the ``[reticulum]`` section of your configuration, you would define the network identity used for encryption as follows: + +.. code:: ini + + [reticulum] + ... + # The identity used to sign/encrypt discovery announces + network_identity = ~/.reticulum/storage/identities/my_network_identity + ... + +With these configuration options applied, your Reticulum instance will actively participate in the network's discovery ecosystem. Other peers running Reticulum with discovery enabled will be able to see your interface, validate its cryptographic stamp, and (depending on their configuration) automatically connect to it. + +For information on how to use these discovered interfaces and configure your system to auto-connect to them, refer to the :ref:`Discovering Interfaces` chapter. + .. _interfaces-options: Common Interface Options @@ -991,6 +1188,15 @@ These can be used to control various aspects of interface behaviour. option, to set the interface speed in *bits per second*. + * | The ``bootstrap_only`` option designates an interface as a temporary + bridge for initial connectivity. If this option is enabled, the + interface will be monitored and automatically detached once the + number of auto-connected interfaces reaches the limit configured by + ``autoconnect_discovered_interfaces``. This is particularly useful + for using a slow or expensive connection (such as a single LoRa + link or a remote TCP tunnel) solely to discover better local + infrastructure, which then supersedes the bootstrap interface. + .. _interfaces-modes: Interface Modes diff --git a/docs/source/understanding.rst b/docs/source/understanding.rst index f9ac2aa..f7402b3 100644 --- a/docs/source/understanding.rst +++ b/docs/source/understanding.rst @@ -596,6 +596,82 @@ the transfer, integrity verification and reassembling the data on the other end. of codes to reliably transfer any amount of data. They can be used to transfer data stored in memory, or stream data directly from files. +.. _understanding-network_identities: + +Network Identities +================== + +In Reticulum, every peer and application utilizes a cryptographic **Identity** to verify authenticity and establish encrypted channels. While standard identities are typically used to represent a single user, device, or service, Reticulum introduces the concept of a **Network Identity** to represent a logical group of nodes or an entire community infrastructure. + +A Network Identity is, at its core, a standard Reticulum Identity keyset. However, its purpose and usage differ from a personal identity. Instead of identifying a single entity, a Network Identity acts as a shared credential that federates multiple independent Transport Instances under a single, verifiable administrative domain. + + +Conceptual Overview +------------------- + +You can think of a standard Reticulum Identity as a self-sovereign, privately created passport for a single person. A Network Identity, conversely, is akin to a cryptographic flag, or a charter that flies over a fleet of ships. It signifies that while the ships may operate independently and be physically distant, they belong to the same organization, follow the same protocols, and are expected to act in concert. + +When you configure a Network Identity on one or more of your nodes, you are effectively declaring that these nodes constitute a specific "network" within a broader Reticulum mesh. This allows other peers to recognize interfaces not just as "a node named Alice", but as "a gateway belonging to The Eastern Ret Of Freedom". + + +Current Usage +------------- + +At present, the primary function of a Network Identity is within the :ref:`Interface Discovery` system. + +When a Transport Instance broadcasts a discovery announce for an interface, it can optionally sign that announce with a Network Identity, instead of just its local transport identity. Remote peers receiving the announce can then verify the signature. This provides functionality for two important distinctions: + +1. **Authenticity:** It proves that the interface was published by an operator who possesses the private key for that Network Identity. +2. **Trust Boundaries:** It allows users to configure their systems to only accept and connect to interfaces that belong to specific Network Identities, effectively creating "whitelisted" zones of trusted infrastructure. + +.. note:: + If you enable encryption on your discovery announces, the Network Identity is used as the shared secret. Only peers who have been explicitly provided with the Network Identity's full keyset (and have it configured locally) will be able to decrypt and utilize the connection details. + + This functionality will be expanded in the future, so that peers with delegated keys can be allowed to decrypt discovery announces without holding the root network key. Currently, the functionality is sufficient for sharing interface information privately where you control all nodes that must decrypt the discovered interfaces. + + +Future Implications +------------------- + +While the current implementation focuses on interface discovery, the concept of Network Identities serves as the foundational building block for future Reticulum features designed to support large-scale, organic mesh formation. + +As the ecosystem evolves, Network Identities will facilitate: + +* **Distributed Name Resolution:** A system where networks can publish name-to-identity mappings, allowing human-readable names to resolve without centralized servers. +* **Service Publishing:** Networks will be able to announce specific capabilities, services, or information endpoints available publicly or to their members. +* **Inter-Network Federation:** Trust relationships between different networks, allowing for seamless but managed flow of traffic and information across distinct administrative boundaries. +* **Distributed Blackhole Management:** A reputation-based system for blackhole list distribution, where trusted Network Identities can sign and publish lists of blackholed identities. This allows communities to collaboratively enforce security standards and filter spam or malicious identities across the parts of the wider mesh that they are responsible for. + +By adopting the use of Network Identities now, you are preparing your infrastructure to be compatible with this future functionality. + + +Creating and Using a Network Identity +------------------------------------- + +Since a Network Identity is simply a standard Reticulum Identity, you create one using the built-in tools. + +1. **Generate the Identity:** + Use the ``rnid`` utility to generate a new identity file that will serve as your Network Identity. + + .. code:: sh + + $ rnid -g ~/.reticulum/storage/identities/my_network + +2. **Distribute the Public Key:** + The public key must be distributed to any Transport Instance that needs to verify your network's announces and discovery information. By default, if your node is set up to use a network identity, this happens automatically (using the standard announce mechanism). + +3. **Configure Instances:** + In the ``[reticulum]`` section of the configuration file on every node within your network, point the ``network_identity`` option to the file you created. + + .. code:: ini + + [reticulum] + ... + network_identity = ~/.reticulum/storage/identities/my_network + ... + +Once configured, your instances will automatically utilize this identity for signing discovery announces (and potentially decrypting network-private information), presenting a unified front to the wider network. + .. _understanding-referencesystem: Reference Setup diff --git a/docs/source/using.rst b/docs/source/using.rst index fdd1126..b0ec654 100644 --- a/docs/source/using.rst +++ b/docs/source/using.rst @@ -338,8 +338,8 @@ Filter output to only show some interfaces: .. code:: text usage: rnstatus [-h] [--config CONFIG] [--version] [-a] [-A] - [-l] [-s SORT] [-r] [-j] [-R hash] [-i path] - [-w seconds] [-v] [-m] [-mi seconds] [filter] + [-l] [-t] [-s SORT] [-r] [-j] [-R hash] [-i path] + [-w seconds] [-d] [-D] [-m] [-I seconds] [-v] [filter] Reticulum Network Stack Status @@ -353,16 +353,20 @@ Filter output to only show some interfaces: -a, --all show all interfaces -A, --announce-stats show announce stats -l, --link-stats show link stats - -s SORT, --sort SORT sort interfaces by [rate, traffic, rx, tx, announces, arx, atx, held] + -t, --totals display traffic totals + -s, --sort SORT sort interfaces by [rate, traffic, rx, tx, rxs, txs, + announces, arx, atx, held] -r, --reverse reverse sorting -j, --json output in JSON format - -R hash transport identity hash of remote instance to get status from (requires -i) + -R hash transport identity hash of remote instance to get status from -i path path to identity used for remote management -w seconds timeout before giving up on remote queries - -v, --verbose + -d, --discovered list discovered interfaces + -D show details and config entries for discovered interfaces -m, --monitor continuously monitor status - -I seconds, --monitor-interval seconds + -I, --monitor-interval seconds refresh interval for monitor mode (default: 1) + -v, --verbose .. note:: @@ -466,6 +470,7 @@ Decrypt a file using the Reticulum Identity it was encrypted for: -B, --base32 Use base32-encoded input and output --version show program's version number and exit +.. _utility-rnpath: The rnpath Utility ==================== @@ -487,21 +492,23 @@ Resolve path to a destination: .. code:: text - usage: rnpath [-h] [--config CONFIG] [--version] [-t] [-m hops] - [-r] [-d] [-D] [-x] [-w seconds] [-R hash] [-i path] - [-W seconds] [-j] [-v] [destination] + usage: rnpath [-h] [--config CONFIG] [--version] [-t] [-m hops] [-r] [-d] [-D] + [-x] [-w seconds] [-R hash] [-i path] [-W seconds] [-b] [-B] [-U] + [--duration DURATION] [--reason REASON] [-p] [-j] [-v] + [destination] [list_filter] - Reticulum Path Discovery Utility + Reticulum Path Management Utility positional arguments: destination hexadecimal hash of the destination + list_filter filter for remote blackhole list view options: -h, --help show this help message and exit --config CONFIG path to alternative Reticulum config directory --version show program's version number and exit -t, --table show all known paths - -m hops, --max hops maximum hops to filter path table by + -m, --max hops maximum hops to filter path table by -r, --rates show announce rate info -d, --drop remove the path to a destination -D, --drop-announces drop all queued announces @@ -510,6 +517,13 @@ Resolve path to a destination: -R hash transport identity hash of remote instance to manage -i path path to identity used for remote management -W seconds timeout before giving up on remote queries + -b, --blackholed list blackholed identities + -B, --blackhole blackhole identity + -U, --unblackhole unblackhole identity + --duration DURATION duration of blackhole enforcement in hours + --reason REASON reason for blackholing identity + -p, --blackholed-list + view published blackhole list for remote transport instance -j, --json output in JSON format -v, --verbose @@ -821,6 +835,104 @@ to create and provision new :ref:`RNodes` from any supported hardwar For more information on how to create your own RNodes, please read the :ref:`Creating RNodes` section of this manual. +.. _using-interface_discovery: +Discovering Interfaces +---------------------- + +Reticulum includes built-in functionality for discovering connectable interfaces over Reticulum itself. This is particularly useful in situations where you want to do one or more of the following: + +* Discover connectable entrypoints available on the Internet +* Find connectable radio access points in the physical world +* Maintain connectivity to RNS instances with unknown or changing IP addresses + +Discovered interfaces can be **auto-connected** by Reticulum, which makes it possible to create setups where an arbitrary interface can act simply as a bootstrap connection, that can be torn down again once more suitable interfaces have been discovered and connected. + +The interface discovery mechanism uses announces sent over Reticulum itself, and supports both publicly readable interfaces and private, encrypted discovery, that can only be decoded by specified *network identities*. It is also possible to specify which network identities should be considered valid sources for discovered interfaces, so that interfaces published by unknown entities are ignored. + +.. note:: + A *network identity* is a normal Reticulum identity keyset that can be used by + one or more transport nodes to identify them as belonging to the same overall + network. In the context of interface discovery, this makes it easy to manage + connecting to only the particular networks you care about, even if those networks + utilize many individual physical transport node. + + This also makes it convenient to auto-connect discovered interfaces only for networks you have some level of trust in. + +For information on how to make your interfaces discoverable, see the :ref:`Discoverable Interfaces` chapter of this manual. The current section will focus on how to actually *discover and connect to* interfaces available on the network. + +In its most basic form, enabling interface discovery is as simple as setting ``discover_interfaces`` to ``true`` in your Reticulum config: + +.. code:: text + + [reticulum] + ... + discover_interfaces = yes + ... + +Once this option is enabled, your RNS instance will start listening for interface discovery announces, and store them for later use or inspection. You can list discovered interfaces with the ``rnstatus`` utility: + +.. code:: text + + $ rnstatus -d + + Name Type Status Last Heard Value Location + ------------------------------------------------------------------------- + Sideband Hub Backbone ✓ Available 1h ago 16 46.2316, 6.0536 + RNS Amsterdam Backbone ✓ Available 32m ago 16 52.3865, 4.9037 + + +You can view more detailed information about discovered interfaces, including configuration snippets for pasting directly into your ``[interfaces]`` config, by using the ``rnstatus -D`` option: + +.. code:: text + + $ rnstatus -D sideband + + Transport ID : 521c87a83afb8f29e4455e77930b973b + Name : Sideband Hub + Type : BackboneInterface + Status : Available + Transport : Enabled + Distance : 2 hops + Discovered : 9h and 40m ago + Last Heard : 1h and 15m ago + Location : 46.2316, 6.0536 + Address : sideband.connect.reticulum.network:7822 + Stamp Value : 16 + + Configuration Entry: + [[Sideband Hub]] + type = BackboneInterface + enabled = yes + remote = sideband.connect.reticulum.network + target_port = 7822 + transport_identity = 521c87a83afb8f29e4455e77930b973b + +In addition to providing local interface discovery information and control, the ``rnstatus`` utility can export discovered interface data in machine-readable JSON format using the ``rnstatus -d --json`` option. This can be useful for exporting the data to external applications such as status pages, access point maps and similar. + +To control what sources are considered valid for discovered sources, additional +configuration options can be specified for the interface discovery system. + +* The ``interface_discovery_sources`` option is a list of the network or transport identities from which interfaces will be accepted. If this option is set, all others will be ignored. If this option is not set, discovered interfaces will be accepted from any source, but are still subject to stamp value requirements. + +* The ``required_discovery_value`` options specifies the minimum stamp value required for the interface announce to be considered valid. To make it computationally difficult to spam the network with a large number of defunct or malicious interfaces, each announced interface requires a valid cryptographical stamp, of configurable difficulty value. + +* The ``autoconnect_discovered_interfaces`` value defaults to ``0``, and specifies the maximum number of discovered interfaces that should be auto-connected at any given time. If set to a number greater than ``0``, Reticulum automatically manages discovered interface connections, and will bring discovered interfaces up and down based on availability. You can at any time add discovered interfaces to your configuration manually, to persistently keep them available. + +* The ``network_identity`` option specifies the *network identity* for this RNS instance. This identity is used both to sign (and potentially encrypt) *outgoing* interface discovery announces, and to decrypt incoming discovery information. + +The configuration snippet below contains an example of setting these additional configuration options: + +.. code:: text + + [reticulum] + ... + discover_interfaces = yes + interface_discovery_sources = 521c87a83afb8f29e4455e77930b973b + required_discovery_value = 16 + autoconnect_discovered_interfaces = 3 + network_identity = ~/.reticulum/storage/identities/my_network + ... + Remote Management ----------------- @@ -846,6 +958,130 @@ in the Reticulum configuration file: For a complete example configuration, you can run ``rnsd --exampleconfig``. +.. _using-blackhole_management: + +Blackhole Management +-------------------- + +Reticulum networks are fundamentally permissionless and open, allowing anyone with a compatible interface to participate. While this openness is essential for a resilient and decentralized network, it also exposes the network to potential abuse, such as peers flooding the network with excessive announce broadcasts or other forms of resource exhaustion. + +The **Blackhole** system provides tools to help manage this problem. It allows operators and individual users to block specific identities at the Transport layer, preventing them from propagating announces through your node, and for other nodes to reach them through your network. + +.. note:: + + There is fundamentally **no way** to *globally* block or censor any identity or destination in Reticulum networks. The blackhole functionality will prevent announces from (and traffic to) all destinations associated with the blackholed identity *on your own network segments only*. + + This provides users and operators with control over what they want to allow *on their own network segments*, but there is no way to globally censor or remove an identity, as long as *someone* is willing to provide transport for it. + +This functionality serves a dual purpose: + +* **For Individual Users:** It offers a simple way to maintain a quiet and efficient local network by manually blocking spammy or unwanted peers. +* **For Network Operators:** It enables the creation of federated, community-wide security standards. By publishing and sharing blackhole lists, operators can protect large infrastructures and distribute spam filtering rules across the mesh without manual intervention. + + +Local Blackhole Management +========================== + +The most immediate way to manage unwanted identities is through manual configuration using the ``rnpath`` utility. This allows you to instantly block or unblock specific identities on your local Transport Instance. + +**Blackholing an Identity** + +To block an identity, use the ``-B`` (or ``--blackhole``) flag followed by the identity hash. You can optionally specify a duration and a reason, which are useful for logging and future reference. + +.. code:: text + + $ rnpath -B 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o + +You can also add a duration (in hours) and a reason: + +.. code:: text + + $ rnpath -B 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o --duration 24 --reason "Excessive announces" + +**Lifting Blackholes** + +To remove an identity from the blackhole, use the ``-U`` (or ``--unblackhole``) flag: + +.. code:: text + + $ rnpath -U 3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o + +**Viewing the Blackhole List** + +To see all identities currently blackholed on your local instance, use the ``-b`` (or ``--blackholed``) flag: + +.. code:: text + + $ rnpath -b + + <3a4f8b9c1d2e3f4g5h6i7j8k9l0m1n2o> blackholed for 23h, 56m (Excessive announces) + <399ea050ce0eed1816c300bcb0840938> blackholed indefinitely (Announce spam) + blackholed indefinitely (Announce spam) + <2b9ec651326d9bc274119054c70fb75e> blackholed indefinitely (Announce spam) + <1178a8f1fad405bf2ad153bf5036bdfd> blackholed indefinitely (Announce spam) + + + +Automated List Sourcing +======================= + +Manually blocking identities is effective for immediate threats, but maintaining an up-to-date blocklist for a large network is impractical. Reticulum supports **automated list sourcing**, allowing your node to subscribe to blackhole lists maintained by trusted peers, or a central authority you manage yourself. + +.. warning:: **Verify Before Subscribing!** + Subscribing to a blackhole source is a powerful action that grants that source the ability to dictate who you can communicate with. Before adding a source to your configuration, verify that the maintainer aligns with your usage policy and values. Blindly subscribing to untrusted lists could inadvertently block legitimate peers or essential services. + +When enabled, your Transport Instance will periodically (approximately once per hour) connect to configured sources, retrieve their latest blackhole lists, and automatically merge them into your local blocklist. This provides "set-and-forget" protection for both individual users and large networks. + +**Configuration** + +To enable automated sourcing, add the ``blackhole_sources`` option to the ``[reticulum]`` section of your configuration file. This option accepts a comma-separated list of Transport Identity hashes that you trust to provide valid blackhole lists. + +.. code:: ini + + [reticulum] + ... + # Automatically fetch blackhole lists from these trusted sources + blackhole_sources = 521c87a83afb8f29e4455e77930b973b, 68a4aa91ac350c4087564e8a69f84e86 + ... + +**How It Works** + +1. The ``BlackholeUpdater`` service runs in the background. +2. For every identity hash listed in ``blackhole_sources``, it attempts to establish a temporary link to the destination ``rnstransport.info.blackhole``. +3. It requests the ``/list`` path, which returns a dictionary of blocked identities and their associated metadata. +4. The received list is merged with your local ``blackholed_identities`` database. +5. The lists are persisted to disk, ensuring they survive restarts. + +.. note:: + You can verify the external lists you are subscribed to, and their contents, without importing them by using ``rnpath -p``. See the :ref:`rnpath utility documentation` for details on querying remote blackhole lists. + + +Publishing Blackhole Lists +========================== + +If you are operating a public gateway, a community hub, or simply wish to share your blocklist with others, you can configure your instance to act as a blackhole list publisher. This allows other nodes to subscribe to *your* definitions of unwanted traffic. + +**Enabling Publishing** + +To publish your local blackhole list, enable the ``publish_blackhole`` option in the ``[reticulum]`` section: + +.. code:: ini + + [reticulum] + ... + publish_blackhole = yes + ... + +When this is enabled, your Transport Instance will register a request handler at ``rnstransport.info.blackhole``. Any peer that connects to this destination and requests ``/list`` will receive the complete set of identities currently present in your local blackhole database. + +**Federation and Trust** + +The blackhole system relies on the trust relationship between the subscriber and the publisher. By subscribing to a source, you are implicitly trusting that source to only block identities that are genuinely detrimental to the network. + +As the ecosystem matures, this system is designed to integrate with **Network Identities**. This allows communities to verify that a published blackhole list is actually provided by a specific network or organization with a certain level of reputation and trustworthiness, adding a layer of cryptographic trust to the federation process. This prevents malicious actors from publishing fake lists intended to censor legitimate traffic. + +For operators, this creates a scalable model where maintaining a single high-quality blocklist can protect thousands of downstream peers, drastically reducing the administrative overhead of network hygiene. + Improving System Configuration ------------------------------