diff --git a/RNS/Reticulum.py b/RNS/Reticulum.py index 8ba8f34..c0a7ef6 100755 --- a/RNS/Reticulum.py +++ b/RNS/Reticulum.py @@ -414,7 +414,7 @@ class Reticulum: if announce_rate_target != None and announce_rate_penalty == None: announce_rate_penalty = 0 - + announce_cap = Reticulum.ANNOUNCE_CAP/100.0 if "announce_cap" in c: if c.as_float("announce_cap") > 0 and c.as_float("announce_cap") <= 100: diff --git a/docs/Reticulum Manual.pdf b/docs/Reticulum Manual.pdf index 0306057..5d81333 100644 Binary files a/docs/Reticulum Manual.pdf and b/docs/Reticulum Manual.pdf differ diff --git a/docs/manual/_images/if_mode_graph.png b/docs/manual/_images/if_mode_graph.png new file mode 100644 index 0000000..81f09a5 Binary files /dev/null and b/docs/manual/_images/if_mode_graph.png differ diff --git a/docs/manual/_images/if_mode_graph_b.png b/docs/manual/_images/if_mode_graph_b.png new file mode 100644 index 0000000..6606b60 Binary files /dev/null and b/docs/manual/_images/if_mode_graph_b.png differ diff --git a/docs/manual/_sources/interfaces.rst.txt b/docs/manual/_sources/interfaces.rst.txt index 2de2405..d98f271 100644 --- a/docs/manual/_sources/interfaces.rst.txt +++ b/docs/manual/_sources/interfaces.rst.txt @@ -19,125 +19,6 @@ types, have a look at the :ref:`Building Networks` chapter of thi manual. -.. _interfaces-options: - -Common Interface Options -======================== - -A number of general configuration options are available on most interfaces. -These can be used to control various aspects of interface behaviour. - - - * | The ``enabled`` option tells Reticulum whether or not - to bring up the interface. Defaults to ``False``. For any - interface to be brought up, the ``enabled`` option - must be set to ``True`` or ``Yes``. - - * | The ``mode`` option allows selecting the high-level behaviour - of the interface from a number of options. - - - The default value is ``full``. In this mode, all discovery, - meshing and transport functionality is available. - - - In the ``access_point`` (or shorthand ``ap``) mode, the - interface will operate as a network access point. In this - mode, announces will not be automatically broadcasted on - the interface, and paths to destinations on the interface - will have a much shorter expiry time. This mode is useful - for creating interfaces that are mostly quiet, unless when - someone is actually using them. An example of this could - be a radio interface serving a wide area, where users are - expected to connect momentarily, use the network, and then - disappear again. - - * | The ``outgoing`` option sets whether an interface is allowed - to transmit. Defaults to ``True``. If set to ``False`` or ``No`` - the interface will only receive data, and never transmit. - - * | The ``network_name`` option sets the virtual network name for - the interface. This allows multiple separate network segments - to exist on the same physical channel or medium. - - * | The ``passphrase`` option sets an authentication passphrase on - the interface. This option can be used in conjunction with the - ``network_name`` option, or be used alone. - - * | The ``ifac_size`` option allows customising the length of the - Interface Authentication Codes carried by each packet on named - and/or authenticated network segments. It is set by default to - a size suitable for the interface in question, but can be set - to a custom size between 8 and 512 bits by using this option. - In normal usage, this option should not be changed from the - default. - - * | The ``announce_cap`` option lets you configure the maximum - bandwidth to allocate, at any given time, to propagating - announces and other network upkeep traffic. It is configured at - 2% by default, and should normally not need to be changed. Can - be set to any value between ``1`` and ``100``. - - * | The ``bitrate`` option configures the interface bitrate. - Reticulum will use interface speeds reported by hardware, or - try to guess a suitable rate when the hardware doesn't report - any. In most cases, the automatically found rate should be - sufficient, but it can be configured by using the ``bitrate`` - option, to set the interface speed in *bits per second*. - - -.. _interfaces-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 -are propagated and how long paths are valid. - -Configuring modes on interfaces is not strictly necessary, but can be useful -when building or connecting to more complex networks. When not running a -Transport Node, it is rarely useful to configure an interface mode. - - * | The default value is ``full``. In this mode, all discovery, - meshing and transport functionality is activated. - - * | In the ``access_point`` (or shorthand ``ap``) mode, the - interface will operate as a network access point. In this - mode, announces will not be automatically broadcasted on - the interface, and paths to destinations on the interface - will have a much shorter expiry time. This mode is useful - for creating interfaces that remain quiet, unless when - someone is actually using them. An example of this could - be a radio interface serving a wide area, where users are - expected to connect momentarily, use the network, and then - disappear again. - - * | The ``roaming`` mode should be used on interfaces that are - roaming (physically mobile), seen from the perspective of - other nodes in the network. As an example, if a vehicle is - equipped with an external LoRa interface, and an internal, - WiFi-based interface, that serves devices that are moving - _with_ the vehicle, the external LoRa interface should be - configured as ``roaming``, and the internal interface can - be left in the default mode. With transport enabled, such - a setup will allow all internal devices to reach each other, - and all other devices that are available on the LoRa side - of the network, when they are in range. Devices on the LoRa - side of the network will also be able to reach devices - internal to the vehicle, when it is in range. Paths via - ``roaming`` interfaces also expire faster. - - * | The purpose of the ``boundary`` mode is to specify interfaces - that establish connectivity with network segments that are - significantly different than the one this node exists on. - As an example, if a Reticulum instance is part of a LoRa-based - network, but also has a high-speed connection to a - public Transport Node available on the Internet, the interface - connecting over the Internet should be set to ``boundary`` mode. - -For a table describing the impact of all modes on announce propagation, -please see the :ref:`Announce Propagation Rules` section. - .. _interfaces-auto: Auto Interface @@ -664,3 +545,182 @@ beaconing functionality described above. # This is useful for modems with a # small internal packet buffer. flow_control = false + +.. _interfaces-options: + +Common Interface Options +======================== + +A number of general configuration options are available on most interfaces. +These can be used to control various aspects of interface behaviour. + + + * | The ``enabled`` option tells Reticulum whether or not + to bring up the interface. Defaults to ``False``. For any + interface to be brought up, the ``enabled`` option + must be set to ``True`` or ``Yes``. + + * | The ``mode`` option allows selecting the high-level behaviour + of the interface from a number of options. + + - The default value is ``full``. In this mode, all discovery, + meshing and transport functionality is available. + + - In the ``access_point`` (or shorthand ``ap``) mode, the + interface will operate as a network access point. In this + mode, announces will not be automatically broadcasted on + the interface, and paths to destinations on the interface + will have a much shorter expiry time. This mode is useful + for creating interfaces that are mostly quiet, unless when + someone is actually using them. An example of this could + be a radio interface serving a wide area, where users are + expected to connect momentarily, use the network, and then + disappear again. + + * | The ``outgoing`` option sets whether an interface is allowed + to transmit. Defaults to ``True``. If set to ``False`` or ``No`` + the interface will only receive data, and never transmit. + + * | The ``network_name`` option sets the virtual network name for + the interface. This allows multiple separate network segments + to exist on the same physical channel or medium. + + * | The ``passphrase`` option sets an authentication passphrase on + the interface. This option can be used in conjunction with the + ``network_name`` option, or be used alone. + + * | The ``ifac_size`` option allows customising the length of the + Interface Authentication Codes carried by each packet on named + and/or authenticated network segments. It is set by default to + a size suitable for the interface in question, but can be set + to a custom size between 8 and 512 bits by using this option. + In normal usage, this option should not be changed from the + default. + + * | The ``announce_cap`` option lets you configure the maximum + bandwidth to allocate, at any given time, to propagating + announces and other network upkeep traffic. It is configured at + 2% by default, and should normally not need to be changed. Can + be set to any value between ``1`` and ``100``. + + *If an interface exceeds its announce cap, it will queue announces + for later transmission. Reticulum will always prioritise propagating + announces from nearby nodes first. This ensures that the local + topology is prioritised, and that slow networks are not overwhelmed + by interconnected fast networks.* + + *Destinations that are rapidly re-announcing will be down-prioritised + further. Trying to get "first-in-line" by announce spamming will have + the exact opposite effect: Getting moved to the back of the queue every + time a new announce from the excessively announcing destination is received.* + + *This means that it is always beneficial to select a balanced + announce rate, and not announce more often than is actually necesarry + for your application to function.* + + * | The ``bitrate`` option configures the interface bitrate. + Reticulum will use interface speeds reported by hardware, or + try to guess a suitable rate when the hardware doesn't report + any. In most cases, the automatically found rate should be + sufficient, but it can be configured by using the ``bitrate`` + option, to set the interface speed in *bits per second*. + + +.. _interfaces-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 +are propagated and how long paths are valid. + +Configuring modes on interfaces is not strictly necessary, but can be useful +when building or connecting to more complex networks. When not running a +Transport Node, it is rarely useful to configure an interface mode. + + * | The default value is ``full``. In this mode, all discovery, + meshing and transport functionality is activated. + + * | In the ``access_point`` (or shorthand ``ap``) mode, the + interface will operate as a network access point. In this + mode, announces will not be automatically broadcasted on + the interface, and paths to destinations on the interface + will have a much shorter expiry time. This mode is useful + for creating interfaces that remain quiet, unless when + someone is actually using them. An example of this could + be a radio interface serving a wide area, where users are + expected to connect momentarily, use the network, and then + disappear again. + + * | The ``roaming`` mode should be used on interfaces that are + roaming (physically mobile), seen from the perspective of + other nodes in the network. As an example, if a vehicle is + equipped with an external LoRa interface, and an internal, + WiFi-based interface, that serves devices that are moving + _with_ the vehicle, the external LoRa interface should be + configured as ``roaming``, and the internal interface can + be left in the default mode. With transport enabled, such + a setup will allow all internal devices to reach each other, + and all other devices that are available on the LoRa side + of the network, when they are in range. Devices on the LoRa + side of the network will also be able to reach devices + internal to the vehicle, when it is in range. Paths via + ``roaming`` interfaces also expire faster. + + * | The purpose of the ``boundary`` mode is to specify interfaces + that establish connectivity with network segments that are + significantly different than the one this node exists on. + As an example, if a Reticulum instance is part of a LoRa-based + network, but also has a high-speed connection to a + public Transport Node available on the Internet, the interface + connecting over the Internet should be set to ``boundary`` mode. + +For a table describing the impact of all modes on announce propagation, +please see the :ref:`Announce Propagation Rules` section. + +.. _interfaces-announcerates: + +Announce Rate Control +===================== + +The built-in announce control mechanisms and the default ``announce_cap`` +option described above are sufficient most of the time, but in some cases, especially on fast +interfaces, it may be useful to control the target announce rate. Using the +``announce_rate_target``, ``announce_rate_grace`` and ``announce_rate_penalty`` +options, this can be done on a per-interface basis, and moderates the *rate at +which received announces are re-broadcasted to other interfaces*. + + * | The ``announce_rate_target`` option sets the minimum amount of time, + in seconds, that should pass between received announces, for any one + destination. As an example, setting this value to ``3600`` means that + announces *received* on this interface will only be re-transmitted and + propagated to other interfaces once every hour, no matter how often they + are received. + + * | The optional ``announce_rate_grace`` defines the number of times a destination + can violate the announce rate before the target rate is enforced. + + * | The optional ``announce_rate_penalty`` configures an extra amount of + time that is added to the normal rate target. As an example, if a penalty + of ``7200`` seconds is defined, once the rate target is enforced, the + destination in question will only have its announces propagated every + 3 hours, until it lowers its actual announce rate to within the target. + +These mechanisms, in conjunction with the ``annouce_cap`` mechanisms mentioned +above means that it is essential to select a balanced announce strategy for +your destinations. The more balanced you can make this decision, the easier +it will be for your destinations to make it into slower networks that many hops +away. Or you can prioritise only reaching high-capacity networks with more frequent +announces. + +Current statistics and information about announce rates can be viewed using the +``rnpath -r`` command. + +It is important to note that there is no one right or wrong way to set up announce +rates. Slower networks will naturally tend towards using less frequent announces to +conserve bandwidth, while very fast networks can support applications that +need very frequent announces. Reticulum implements these mechanisms to ensure +that a large span of network types can seamlessly *co-exist* and interconnect. + diff --git a/docs/manual/_sources/understanding.rst.txt b/docs/manual/_sources/understanding.rst.txt index 5701401..52b58e0 100644 --- a/docs/manual/_sources/understanding.rst.txt +++ b/docs/manual/_sources/understanding.rst.txt @@ -813,26 +813,27 @@ from one interface type to another, for all possible combinations. See the :ref:`Interface Modes` section for a conceptual overview of the different interface modes, and how they are configured. -.. code-block:: text +.. image:: graphics/if_mode_graph_b.png - Full ────── ✓ ──┐ ┌── ✓ ── Full - AP ──────── ✓ ──┼───> Full >───┼── ✕ ── AP - Boundary ── ✓ ──┤ ├── ✓ ── Boundary - Roaming ─── ✓ ──┘ └── ✓ ── Roaming +.. + (.. code-block:: text) + Full ────── ✓ ──┐ ┌── ✓ ── Full + AP ──────── ✓ ──┼───> Full >───┼── ✕ ── AP + Boundary ── ✓ ──┤ ├── ✓ ── Boundary + Roaming ─── ✓ ──┘ └── ✓ ── Roaming - Full ────── ✕ ──┐ ┌── ✓ ── Full - AP ──────── ✕ ──┼────> AP >────┼── ✕ ── AP - Boundary ── ✕ ──┤ ├── ✓ ── Boundary - Roaming ─── ✕ ──┘ └── ✓ ── Roaming + Full ────── ✕ ──┐ ┌── ✓ ── Full + AP ──────── ✕ ──┼────> AP >────┼── ✕ ── AP + Boundary ── ✕ ──┤ ├── ✓ ── Boundary + Roaming ─── ✕ ──┘ └── ✓ ── Roaming - Full ────── ✓ ──┐ ┌── ✓ ── Full - AP ──────── ✓ ──┼─> Roaming >──┼── ✕ ── AP - Boundary ── ✕ ──┤ ├── ✕ ── Boundary - Roaming ─── ✕ ──┘ └── ✕ ── Roaming - - Full ────── ✓ ──┐ ┌── ✓ ── Full - AP ──────── ✓ ──┼─> Boundary >─┼── ✕ ── AP - Boundary ── ✓ ──┤ ├── ✓ ── Boundary - Roaming ─── ✕ ──┘ └── ✕ ── Roaming + Full ────── ✓ ──┐ ┌── ✓ ── Full + AP ──────── ✓ ──┼─> Roaming >──┼── ✕ ── AP + Boundary ── ✕ ──┤ ├── ✕ ── Boundary + Roaming ─── ✕ ──┘ └── ✕ ── Roaming + Full ────── ✓ ──┐ ┌── ✓ ── Full + AP ──────── ✓ ──┼─> Boundary >─┼── ✕ ── AP + Boundary ── ✓ ──┤ ├── ✓ ── Boundary + Roaming ─── ✕ ──┘ └── ✕ ── Roaming diff --git a/docs/manual/_sources/using.rst.txt b/docs/manual/_sources/using.rst.txt index e22e24a..db0de0c 100644 --- a/docs/manual/_sources/using.rst.txt +++ b/docs/manual/_sources/using.rst.txt @@ -19,6 +19,122 @@ instance is simply shared. This works for any number of programs running concurrently, and is very easy to use, but depending on your use case, there are other options. +Configuration & Data +-------------------- + +A Reticulum stores all information that it needs to function in a single file- +system directory. By default, this directory is ``~/.reticulum``, but you can +use any directory you wish. You can also run multiple separate Reticulum +instances on the same physical system, in complete isolation from each other, +or connected together. + +In most cases, a single physical system will only need to run one Reticulum +instance. This can either be launched at boot, as a system service, or simply +be brought up when a program needs it. In either case, any number of programs +running on the same system will automatically share the same Reticulum instance, +if the configuration allows for it, which it does by default. + +The entire configuration of Reticulum is found in the ``~/.reticulum/config`` +file. When Reticulum is first started on a new system, a basic, functional +configuration file is created. The default configuration looks like this: + +.. code:: + + # This is the default Reticulum config file. + # You should probably edit it to include any additional, + # interfaces and settings you might need. + + # Only the most basic options are included in this default + # configuration. To see a more verbose, and much longer, + # configuration example, you can run the command: + # rnsd --exampleconfig + + + [reticulum] + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should only be done for systems that are suited to + # act as transport nodes, ie. if they are stationary and + # always-on. This directive is optional and can be removed + # for brevity. + + enable_transport = False + + + # By default, the first program to launch the Reticulum + # Network Stack will create a shared instance, that other + # programs can communicate with. Only the shared instance + # opens all the configured interfaces directly, and other + # local programs communicate with the shared instance over + # a local socket. This is completely transparent to the + # user, and should generally be turned on. This directive + # is optional and can be removed for brevity. + + share_instance = Yes + + + # If you want to run multiple *different* shared instances + # on the same system, you will need to specify different + # shared instance ports for each. The defaults are given + # below, and again, these options can be left out if you + # don't need them. + + shared_instance_port = 37428 + instance_control_port = 37429 + + + # You can configure Reticulum to panic and forcibly close + # if an unrecoverable interface error occurs, such as the + # hardware device for an interface disappearing. This is + # an optional directive, and can be left out for brevity. + # This behaviour is disabled by default. + + panic_on_interface_error = No + + + [logging] + # Valid log levels are 0 through 7: + # 0: Log only critical information + # 1: Log errors and lower log levels + # 2: Log warnings and lower log levels + # 3: Log notices and lower log levels + # 4: Log info and lower (this is the default) + # 5: Verbose logging + # 6: Debug logging + # 7: Extreme logging + + loglevel = 4 + + + # The interfaces section defines the physical and virtual + # interfaces Reticulum will use to communicate on. This + # section will contain examples for a variety of interface + # types. You can modify these or use them as a basis for + # your own config, or simply remove the unused ones. + + [interfaces] + + # This interface enables communication with other + # link-local Reticulum nodes over UDP. It does not + # need any functional IP infrastructure like routers + # or DHCP servers, but will require that at least link- + # local IPv6 is enabled in your operating system, which + # should be enabled by default in almost any OS. See + # the Reticulum Manual for more configuration options. + + [[Default Interface]] + type = AutoInterface + interface_enabled = True + +If Reticulum infrastructure already exists locally, you probably don't need to +change anything, and you may already be connected to a wider network. If not, +you will probably need to add relevant *interfaces* to the configuration, in +order to communicate with other systems. It is a good idea to read the comments +and explanations in the above default config. It will teach you the basic +concepts you need to understand to configure your network. Once you have done that, +take a look at the :ref:`Interfaces` chapter of this manual. + Included Utility Programs ------------------------- @@ -30,8 +146,8 @@ other programs, applications and services can utilise. The rnsd Utility ================ -To do so is very easy. Simply run the included ``rnsd`` command. When ``rnsd`` -is running, it will keep all configured interfaces open, handle transport if +It is very easy to run Reticulum as a service. Simply run the included ``rnsd`` command. +When ``rnsd`` is running, it will keep all configured interfaces open, handle transport if it is enabled, and allow any other programs to immediately utilise the Reticulum network it is configured for. diff --git a/docs/manual/index.html b/docs/manual/index.html index f22fe8a..ad6266f 100644 --- a/docs/manual/index.html +++ b/docs/manual/index.html @@ -70,6 +70,7 @@ to participate in the development of Reticulum itself.

  • Using Reticulum on Your System
      +
    • Configuration & Data
    • Included Utility Programs
    • Supported Interfaces
    • Understanding Reticulum
        diff --git a/docs/manual/interfaces.html b/docs/manual/interfaces.html index b885af7..1f539c2 100644 --- a/docs/manual/interfaces.html +++ b/docs/manual/interfaces.html @@ -53,149 +53,6 @@ and gives example configurations for the respective interface types.

        For a high-level overview of how networks can be formed over different interface types, have a look at the Building Networks chapter of this manual.

        -
        -

        Common Interface Options

        -

        A number of general configuration options are available on most interfaces. -These can be used to control various aspects of interface behaviour.

        -
        -
          -
        • -
          The enabled option tells Reticulum whether or not -to bring up the interface. Defaults to False. For any -interface to be brought up, the enabled option -must be set to True or Yes.
          -
          -
        • -
        • -
          The mode option allows selecting the high-level behaviour -of the interface from a number of options.
          -
          -
          -
            -
          • The default value is full. In this mode, all discovery, -meshing and transport functionality is available.

          • -
          • In the access_point (or shorthand ap) mode, the -interface will operate as a network access point. In this -mode, announces will not be automatically broadcasted on -the interface, and paths to destinations on the interface -will have a much shorter expiry time. This mode is useful -for creating interfaces that are mostly quiet, unless when -someone is actually using them. An example of this could -be a radio interface serving a wide area, where users are -expected to connect momentarily, use the network, and then -disappear again.

          • -
          -
          -
        • -
        • -
          The outgoing option sets whether an interface is allowed -to transmit. Defaults to True. If set to False or No -the interface will only receive data, and never transmit.
          -
          -
        • -
        • -
          The network_name option sets the virtual network name for -the interface. This allows multiple separate network segments -to exist on the same physical channel or medium.
          -
          -
        • -
        • -
          The passphrase option sets an authentication passphrase on -the interface. This option can be used in conjunction with the -network_name option, or be used alone.
          -
          -
        • -
        • -
          The ifac_size option allows customising the length of the -Interface Authentication Codes carried by each packet on named -and/or authenticated network segments. It is set by default to -a size suitable for the interface in question, but can be set -to a custom size between 8 and 512 bits by using this option. -In normal usage, this option should not be changed from the -default.
          -
          -
        • -
        • -
          The announce_cap option lets you configure the maximum -bandwidth to allocate, at any given time, to propagating -announces and other network upkeep traffic. It is configured at -2% by default, and should normally not need to be changed. Can -be set to any value between 1 and 100.
          -
          -
        • -
        • -
          The bitrate option configures the interface bitrate. -Reticulum will use interface speeds reported by hardware, or -try to guess a suitable rate when the hardware doesn’t report -any. In most cases, the automatically found rate should be -sufficient, but it can be configured by using the bitrate -option, to set the interface speed in bits per second.
          -
          -
        • -
        -
        -
        -
        -

        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 -are propagated and how long paths are valid.

        -

        Configuring modes on interfaces is not strictly necessary, but can be useful -when building or connecting to more complex networks. When not running a -Transport Node, it is rarely useful to configure an interface mode.

        -
        -
          -
        • -
          The default value is full. In this mode, all discovery, -meshing and transport functionality is activated.
          -
          -
        • -
        • -
          In the access_point (or shorthand ap) mode, the -interface will operate as a network access point. In this -mode, announces will not be automatically broadcasted on -the interface, and paths to destinations on the interface -will have a much shorter expiry time. This mode is useful -for creating interfaces that remain quiet, unless when -someone is actually using them. An example of this could -be a radio interface serving a wide area, where users are -expected to connect momentarily, use the network, and then -disappear again.
          -
          -
        • -
        • -
          The roaming mode should be used on interfaces that are -roaming (physically mobile), seen from the perspective of -other nodes in the network. As an example, if a vehicle is -equipped with an external LoRa interface, and an internal, -WiFi-based interface, that serves devices that are moving -_with_ the vehicle, the external LoRa interface should be -configured as roaming, and the internal interface can -be left in the default mode. With transport enabled, such -a setup will allow all internal devices to reach each other, -and all other devices that are available on the LoRa side -of the network, when they are in range. Devices on the LoRa -side of the network will also be able to reach devices -internal to the vehicle, when it is in range. Paths via -roaming interfaces also expire faster.
          -
          -
        • -
        • -
          The purpose of the boundary mode is to specify interfaces -that establish connectivity with network segments that are -significantly different than the one this node exists on. -As an example, if a Reticulum instance is part of a LoRa-based -network, but also has a high-speed connection to a -public Transport Node available on the Internet, the interface -connecting over the Internet should be set to boundary mode.
          -
          -
        • -
        -
        -

        For a table describing the impact of all modes on announce propagation, -please see the Announce Propagation Rules section.

        -

        Auto Interface

        The Auto Interface enables communication with other discoverable Reticulum @@ -653,6 +510,211 @@ beaconing functionality described above.

        +
        +

        Common Interface Options

        +

        A number of general configuration options are available on most interfaces. +These can be used to control various aspects of interface behaviour.

        +
        +
          +
        • +
          The enabled option tells Reticulum whether or not +to bring up the interface. Defaults to False. For any +interface to be brought up, the enabled option +must be set to True or Yes.
          +
          +
        • +
        • +
          The mode option allows selecting the high-level behaviour +of the interface from a number of options.
          +
          +
          +
            +
          • The default value is full. In this mode, all discovery, +meshing and transport functionality is available.

          • +
          • In the access_point (or shorthand ap) mode, the +interface will operate as a network access point. In this +mode, announces will not be automatically broadcasted on +the interface, and paths to destinations on the interface +will have a much shorter expiry time. This mode is useful +for creating interfaces that are mostly quiet, unless when +someone is actually using them. An example of this could +be a radio interface serving a wide area, where users are +expected to connect momentarily, use the network, and then +disappear again.

          • +
          +
          +
        • +
        • +
          The outgoing option sets whether an interface is allowed +to transmit. Defaults to True. If set to False or No +the interface will only receive data, and never transmit.
          +
          +
        • +
        • +
          The network_name option sets the virtual network name for +the interface. This allows multiple separate network segments +to exist on the same physical channel or medium.
          +
          +
        • +
        • +
          The passphrase option sets an authentication passphrase on +the interface. This option can be used in conjunction with the +network_name option, or be used alone.
          +
          +
        • +
        • +
          The ifac_size option allows customising the length of the +Interface Authentication Codes carried by each packet on named +and/or authenticated network segments. It is set by default to +a size suitable for the interface in question, but can be set +to a custom size between 8 and 512 bits by using this option. +In normal usage, this option should not be changed from the +default.
          +
          +
        • +
        • +
          The announce_cap option lets you configure the maximum +bandwidth to allocate, at any given time, to propagating +announces and other network upkeep traffic. It is configured at +2% by default, and should normally not need to be changed. Can +be set to any value between 1 and 100.
          +
          +
          +

          If an interface exceeds its announce cap, it will queue announces +for later transmission. Reticulum will always prioritise propagating +announces from nearby nodes first. This ensures that the local +topology is prioritised, and that slow networks are not overwhelmed +by interconnected fast networks.

          +

          Destinations that are rapidly re-announcing will be down-prioritised +further. Trying to get “first-in-line” by announce spamming will have +the exact opposite effect: Getting moved to the back of the queue every +time a new announce from the excessively announcing destination is received.

          +

          This means that it is always beneficial to select a balanced +announce rate, and not announce more often than is actually necesarry +for your application to function.

          +
          +
        • +
        • +
          The bitrate option configures the interface bitrate. +Reticulum will use interface speeds reported by hardware, or +try to guess a suitable rate when the hardware doesn’t report +any. In most cases, the automatically found rate should be +sufficient, but it can be configured by using the bitrate +option, to set the interface speed in bits per second.
          +
          +
        • +
        +
        +
        +
        +

        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 +are propagated and how long paths are valid.

        +

        Configuring modes on interfaces is not strictly necessary, but can be useful +when building or connecting to more complex networks. When not running a +Transport Node, it is rarely useful to configure an interface mode.

        +
        +
          +
        • +
          The default value is full. In this mode, all discovery, +meshing and transport functionality is activated.
          +
          +
        • +
        • +
          In the access_point (or shorthand ap) mode, the +interface will operate as a network access point. In this +mode, announces will not be automatically broadcasted on +the interface, and paths to destinations on the interface +will have a much shorter expiry time. This mode is useful +for creating interfaces that remain quiet, unless when +someone is actually using them. An example of this could +be a radio interface serving a wide area, where users are +expected to connect momentarily, use the network, and then +disappear again.
          +
          +
        • +
        • +
          The roaming mode should be used on interfaces that are +roaming (physically mobile), seen from the perspective of +other nodes in the network. As an example, if a vehicle is +equipped with an external LoRa interface, and an internal, +WiFi-based interface, that serves devices that are moving +_with_ the vehicle, the external LoRa interface should be +configured as roaming, and the internal interface can +be left in the default mode. With transport enabled, such +a setup will allow all internal devices to reach each other, +and all other devices that are available on the LoRa side +of the network, when they are in range. Devices on the LoRa +side of the network will also be able to reach devices +internal to the vehicle, when it is in range. Paths via +roaming interfaces also expire faster.
          +
          +
        • +
        • +
          The purpose of the boundary mode is to specify interfaces +that establish connectivity with network segments that are +significantly different than the one this node exists on. +As an example, if a Reticulum instance is part of a LoRa-based +network, but also has a high-speed connection to a +public Transport Node available on the Internet, the interface +connecting over the Internet should be set to boundary mode.
          +
          +
        • +
        +
        +

        For a table describing the impact of all modes on announce propagation, +please see the Announce Propagation Rules section.

        +
        +
        +

        Announce Rate Control

        +

        The built-in announce control mechanisms and the default announce_cap +option described above are sufficient most of the time, but in some cases, especially on fast +interfaces, it may be useful to control the target announce rate. Using the +announce_rate_target, announce_rate_grace and announce_rate_penalty +options, this can be done on a per-interface basis, and moderates the rate at +which received announces are re-broadcasted to other interfaces.

        +
        +
          +
        • +
          The announce_rate_target option sets the minimum amount of time, +in seconds, that should pass between received announces, for any one +destination. As an example, setting this value to 3600 means that +announces received on this interface will only be re-transmitted and +propagated to other interfaces once every hour, no matter how often they +are received.
          +
          +
        • +
        • +
          The optional announce_rate_grace defines the number of times a destination +can violate the announce rate before the target rate is enforced.
          +
          +
        • +
        • +
          The optional announce_rate_penalty configures an extra amount of +time that is added to the normal rate target. As an example, if a penalty +of 7200 seconds is defined, once the rate target is enforced, the +destination in question will only have its announces propagated every +3 hours, until it lowers its actual announce rate to within the target.
          +
          +
        • +
        +
        +

        These mechanisms, in conjunction with the annouce_cap mechanisms mentioned +above means that it is essential to select a balanced announce strategy for +your destinations. The more balanced you can make this decision, the easier +it will be for your destinations to make it into slower networks that many hops +away. Or you can prioritise only reaching high-capacity networks with more frequent +announces.

        +

        Current statistics and information about announce rates can be viewed using the +rnpath -r command.

        +

        It is important to note that there is no one right or wrong way to set up announce +rates. Slower networks will naturally tend towards using less frequent announces to +conserve bandwidth, while very fast networks can support applications that +need very frequent announces. Reticulum implements these mechanisms to ensure +that a large span of network types can seamlessly co-exist and interconnect.

        +
        @@ -665,8 +727,6 @@ beaconing functionality described above.

        Table of Contents

        diff --git a/docs/manual/objects.inv b/docs/manual/objects.inv index 68dcd2f..cfa5ba3 100644 Binary files a/docs/manual/objects.inv and b/docs/manual/objects.inv differ diff --git a/docs/manual/searchindex.js b/docs/manual/searchindex.js index a5ffee3..cfa03d3 100644 --- a/docs/manual/searchindex.js +++ b/docs/manual/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["examples","gettingstartedfast","index","interfaces","networks","reference","understanding","using","whatis"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["examples.rst","gettingstartedfast.rst","index.rst","interfaces.rst","networks.rst","reference.rst","understanding.rst","using.rst","whatis.rst"],objects:{"RNS.Destination":{announce:[5,1,1,""],app_and_aspects_from_name:[5,1,1,""],clear_default_app_data:[5,1,1,""],create_keys:[5,1,1,""],decrypt:[5,1,1,""],deregister_request_handler:[5,1,1,""],encrypt:[5,1,1,""],full_name:[5,1,1,""],get_private_key:[5,1,1,""],hash:[5,1,1,""],hash_from_name_and_identity:[5,1,1,""],load_private_key:[5,1,1,""],register_request_handler:[5,1,1,""],set_default_app_data:[5,1,1,""],set_link_established_callback:[5,1,1,""],set_packet_callback:[5,1,1,""],set_proof_requested_callback:[5,1,1,""],set_proof_strategy:[5,1,1,""],sign:[5,1,1,""]},"RNS.Identity":{CURVE:[5,2,1,""],KEYSIZE:[5,2,1,""],TRUNCATED_HASHLENGTH:[5,2,1,""],decrypt:[5,1,1,""],encrypt:[5,1,1,""],from_bytes:[5,1,1,""],from_file:[5,1,1,""],full_hash:[5,1,1,""],get_private_key:[5,1,1,""],get_public_key:[5,1,1,""],get_random_hash:[5,1,1,""],load_private_key:[5,1,1,""],load_public_key:[5,1,1,""],recall:[5,1,1,""],recall_app_data:[5,1,1,""],sign:[5,1,1,""],to_file:[5,1,1,""],truncated_hash:[5,1,1,""],validate:[5,1,1,""]},"RNS.Link":{CURVE:[5,2,1,""],ESTABLISHMENT_TIMEOUT_PER_HOP:[5,2,1,""],KEEPALIVE:[5,2,1,""],get_remote_identity:[5,1,1,""],identify:[5,1,1,""],inactive_for:[5,1,1,""],no_inbound_for:[5,1,1,""],no_outbound_for:[5,1,1,""],request:[5,1,1,""],set_packet_callback:[5,1,1,""],set_remote_identified_callback:[5,1,1,""],set_resource_callback:[5,1,1,""],set_resource_concluded_callback:[5,1,1,""],set_resource_started_callback:[5,1,1,""],set_resource_strategy:[5,1,1,""],teardown:[5,1,1,""]},"RNS.Packet":{ENCRYPTED_MDU:[5,2,1,""],PLAIN_MDU:[5,2,1,""],resend:[5,1,1,""],send:[5,1,1,""]},"RNS.PacketReceipt":{get_rtt:[5,1,1,""],get_status:[5,1,1,""],set_delivery_callback:[5,1,1,""],set_timeout:[5,1,1,""],set_timeout_callback:[5,1,1,""]},"RNS.RequestReceipt":{get_progress:[5,1,1,""],get_request_id:[5,1,1,""],get_response:[5,1,1,""],get_response_time:[5,1,1,""],get_status:[5,1,1,""]},"RNS.Resource":{advertise:[5,1,1,""],cancel:[5,1,1,""],get_progress:[5,1,1,""]},"RNS.Reticulum":{ANNOUNCE_CAP:[5,2,1,""],MTU:[5,2,1,""],should_use_implicit_proof:[5,1,1,""],transport_enabled:[5,1,1,""]},"RNS.Transport":{PATHFINDER_M:[5,2,1,""],deregister_announce_handler:[5,1,1,""],has_path:[5,1,1,""],hops_to:[5,1,1,""],next_hop:[5,1,1,""],next_hop_interface:[5,1,1,""],register_announce_handler:[5,1,1,""],request_path:[5,1,1,""]},RNS:{Destination:[5,0,1,""],Identity:[5,0,1,""],Link:[5,0,1,""],Packet:[5,0,1,""],PacketReceipt:[5,0,1,""],RequestReceipt:[5,0,1,""],Resource:[5,0,1,""],Reticulum:[5,0,1,""],Transport:[5,0,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:attribute"},terms:{"0":[0,3,5,6,8],"00":[6,7],"000":[],"00000000":6,"00000100":6,"00000111":6,"01":6,"01010000":6,"02":[],"05":0,"07":[],"1":[0,3,5,6,7],"10":[0,3,6,7],"100":[0,3,6],"1000":0,"10000000":6,"1024":0,"11":6,"115200":[3,7],"12":3,"1200":6,"125":3,"125000":3,"127":3,"128":[5,6,8],"13":7,"14":6,"141":[],"15":3,"150":[3,7],"150m":3,"151":6,"16":[3,7],"17":7,"18":[],"180":[],"182":[],"187":7,"2":[0,3,5,6,7],"20":[0,3,6,7],"200":[3,7],"2000000":[],"205":[],"211":[],"23":7,"237":[6,8],"24":3,"240":[],"25":[0,2,8],"255":3,"256":[5,6],"27":7,"270":[],"2f":0,"3":[0,6,7,8],"30":7,"323":[],"33":6,"34":[],"360":5,"3600":0,"367":[],"37":[],"37428":7,"38":7,"383":5,"3e12fc71692f8ec47bc5":1,"3w3lha":[],"4":[6,7],"409":[],"4242":3,"430":6,"45":0,"460":[],"469":7,"476":5,"477":6,"48555":3,"49":7,"49555":3,"4965":[1,7],"5":[0,3,5],"500":[5,6,8],"5001":3,"507":5,"512":[3,5,6],"5245a8efe1788c6a70e1":7,"55":3,"56b115c30cd386cad69c":7,"5757":3,"5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq":3,"60":0,"600":3,"62":[6,8],"63":7,"64":[6,7],"7":3,"72":3,"74":7,"77":6,"7c565719ec7a8cdb1fe2":[],"7ca6f4e4dc26ae329e61":[],"8":[0,3,7],"80":[5,6,7],"8001":3,"80e29bf7cccaf31431b3":6,"83":[6,7],"86":7,"867":3,"867200000":3,"868":6,"88":3,"9":7,"900":6,"9382f334de63217a4278":7,"95":6,"\u00ec2pd":3,"abstract":6,"break":[5,6,8],"byte":[0,5,6,7,8],"case":[1,3,4,6,7],"class":[0,2,4,8],"default":[0,1,3,4,5,6],"do":[0,1,3,5,6,7,8],"export":1,"final":6,"float":[0,5],"function":[0,1,2,3,4,5,8],"import":[0,1,3,4,6],"int":0,"long":[0,3,6],"new":[0,3,4,5,6,7],"public":[0,2,3,5],"return":[0,5],"short":[6,7],"static":5,"switch":[3,6],"throw":[],"true":[0,1,3,5,7],"try":[0,2,3],"while":[0,1,3,4,5,6,8],A:[0,1,3,4,5,6,8],And:0,As:[1,3,4,5,6,8],At:[4,6],Be:[5,7],But:6,By:[0,1,3,5,6],For:[1,3,4,5,6,8],IF:[],IN:[0,5],If:[0,1,3,4,5,6,7,8],In:[0,1,3,4,5,6,7,8],It:[0,1,3,5,6,7,8],No:[3,6,8],On:[0,1,3,7],One:5,Or:[3,8],That:6,The:[0,1,2,3,4,5,8],Then:1,There:[1,4,6,8],These:[1,3,6,7],To:[0,1,3,4,6,7,8],Will:5,With:[2,3,4,6,7],_:6,__:6,______:6,_______:6,________:6,________________:6,__init__:0,__main__:0,__name__:0,_exit:0,_with_:3,aarch64:1,ab:0,abil:1,abl:[0,1,3,4,5,6,7],about:[0,1,3,4,5,6],abov:[1,3,6],absolut:[1,8],accept:[5,6],accept_al:[0,5],accept_app:5,accept_non:5,access:[1,2,3,4,5,7],access_point:3,accomod:6,accord:6,accordingli:0,acheiv:[3,6],achiev:[5,6],acknowledg:8,across:4,act:[1,5,6],action:0,activ:[0,1,3,5,6],actor:6,actual:[0,1,3,6],ad:[0,2,4,5,6,8],adapt:4,add:[0,1,3,4,7],add_argu:0,addit:[6,8],addr1:[],addr2:[],address:[0,1,3,4,5,6,8],adher:5,admin:3,administr:7,adress:[0,1,4,5,6,8],advanc:6,advantag:5,adversari:1,advertis:[0,5],advis:6,ae:[6,8],affect:3,after:[0,3,4,6,7],again:[1,3,6],against:6,agenc:6,agent:6,agnost:[4,6],agnostic:6,aim:[2,6],air:8,airtim:3,aliv:[5,6],all:[0,1,2,3,4,5,6,7,8],alloc:[3,5,6,7],allow:[0,1,3,4,5,6,7,8],allow_al:[0,5],allow_list:5,allow_non:5,allowed_list:5,almost:[3,6],alo:6,alon:3,along:[4,6],alreadi:[0,1,4,6],als:[],also:[0,1,3,4,5,6,7,8],alter:6,altern:[0,3,7],although:[6,8],alwai:[1,5,6,7],amateur:[3,8],amet:[],amount:[3,4,5,6,8],an:[0,1,3,4,5,6,7,8],android:2,ani:[0,1,3,4,5,6,7,8],announc:[2,3,5,7],announce_cap:[3,5],announce_handl:0,announced_ident:[0,5],announceloop:0,announcesampl:0,announec:[],anonym:[1,4,5,6,8],anoth:[1,5,6,7],answer:[6,7],anymor:1,anyon:[0,1,4,5,6],anyth:[3,6,8],anywher:[0,3],ap:[3,6],apart:[],api:[1,2,6,8],apk:1,app:[0,1,5,6],app_and_aspects_from_nam:5,app_data:[0,5],app_nam:[0,5],app_timeout:0,append:[0,6],appli:[5,6],applic:[0,4,5,6,7],approach:[6,7],approv:6,approxim:[],apt:1,ar:[0,1,3,4,5,6,7,8],arbitrari:[5,6],arbritrari:8,architectur:1,area:[3,4,6,8],arg:0,argon:0,argpars:0,argument:[0,5,7],argumentpars:0,arm64:2,around:6,arriv:[0,6],ask:[0,5],aspect:[0,3,5,6],aspect_filt:[0,5],assign:[6,7],associ:[1,5,6],assum:[3,6],asymmetr:[6,8],attached_interfac:[],attack:1,attempt:5,attribut:5,audit:8,authent:[1,3,4,5,6,8],author:6,auto:[2,5,6],auto_compress:5,autoconfigur:[3,8],autodiscov:3,autointerfac:[3,7],autom:6,automat:[0,1,3,4,5,6,7,8],autonom:[4,6],autoomat:0,avail:[0,1,3,4,5,6,7,8],availadbl:[],averag:6,avoid:[6,7],awai:[0,4,6,7],awar:6,ax25kissinterfac:3,ax:[2,8],b32:[1,3],b:[0,4],back:[0,6,8],background:[1,3],backhaul:4,band:6,bandwidth:[1,3,4,5,6,8],bare:0,barrier:6,base32:3,base:[2,3,4,5,6,7,8],basi:[5,6,8],basic:[0,1,2],baud:3,beacon:3,beam:[],becaus:[4,6],becki:0,becom:[0,1,4,6],been:[0,1,3,4,5,6,8],befor:[0,1,5,6,7],begin:[0,5],begun:5,behaviour:3,behind:[1,6],being:[3,5,6],beings:6,belief:6,below:[1,3],benefici:7,best:[1,6,8],beta:8,better:3,between:[0,3,4,5,6],bgp:[],bi:6,bidirect:6,billion:[4,6],bin:7,binari:[0,1,6],bind:3,bit:[3,5,6,7,8],bitrat:3,blob:[0,6],block:3,board:[1,6,8],boot:7,both:[1,3,4,5,6,8],boundari:[3,6],bp:[],bridg:2,briefli:6,bring:3,broadcast:[1,2,3,5,6],broadcast_destin:0,broadcastloop:0,brought:[3,7],browser:1,buffer:3,bug:8,build:[0,1,2,3,6,8],built:[1,6,8],bundl:0,c:[0,4],cabl:4,cad:[],calcul:[5,6],call:[0,4,5,6,8],callabl:5,callback:[0,5],callsign:3,can:[0,1,2,3,4,5,6,7],cancel:5,candid:4,cannot:0,capabl:6,capac:[5,6],carambola:0,care:[1,5,8],carefulli:1,cargo_build_target:1,carri:[3,5,6],carrier:[4,8],caution:3,caveat:2,cb:6,cbc:8,cd:1,cdma:3,censor:6,censorship:6,central:[4,6],centralis:6,certain:[0,3,4,6],challeng:6,chang:[0,1,3,5,6,7,8],channel:[0,3,4,6,8],channelarg:0,chapter:[1,3,4,6,8],charact:0,characterist:6,cheap:6,check:[0,1,5,6],checksum:[5,8],choos:[0,1,3,6],choosen:6,chose:6,chosen:4,chunk:0,ciphertext:5,ciphertext_token:5,circumst:6,cl:0,clear:[0,5,6],clear_default_app_data:5,clear_screen:0,client:[0,1,2,5],client_connect:0,client_disconnect:0,client_ident:0,client_loop:0,client_packet_receiv:0,client_request:0,clone:1,close:[0,4,5],closed_callback:5,closer:6,closest:6,cluster:6,co:8,code:[1,2,3],codingr:3,com:[0,1],combin:[1,4,6],come:[1,6],comma:3,command:[0,1,3,7],comment:3,common:[1,2,4,6,8],commun:[0,1,3,4,5,6,7,8],compat:[1,3,5,6],compil:1,complet:[0,1,3,4,5,6,8],complex:[3,6],compon:6,compos:6,compress:[0,5,6],comput:[1,6,8],concaten:5,concept:[2,6],conceptu:6,conclud:[0,5],concurr:[6,7],condit:6,config:[0,1,4,7],configarg:0,configdir:5,configpath:0,configur:[0,1,2,3,4,5,6,8],confirm:[6,8],confus:6,congest:6,conjunct:3,connect:[0,2,3,4,5,6,7,8],consequ:[],consid:[6,8],consider:[],consist:6,constant:5,constantli:6,construct:6,consumpt:[],contact:6,contain:[0,4,5,6],contend:6,content:[4,7],context:6,contin:3,continu:8,control:[0,1,3,4,5,6],conveni:0,convent:0,converg:[2,6],coordin:[4,5,6,8],core:[4,6,8],correct:[0,6],correctli:0,correspond:6,cost:[6,8],could:[0,1,3,4,5,6,8],count:6,counter:0,cours:[3,6],cover:[6,8],coverag:4,cpu:0,creat:[0,2,3,4,5,6,7,8],create_kei:5,create_receipt:[0,5],creation:6,creator:6,critic:6,cryptograph:[4,8],cryptographi:[1,6,8],ctrl:0,cull:5,current:[0,1,2,3,5,6],current_download:0,current_filenam:0,curv:[4,5,6,8],curve25519:[4,5,6,8],custom:[3,5,6,8],custom_network_nam:3,customis:3,d:[4,7],daemon:[1,3,5,7],dai:4,data:[0,1,3,4,5,6,8],data_port:3,databit:[3,7],date:[0,1],db:0,dbm:[0,3],debian:[6,7],debug:[],decai:[],decid:[4,5,6],decod:0,decrypt:[5,6],dedic:[3,6],deep:1,def:0,default_timeout:[],defin:[0,3,6],definit:6,degrad:4,degre:3,delai:[1,3,6,7],deliv:[0,5],deliveri:[0,1,5,8],demand:5,demonstr:[0,3],depend:[1,4,6,7],deploi:6,deregist:5,deregister_announce_handl:5,deregister_request_handl:5,deriv:[6,8],describ:[3,5,6],descript:[0,7],design:[1,4,6,8],desir:[0,3,6],destin:[0,1,2,3,4,7],destination_1:0,destination_2:0,destination_clos:0,destination_hash:[0,5,7],destination_hexhash:0,detail:[0,1,2,3,5,7,8],detect:0,determin:[1,5,6],dev:[1,3,7],develop:[2,6,8],devic:[1,2,3,4,5,6,7],dh:5,dhcp:3,did:0,differ:[0,1,3,4,5,6,7,8],diffi:[4,6,8],difficult:1,digit:[6,8],dir:0,direct:[0,1,4,5,6],directli:[3,5,6,7,8],directori:[0,7],disabl:[3,6],disable_encrypt:[],disappear:3,disassoci:6,discard:6,disconnect:0,discov:1,discover:3,discoveri:[3,6,7],discovery_port:3,discovery_scop:3,discrimin:4,discuss:[1,6],disk:[0,5],displai:[0,6],dissolv:4,distanc:6,distant:5,distinct:[3,6],distinguish:6,distribut:[0,1,4,5,6,7],divmod:0,document:6,doe:[0,1,2,3,4,5,6],doesn:3,dolor:[],domain:[1,3],don:[0,1,4,5],done:[0,1,4,6],dori:4,dot:[6,7],down:[0,3],downgrad:[],download:[0,3],download_began:0,download_conclud:0,download_finish:0,download_start:0,download_tim:0,driver:[7,8],droid:1,drop:[5,6,7],due:4,duplex:[6,8],dynam:[1,7],e702c42ba8:7,e:[0,4],each:[0,1,3,4,6],earli:1,earlier:6,eas:[3,6],easi:[1,3,6,7,8],easier:[1,3,4,7],easiest:[1,3,6],easili:[3,4,6,7,8],eca6f4e4dc26ae329e61:7,ecdh:[6,8],echo:[1,2,7],echo_destin:0,echo_request:0,ed25519:[6,8],edit:1,effeci:[],effici:[0,1,3,6,8],ei:0,either:[3,4,6],elaps:3,elif:0,ellipt:[4,5,6,8],els:[0,4,6],emploi:6,emptor:2,emul:1,enabl:[1,3,4,5,6,7],enable_transport:6,encapsul:[3,8],encod:0,encrypt:[0,1,4,5,6,8],encrypted_mdu:5,encryptionless:[],end:[0,3,4,5,6,8],endless:3,endpoint:[0,4,5,6],energi:1,engin:[],enhanc:6,enough:[1,6],ensur:[5,6],enter:0,entir:[4,6],entiti:6,entri:[0,1,6],enumer:0,environ:[1,4,6],environment:6,environmentlogg:6,eof:3,ephemer:[4,5,6,8],equal:[4,6],equip:[3,4,6],equival:3,equl:[],error:[0,1],especi:3,essenti:[1,6],establish:[0,1,3,4,5,8],established_callback:5,establishment_timeout_per_hop:5,etc:7,eth0:3,eth1:3,ethernet:[1,3,4,6,8],even:[1,3,4,6,7,8],event:3,eventu:5,everi:[0,3,4,5,6],everyon:[4,6],everyth:[0,4,6],evolv:4,exact:6,exactli:[5,6],exampl:[1,2,3,5,6,7,8],example_util:[0,7],exampleannouncehandl:0,exce:[0,5],except:[0,3],exchang:[4,5,6,8],exclud:6,execstart:7,execstartpr:7,execut:[0,1,3,5,7],exhaust:6,exist:[0,1,3,6,8],exit:[0,1,5,7],exit_handl:0,expand:6,expect:[0,3,5,6,7],experi:[1,6],experiment:[1,8],expir:3,expiri:3,explain:5,explan:6,explicit:5,explicitli:[],explor:[0,6,8],expos:[3,5],extend:[0,1,5],extern:[1,3,5,8],extra:[1,3,4,7],extrem:[1,6,8],f:1,fa7ddfab5213f916dea:6,face:1,fact:8,factor:3,fail:[0,5],failed_callback:[0,5],failur:[1,3],fals:[0,3,5],far:[4,6],fast:[2,5,6],faster:[1,3,6],fastest:[3,6],featur:[1,6,8],feed:5,feedback:0,feel:1,fernet:8,few:[1,3,4,6,7,8],fewer:5,fibr:8,field:6,file:[0,1,3,4,5,6,7,8],file_resourc:0,file_s:0,filelist:0,filelist_data:0,filelist_receiv:0,filelist_timeout_job:0,filenam:0,filetransf:[1,2,5],filter:[0,4,6],find:[4,6],firewal:[1,3],firmwar:[1,6],first:[0,1,3,5,6],fit:0,five:0,fix:[2,6],flag:[5,6],flexibl:[3,8],flow:[3,4],flow_control:3,flush:0,folder:1,follow:[0,1,3,6,7,8],forcibl:5,foreground:1,foremost:8,form:[1,3,4,5,6],format:[0,2,8],forth:0,forward:[3,5,6,8],forward_ip:3,forward_port:3,found:[0,1,3,4,6,7],four:4,frame:3,frankfurt:[1,7],free:[4,8],freedom:6,freeli:6,frequenc:[3,6],frequent:3,friendli:8,from:[0,1,3,4,5,6,7,8],from_byt:5,from_fil:5,fromhex:0,fruit:0,ftdi_ft230x_basic_uart_43891ckm:7,full:[0,3,5,6,7,8],full_hash:5,full_nam:[5,7],fulli:[6,8],funcion:5,fundament:6,further:[1,2],futur:[4,6],g:0,ga:0,gain:6,galact:6,gatekeep:6,gatewai:[1,4],gbp:7,gen:[],gener:[0,1,3,4,5,6,8],generalis:8,geograph:4,get:[0,2,3,5,8],get_packet_rssi:0,get_packet_snr:0,get_private_kei:5,get_progress:[0,5],get_public_kei:5,get_random_hash:[0,5],get_remote_ident:[0,5],get_request_id:5,get_respons:5,get_response_tim:5,get_rtt:[0,5],get_statu:5,geti2p:3,ghz:6,gi:0,gigabyt:8,gipsum:[],git:1,github:[0,1],give:[3,6,7],given:[3,4,5,6],global:[0,1,3,4,6,8],go:[0,1,3,6],goal:[2,3],good:[4,6],got:0,got_respons:0,govern:6,gracefulli:3,grape:0,graphic:1,great:6,greater:6,greatli:3,group:[3,5,6],group_id:3,grow:4,growth:2,guarante:[1,6],guess:3,guid:[1,5,6],h:[1,7],ha:[0,1,3,4,5,6,8],hack:8,had:6,half:[6,8],hand:[0,1],handheld:6,handl:[0,3,4,5,6,7,8],handler:[0,5],happen:[0,5,6],hardlin:4,hardwar:[1,3,4,5,6,8],has_path:[0,5],hasattr:0,hash1:6,hash2:6,hash:[0,1,5,6,7],hash_from_name_and_ident:5,hashmap:0,have:[0,1,3,4,5,6,7],hazard:5,head:1,header:6,header_1:6,header_2:6,header_typ:[],hear:6,heard:[5,6],helium:0,hellman:[4,6,8],help:[0,4,6,7,8],her:4,here:[0,1,3,6,7],hexadecim:[0,6,7],hide:1,high:[3,6,8],higher:[4,8],highli:6,hill:4,hint:0,hit:0,hmac:8,hoc:8,hold:[5,6],home:4,homebrew:3,hop:[4,5,6,7,8],hops_to:5,host:[0,1,3,6,7],hostnam:3,hour:0,how:[0,1,3,4,6,8],howev:[1,4],http:[0,1],hub:3,huge:[],human:[0,5,6],i2p:[1,2,8],i2p_tunnel:3,i2pd:1,i2pinterfac:[1,3],i:0,id:[3,5,6,7],id_callsign:3,id_interv:3,idea:6,ideal:8,ident:[0,1,2,8],identif:[2,3,8],identifi:[0,3,5,6],identify:6,identifyexampl:0,ie:[],if00:7,ifac:[6,7],ifac_s:3,ifconfig:7,ignor:[3,5,6],ignored_devic:3,illustr:[4,6],immedi:[1,7],impact:[3,6],implement:[0,4,5,6,8],implic:3,implicit:[5,6],imposs:6,improv:[2,3],inactive_for:5,inbound:[3,5],includ:[0,2,3,5,6],incom:[0,3,5],incompat:[5,6],increas:3,incur:3,indefinit:[],independ:[5,6],independt:8,index:[0,1,2],indirectli:6,individu:[5,6],inevit:6,infer:6,info:[5,6,7],inform:[0,1,2,4,5,6],infrastructur:[1,3,4,6],ingo:5,initi:[0,4,5,6,8],initialis:[0,5,7],input:0,insert:6,insid:6,inspect:[1,3,4,6],instal:[1,3,4,7,8],instanc:[0,2,3,5,6,7],instanti:5,instead:[0,3,6,7],integr:[4,6],intend:[4,6],intention:6,inter:5,interact:[0,1,5,6],interchang:3,interconnect:[2,6],interest:6,interfac:[0,2,4,5,7],interface_en:[1,3,7],interface_mod:[],intermediari:6,intermitt:3,intern:[3,5],internet:[2,3,6,8],interoper:[1,4,6,8],interv:[3,5],intiat:0,introduc:6,introduct:2,intuit:8,invalid:[0,5],invers:6,investig:4,invis:[1,3],involv:4,io:[1,7],ip:[1,3,6,8],ipsum:[],ipv6:3,is_connected_to_shared_inst:0,is_request:[],is_respons:[],isdir:0,isfil:0,island:4,ism:6,isol:3,issu:4,its:[3,5,6],itself:[2,6],iv:8,job:0,join:[0,1,4,6],just:[0,1,3,4,6,8],k:0,kb:7,kbp:7,keep:[0,4,5,6,7,8],keepal:[5,6],kei:[0,2,4,5,8],kept:[3,4,5,6],kernel:[3,7,8],keyboardinterrupt:0,keyerror:5,keypair:6,keysiz:5,keystor:4,khz:3,ki:0,kill:[5,6],kilomet:[],kind:[3,4,6],kiss:[2,7,8],kiss_fram:3,kissinterfac:[3,7],know:[0,1,4,5,6],knowledg:[4,6],known:[0,5,6,7],krypton:0,l:3,lack:6,laid:6,lan:3,larg:[0,4,5,6,8],larger:[4,6],laser:3,last:[0,3,5],last_unit:0,latenc:[1,6,8],later:[0,1],latest:[0,1,3],latest_client_link:0,launch:1,lavg:[],layer:[3,4,6,8],lead:6,leak:1,learn:[0,1,6],least:[3,6,8],leav:[4,6],ledger:6,left:[3,5,6],legaci:4,len:0,length:[0,3,5,6],less:[3,6,8],let:[0,1,3,4,6,7],level:[3,6],libffi:1,librari:1,licens:6,light:7,like:[1,3,4,5,6,7,8],limit:[4,6],line:[0,1,4,6,8],link:[2,3,4,8],link_clos:0,link_establish:0,linkexampl:0,linux:[1,6],list:[0,3,5,6,8],list_deliv:0,list_fil:0,list_packet:0,list_receipt:0,list_timeout:0,listdir:0,listen:[0,3,6],listen_ip:3,listen_port:3,littl:6,lki:6,lkr:6,ll:[0,1,8],ln:[1,7],load:[0,5,7],load_private_kei:5,load_public_kei:5,local:[0,1,3,4,5,6,7,8],locat:[1,4,6,7],log:[0,3],log_error:0,log_info:0,loglevel:[0,5],longer:[0,4,6],longest:3,look:[0,1,3,6,7],loop:0,lora32:[],lora:[1,2,6,8],lorawan:6,lorem:[],lot:6,low:[1,3,4,6,8],lower:1,lxmf:1,m:[0,1,6,7],mac:6,machin:6,maco:1,made:[1,5,6],mai:[1,3,5,6],main:0,mainli:4,maintain:6,make:[1,6,7],malici:6,manag:[1,4,5,6],mani:[0,1,3,4,5,6,7,8],manipul:6,manner:4,manual:[0,1,3,4,5,7],mark:6,markqvist:[0,1],master:[0,5],match:[0,3,6],maximum:[3,5,6],mbp:7,mcu:[],mdu:0,mean:[3,4,6,7],measur:6,mechan:[2,3],medium:[3,4,5,6,8],member:4,memori:6,mention:6,menu:0,menu_mod:0,mesh:[1,3,4,8],messag:[0,1,5,6,7],messeng:6,metadata:1,metavar:0,method:[0,1,3,5,6],methodolog:[6,7],mhz:[3,6],mi:0,microcontrol:6,microwav:[],might:[1,3,4,6,7],millisecond:[0,7],mind:[4,8],minim:[2,6],minimalsampl:0,minimum:[0,4,6],minut:[0,1,3,6],mix:[1,3,4,7],mobil:[3,6],mode:[0,1,2,6,7,8],modem:[3,4,5,6,8],modifi:6,modul:[0,1,6,7,8],moment:[6,8],momentarili:3,monitor:6,moon:0,mor:[],more:[1,3,4,5,6,8],morej:[],most:[1,3,4,6,7],mostli:[3,4,6],motiv:2,move:[1,3,6],mqtt:[],mtu:[5,6,8],much:[1,3,4],multi:[6,7,8],multicast:3,multilater:6,multipl:[0,3,4,6,7],multipoint:6,must:[0,1,3,4,5,6],mw:3,my:6,mycal:3,myriad:6,n:[0,6],name:[0,2,3,4,5],namespac:0,nano:1,narg:0,natur:3,nears:6,necesarri:4,necessari:[1,3,5,6],necessarili:6,need:[0,1,2,3,4,6,7,8],neglig:6,neither:6,neon:0,net:3,netcat:3,netifac:1,network:[0,3,5,6,7,8],network_nam:3,never:[3,5,6],newer:6,newest:6,newli:[4,6],next:[1,4,5,6],next_hop:5,next_hop_interfac:5,nicknam:6,no1cll:3,no_inbound_for:5,no_outbound_for:5,nobl:0,noble_ga:0,noble_gas:0,node:[1,2,3,4,7,8],nodet:[],nomad:2,nomadnet:1,non:[1,5,6],none:[0,3,5,6,7],normal:[0,3,5],notat:[6,7],note:[0,1,3,6,7],noth:8,notic:6,notif:[0,5],now:[0,1,4,6,7],nt:0,num:0,number:[0,1,3,4,5,6,7],obfusc:[],object:5,obtain:6,obviusli:6,occasion:1,occur:8,off:[6,8],offer:[1,2,3,5,6],offlin:1,often:[1,4,6,7],oganesson:0,old:6,on_interfac:5,onc:[0,1,3,4,5,6,8],one:[0,1,3,4,5,6,7,8],ones:3,oneself:6,onli:[0,1,3,4,5,6,7,8],onlin:[],onto:6,open:[0,3,4,5,6,7,8],openmodem:[3,8],openssl:1,oper:[3,4,5,6,8],opt:6,optic:8,optim:4,optimis:[],option:[0,1,2,4,5,6,7],order:7,orem:[],organ:4,organis:[3,4],orient:6,origin:[0,4,6],original_hash:[],os:[0,3,6,7,8],ospf:[],other:[1,3,4,5,6,7],otherwis:5,our:[0,6],out:[0,1,3,4,5,6,8],outbound:[5,6],outgo:[0,1,3,5,6,7],outli:4,outlier:4,outlin:[1,6],output:[3,7],outward:[],over:[0,2,3,5,6,7,8],overal:6,overcom:6,overhead:[3,6],overrid:0,oversight:6,overview:[2,3,6],overwhelm:5,own:[0,1,4,5,6],owner:[],p:0,pack:0,packag:[1,3],packb:0,packet:[0,1,2,3,4,7,8],packet_callback:0,packet_deliv:0,packet_hash:0,packet_receipt:[0,5],packet_timed_out:0,packet_typ:[],packetreceipt:[0,5],pad:8,page:[1,2,6],pair:[3,6],palm:[],parallel:1,paramet:[3,4,5,6],pariti:[3,7],pars:0,parse_arg:0,parser:0,part:[0,3,4,6],particip:[2,4,6],pass:[0,3,4,5,6],passphras:[3,6],past:[],path:[0,1,3,5,6,7],path_respons:5,pathfind:[],pathfinder_m:5,pattern:6,payload:[5,6],peach:0,peer:[0,1,3,5,6,7],peer_pub_byt:[],peer_sig_pub_byt:[],peopl:6,per:[3,5,6,8],percent:0,percentag:5,perfect:[],perform:[0,1,3,4,6],period:[3,6],perman:7,permissionless:6,persecut:6,persist:[3,7],person:6,perspect:[3,6],pet:0,philosophi:6,physic:[1,3,6,7],pi:[0,4,6,7,8],pick:6,piec:6,ping:[1,7],pip3:[1,7],pip:[1,7],pipe:[2,8],pipeinterfac:3,pkcs7:8,pkg:1,place:[4,6,7],plain:[0,3,5,6],plain_mdu:5,plaintext:[0,5],plan:[4,6],platform:[1,6],pleas:[0,1,3,7,8],plenti:6,plu:[],plug:7,pmr:6,point:[1,3,4,6,7],pomelo:0,poorli:4,popular:8,port0:7,port:[2,3,4,6,8],portabl:[3,6],posit:7,possess:6,possibl:[1,3,4,5,6,8],potenti:[0,3,6,7],power:[1,3,6],practic:[6,8],pre:[1,3,5,6],preambl:[3,7],precompil:1,predict:6,prefer:6,prepar:[0,4],prerequisit:5,presenc:5,preserv:[1,5],preshar:6,press:0,pretend:6,pretti:6,prettyhexrep:0,previou:0,previous:[4,5,6],primari:6,principl:[6,8],print:[0,3],print_filelist:0,print_help:0,print_menu:0,prioriti:6,prioritis:[2,4,5],privaci:8,privat:[1,3,5,6,8],privileg:7,probabl:[0,4,6,7,8],probe:7,problem:6,procedur:6,process:[1,3,5,6],product:[],program:[0,2,3,5,6,8],program_setup:0,programm:6,programmat:6,progress:[0,5,8],progress_callback:5,project:1,prompt:0,proof:[0,5,6,7],proof_packet:0,proof_requested_callback:5,proof_strategi:5,propag:[2,3,5],properli:1,properti:[4,5],proport:6,propos:1,protocol:[1,2,3,8],prove:[0,6],prove_al:[0,5],prove_app:5,prove_non:5,proven:[5,6],provid:[0,1,2,3,4,5,6,8],prv_byte:5,pub_byt:5,public_inform:0,publicli:1,purchas:[4,6,8],purg:5,purpos:[3,5,6],purposefulli:[],put:0,py:[0,1,7],pyseri:1,python3:[1,7],python:[1,6,7,8],q:[0,7],queri:[0,1],question:3,queu:[5,7],queue:6,quickli:[6,8],quiet:[3,7],quinc:0,quit:0,r:[0,6,7],radio:[2,3,4,5,6,7,8],radiu:[],radon:0,rais:[0,5],ram:3,rand:[],randint:0,random:[0,5,6],random_text_gener:0,randomis:6,randomli:[0,6],rang:[0,1,3,4,6,8],rare:3,raspberri:[4,6,7,8],rate:[0,3,7],rather:1,rb:0,re:[0,3,5,6],reach:[2,3,4],reachabl:[0,1,3,4,5,6,7],read:[0,1,3,6],readabl:[0,5,6],readi:[0,1,3,4,5,8],readili:8,real:[4,8],realli:[3,5],reappear:3,reason:[3,6],reassembl:6,reboot:1,recal:[0,5],recall_app_data:5,recap:6,receipt:[0,2,6],receiv:[0,1,3,5,6,7],received_announc:[0,5],recent:6,reception_rssi:0,reception_snr:0,reception_stat:0,recip:1,recipi:6,recommend:[0,1,6],reconstruct:6,record:[1,6],recoveri:3,recreat:6,refer:[0,1,2],regard:6,regist:[0,5],register_announce_handl:[0,5],register_request_handl:[0,5],rel:[6,8],relai:1,relat:1,releas:[1,3,6],relev:[0,3,5,6],reli:6,reliabl:[3,4,6,8],rem:0,remain:[3,5,6],rememb:6,remot:[0,5],remote_ident:[0,5],remote_identifi:0,remote_identity_hash:[],remote_p:0,remotesensor:6,remov:7,render:1,repeat:1,replac:[1,6,7],repli:[0,7],replic:6,reply_data:0,reply_text:0,report:3,repositori:[1,6],repres:6,represent:[0,6],request:[2,6,7],request_destin:0,request_fail:0,request_id:[0,5],request_packet:0,request_path:[0,5],request_receipt:[0,5],request_receiv:0,requested_at:[0,5],requestexampl:0,requestreceipt:5,requir:[0,1,3,4,6,7,8],research:8,resend:5,reserv:6,resili:8,resourc:[0,1,2],resource_callback:5,resource_sending_conclud:0,resource_strategi:5,respawn:3,respawn_delai:3,respawn_interv:3,respect:3,respond:[0,5],respons:[2,5,6],response_callback:[0,5],response_gener:[0,5],response_tim:[],rest:[4,8],restart:7,restartsec:7,restor:3,restrict:4,result:[0,6],retain:3,reticulum:[0,3,4],retiiculum:[],retransmiss:6,retransmit:6,retri:6,reveal:[1,5,6,8],review:8,ridicul:6,right:4,rn:[0,1,5,7],rnode:[1,2,6,7,8],rnodeinterfac:[3,7],rnpath:[1,2],rnprobe:[1,2],rnsconfig:1,rnsd:[1,2],rnstatu:[1,2,3,6],roam:[3,6],robot:6,rotat:6,round:[0,5,7],rout:[1,3,4,5,6,8],routabl:[],router:3,rprogress:0,rsa:[],rssi:0,rtt:[0,5,6],rttstring:0,rule:[2,3],run:[0,1,3,4,5,6,7,8],runtim:6,rust:1,rw:[],rx:3,s:[0,1,3,4,6,7,8],said:6,same:[1,3,4,5,6,7],satisfi:6,save:[5,6],save_error:0,saved_filenam:0,scalabl:8,scale:6,scan:3,scenario:[1,2,6],schedul:5,scope:3,screen:0,search:2,second:[0,3,5,6,7,8],secreci:[5,6,8],section:[1,3,4,6],secur:[1,6,8],see:[0,1,3,4,5,6,8],seek:6,seen:3,segment:[3,4,6,8],segment_index:[],select:[0,3],self:[0,4,8],send:[0,3,5,6,7],sender:[0,1,4,6],sendig:0,sensibl:1,sensor:6,sent:[0,1,5,6,7],sentiment:6,separ:[1,3,4,6,7],sequenc:[0,5,6,8],serial:[2,6,8],serialinterfac:3,serv:[0,3,4,6,7],serve_path:0,server:[0,1,2],server_callback:0,server_destin:0,server_fil:0,server_ident:0,server_link:0,server_loop:0,server_packet_receiv:0,servic:[1,2,4],session:6,set:[0,1,3,4,5,6,7,8],set_default_app_data:5,set_delivery_callback:[0,5],set_link_closed_callback:0,set_link_established_callback:[0,5],set_packet_callback:[0,5],set_proof_requested_callback:5,set_proof_strategi:[0,5],set_remote_identified_callback:[0,5],set_resource_callback:5,set_resource_concluded_callback:[0,5],set_resource_started_callback:[0,5],set_resource_strategi:[0,5],set_timeout:[0,5],set_timeout_callback:[0,5],setdaemon:0,setup:[0,1,2,3],sever:[1,4,5,7],sha256:8,sha:[5,6],shall:6,share:[1,4,5,6,7],she:4,shelf:[6,8],shop:0,shorter:3,shortest:6,shorthand:[3,7],should:[0,1,3,4,5,6,8],should_allow_unencrypt:[],should_quit:0,should_use_implicit_proof:5,show:7,shown:0,side:[3,8],sideband:2,sight:4,sign:[5,6],signatur:[5,6,8],significantli:3,similar:[1,3,4,7,8],simpl:[0,6,7,8],simpler:3,simplest:[3,6],simpli:[0,1,3,4,6,7],simplic:6,simultan:6,sinc:[0,1,3,4,5,6],singl:[0,3,5,6,8],singular:6,sit:[],site:[2,3],situat:[1,3,4,6],size:[0,1,3,5,6],size_str:0,sleep:[0,7],slice:0,slightli:1,slottim:[3,7],slow:[0,3,6],slower:[5,6],small:[0,3,4,6,8],smaller:5,snr:0,so:[0,1,3,4,5,6,7,8],softwar:[1,3,6,8],solut:6,solv:6,some:[0,1,3,4,6,7],someon:[1,3],someth:6,somethign:0,soon:5,sort:[3,6],soundmodem:3,sourc:[0,1,4,6,8],space:[0,1,4,6,8],span:6,special:[6,7],specif:[0,2,3,5,8],specifi:[0,1,3,4,5,7],spectrum:[3,6],speed:[3,6,7],split:0,sponsor:8,spread:3,spreadingfactor:3,squelch:3,ssid:3,stabl:[6,8],stack:[0,1,4,6,7,8],stage:[1,6],stai:[0,6,7],standard:[1,6],start:[0,2,3,5,6,7],startlimitintervalsec:[],startup:0,state:0,station:3,stationari:4,statist:0,statu:[0,1,2,3,5,6,7],stdin:3,stdio:8,stdout:[0,3],step:1,still:[0,4,6],stock:0,stop:8,stopbit:[3,7],store:[0,6],store_tru:0,str:0,strategi:5,stream:6,strength:8,strictli:[3,6],string:[0,5],strong:6,structur:6,subject:[],subnet:[1,4],subsequ:6,succe:1,successful:5,successfulli:0,sucessfulli:6,sudo:[1,7],suffic:6,suffici:[1,3,6,7],suffix:0,suit:[1,6],suitabl:[0,1,3,4,6,8],suppli:[4,5,6],support:[0,1,2,4,6,8],sure:[1,7],surveil:6,surviv:6,sy:0,symlink:[1,7],symmetr:[5,6],system:[0,1,2,3,4,5,6,8],systemctl:7,systemd:7,t:[0,1,3,4,5,7],tabl:[1,3,4,6,7],tail:3,tailor:6,take:[0,1,3,6,8],taken:[0,6],tangerin:0,target:[0,7],target_host:[1,3],target_port:[1,3],tcp:[1,2,4,6,8],tcpclientinterfac:[1,3],tcpinterfac:7,tcpserverinterfac:[1,3],tdata:0,teardown:[0,5],teardown_reason:0,teffect:0,tell:[0,3],temperatur:6,ten:6,term:[4,6],termin:[1,5],terminolog:[4,6],termux:1,test:[1,3,6],testnet:[2,7],text:[0,1,4,6],tfile:0,than:[0,1,3,4,6],thei:[0,1,3,4,5,6],them:[0,1,3,4,6],thereaft:6,therefor:[6,8],thi:[0,1,2,3,4,5,6,7,8],thing:1,think:1,those:[4,6],though:[1,6],thourough:8,thousand:6,thread:0,three:[4,6],throough:3,throttl:4,through:[1,3,4,5,6,8],throughout:6,throughput:[6,8],thu:[4,5,6],ti:[0,6],time:[0,1,3,4,5,6,7],timeout:[0,5,7],timeout_callback:[],timeoutarg:0,timestr:0,tnc:[3,5,7,8],to_fil:5,todai:6,todo:[],togeth:6,token:[5,6],toler:3,too:[0,4],tool:[6,8],top:[4,6],topic:6,topographi:[1,4,6],topolog:[3,6],total:[6,8],total_s:0,touch:8,toward:[0,6],tradeoff:6,tradit:[4,6],traffic:[0,1,3,4,5,6,7],tramsit:[],transceiv:[1,3,6,8],transfer:[0,5,6,7,8],transfer_s:0,transform:8,transmiss:[1,3,5,6],transmit:[0,3,6],transpar:[3,6],transpor:[],transport:[0,1,2,3,4,7,8],transport_en:5,transport_id:[],transport_typ:[],travers:6,treat:6,tri:0,trip:[0,5,7],trivial:8,truli:6,truncat:[5,6],truncated_hash:5,truncated_hashlength:5,trust:6,trustless:[4,6,8],ttime:0,ttransfer:0,ttyusb0:[3,7],ttyusb1:3,ttyusb2:3,tun0:3,tune:[],tunnel:[3,6,8],tupl:5,turnaround:3,tutori:1,two:[0,1,3,4,6],tx:3,txpower:3,txtail:[3,7],type:[0,1,2,3,4,5,7],typeerror:5,ubuntu:7,udp:[2,4,6,8],udpinterfac:3,uhf:[7,8],ultim:6,umsgpack:0,uncencrypt:0,uncensor:1,under:7,underli:[4,8],understand:[1,2],unencrypt:[0,5,6],unequivoc:6,unexplor:4,unforg:8,unidentifi:0,unifi:4,uninterest:0,uniqu:[6,8],unit:[0,7],unknown:[0,5,6],unless:[1,3,5,6],unlicens:6,unlik:6,unorganis:4,unpack:0,unpackb:0,unplug:7,unreli:3,unsign:[1,7],unsupport:5,until:[0,5],unwant:6,up:[0,1,3,4,6,7,8],updat:[0,1,5,6],upgrad:[1,6],upkeep:3,upon:[0,6],upset:0,urandom:8,us:[0,2,3,4,5,6],usabl:6,usag:[1,3,7],usb:[4,6,7],useabl:6,user:[0,1,3,4,6,7],user_input:0,userland:8,usernameher:7,usr:7,utf:0,util:[0,2,3,6],utilis:[1,4,7,8],v:7,valid:[0,3,5,6,7],valu:[3,5,6],valueerror:[0,5],vari:[6,7],variabl:0,varieti:[3,6,8],variou:[0,1,3,4,6],vast:6,ve:1,vehicl:3,vendor:0,verbos:7,veri:[1,4,5,6,7,8],verif:[5,6],verifi:[0,5,6],versa:[4,8],version:[6,7],vhf:[4,6,8],via:[1,3,6,7,8],vice:[4,8],view:[1,6,7],virtual:[3,4,6,8],visibl:0,w:7,wa:[0,3,4,5,6,8],wai:[0,1,3,4,6],wait:[0,3,6],want:[0,1,3,4,6,7,8],wantedbi:7,warrant:8,wast:3,wb:0,we:[0,1,3,6],websit:3,weight:7,welcom:1,well:[1,3,4,5,6,8],went:0,were:4,what:[0,1,2,5,6],whatev:[5,6],wheel:1,when:[0,1,3,4,5,6,7],whenev:[5,6],where:[1,2,3,4,5,6,7],whereupon:6,whether:[0,3,5,6],which:[0,1,3,4,5,6,7],who:[1,6],wide:[3,6,8],wider:[1,6],wifi:[1,3,4,6,7,8],wildcard:0,willing:4,window:[],wire:[1,2,3,8],wireless:4,wish:6,within:[0,1,3,4,5,6],without:[1,4,6,8],wlan0:3,won:0,work:[1,4,6,7,8],world:[4,8],worri:4,would:[1,3,4,5,6],write:[0,1,3,5,6],written:6,wrong:0,x25519:[5,6,8],x:6,xenon:0,y:0,ye:[1,3,6],year:6,yet:[0,3,6],yi:0,ykzlw5ujbaqc2xkec4cpvgyxj257wcrmmgkuxqmqcur7cq3w3lha:1,you:[0,1,2,3,4,5,6,7,8],your:[0,1,2,3,4,6,8],yourself:[6,8],z:0,zero:[5,8],zeromq:[],zi:0},titles:["Code Examples","Getting Started Fast","Reticulum Network Stack Manual","Supported Interfaces","Building Networks","API Reference","Understanding Reticulum","Using Reticulum on Your System","What is Reticulum?"],titleterms:{"1":[],"2":[],"25":3,"class":5,"function":6,"public":[1,6],"try":1,The:[6,7],With:1,access:6,ad:1,android:1,announc:[0,6],api:5,arm64:1,auto:3,ax:3,base:1,basic:6,binari:[],bridg:4,broadcast:0,build:4,can:8,caveat:8,client:3,code:[0,6],common:3,concept:4,configur:7,connect:1,converg:4,creat:1,current:8,deliveri:[],destin:[5,6],detail:6,develop:1,devic:8,doe:8,echo:0,emptor:8,establish:6,exampl:[0,4],fast:1,filetransf:0,fix:7,format:6,further:6,get:[1,6],gipsum:[],goal:6,growth:4,i2p:3,ident:[5,6],identif:0,improv:7,includ:[1,7],indic:2,instanc:1,interconnect:4,interfac:[1,3,6,8],internet:[1,4],introduct:6,kei:6,kiss:3,link:[0,5,6],lora:[3,4],manual:2,mechan:6,minim:0,mode:3,motiv:6,name:[6,7],network:[1,2,4],node:6,nomad:1,offer:8,option:3,orem:[],over:[1,4],overview:4,packet:[5,6],particip:1,pathfind:[],pipe:3,port:7,predict:[],prioritis:6,program:[1,7],propag:6,protocol:6,proven:[],radio:1,reach:6,receipt:5,refer:[5,6],request:[0,5],resourc:[5,6],respons:0,reticulum:[1,2,5,6,7,8],retiiculum:[],rnode:3,rnpath:7,rnprobe:7,rnsd:7,rnstatu:7,rule:6,run:[],scenario:4,serial:[3,7],server:3,servic:7,setup:6,sideband:1,site:4,specif:6,stack:2,start:1,statu:8,step:[],support:3,system:7,tabl:2,tcp:3,testnet:1,transport:[5,6],type:[6,8],udp:3,understand:6,us:[1,7,8],util:[1,7],virtual:[],what:8,where:8,wire:6,your:7}}) \ No newline at end of file +Search.setIndex({docnames:["examples","gettingstartedfast","index","interfaces","networks","reference","understanding","using","whatis"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["examples.rst","gettingstartedfast.rst","index.rst","interfaces.rst","networks.rst","reference.rst","understanding.rst","using.rst","whatis.rst"],objects:{"RNS.Destination":{announce:[5,1,1,""],app_and_aspects_from_name:[5,1,1,""],clear_default_app_data:[5,1,1,""],create_keys:[5,1,1,""],decrypt:[5,1,1,""],deregister_request_handler:[5,1,1,""],encrypt:[5,1,1,""],full_name:[5,1,1,""],get_private_key:[5,1,1,""],hash:[5,1,1,""],hash_from_name_and_identity:[5,1,1,""],load_private_key:[5,1,1,""],register_request_handler:[5,1,1,""],set_default_app_data:[5,1,1,""],set_link_established_callback:[5,1,1,""],set_packet_callback:[5,1,1,""],set_proof_requested_callback:[5,1,1,""],set_proof_strategy:[5,1,1,""],sign:[5,1,1,""]},"RNS.Identity":{CURVE:[5,2,1,""],KEYSIZE:[5,2,1,""],TRUNCATED_HASHLENGTH:[5,2,1,""],decrypt:[5,1,1,""],encrypt:[5,1,1,""],from_bytes:[5,1,1,""],from_file:[5,1,1,""],full_hash:[5,1,1,""],get_private_key:[5,1,1,""],get_public_key:[5,1,1,""],get_random_hash:[5,1,1,""],load_private_key:[5,1,1,""],load_public_key:[5,1,1,""],recall:[5,1,1,""],recall_app_data:[5,1,1,""],sign:[5,1,1,""],to_file:[5,1,1,""],truncated_hash:[5,1,1,""],validate:[5,1,1,""]},"RNS.Link":{CURVE:[5,2,1,""],ESTABLISHMENT_TIMEOUT_PER_HOP:[5,2,1,""],KEEPALIVE:[5,2,1,""],get_remote_identity:[5,1,1,""],identify:[5,1,1,""],inactive_for:[5,1,1,""],no_inbound_for:[5,1,1,""],no_outbound_for:[5,1,1,""],request:[5,1,1,""],set_packet_callback:[5,1,1,""],set_remote_identified_callback:[5,1,1,""],set_resource_callback:[5,1,1,""],set_resource_concluded_callback:[5,1,1,""],set_resource_started_callback:[5,1,1,""],set_resource_strategy:[5,1,1,""],teardown:[5,1,1,""]},"RNS.Packet":{ENCRYPTED_MDU:[5,2,1,""],PLAIN_MDU:[5,2,1,""],resend:[5,1,1,""],send:[5,1,1,""]},"RNS.PacketReceipt":{get_rtt:[5,1,1,""],get_status:[5,1,1,""],set_delivery_callback:[5,1,1,""],set_timeout:[5,1,1,""],set_timeout_callback:[5,1,1,""]},"RNS.RequestReceipt":{get_progress:[5,1,1,""],get_request_id:[5,1,1,""],get_response:[5,1,1,""],get_response_time:[5,1,1,""],get_status:[5,1,1,""]},"RNS.Resource":{advertise:[5,1,1,""],cancel:[5,1,1,""],get_progress:[5,1,1,""]},"RNS.Reticulum":{ANNOUNCE_CAP:[5,2,1,""],MTU:[5,2,1,""],should_use_implicit_proof:[5,1,1,""],transport_enabled:[5,1,1,""]},"RNS.Transport":{PATHFINDER_M:[5,2,1,""],deregister_announce_handler:[5,1,1,""],has_path:[5,1,1,""],hops_to:[5,1,1,""],next_hop:[5,1,1,""],next_hop_interface:[5,1,1,""],register_announce_handler:[5,1,1,""],request_path:[5,1,1,""]},RNS:{Destination:[5,0,1,""],Identity:[5,0,1,""],Link:[5,0,1,""],Packet:[5,0,1,""],PacketReceipt:[5,0,1,""],RequestReceipt:[5,0,1,""],Resource:[5,0,1,""],Reticulum:[5,0,1,""],Transport:[5,0,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:attribute"},terms:{"0":[0,3,5,6,7,8],"00":[6,7],"000":[],"00000000":6,"00000100":6,"00000111":6,"01":6,"01010000":6,"02":[],"05":0,"07":[],"1":[0,3,5,6,7],"10":[0,3,6,7],"100":[0,3,6],"1000":0,"10000000":6,"1024":0,"11":6,"115200":[3,7],"12":3,"1200":6,"125":3,"125000":3,"127":3,"128":[5,6,8],"13":7,"14":6,"141":[],"15":3,"150":[3,7],"150m":3,"151":6,"16":[3,7],"17":7,"18":[],"180":[],"182":[],"187":7,"2":[0,3,5,6,7],"20":[0,3,6,7],"200":[3,7],"2000000":[],"205":[],"211":[],"23":7,"237":[6,8],"24":3,"240":[],"25":[0,2,8],"255":3,"256":[5,6],"27":7,"270":[],"2f":0,"3":[0,3,6,7,8],"30":7,"323":[],"33":6,"34":[],"360":5,"3600":[0,3],"367":[],"37":[],"37428":7,"37429":7,"38":7,"383":5,"3e12fc71692f8ec47bc5":1,"3w3lha":[],"4":[6,7],"409":[],"4242":3,"430":6,"45":0,"460":[],"469":7,"476":5,"477":6,"48555":3,"49":7,"49555":3,"4965":[1,7],"5":[0,3,5,7],"500":[5,6,8],"5001":3,"507":5,"512":[3,5,6],"5245a8efe1788c6a70e1":7,"55":3,"56b115c30cd386cad69c":7,"5757":3,"5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq":3,"6":7,"60":0,"600":3,"62":[6,8],"63":7,"64":[6,7],"7":[3,7],"72":3,"7200":3,"74":7,"77":6,"7c565719ec7a8cdb1fe2":[],"7ca6f4e4dc26ae329e61":[],"8":[0,3,7],"80":[5,6,7],"8001":3,"80e29bf7cccaf31431b3":6,"83":[6,7],"86":7,"867":3,"867200000":3,"868":6,"88":3,"9":7,"900":6,"9382f334de63217a4278":7,"95":6,"\u00ec2pd":3,"abstract":6,"break":[5,6,8],"byte":[0,5,6,7,8],"case":[1,3,4,6,7],"class":[0,2,4,8],"default":[0,1,3,4,5,6,7],"do":[0,1,3,5,6,8],"export":1,"final":6,"float":[0,5],"function":[0,1,2,3,4,5,7,8],"import":[0,1,3,4,6],"int":0,"long":[0,3,6],"new":[0,3,4,5,6,7],"public":[0,2,3,5],"return":[0,5],"short":[6,7],"static":5,"switch":[3,6],"throw":[],"true":[0,1,3,5,7],"try":[0,2,3],"while":[0,1,3,4,5,6,8],A:[0,1,3,4,5,6,7,8],And:0,As:[1,3,4,5,6,8],At:[4,6],Be:[5,7],But:6,By:[0,1,3,5,6,7],For:[1,3,4,5,6,8],IF:[],IN:[0,5],If:[0,1,3,4,5,6,7,8],In:[0,1,3,4,5,6,7,8],It:[0,1,3,5,6,7,8],No:[3,6,7,8],On:[0,1,3,7],One:5,Or:[3,8],That:6,The:[0,1,2,3,4,5,8],Then:1,There:[1,4,6,8],These:[1,3,6,7],To:[0,1,3,4,6,7,8],Will:5,With:[2,3,4,6,7],_:6,__:6,______:6,_______:6,________:6,________________:6,__init__:0,__main__:0,__name__:0,_exit:0,_other_:[],_with_:3,aarch64:1,ab:0,abil:1,abl:[0,1,3,4,5,6,7],about:[0,1,3,4,5,6],abov:[1,3,6,7],absolut:[1,8],accept:[5,6],accept_al:[0,5],accept_app:5,accept_non:5,access:[1,2,3,4,5,7],access_point:3,accomod:6,accord:6,accordingli:0,acheiv:[3,6],achiev:[5,6],acknowledg:8,across:4,act:[1,5,6,7],action:0,activ:[0,1,3,5,6],actor:6,actual:[0,1,3,6],ad:[0,2,3,4,5,6,8],adapt:4,add:[0,1,3,4,7],add_argu:0,addit:[6,7,8],addr1:[],addr2:[],address:[0,1,3,4,5,6,8],adher:5,admin:3,administr:7,adress:[0,1,4,5,6,8],advanc:6,advantag:5,adversari:1,advertis:[0,5],advis:6,ae:[6,8],affect:3,after:[0,3,4,6,7],again:[1,3,6,7],against:6,agenc:6,agent:6,agnost:[4,6],agnostic:6,aim:[2,6],air:8,airtim:3,aliv:[5,6],all:[0,1,2,3,4,5,6,7,8],alloc:[3,5,6,7],allow:[0,1,3,4,5,6,7,8],allow_al:[0,5],allow_list:5,allow_non:5,allowed_list:5,almost:[3,6,7],alo:6,alon:3,along:[4,6],alreadi:[0,1,4,6,7],als:[],also:[0,1,3,4,5,6,7,8],alter:6,altern:[0,3,7],although:[6,8],alwai:[1,3,5,6,7],amateur:[3,8],amet:[],amount:[3,4,5,6,8],an:[0,1,3,4,5,6,7,8],android:2,ani:[0,1,3,4,5,6,7,8],annouce_cap:3,announc:[2,5,7],announce_cap:[3,5],announce_handl:0,announce_rate_grac:3,announce_rate_penalti:3,announce_rate_target:3,announced_ident:[0,5],announceloop:0,announcesampl:0,announec:[],anonym:[1,4,5,6,8],anoth:[1,5,6,7],answer:[6,7],anymor:1,anyon:[0,1,4,5,6],anyth:[3,6,7,8],anywher:[0,3],ap:3,apart:[],api:[1,2,6,8],apk:1,app:[0,1,5,6],app_and_aspects_from_nam:5,app_data:[0,5],app_nam:[0,5],app_timeout:0,append:[0,6],appli:[5,6],applic:[0,3,4,5,6,7],approach:[6,7],approv:6,approxim:[],apt:1,ar:[0,1,3,4,5,6,7,8],arbitrari:[5,6],arbritrari:8,architectur:1,area:[3,4,6,8],arg:0,argon:0,argpars:0,argument:[0,5,7],argumentpars:0,arm64:2,around:6,arriv:[0,6],ask:[0,5],aspect:[0,3,5,6],aspect_filt:[0,5],assign:[6,7],associ:[1,5,6],assum:[3,6],asymmetr:[6,8],attached_interfac:[],attack:1,attempt:5,attribut:5,audit:8,authent:[1,3,4,5,6,8],author:6,auto:[2,5,6],auto_compress:5,autoconfigur:[3,8],autodiscov:3,autointerfac:[3,7],autom:6,automat:[0,1,3,4,5,6,7,8],autonom:[4,6],autoomat:0,avail:[0,1,3,4,5,6,7,8],availadbl:[],averag:6,avoid:[6,7],awai:[0,3,4,6,7],awar:6,ax25kissinterfac:3,ax:[2,8],b32:[1,3],b:[0,4],back:[0,3,6,8],background:[1,3],backhaul:4,balanc:3,band:6,bandwidth:[1,3,4,5,6,8],bare:0,barrier:6,base32:3,base:[2,3,4,5,6,7,8],basi:[3,5,6,7,8],basic:[0,1,2,7],baud:3,beacon:3,beam:[],becaus:[4,6],becki:0,becom:[0,1,4,6],been:[0,1,3,4,5,6,8],befor:[0,1,3,5,6,7],begin:[0,5],begun:5,behaviour:[3,7],behind:[1,6],being:[3,5,6],beings:6,belief:6,below:[1,3,7],benefici:[3,7],best:[1,6,8],beta:8,better:3,between:[0,3,4,5,6],bgp:[],bi:6,bidirect:6,billion:[4,6],bin:7,binari:[0,1,6],bind:3,bit:[3,5,6,7,8],bitrat:3,blob:[0,6],block:3,board:[1,6,8],boot:7,both:[1,3,4,5,6,8],boundari:3,bp:[],breviti:7,bridg:2,briefli:6,bring:3,broadcast:[1,2,3,5,6],broadcast_destin:0,broadcastloop:0,brought:[3,7],browser:1,buffer:3,bug:8,build:[0,1,2,3,6,8],built:[1,3,6,8],bundl:0,c:[0,4],cabl:4,cad:[],calcul:[5,6],call:[0,4,5,6,8],callabl:5,callback:[0,5],callsign:3,can:[0,1,2,3,4,5,6,7],cancel:5,candid:4,cannot:0,cap:3,capabl:6,capac:[3,5,6],carambola:0,care:[1,5,8],carefulli:1,cargo_build_target:1,carri:[3,5,6],carrier:[4,8],caution:3,caveat:2,cb:6,cbc:8,cd:1,cdma:3,censor:6,censorship:6,central:[4,6],centralis:6,certain:[0,3,4,6],challeng:6,chang:[0,1,3,5,6,7,8],channel:[0,3,4,6,8],channelarg:0,chapter:[1,3,4,6,7,8],charact:0,characterist:6,cheap:6,check:[0,1,5,6],checksum:[5,8],choos:[0,1,3,6],choosen:6,chose:6,chosen:4,chunk:0,ciphertext:5,ciphertext_token:5,circumst:6,cl:0,clear:[0,5,6],clear_default_app_data:5,clear_screen:0,client:[0,1,2,5],client_connect:0,client_disconnect:0,client_ident:0,client_loop:0,client_packet_receiv:0,client_request:0,clone:1,close:[0,4,5,7],closed_callback:5,closer:6,closest:6,cluster:6,co:[3,8],code:[1,2,3],codingr:3,com:[0,1],combin:[1,4,6],come:[1,6],comma:3,command:[0,1,3,7],comment:[3,7],common:[1,2,4,6,8],commun:[0,1,3,4,5,6,7,8],compat:[1,3,5,6],compil:1,complet:[0,1,3,4,5,6,7,8],complex:[3,6],compon:6,compos:6,compress:[0,5,6],comput:[1,6,8],concaten:5,concept:[2,6,7],conceptu:6,conclud:[0,5],concurr:[6,7],condit:6,config:[0,1,4,7],configarg:0,configdir:5,configpath:0,configur:[0,1,2,3,4,5,6,8],confirm:[6,8],confus:6,congest:6,conjunct:3,connect:[0,2,3,4,5,6,7,8],consequ:[],conserv:3,consid:[6,8],consider:[],consist:6,constant:5,constantli:6,construct:6,consumpt:[],contact:6,contain:[0,4,5,6,7],contend:6,content:[4,7],context:6,contin:3,continu:8,control:[0,1,2,4,5,6],conveni:0,convent:0,converg:[2,6],coordin:[4,5,6,8],core:[4,6,8],correct:[0,6],correctli:0,correspond:6,cost:[6,8],could:[0,1,3,4,5,6,8],count:6,counter:0,cours:[3,6],cover:[6,8],coverag:4,cpu:0,creat:[0,2,3,4,5,6,7,8],create_kei:5,create_receipt:[0,5],creation:6,creator:6,critic:[6,7],cryptograph:[4,8],cryptographi:[1,6,8],ctrl:0,cull:5,current:[0,1,2,3,5,6],current_download:0,current_filenam:0,curv:[4,5,6,8],curve25519:[4,5,6,8],custom:[3,5,6,8],custom_network_nam:3,customis:3,d:[4,7],daemon:[1,3,5,7],dai:4,data:[0,1,2,3,4,5,6,8],data_port:3,databit:[3,7],date:[0,1],db:0,dbm:[0,3],de:[],debian:[6,7],debug:7,decai:[],decid:[4,5,6],decis:3,decod:0,decrypt:[5,6],dedic:[3,6],deep:1,def:0,default_timeout:[],defin:[0,3,6,7],definit:6,degrad:4,degre:3,delai:[1,3,6,7],deliv:[0,5],deliveri:[0,1,5,8],demand:5,demonstr:[0,3],depend:[1,4,6,7],deploi:6,deregist:5,deregister_announce_handl:5,deregister_request_handl:5,deriv:[6,8],describ:[3,5,6],descript:[0,7],design:[1,4,6,8],desir:[0,3,6],destin:[0,1,2,3,4,7],destination_1:0,destination_2:0,destination_clos:0,destination_hash:[0,5,7],destination_hexhash:0,detail:[0,1,2,3,5,7,8],detect:0,determin:[1,5,6],dev:[1,3,7],develop:[2,6,8],devic:[1,2,3,4,5,6,7],dh:5,dhcp:[3,7],did:0,differ:[0,1,3,4,5,6,7,8],diffi:[4,6,8],difficult:1,digit:[6,8],dir:0,direct:[0,1,4,5,6,7],directli:[3,5,6,7,8],directori:[0,7],disabl:[3,6,7],disable_encrypt:[],disappear:[3,7],disassoci:6,discard:6,disconnect:0,discov:1,discover:3,discoveri:[3,6,7],discovery_port:3,discovery_scop:3,discrimin:4,discuss:[1,6],disk:[0,5],displai:[0,6],dissolv:4,distanc:6,distant:5,distinct:[3,6],distinguish:6,distribut:[0,1,4,5,6,7],divmod:0,document:6,doe:[0,1,2,3,4,5,6,7],doesn:3,dolor:[],domain:[1,3],don:[0,1,4,5,7],done:[0,1,3,4,6,7],dori:4,dot:[6,7],down:[0,3],downgrad:[],download:[0,3],download_began:0,download_conclud:0,download_finish:0,download_start:0,download_tim:0,driver:[7,8],droid:1,drop:[5,6,7],due:4,duplex:[6,8],dynam:[1,7],e702c42ba8:7,e:[0,4],each:[0,1,3,4,6,7],earli:1,earlier:6,eas:[3,6],easi:[1,3,6,7,8],easier:[1,3,4,7],easiest:[1,3,6],easili:[3,4,6,7,8],eca6f4e4dc26ae329e61:7,ecdh:[6,8],echo:[1,2,7],echo_destin:0,echo_request:0,ed25519:[6,8],edit:[1,7],effeci:[],effect:3,effici:[0,1,3,6,8],ei:0,either:[3,4,6,7],elaps:3,elif:0,ellipt:[4,5,6,8],els:[0,4,6],emploi:6,emptor:2,emul:1,enabl:[1,3,4,5,6,7],enable_transport:[6,7],encapsul:[3,8],encod:0,encrypt:[0,1,4,5,6,8],encrypted_mdu:5,encryptionless:[],end:[0,3,4,5,6,8],endless:3,endpoint:[0,4,5,6],energi:1,enforc:3,engin:[],enhanc:6,enough:[1,6],ensur:[3,5,6],enter:0,entir:[4,6,7],entiti:6,entri:[0,1,6],enumer:0,environ:[1,4,6],environment:6,environmentlogg:6,eof:3,ephemer:[4,5,6,8],equal:[4,6],equip:[3,4,6],equival:3,equl:[],error:[0,1,7],especi:3,essenti:[1,3,6],establish:[0,1,3,4,5,8],established_callback:5,establishment_timeout_per_hop:5,etc:7,eth0:3,eth1:3,ethernet:[1,3,4,6,8],even:[1,3,4,6,7,8],event:3,eventu:5,everi:[0,3,4,5,6],everyon:[4,6],everyth:[0,4,6],evolv:4,exact:[3,6],exactli:[5,6],exampl:[1,2,3,5,6,7,8],example_util:[0,7],exampleannouncehandl:0,exampleconfig:7,exce:[0,3,5],except:[0,3],excess:3,exchang:[4,5,6,8],exclud:6,execstart:7,execstartpr:7,execut:[0,1,3,5,7],exhaust:6,exist:[0,1,3,6,7,8],exit:[0,1,5,7],exit_handl:0,expand:6,expect:[0,3,5,6,7],experi:[1,6],experiment:[1,8],expir:3,expiri:3,explain:5,explan:[6,7],explicit:5,explicitli:[],explor:[0,6,8],expos:[3,5],extend:[0,1,5],extern:[1,3,5,8],extra:[1,3,4,7],extrem:[1,6,7,8],f:1,fa7ddfab5213f916dea:6,face:1,fact:8,factor:3,fail:[0,5],failed_callback:[0,5],failur:[1,3],fals:[0,3,5,7],far:[4,6],fast:[2,3,5,6],faster:[1,3,6],fastest:[3,6],featur:[1,6,8],feed:5,feedback:0,feel:1,fernet:8,few:[1,3,4,6,7,8],fewer:5,fibr:8,field:6,file:[0,1,3,4,5,6,7,8],file_resourc:0,file_s:0,filelist:0,filelist_data:0,filelist_receiv:0,filelist_timeout_job:0,filenam:0,filetransf:[1,2,5],filter:[0,4,6],find:[4,6],firewal:[1,3],firmwar:[1,6],first:[0,1,3,5,6,7],fit:0,five:0,fix:[2,6],flag:[5,6],flexibl:[3,8],flow:[3,4],flow_control:3,flush:0,folder:1,follow:[0,1,3,6,7,8],forcibl:[5,7],foreground:1,foremost:8,form:[1,3,4,5,6],format:[0,2,8],forth:0,forward:[3,5,6,8],forward_ip:3,forward_port:3,found:[0,1,3,4,6,7],four:4,frame:3,frankfurt:[1,7],free:[4,8],freedom:6,freeli:6,frequenc:[3,6],frequent:3,friendli:8,from:[0,1,3,4,5,6,7,8],from_byt:5,from_fil:5,fromhex:0,fruit:0,ftdi_ft230x_basic_uart_43891ckm:7,full:[0,3,5,6,7,8],full_hash:5,full_nam:[5,7],fulli:[6,8],funcion:5,fundament:6,further:[1,2,3],furthermor:[],futur:[4,6],g:0,ga:0,gain:6,galact:6,gatekeep:6,gatewai:[1,4],gbp:7,gen:[],gener:[0,1,3,4,5,6,7,8],generalis:8,geograph:4,get:[0,2,3,5,8],get_packet_rssi:0,get_packet_snr:0,get_private_kei:5,get_progress:[0,5],get_public_kei:5,get_random_hash:[0,5],get_remote_ident:[0,5],get_request_id:5,get_respons:5,get_response_tim:5,get_rtt:[0,5],get_statu:5,geti2p:3,ghz:6,gi:0,gigabyt:8,gipsum:[],git:1,github:[0,1],give:[3,6,7],given:[3,4,5,6,7],global:[0,1,3,4,6,8],go:[0,1,3,6],goal:[2,3],good:[4,6,7],got:0,got_respons:0,govern:6,gracefulli:3,grape:0,graphic:1,great:6,greater:6,greatli:3,group:[3,5,6],group_id:3,grow:4,growth:2,guarante:[1,6],guess:3,guid:[1,5,6],h:[1,7],ha:[0,1,3,4,5,6,8],hack:8,had:6,half:[6,8],hand:[0,1],handheld:6,handl:[0,3,4,5,6,7,8],handler:[0,5],happen:[0,5,6],hardlin:4,hardwar:[1,3,4,5,6,7,8],has_path:[0,5],hasattr:0,hash1:6,hash2:6,hash:[0,1,5,6,7],hash_from_name_and_ident:5,hashmap:0,have:[0,1,3,4,5,6,7],hazard:5,head:1,header:6,header_1:6,header_2:6,header_typ:[],hear:6,heard:[5,6],helium:0,hellman:[4,6,8],help:[0,4,6,7,8],her:4,here:[0,1,3,6,7],hexadecim:[0,6,7],hide:1,high:[3,6,8],higher:[4,8],highli:6,hill:4,hint:0,hit:0,hmac:8,hoc:8,hold:[5,6],home:4,homebrew:3,hop:[3,4,5,6,7,8],hops_to:5,host:[0,1,3,6,7],hostnam:3,hour:[0,3],how:[0,1,3,4,6,8],howev:[1,4],http:[0,1],hub:3,huge:[],human:[0,5,6],i2p:[1,2,8],i2p_tunnel:3,i2pd:1,i2pinterfac:[1,3],i:0,id:[3,5,6,7],id_callsign:3,id_interv:3,idea:[6,7],ideal:8,ident:[0,1,2,8],identif:[2,3,8],identifi:[0,3,5,6],identify:6,identifyexampl:0,ie:7,if00:7,ifac:[6,7],ifac_s:3,ifconfig:7,ignor:[3,5,6],ignored_devic:3,illustr:[4,6],immedi:[1,7],impact:[3,6],implement:[0,3,4,5,6,8],implic:3,implicit:[5,6],imposs:6,improv:[2,3],inactive_for:5,inbound:[3,5],includ:[0,2,3,5,6],incom:[0,3,5],incompat:[5,6],increas:3,incred:[],incur:3,indefinit:[],independ:[5,6],independt:8,index:[0,1,2],indirectli:6,individu:[5,6],inevit:6,infer:6,info:[5,6,7],inform:[0,1,2,3,4,5,6,7],infrastructur:[1,3,4,6,7],ingo:5,initi:[0,4,5,6,8],initialis:[0,5,7],input:0,insert:6,insid:6,inspect:[1,3,4,6],instal:[1,3,4,7,8],instanc:[0,2,3,5,6,7],instance_control_port:7,instanti:5,instead:[0,3,6,7],integr:[4,6],intend:[4,6],intention:6,inter:5,interact:[0,1,5,6],interchang:3,interconnect:[2,3,6],interest:6,interfac:[0,2,4,5,7],interface_en:[1,3,7],interface_mod:[],intermediari:6,intermitt:3,intern:[3,5],internet:[2,3,6,8],interoper:[1,4,6,8],interv:[3,5],intiat:0,introduc:6,introduct:2,intuit:8,invalid:[0,5],invers:6,investig:4,invis:[1,3],involv:4,io:[1,7],ip:[1,3,6,7,8],ipsum:[],ipv6:[3,7],is_connected_to_shared_inst:0,is_request:[],is_respons:[],isdir:0,isfil:0,island:4,ism:6,isol:[3,7],issu:4,its:[3,5,6],itself:[2,6],iv:8,job:0,join:[0,1,4,6],just:[0,1,3,4,6,8],k:0,kb:7,kbp:7,keep:[0,4,5,6,7,8],keepal:[5,6],kei:[0,2,4,5,8],kept:[3,4,5,6],kernel:[3,7,8],keyboardinterrupt:0,keyerror:5,keypair:6,keysiz:5,keystor:4,khz:3,ki:0,kill:[5,6],kilomet:[],kind:[3,4,6],kiss:[2,7,8],kiss_fram:3,kissinterfac:[3,7],know:[0,1,4,5,6],knowledg:[4,6],known:[0,5,6,7],krypton:0,l:3,lack:6,laid:6,lan:3,larg:[0,3,4,5,6,8],larger:[4,6],laser:3,last:[0,3,5],last_unit:0,latenc:[1,6,8],later:[0,1,3],latest:[0,1,3],latest_client_link:0,launch:[1,7],lavg:[],layer:[3,4,6,8],lead:6,leak:1,learn:[0,1,6],least:[3,6,7,8],leav:[4,6],ledger:6,left:[3,5,6,7],legaci:4,len:0,length:[0,3,5,6],less:[3,6,8],let:[0,1,3,4,6,7],level:[3,6,7],libffi:1,librari:1,licens:6,light:7,like:[1,3,4,5,6,7,8],limit:[4,6],line:[0,1,3,4,6,8],link:[2,3,4,7,8],link_clos:0,link_establish:0,linkexampl:0,linux:[1,6],list:[0,3,5,6,8],list_deliv:0,list_fil:0,list_packet:0,list_receipt:0,list_timeout:0,listdir:0,listen:[0,3,6],listen_ip:3,listen_port:3,littl:6,lki:6,lkr:6,ll:[0,1,8],ln:[1,7],load:[0,5,7],load_private_kei:5,load_public_kei:5,local:[0,1,3,4,5,6,7,8],locat:[1,4,6,7],log:[0,3,7],log_error:0,log_info:0,loglevel:[0,5,7],longer:[0,4,6,7],longest:3,look:[0,1,3,6,7],loop:0,lora32:[],lora:[1,2,6,8],lorawan:6,lorem:[],lot:6,low:[1,3,4,6,8],lower:[1,3,7],lxmf:1,m:[0,1,6,7],mac:6,machin:6,maco:1,made:[1,5,6],mai:[1,3,5,6,7],main:0,mainli:4,maintain:6,make:[1,3,6,7],malici:6,manag:[1,4,5,6],mani:[0,1,3,4,5,6,7,8],manipul:6,manner:4,manual:[0,1,3,4,5,7],mark:6,markqvist:[0,1],master:[0,5],match:[0,3,6],matter:3,maximum:[3,5,6],mbp:7,mcu:[],mdu:0,mean:[3,4,6,7],measur:6,mechan:[2,3],medium:[3,4,5,6,8],member:4,memori:6,mention:[3,6],menu:0,menu_mod:0,mesh:[1,3,4,8],messag:[0,1,5,6,7],messeng:6,metadata:1,metavar:0,method:[0,1,3,5,6],methodolog:[6,7],mhz:[3,6],mi:0,microcontrol:6,microwav:[],might:[1,3,4,6,7],millisecond:[0,7],mind:[4,8],minim:[2,6],minimalsampl:0,minimum:[0,3,4,6],minut:[0,1,3,6],mix:[1,3,4,7],mobil:[3,6],mode:[0,1,2,6,7,8],modem:[3,4,5,6,8],moder:3,modifi:[6,7],modul:[0,1,6,7,8],moment:[6,8],momentarili:3,monitor:6,moon:0,mor:[],more:[1,3,4,5,6,7,8],morej:[],most:[1,3,4,6,7],mostli:[3,4,6],motiv:2,move:[1,3,6],mqtt:[],mtu:[5,6,8],much:[1,3,4,7],multi:[6,7,8],multicast:3,multilater:6,multipl:[0,3,4,6,7],multipoint:6,must:[0,1,3,4,5,6],mw:3,my:6,mycal:3,myriad:6,n:[0,6],name:[0,2,3,4,5],namespac:0,nano:1,narg:0,natur:3,nearbi:3,nears:6,necesarri:[3,4],necessari:[1,3,5,6],necessarili:6,need:[0,1,2,3,4,6,7,8],neglig:6,neither:6,neon:0,net:3,netcat:3,netifac:1,network:[0,3,5,6,7,8],network_nam:3,never:[3,5,6],newer:6,newest:6,newli:[4,6],next:[1,4,5,6],next_hop:5,next_hop_interfac:5,nicknam:6,no1cll:3,no_inbound_for:5,no_outbound_for:5,nobl:0,noble_ga:0,noble_gas:0,node:[1,2,3,4,7,8],nodet:[],nomad:2,nomadnet:1,non:[1,5,6],none:[0,3,5,6,7],normal:[0,3,5],notat:[6,7],note:[0,1,3,6,7],noth:8,notic:[6,7],notif:[0,5],now:[0,1,4,6,7],nt:0,num:0,number:[0,1,3,4,5,6,7],obfusc:[],object:5,obtain:6,obviusli:6,occasion:1,occur:[7,8],off:[6,8],offer:[1,2,3,5,6],offlin:1,often:[1,3,4,6,7],oganesson:0,old:6,on_interfac:5,onc:[0,1,3,4,5,6,7,8],one:[0,1,3,4,5,6,7,8],ones:[3,7],oneself:6,onli:[0,1,3,4,5,6,7,8],onlin:[],onto:6,open:[0,3,4,5,6,7,8],openmodem:[3,8],openssl:1,oper:[3,4,5,6,7,8],opposit:3,opt:6,optic:8,optim:4,optimis:[],option:[0,1,2,4,5,6,7],order:7,orem:[],organ:4,organis:[3,4],orient:6,origin:[0,4,6],original_hash:[],os:[0,3,6,7,8],ospf:[],other:[1,3,4,5,6,7],otherwis:5,our:[0,6],out:[0,1,3,4,5,6,7,8],outbound:[5,6],outgo:[0,1,3,5,6,7],outli:4,outlier:4,outlin:[1,6],output:[3,7],outward:[],over:[0,2,3,5,6,7,8],overal:6,overcom:6,overhead:[3,6],overrid:0,oversight:6,overview:[2,3,6],overwhelm:[3,5],own:[0,1,4,5,6,7],owner:[],p:0,pack:0,packag:[1,3],packb:0,packet:[0,1,2,3,4,7,8],packet_callback:0,packet_deliv:0,packet_hash:0,packet_receipt:[0,5],packet_timed_out:0,packet_typ:[],packetreceipt:[0,5],pad:8,page:[1,2,6],pair:[3,6],palm:[],panic:7,panic_on_interface_error:7,parallel:1,paramet:[3,4,5,6],pariti:[3,7],pars:0,parse_arg:0,parser:0,part:[0,3,4,6],particip:[2,4,6],pass:[0,3,4,5,6,7],passphras:[3,6],past:[],path:[0,1,3,5,6,7],path_respons:5,pathfind:[],pathfinder_m:5,pattern:6,payload:[5,6],peach:0,peer:[0,1,3,5,6,7],peer_pub_byt:[],peer_sig_pub_byt:[],penalti:3,peopl:6,per:[3,5,6,8],percent:0,percentag:5,perfect:[],perform:[0,1,3,4,6],period:[3,6],perman:7,permissionless:6,persecut:6,persist:[3,7],person:6,perspect:[3,6],pet:0,philosophi:6,physic:[1,3,6,7],pi:[0,4,6,7,8],pick:6,piec:6,ping:[1,7],pip3:[1,7],pip:[1,7],pipe:[2,8],pipeinterfac:3,pkcs7:8,pkg:1,place:[4,6,7],plain:[0,3,5,6],plain_mdu:5,plaintext:[0,5],plan:[4,6],platform:[1,6],pleas:[0,1,3,7,8],plenti:6,plu:[],plug:7,pmr:6,point:[1,3,4,6,7],pomelo:0,poorli:4,popular:8,port0:7,port:[2,3,4,6,8],portabl:[3,6],posit:7,possess:6,possibl:[1,3,4,5,6,8],potenti:[0,3,6,7],power:[1,3,6],practic:[6,8],pre:[1,3,5,6],preambl:[3,7],precompil:1,predict:6,prefer:6,prepar:[0,4],prerequisit:5,presenc:5,preserv:[1,5],preshar:6,press:0,pretend:6,pretti:6,prettyhexrep:0,previou:0,previous:[4,5,6],primari:6,principl:[6,8],print:[0,3],print_filelist:0,print_help:0,print_menu:0,prioriti:6,prioritis:[2,3,4,5],privaci:8,privat:[1,3,5,6,8],privileg:7,probabl:[0,4,6,7,8],probe:7,problem:6,procedur:6,process:[1,3,5,6],product:[],program:[0,2,3,5,6,8],program_setup:0,programm:6,programmat:6,progress:[0,5,8],progress_callback:5,project:1,prompt:0,proof:[0,5,6,7],proof_packet:0,proof_requested_callback:5,proof_strategi:5,propag:[2,3,5],properli:1,properti:[4,5],proport:6,propos:1,protocol:[1,2,3,8],prove:[0,6],prove_al:[0,5],prove_app:5,prove_non:5,proven:[5,6],provid:[0,1,2,3,4,5,6,8],prv_byte:5,pub_byt:5,public_inform:0,publicli:1,purchas:[4,6,8],purg:5,purpos:[3,5,6],purposefulli:[],put:0,py:[0,1,7],pyseri:1,python3:[1,7],python:[1,6,7,8],q:[0,7],queri:[0,1],question:3,queu:[5,7],queue:[3,6],quickli:[6,8],quiet:[3,7],quinc:0,quit:0,r:[0,3,6,7],radio:[2,3,4,5,6,7,8],radiu:[],radon:0,rais:[0,5],ram:3,rand:[],randint:0,random:[0,5,6],random_text_gener:0,randomis:6,randomli:[0,6],rang:[0,1,3,4,6,8],rapidli:3,rare:3,raspberri:[4,6,7,8],rate:[0,2,7],rather:1,rb:0,re:[0,3,5,6],reach:[2,3,4],reachabl:[0,1,3,4,5,6,7],read:[0,1,3,6,7],readabl:[0,5,6],readi:[0,1,3,4,5,8],readili:8,real:[4,8],realli:[3,5],reappear:3,reason:[3,6],reassembl:6,reboot:1,recal:[0,5],recall_app_data:5,recap:6,receipt:[0,2,6],receiv:[0,1,3,5,6,7],received_announc:[0,5],recent:6,reception_rssi:0,reception_snr:0,reception_stat:0,recip:1,recipi:6,recommend:[0,1,6],reconstruct:6,record:[1,6],recoveri:3,recreat:6,refer:[0,1,2],regard:6,regist:[0,5],register_announce_handl:[0,5],register_request_handl:[0,5],rel:[6,8],relai:1,relat:1,releas:[1,3,6],relev:[0,3,5,6,7],reli:6,reliabl:[3,4,6,8],rem:0,remain:[3,5,6],rememb:6,remot:[0,5],remote_ident:[0,5],remote_identifi:0,remote_identity_hash:[],remote_p:0,remotesensor:6,remov:7,render:1,repeat:1,replac:[1,6,7],repli:[0,7],replic:6,reply_data:0,reply_text:0,report:3,repositori:[1,6],repres:6,represent:[0,6],request:[2,6,7],request_destin:0,request_fail:0,request_id:[0,5],request_packet:0,request_path:[0,5],request_receipt:[0,5],request_receiv:0,requested_at:[0,5],requestexampl:0,requestreceipt:5,requir:[0,1,3,4,6,7,8],research:8,resend:5,reserv:6,resili:8,resourc:[0,1,2],resource_callback:5,resource_sending_conclud:0,resource_strategi:5,respawn:3,respawn_delai:3,respawn_interv:3,respect:3,respond:[0,5],respons:[2,5,6],response_callback:[0,5],response_gener:[0,5],response_tim:[],rest:[4,8],restart:7,restartsec:7,restor:3,restrict:4,result:[0,6],retain:3,reticulum:[0,3,4],retiiculum:[],retransmiss:6,retransmit:6,retri:6,reveal:[1,5,6,8],review:8,ridicul:6,right:[3,4],rn:[0,1,5,7],rnode:[1,2,6,7,8],rnodeinterfac:[3,7],rnpath:[1,2,3],rnprobe:[1,2],rnsconfig:1,rnsd:[1,2],rnstatu:[1,2,3,6],roam:3,robot:6,rotat:6,round:[0,5,7],rout:[1,3,4,5,6,7,8],routabl:[],router:[3,7],rprogress:0,rsa:[],rssi:0,rtt:[0,5,6],rttstring:0,rule:[2,3],run:[0,1,3,4,5,6,7,8],runtim:6,rust:1,rw:[],rx:3,s:[0,1,3,4,6,7,8],said:6,same:[1,3,4,5,6,7],satisfi:6,save:[5,6],save_error:0,saved_filenam:0,scalabl:8,scale:6,scan:3,scenario:[1,2,6],schedul:5,scope:3,screen:0,seamlessli:3,search:2,second:[0,3,5,6,7,8],secreci:[5,6,8],section:[1,3,4,6,7],secur:[1,6,8],see:[0,1,3,4,5,6,7,8],seek:6,seen:3,segment:[3,4,6,8],segment_index:[],select:[0,3],self:[0,4,8],send:[0,3,5,6,7],sender:[0,1,4,6],sendig:0,sensibl:1,sensor:6,sent:[0,1,5,6,7],sentiment:6,separ:[1,3,4,6,7],sequenc:[0,5,6,8],serial:[2,6,8],serialinterfac:3,serv:[0,3,4,6,7],serve_path:0,server:[0,1,2,7],server_callback:0,server_destin:0,server_fil:0,server_ident:0,server_link:0,server_loop:0,server_packet_receiv:0,servic:[1,2,4],session:6,set:[0,1,3,4,5,6,7,8],set_default_app_data:5,set_delivery_callback:[0,5],set_link_closed_callback:0,set_link_established_callback:[0,5],set_packet_callback:[0,5],set_proof_requested_callback:5,set_proof_strategi:[0,5],set_remote_identified_callback:[0,5],set_resource_callback:5,set_resource_concluded_callback:[0,5],set_resource_started_callback:[0,5],set_resource_strategi:[0,5],set_timeout:[0,5],set_timeout_callback:[0,5],setdaemon:0,setup:[0,1,2,3],sever:[1,4,5,7],sha256:8,sha:[5,6],shall:6,share:[1,4,5,6,7],share_inst:7,shared_instance_port:7,she:4,shelf:[6,8],shop:0,shorter:3,shortest:6,shorthand:[3,7],should:[0,1,3,4,5,6,7,8],should_allow_unencrypt:[],should_quit:0,should_use_implicit_proof:5,show:7,shown:0,side:[3,8],sideband:2,sight:4,sign:[5,6],signatur:[5,6,8],significantli:3,similar:[1,3,4,7,8],simpl:[0,6,7,8],simpler:3,simplest:[3,6],simpli:[0,1,3,4,6,7],simplic:6,simultan:6,sinc:[0,1,3,4,5,6],singl:[0,3,5,6,7,8],singular:6,sit:[],site:[2,3],situat:[1,3,4,6],size:[0,1,3,5,6],size_str:0,sleep:[0,7],slice:0,slightli:1,slottim:[3,7],slow:[0,3,6],slower:[3,5,6],small:[0,3,4,6,8],smaller:5,snr:0,so:[0,1,3,4,5,6,8],socket:7,softwar:[1,3,6,8],solut:6,solv:6,some:[0,1,3,4,6,7],someon:[1,3],someth:6,somethign:0,soon:5,sort:[3,6],soundmodem:3,sourc:[0,1,4,6,8],space:[0,1,4,6,8],spam:3,span:[3,6],special:[6,7],specif:[0,2,3,5,8],specifi:[0,1,3,4,5,7],spectrum:[3,6],speed:[3,6,7],split:0,sponsor:8,spread:3,spreadingfactor:3,squelch:3,ssid:3,stabl:[6,8],stack:[0,1,4,6,7,8],stage:[1,6],stai:[0,6,7],standard:[1,6],start:[0,2,3,5,6,7],startlimitintervalsec:[],startup:0,state:0,station:3,stationari:[4,7],statist:[0,3],statu:[0,1,2,3,5,6,7],stdin:3,stdio:8,stdout:[0,3],step:1,still:[0,4,6],stock:0,stop:8,stopbit:[3,7],store:[0,6,7],store_tru:0,str:0,strategi:[3,5],stream:6,strength:8,strictli:[3,6],string:[0,5],strong:6,structur:6,subject:[],subnet:[1,4],subsequ:6,succe:1,successful:5,successfulli:0,sucessfulli:6,sudo:[1,7],suffic:6,suffici:[1,3,6,7],suffix:0,suit:[1,6,7],suitabl:[0,1,3,4,6,8],suppli:[4,5,6],support:[0,1,2,4,6,8],sure:[1,7],surveil:6,surviv:6,sy:0,symlink:[1,7],symmetr:[5,6],system:[0,1,2,3,4,5,6,8],systemctl:7,systemd:7,t:[0,1,3,4,5,7],tabl:[1,3,4,6,7],tail:3,tailor:6,take:[0,1,3,6,7,8],taken:[0,6],tangerin:0,target:[0,3,7],target_host:[1,3],target_port:[1,3],tcp:[1,2,4,6,8],tcpclientinterfac:[1,3],tcpinterfac:7,tcpserverinterfac:[1,3],tdata:0,teach:7,teardown:[0,5],teardown_reason:0,teffect:0,tell:[0,3],temperatur:6,ten:6,tend:3,term:[4,6],termin:[1,5],terminolog:[4,6],termux:1,test:[1,3,6],testnet:[2,7],text:[0,1,4,6],tfile:0,than:[0,1,3,4,6],thei:[0,1,3,4,5,6,7],them:[0,1,3,4,6,7],thereaft:6,therefor:[6,8],thi:[0,1,2,3,4,5,6,7,8],thing:1,think:1,those:[4,6],though:[1,6],thourough:8,thousand:6,thread:0,three:[4,6],throough:3,throttl:4,through:[1,3,4,5,6,7,8],throughout:6,throughput:[6,8],thu:[4,5,6],ti:[0,6],time:[0,1,3,4,5,6,7],timeout:[0,5,7],timeout_callback:[],timeoutarg:0,timestr:0,tnc:[3,5,7,8],to_fil:5,todai:6,todo:[],togeth:[6,7],token:[5,6],toler:3,too:[0,4],tool:[6,8],top:[4,6],topic:6,topographi:[1,4,6],topolog:[3,6],total:[6,8],total_s:0,touch:8,toward:[0,3,6],tradeoff:6,tradit:[4,6],traffic:[0,1,3,4,5,6,7],tramsit:[],transceiv:[1,3,6,8],transfer:[0,5,6,7,8],transfer_s:0,transform:8,transmiss:[1,3,5,6],transmit:[0,3,6],transpar:[3,6,7],transpor:[],transport:[0,1,2,3,4,7,8],transport_en:5,transport_id:[],transport_typ:[],travers:6,treat:6,tri:0,trip:[0,5,7],trivial:8,truli:6,truncat:[5,6],truncated_hash:5,truncated_hashlength:5,trust:6,trustless:[4,6,8],ttime:0,ttransfer:0,ttyusb0:[3,7],ttyusb1:3,ttyusb2:3,tun0:3,tune:[],tunnel:[3,6,8],tupl:5,turn:7,turnaround:3,tutori:1,two:[0,1,3,4,6],tx:3,txpower:3,txtail:[3,7],type:[0,1,2,3,4,5,7],typeerror:5,ubuntu:7,udp:[2,4,6,7,8],udpinterfac:3,uhf:[7,8],ultim:6,umsgpack:0,uncencrypt:0,uncensor:1,under:7,underli:[4,8],understand:[1,2,7],unencrypt:[0,5,6],unequivoc:6,unexplor:4,unforg:8,unidentifi:0,unifi:4,uninterest:0,uniqu:[6,8],unit:[0,7],unknown:[0,5,6],unless:[1,3,5,6],unlicens:6,unlik:6,unorganis:4,unpack:0,unpackb:0,unplug:7,unrecover:7,unreli:3,unsign:[1,7],unsupport:5,until:[0,3,5],unus:7,unwant:6,up:[0,1,3,4,6,7,8],updat:[0,1,5,6],upgrad:[1,6],upkeep:3,upon:[0,6],upset:0,urandom:8,us:[0,2,3,4,5,6],usabl:6,usag:[1,3,7],usb:[4,6,7],useabl:6,user:[0,1,3,4,6,7],user_input:0,userland:8,usernameher:7,usr:7,utf:0,util:[0,2,3,6],utilis:[1,4,7,8],v:7,valid:[0,3,5,6,7],valu:[3,5,6],valueerror:[0,5],vari:[6,7],variabl:0,varieti:[3,6,7,8],variou:[0,1,3,4,6],vast:6,ve:1,vehicl:3,vendor:0,verbos:7,veri:[1,3,4,5,6,7,8],verif:[5,6],verifi:[0,5,6],versa:[4,8],version:[6,7],vhf:[4,6,8],via:[1,3,6,7,8],vice:[4,8],view:[1,3,6,7],violat:3,virtual:[3,4,6,7,8],visibl:0,w:7,wa:[0,3,4,5,6,8],wai:[0,1,3,4,6],wait:[0,3,6],want:[0,1,3,4,6,7,8],wantedbi:7,warn:7,warrant:8,wast:3,wb:0,we:[0,1,3,6],websit:3,weight:7,welcom:1,well:[1,3,4,5,6,8],went:0,were:4,what:[0,1,2,5,6],whatev:[5,6],wheel:1,when:[0,1,3,4,5,6,7],whenev:[5,6],where:[1,2,3,4,5,6,7],whereupon:6,whether:[0,3,5,6],which:[0,1,3,4,5,6,7],who:[1,6],wide:[3,6,8],wider:[1,6,7],wifi:[1,3,4,6,7,8],wildcard:0,willing:4,window:[],wire:[1,2,3,8],wireless:4,wish:[6,7],within:[0,1,3,4,5,6],without:[1,4,6,8],wlan0:3,won:0,work:[1,4,6,7,8],world:[4,8],worri:4,would:[1,3,4,5,6],write:[0,1,3,5,6],written:6,wrong:[0,3],x25519:[5,6,8],x:6,xenon:0,y:0,ye:[1,3,6,7],year:6,yet:[0,3,6],yi:0,ykzlw5ujbaqc2xkec4cpvgyxj257wcrmmgkuxqmqcur7cq3w3lha:1,you:[0,1,2,3,4,5,6,7,8],your:[0,1,2,3,4,6,8],yourself:[6,8],z:0,zero:[5,8],zeromq:[],zi:0},titles:["Code Examples","Getting Started Fast","Reticulum Network Stack Manual","Supported Interfaces","Building Networks","API Reference","Understanding Reticulum","Using Reticulum on Your System","What is Reticulum?"],titleterms:{"1":[],"2":[],"25":3,"class":5,"function":6,"public":[1,6],"try":1,The:[6,7],With:1,access:6,ad:1,android:1,announc:[0,3,6],api:5,arm64:1,auto:3,ax:3,base:1,basic:6,binari:[],bridg:4,broadcast:0,build:4,can:8,caveat:8,client:3,code:[0,6],common:3,concept:4,configur:7,connect:1,control:3,converg:4,creat:1,current:8,data:7,deliveri:[],destin:[5,6],detail:6,develop:1,devic:8,doe:8,echo:0,emptor:8,establish:6,exampl:[0,4],fast:1,filetransf:0,fix:7,format:6,further:6,get:[1,6],gipsum:[],goal:6,growth:4,i2p:3,ident:[5,6],identif:0,improv:7,includ:[1,7],indic:2,instanc:1,interconnect:4,interfac:[1,3,6,8],internet:[1,4],introduct:6,kei:6,kiss:3,link:[0,5,6],lora:[3,4],manual:2,mechan:6,minim:0,mode:3,motiv:6,name:[6,7],network:[1,2,4],node:6,nomad:1,offer:8,option:3,orem:[],over:[1,4],overview:4,packet:[5,6],particip:1,pathfind:[],pipe:3,port:7,predict:[],prioritis:6,program:[1,7],propag:6,protocol:6,proven:[],radio:1,rate:3,reach:6,receipt:5,refer:[5,6],request:[0,5],resourc:[5,6],respons:0,reticulum:[1,2,5,6,7,8],retiiculum:[],rnode:3,rnpath:7,rnprobe:7,rnsd:7,rnstatu:7,rule:6,run:[],scenario:4,serial:[3,7],server:3,servic:7,setup:6,sideband:1,site:4,specif:6,stack:2,start:1,statu:8,step:[],support:3,system:7,tabl:2,tcp:3,testnet:1,transport:[5,6],type:[6,8],udp:3,understand:6,us:[1,7,8],util:[1,7],virtual:[],what:8,where:8,wire:6,your:7}}) \ No newline at end of file diff --git a/docs/manual/understanding.html b/docs/manual/understanding.html index 52af9f5..173a73c 100644 --- a/docs/manual/understanding.html +++ b/docs/manual/understanding.html @@ -864,27 +864,7 @@ but excluding any interface access codes. from one interface type to another, for all possible combinations. See the Interface Modes section for a conceptual overview of the different interface modes, and how they are configured.

        -
        Full ────── ✓ ──┐              ┌── ✓ ── Full
        -AP ──────── ✓ ──┼───> Full >───┼── ✕ ── AP
        -Boundary ── ✓ ──┤              ├── ✓ ── Boundary
        -Roaming ─── ✓ ──┘              └── ✓ ── Roaming
        -
        -Full ────── ✕ ──┐              ┌── ✓ ── Full
        -AP ──────── ✕ ──┼────> AP >────┼── ✕ ── AP
        -Boundary ── ✕ ──┤              ├── ✓ ── Boundary
        -Roaming ─── ✕ ──┘              └── ✓ ── Roaming
        -
        -Full ────── ✓ ──┐              ┌── ✓ ── Full
        -AP ──────── ✓ ──┼─> Roaming >──┼── ✕ ── AP
        -Boundary ── ✕ ──┤              ├── ✕ ── Boundary
        -Roaming ─── ✕ ──┘              └── ✕ ── Roaming
        -
        -Full ────── ✓ ──┐              ┌── ✓ ── Full
        -AP ──────── ✓ ──┼─> Boundary >─┼── ✕ ── AP
        -Boundary ── ✓ ──┤              ├── ✓ ── Boundary
        -Roaming ─── ✕ ──┘              └── ✕ ── Roaming
        -
        -
        +_images/if_mode_graph_b.png diff --git a/docs/manual/using.html b/docs/manual/using.html index e053505..0114e60 100644 --- a/docs/manual/using.html +++ b/docs/manual/using.html @@ -56,6 +56,117 @@ program starts up and also wants access to the same Reticulum network, the instance is simply shared. This works for any number of programs running concurrently, and is very easy to use, but depending on your use case, there are other options.

        +
        +

        Configuration & Data

        +

        A Reticulum stores all information that it needs to function in a single file- +system directory. By default, this directory is ~/.reticulum, but you can +use any directory you wish. You can also run multiple separate Reticulum +instances on the same physical system, in complete isolation from each other, +or connected together.

        +

        In most cases, a single physical system will only need to run one Reticulum +instance. This can either be launched at boot, as a system service, or simply +be brought up when a program needs it. In either case, any number of programs +running on the same system will automatically share the same Reticulum instance, +if the configuration allows for it, which it does by default.

        +

        The entire configuration of Reticulum is found in the ~/.reticulum/config +file. When Reticulum is first started on a new system, a basic, functional +configuration file is created. The default configuration looks like this:

        +
        # This is the default Reticulum config file.
        +# You should probably edit it to include any additional,
        +# interfaces and settings you might need.
        +
        +# Only the most basic options are included in this default
        +# configuration. To see a more verbose, and much longer,
        +# configuration example, you can run the command:
        +# rnsd --exampleconfig
        +
        +
        +[reticulum]
        +
        +# If you enable Transport, your system will route traffic
        +# for other peers, pass announces and serve path requests.
        +# This should only be done for systems that are suited to
        +# act as transport nodes, ie. if they are stationary and
        +# always-on. This directive is optional and can be removed
        +# for brevity.
        +
        +enable_transport = False
        +
        +
        +# By default, the first program to launch the Reticulum
        +# Network Stack will create a shared instance, that other
        +# programs can communicate with. Only the shared instance
        +# opens all the configured interfaces directly, and other
        +# local programs communicate with the shared instance over
        +# a local socket. This is completely transparent to the
        +# user, and should generally be turned on. This directive
        +# is optional and can be removed for brevity.
        +
        +share_instance = Yes
        +
        +
        +# If you want to run multiple *different* shared instances
        +# on the same system, you will need to specify different
        +# shared instance ports for each. The defaults are given
        +# below, and again, these options can be left out if you
        +# don't need them.
        +
        +shared_instance_port = 37428
        +instance_control_port = 37429
        +
        +
        +# You can configure Reticulum to panic and forcibly close
        +# if an unrecoverable interface error occurs, such as the
        +# hardware device for an interface disappearing. This is
        +# an optional directive, and can be left out for brevity.
        +# This behaviour is disabled by default.
        +
        +panic_on_interface_error = No
        +
        +
        +[logging]
        +# Valid log levels are 0 through 7:
        +#   0: Log only critical information
        +#   1: Log errors and lower log levels
        +#   2: Log warnings and lower log levels
        +#   3: Log notices and lower log levels
        +#   4: Log info and lower (this is the default)
        +#   5: Verbose logging
        +#   6: Debug logging
        +#   7: Extreme logging
        +
        +loglevel = 4
        +
        +
        +# The interfaces section defines the physical and virtual
        +# interfaces Reticulum will use to communicate on. This
        +# section will contain examples for a variety of interface
        +# types. You can modify these or use them as a basis for
        +# your own config, or simply remove the unused ones.
        +
        +[interfaces]
        +
        +  # This interface enables communication with other
        +  # link-local Reticulum nodes over UDP. It does not
        +  # need any functional IP infrastructure like routers
        +  # or DHCP servers, but will require that at least link-
        +  # local IPv6 is enabled in your operating system, which
        +  # should be enabled by default in almost any OS. See
        +  # the Reticulum Manual for more configuration options.
        +
        +  [[Default Interface]]
        +    type = AutoInterface
        +    interface_enabled = True
        +
        +
        +

        If Reticulum infrastructure already exists locally, you probably don’t need to +change anything, and you may already be connected to a wider network. If not, +you will probably need to add relevant interfaces to the configuration, in +order to communicate with other systems. It is a good idea to read the comments +and explanations in the above default config. It will teach you the basic +concepts you need to understand to configure your network. Once you have done that, +take a look at the Interfaces chapter of this manual.

        +

        Included Utility Programs

        If you often use Reticulum from several different programs, or simply want @@ -64,8 +175,8 @@ a transport node, you might want to run Reticulum as a separate service that other programs, applications and services can utilise.

        The rnsd Utility

        -

        To do so is very easy. Simply run the included rnsd command. When rnsd -is running, it will keep all configured interfaces open, handle transport if +

        It is very easy to run Reticulum as a service. Simply run the included rnsd command. +When rnsd is running, it will keep all configured interfaces open, handle transport if it is enabled, and allow any other programs to immediately utilise the Reticulum network it is configured for.

        You can even run multiple instances of rnsd with different configurations on @@ -298,6 +409,7 @@ WantedBy=multi-user.target

        Table of Contents

        • Using Reticulum on Your System
            +
          • Configuration & Data
          • Included Utility Programs
            • The rnsd Utility
            • The rnstatus Utility
            • diff --git a/docs/source/graphics/if_mode_graph.png b/docs/source/graphics/if_mode_graph.png new file mode 100644 index 0000000..81f09a5 Binary files /dev/null and b/docs/source/graphics/if_mode_graph.png differ diff --git a/docs/source/graphics/if_mode_graph_b.png b/docs/source/graphics/if_mode_graph_b.png new file mode 100644 index 0000000..6606b60 Binary files /dev/null and b/docs/source/graphics/if_mode_graph_b.png differ diff --git a/docs/source/graphics/if_mode_graph_b.xcf b/docs/source/graphics/if_mode_graph_b.xcf new file mode 100644 index 0000000..da73a33 Binary files /dev/null and b/docs/source/graphics/if_mode_graph_b.xcf differ diff --git a/docs/source/interfaces.rst b/docs/source/interfaces.rst index 2de2405..d98f271 100644 --- a/docs/source/interfaces.rst +++ b/docs/source/interfaces.rst @@ -19,125 +19,6 @@ types, have a look at the :ref:`Building Networks` chapter of thi manual. -.. _interfaces-options: - -Common Interface Options -======================== - -A number of general configuration options are available on most interfaces. -These can be used to control various aspects of interface behaviour. - - - * | The ``enabled`` option tells Reticulum whether or not - to bring up the interface. Defaults to ``False``. For any - interface to be brought up, the ``enabled`` option - must be set to ``True`` or ``Yes``. - - * | The ``mode`` option allows selecting the high-level behaviour - of the interface from a number of options. - - - The default value is ``full``. In this mode, all discovery, - meshing and transport functionality is available. - - - In the ``access_point`` (or shorthand ``ap``) mode, the - interface will operate as a network access point. In this - mode, announces will not be automatically broadcasted on - the interface, and paths to destinations on the interface - will have a much shorter expiry time. This mode is useful - for creating interfaces that are mostly quiet, unless when - someone is actually using them. An example of this could - be a radio interface serving a wide area, where users are - expected to connect momentarily, use the network, and then - disappear again. - - * | The ``outgoing`` option sets whether an interface is allowed - to transmit. Defaults to ``True``. If set to ``False`` or ``No`` - the interface will only receive data, and never transmit. - - * | The ``network_name`` option sets the virtual network name for - the interface. This allows multiple separate network segments - to exist on the same physical channel or medium. - - * | The ``passphrase`` option sets an authentication passphrase on - the interface. This option can be used in conjunction with the - ``network_name`` option, or be used alone. - - * | The ``ifac_size`` option allows customising the length of the - Interface Authentication Codes carried by each packet on named - and/or authenticated network segments. It is set by default to - a size suitable for the interface in question, but can be set - to a custom size between 8 and 512 bits by using this option. - In normal usage, this option should not be changed from the - default. - - * | The ``announce_cap`` option lets you configure the maximum - bandwidth to allocate, at any given time, to propagating - announces and other network upkeep traffic. It is configured at - 2% by default, and should normally not need to be changed. Can - be set to any value between ``1`` and ``100``. - - * | The ``bitrate`` option configures the interface bitrate. - Reticulum will use interface speeds reported by hardware, or - try to guess a suitable rate when the hardware doesn't report - any. In most cases, the automatically found rate should be - sufficient, but it can be configured by using the ``bitrate`` - option, to set the interface speed in *bits per second*. - - -.. _interfaces-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 -are propagated and how long paths are valid. - -Configuring modes on interfaces is not strictly necessary, but can be useful -when building or connecting to more complex networks. When not running a -Transport Node, it is rarely useful to configure an interface mode. - - * | The default value is ``full``. In this mode, all discovery, - meshing and transport functionality is activated. - - * | In the ``access_point`` (or shorthand ``ap``) mode, the - interface will operate as a network access point. In this - mode, announces will not be automatically broadcasted on - the interface, and paths to destinations on the interface - will have a much shorter expiry time. This mode is useful - for creating interfaces that remain quiet, unless when - someone is actually using them. An example of this could - be a radio interface serving a wide area, where users are - expected to connect momentarily, use the network, and then - disappear again. - - * | The ``roaming`` mode should be used on interfaces that are - roaming (physically mobile), seen from the perspective of - other nodes in the network. As an example, if a vehicle is - equipped with an external LoRa interface, and an internal, - WiFi-based interface, that serves devices that are moving - _with_ the vehicle, the external LoRa interface should be - configured as ``roaming``, and the internal interface can - be left in the default mode. With transport enabled, such - a setup will allow all internal devices to reach each other, - and all other devices that are available on the LoRa side - of the network, when they are in range. Devices on the LoRa - side of the network will also be able to reach devices - internal to the vehicle, when it is in range. Paths via - ``roaming`` interfaces also expire faster. - - * | The purpose of the ``boundary`` mode is to specify interfaces - that establish connectivity with network segments that are - significantly different than the one this node exists on. - As an example, if a Reticulum instance is part of a LoRa-based - network, but also has a high-speed connection to a - public Transport Node available on the Internet, the interface - connecting over the Internet should be set to ``boundary`` mode. - -For a table describing the impact of all modes on announce propagation, -please see the :ref:`Announce Propagation Rules` section. - .. _interfaces-auto: Auto Interface @@ -664,3 +545,182 @@ beaconing functionality described above. # This is useful for modems with a # small internal packet buffer. flow_control = false + +.. _interfaces-options: + +Common Interface Options +======================== + +A number of general configuration options are available on most interfaces. +These can be used to control various aspects of interface behaviour. + + + * | The ``enabled`` option tells Reticulum whether or not + to bring up the interface. Defaults to ``False``. For any + interface to be brought up, the ``enabled`` option + must be set to ``True`` or ``Yes``. + + * | The ``mode`` option allows selecting the high-level behaviour + of the interface from a number of options. + + - The default value is ``full``. In this mode, all discovery, + meshing and transport functionality is available. + + - In the ``access_point`` (or shorthand ``ap``) mode, the + interface will operate as a network access point. In this + mode, announces will not be automatically broadcasted on + the interface, and paths to destinations on the interface + will have a much shorter expiry time. This mode is useful + for creating interfaces that are mostly quiet, unless when + someone is actually using them. An example of this could + be a radio interface serving a wide area, where users are + expected to connect momentarily, use the network, and then + disappear again. + + * | The ``outgoing`` option sets whether an interface is allowed + to transmit. Defaults to ``True``. If set to ``False`` or ``No`` + the interface will only receive data, and never transmit. + + * | The ``network_name`` option sets the virtual network name for + the interface. This allows multiple separate network segments + to exist on the same physical channel or medium. + + * | The ``passphrase`` option sets an authentication passphrase on + the interface. This option can be used in conjunction with the + ``network_name`` option, or be used alone. + + * | The ``ifac_size`` option allows customising the length of the + Interface Authentication Codes carried by each packet on named + and/or authenticated network segments. It is set by default to + a size suitable for the interface in question, but can be set + to a custom size between 8 and 512 bits by using this option. + In normal usage, this option should not be changed from the + default. + + * | The ``announce_cap`` option lets you configure the maximum + bandwidth to allocate, at any given time, to propagating + announces and other network upkeep traffic. It is configured at + 2% by default, and should normally not need to be changed. Can + be set to any value between ``1`` and ``100``. + + *If an interface exceeds its announce cap, it will queue announces + for later transmission. Reticulum will always prioritise propagating + announces from nearby nodes first. This ensures that the local + topology is prioritised, and that slow networks are not overwhelmed + by interconnected fast networks.* + + *Destinations that are rapidly re-announcing will be down-prioritised + further. Trying to get "first-in-line" by announce spamming will have + the exact opposite effect: Getting moved to the back of the queue every + time a new announce from the excessively announcing destination is received.* + + *This means that it is always beneficial to select a balanced + announce rate, and not announce more often than is actually necesarry + for your application to function.* + + * | The ``bitrate`` option configures the interface bitrate. + Reticulum will use interface speeds reported by hardware, or + try to guess a suitable rate when the hardware doesn't report + any. In most cases, the automatically found rate should be + sufficient, but it can be configured by using the ``bitrate`` + option, to set the interface speed in *bits per second*. + + +.. _interfaces-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 +are propagated and how long paths are valid. + +Configuring modes on interfaces is not strictly necessary, but can be useful +when building or connecting to more complex networks. When not running a +Transport Node, it is rarely useful to configure an interface mode. + + * | The default value is ``full``. In this mode, all discovery, + meshing and transport functionality is activated. + + * | In the ``access_point`` (or shorthand ``ap``) mode, the + interface will operate as a network access point. In this + mode, announces will not be automatically broadcasted on + the interface, and paths to destinations on the interface + will have a much shorter expiry time. This mode is useful + for creating interfaces that remain quiet, unless when + someone is actually using them. An example of this could + be a radio interface serving a wide area, where users are + expected to connect momentarily, use the network, and then + disappear again. + + * | The ``roaming`` mode should be used on interfaces that are + roaming (physically mobile), seen from the perspective of + other nodes in the network. As an example, if a vehicle is + equipped with an external LoRa interface, and an internal, + WiFi-based interface, that serves devices that are moving + _with_ the vehicle, the external LoRa interface should be + configured as ``roaming``, and the internal interface can + be left in the default mode. With transport enabled, such + a setup will allow all internal devices to reach each other, + and all other devices that are available on the LoRa side + of the network, when they are in range. Devices on the LoRa + side of the network will also be able to reach devices + internal to the vehicle, when it is in range. Paths via + ``roaming`` interfaces also expire faster. + + * | The purpose of the ``boundary`` mode is to specify interfaces + that establish connectivity with network segments that are + significantly different than the one this node exists on. + As an example, if a Reticulum instance is part of a LoRa-based + network, but also has a high-speed connection to a + public Transport Node available on the Internet, the interface + connecting over the Internet should be set to ``boundary`` mode. + +For a table describing the impact of all modes on announce propagation, +please see the :ref:`Announce Propagation Rules` section. + +.. _interfaces-announcerates: + +Announce Rate Control +===================== + +The built-in announce control mechanisms and the default ``announce_cap`` +option described above are sufficient most of the time, but in some cases, especially on fast +interfaces, it may be useful to control the target announce rate. Using the +``announce_rate_target``, ``announce_rate_grace`` and ``announce_rate_penalty`` +options, this can be done on a per-interface basis, and moderates the *rate at +which received announces are re-broadcasted to other interfaces*. + + * | The ``announce_rate_target`` option sets the minimum amount of time, + in seconds, that should pass between received announces, for any one + destination. As an example, setting this value to ``3600`` means that + announces *received* on this interface will only be re-transmitted and + propagated to other interfaces once every hour, no matter how often they + are received. + + * | The optional ``announce_rate_grace`` defines the number of times a destination + can violate the announce rate before the target rate is enforced. + + * | The optional ``announce_rate_penalty`` configures an extra amount of + time that is added to the normal rate target. As an example, if a penalty + of ``7200`` seconds is defined, once the rate target is enforced, the + destination in question will only have its announces propagated every + 3 hours, until it lowers its actual announce rate to within the target. + +These mechanisms, in conjunction with the ``annouce_cap`` mechanisms mentioned +above means that it is essential to select a balanced announce strategy for +your destinations. The more balanced you can make this decision, the easier +it will be for your destinations to make it into slower networks that many hops +away. Or you can prioritise only reaching high-capacity networks with more frequent +announces. + +Current statistics and information about announce rates can be viewed using the +``rnpath -r`` command. + +It is important to note that there is no one right or wrong way to set up announce +rates. Slower networks will naturally tend towards using less frequent announces to +conserve bandwidth, while very fast networks can support applications that +need very frequent announces. Reticulum implements these mechanisms to ensure +that a large span of network types can seamlessly *co-exist* and interconnect. + diff --git a/docs/source/understanding.rst b/docs/source/understanding.rst index 5701401..52b58e0 100644 --- a/docs/source/understanding.rst +++ b/docs/source/understanding.rst @@ -813,26 +813,27 @@ from one interface type to another, for all possible combinations. See the :ref:`Interface Modes` section for a conceptual overview of the different interface modes, and how they are configured. -.. code-block:: text +.. image:: graphics/if_mode_graph_b.png - Full ────── ✓ ──┐ ┌── ✓ ── Full - AP ──────── ✓ ──┼───> Full >───┼── ✕ ── AP - Boundary ── ✓ ──┤ ├── ✓ ── Boundary - Roaming ─── ✓ ──┘ └── ✓ ── Roaming +.. + (.. code-block:: text) + Full ────── ✓ ──┐ ┌── ✓ ── Full + AP ──────── ✓ ──┼───> Full >───┼── ✕ ── AP + Boundary ── ✓ ──┤ ├── ✓ ── Boundary + Roaming ─── ✓ ──┘ └── ✓ ── Roaming - Full ────── ✕ ──┐ ┌── ✓ ── Full - AP ──────── ✕ ──┼────> AP >────┼── ✕ ── AP - Boundary ── ✕ ──┤ ├── ✓ ── Boundary - Roaming ─── ✕ ──┘ └── ✓ ── Roaming + Full ────── ✕ ──┐ ┌── ✓ ── Full + AP ──────── ✕ ──┼────> AP >────┼── ✕ ── AP + Boundary ── ✕ ──┤ ├── ✓ ── Boundary + Roaming ─── ✕ ──┘ └── ✓ ── Roaming - Full ────── ✓ ──┐ ┌── ✓ ── Full - AP ──────── ✓ ──┼─> Roaming >──┼── ✕ ── AP - Boundary ── ✕ ──┤ ├── ✕ ── Boundary - Roaming ─── ✕ ──┘ └── ✕ ── Roaming - - Full ────── ✓ ──┐ ┌── ✓ ── Full - AP ──────── ✓ ──┼─> Boundary >─┼── ✕ ── AP - Boundary ── ✓ ──┤ ├── ✓ ── Boundary - Roaming ─── ✕ ──┘ └── ✕ ── Roaming + Full ────── ✓ ──┐ ┌── ✓ ── Full + AP ──────── ✓ ──┼─> Roaming >──┼── ✕ ── AP + Boundary ── ✕ ──┤ ├── ✕ ── Boundary + Roaming ─── ✕ ──┘ └── ✕ ── Roaming + Full ────── ✓ ──┐ ┌── ✓ ── Full + AP ──────── ✓ ──┼─> Boundary >─┼── ✕ ── AP + Boundary ── ✓ ──┤ ├── ✓ ── Boundary + Roaming ─── ✕ ──┘ └── ✕ ── Roaming diff --git a/docs/source/using.rst b/docs/source/using.rst index e22e24a..db0de0c 100644 --- a/docs/source/using.rst +++ b/docs/source/using.rst @@ -19,6 +19,122 @@ instance is simply shared. This works for any number of programs running concurrently, and is very easy to use, but depending on your use case, there are other options. +Configuration & Data +-------------------- + +A Reticulum stores all information that it needs to function in a single file- +system directory. By default, this directory is ``~/.reticulum``, but you can +use any directory you wish. You can also run multiple separate Reticulum +instances on the same physical system, in complete isolation from each other, +or connected together. + +In most cases, a single physical system will only need to run one Reticulum +instance. This can either be launched at boot, as a system service, or simply +be brought up when a program needs it. In either case, any number of programs +running on the same system will automatically share the same Reticulum instance, +if the configuration allows for it, which it does by default. + +The entire configuration of Reticulum is found in the ``~/.reticulum/config`` +file. When Reticulum is first started on a new system, a basic, functional +configuration file is created. The default configuration looks like this: + +.. code:: + + # This is the default Reticulum config file. + # You should probably edit it to include any additional, + # interfaces and settings you might need. + + # Only the most basic options are included in this default + # configuration. To see a more verbose, and much longer, + # configuration example, you can run the command: + # rnsd --exampleconfig + + + [reticulum] + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should only be done for systems that are suited to + # act as transport nodes, ie. if they are stationary and + # always-on. This directive is optional and can be removed + # for brevity. + + enable_transport = False + + + # By default, the first program to launch the Reticulum + # Network Stack will create a shared instance, that other + # programs can communicate with. Only the shared instance + # opens all the configured interfaces directly, and other + # local programs communicate with the shared instance over + # a local socket. This is completely transparent to the + # user, and should generally be turned on. This directive + # is optional and can be removed for brevity. + + share_instance = Yes + + + # If you want to run multiple *different* shared instances + # on the same system, you will need to specify different + # shared instance ports for each. The defaults are given + # below, and again, these options can be left out if you + # don't need them. + + shared_instance_port = 37428 + instance_control_port = 37429 + + + # You can configure Reticulum to panic and forcibly close + # if an unrecoverable interface error occurs, such as the + # hardware device for an interface disappearing. This is + # an optional directive, and can be left out for brevity. + # This behaviour is disabled by default. + + panic_on_interface_error = No + + + [logging] + # Valid log levels are 0 through 7: + # 0: Log only critical information + # 1: Log errors and lower log levels + # 2: Log warnings and lower log levels + # 3: Log notices and lower log levels + # 4: Log info and lower (this is the default) + # 5: Verbose logging + # 6: Debug logging + # 7: Extreme logging + + loglevel = 4 + + + # The interfaces section defines the physical and virtual + # interfaces Reticulum will use to communicate on. This + # section will contain examples for a variety of interface + # types. You can modify these or use them as a basis for + # your own config, or simply remove the unused ones. + + [interfaces] + + # This interface enables communication with other + # link-local Reticulum nodes over UDP. It does not + # need any functional IP infrastructure like routers + # or DHCP servers, but will require that at least link- + # local IPv6 is enabled in your operating system, which + # should be enabled by default in almost any OS. See + # the Reticulum Manual for more configuration options. + + [[Default Interface]] + type = AutoInterface + interface_enabled = True + +If Reticulum infrastructure already exists locally, you probably don't need to +change anything, and you may already be connected to a wider network. If not, +you will probably need to add relevant *interfaces* to the configuration, in +order to communicate with other systems. It is a good idea to read the comments +and explanations in the above default config. It will teach you the basic +concepts you need to understand to configure your network. Once you have done that, +take a look at the :ref:`Interfaces` chapter of this manual. + Included Utility Programs ------------------------- @@ -30,8 +146,8 @@ other programs, applications and services can utilise. The rnsd Utility ================ -To do so is very easy. Simply run the included ``rnsd`` command. When ``rnsd`` -is running, it will keep all configured interfaces open, handle transport if +It is very easy to run Reticulum as a service. Simply run the included ``rnsd`` command. +When ``rnsd`` is running, it will keep all configured interfaces open, handle transport if it is enabled, and allow any other programs to immediately utilise the Reticulum network it is configured for.