mirror of
https://github.com/markqvist/Reticulum.git
synced 2026-07-11 02:58:12 -07:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dca2a92829 | |||
| b1b3ff7143 | |||
| a0f0f31807 | |||
| 72db6e0ef2 | |||
| b70688883a | |||
| dd3ddb9d8a | |||
| 4ba1750c01 | |||
| eacff56fe2 | |||
| 8768e163ae |
+29
-4
@@ -1,10 +1,12 @@
|
|||||||
### 2026-06-01: RNS 1.3.5
|
### 2026-07-10: RNS 1.3.8
|
||||||
|
|
||||||
This maintenance release contains an important fix for `AutoInterface` reliability when roaming between different physical networks.
|
This release fixes various inconsistencies in link and hop-count related APIs.
|
||||||
|
|
||||||
**Changes**
|
**Changes**
|
||||||
- Fixed UDP listener replacement deadlocking inbound AutoInterface traffic when fast-roaming between physical interfaces or WiFi APs
|
- Fixed inconsistent link traffic stats calculation
|
||||||
- Fixed some paths never resolving when using other interfaces at the same time as a deadlocked AutoInterface
|
- Fixed link hop-count metric only being available on initiator side
|
||||||
|
- Fixed potential hop-count serialization error on transport
|
||||||
|
- Updated `WeaveInterface` to support latest Weave firmware
|
||||||
|
|
||||||
**Verified Retrieval**
|
**Verified Retrieval**
|
||||||
You can retrieve and verify this release over Reticulum using the built-in `rngit release` utility. To retrieve only the installation `.whl` package, and the release manifest for future updates, you can use:
|
You can retrieve and verify this release over Reticulum using the built-in `rngit release` utility. To retrieve only the installation `.whl` package, and the release manifest for future updates, you can use:
|
||||||
@@ -34,6 +36,29 @@ rnid -i bc7291552be7a58f361522990465165c -V rns_*.rsm *.rsg
|
|||||||
|
|
||||||
The `rnid` utility will then verify the signatures, and display whether they are valid. If the signature cannot be verified, the release has been tampered with and should be discarded.
|
The `rnid` utility will then verify the signatures, and display whether they are valid. If the signature cannot be verified, the release has been tampered with and should be discarded.
|
||||||
|
|
||||||
|
### 2026-07-03: RNS 1.3.7
|
||||||
|
|
||||||
|
This maintenance release improves announces propagation logic, and adds additional options for configuring announce propagation and interface behavior in transport mode.
|
||||||
|
|
||||||
|
**Changes**
|
||||||
|
- Added `internal` interface mode
|
||||||
|
- Added `recursive_prs` interface option
|
||||||
|
- Added `announces_from_internal` interface option
|
||||||
|
- Added new options to the manual
|
||||||
|
- Improved and cleaned up announce propagation logic
|
||||||
|
|
||||||
|
### 2026-07-03: RNS 1.3.6
|
||||||
|
|
||||||
|
This release contained a bug in the local instance transport handling, and was superseded by version `1.3.7`.
|
||||||
|
|
||||||
|
### 2026-06-01: RNS 1.3.5
|
||||||
|
|
||||||
|
This maintenance release contains an important fix for `AutoInterface` reliability when roaming between different physical networks.
|
||||||
|
|
||||||
|
**Changes**
|
||||||
|
- Fixed UDP listener replacement deadlocking inbound AutoInterface traffic when fast-roaming between physical interfaces or WiFi APs
|
||||||
|
- Fixed some paths never resolving when using other interfaces at the same time as a deadlocked AutoInterface
|
||||||
|
|
||||||
### 2026-05-29: RNS 1.3.4
|
### 2026-05-29: RNS 1.3.4
|
||||||
|
|
||||||
This release fixes a regression that could cause sub-optimal path selection under conditions where the same announce was received within a very short timespan on different interfaces, as well as a few other bugs and inefficiencies.
|
This release fixes a regression that could cause sub-optimal path selection under conditions where the same announce was received within a very short timespan on different interfaces, as well as a few other bugs and inefficiencies.
|
||||||
|
|||||||
@@ -218,7 +218,9 @@ class Interface:
|
|||||||
return time.time()-self.created
|
return time.time()-self.created
|
||||||
|
|
||||||
def hold_announce(self, announce_packet):
|
def hold_announce(self, announce_packet):
|
||||||
if announce_packet.destination_hash in self.held_announces:
|
if announce_packet.hops >= RNS.Transport.PATHFINDER_M-1:
|
||||||
|
return
|
||||||
|
elif announce_packet.destination_hash in self.held_announces:
|
||||||
self.held_announces[announce_packet.destination_hash] = announce_packet
|
self.held_announces[announce_packet.destination_hash] = announce_packet
|
||||||
elif not len(self.held_announces) >= self.ic_max_held_announces:
|
elif not len(self.held_announces) >= self.ic_max_held_announces:
|
||||||
self.held_announces[announce_packet.destination_hash] = announce_packet
|
self.held_announces[announce_packet.destination_hash] = announce_packet
|
||||||
|
|||||||
+110
-128
@@ -109,30 +109,30 @@ class WDCL():
|
|||||||
self.switch_id = self.switch_identity.sig_pub_bytes[-4:]
|
self.switch_id = self.switch_identity.sig_pub_bytes[-4:]
|
||||||
self.switch_pub_bytes = self.switch_identity.sig_pub_bytes
|
self.switch_pub_bytes = self.switch_identity.sig_pub_bytes
|
||||||
|
|
||||||
self.rxb = 0
|
self.rxb = 0
|
||||||
self.txb = 0
|
self.txb = 0
|
||||||
self.owner = owner
|
self.owner = owner
|
||||||
self.as_interface = as_interface
|
self.as_interface = as_interface
|
||||||
self.device = device
|
self.device = device
|
||||||
self.device.connection = self
|
self.device.connection = self
|
||||||
self.pyserial = serial
|
self.pyserial = serial
|
||||||
self.serial = None
|
self.serial = None
|
||||||
self.port = port
|
self.port = port
|
||||||
self.speed = 3000000
|
self.speed = 3000000
|
||||||
self.databits = 8
|
self.databits = 8
|
||||||
self.parity = parity
|
self.parity = parity
|
||||||
self.stopbits = 1
|
self.stopbits = 1
|
||||||
self.timeout = 100
|
self.timeout = 100
|
||||||
self.online = False
|
self.online = False
|
||||||
self.frame_buffer = b""
|
self.frame_buffer = b""
|
||||||
self.next_tx = 0
|
self.next_tx = 0
|
||||||
self.should_run = True
|
self.should_run = True
|
||||||
self.receiver = None
|
self.receiver = None
|
||||||
self.wdcl_connected = False
|
self.wdcl_connected = False
|
||||||
self.reconnecting = False
|
self.reconnecting = False
|
||||||
self.frame_queue = deque()
|
self.frame_queue = deque()
|
||||||
if not self.as_interface:
|
|
||||||
self.id = RNS.Identity.full_hash(port.hwid.encode("utf-8"))
|
if not self.as_interface: self.id = RNS.Identity.full_hash(port.hwid.encode("utf-8"))
|
||||||
|
|
||||||
if self.as_interface:
|
if self.as_interface:
|
||||||
try:
|
try:
|
||||||
@@ -168,19 +168,10 @@ class WDCL():
|
|||||||
self.owner.wlog(f"Opening serial port {self.port.device}...")
|
self.owner.wlog(f"Opening serial port {self.port.device}...")
|
||||||
target_port = self.port.device
|
target_port = self.port.device
|
||||||
|
|
||||||
self.serial = self.pyserial.Serial(
|
self.serial = self.pyserial.Serial(port = target_port, baudrate = self.speed,
|
||||||
port = target_port,
|
bytesize = self.databits, parity = self.parity, stopbits = self.stopbits,
|
||||||
baudrate = self.speed,
|
xonxoff = False, rtscts = False, timeout = 0.250, inter_byte_timeout = None,
|
||||||
bytesize = self.databits,
|
write_timeout = None, dsrdtr = False)
|
||||||
parity = self.parity,
|
|
||||||
stopbits = self.stopbits,
|
|
||||||
xonxoff = False,
|
|
||||||
rtscts = False,
|
|
||||||
timeout = 0.250,
|
|
||||||
inter_byte_timeout = None,
|
|
||||||
write_timeout = None,
|
|
||||||
dsrdtr = False)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if self.port != None:
|
if self.port != None:
|
||||||
# Get device parameters
|
# Get device parameters
|
||||||
@@ -198,19 +189,9 @@ class WDCL():
|
|||||||
from usbserial4a.cdcacmserial4a import CdcAcmSerial
|
from usbserial4a.cdcacmserial4a import CdcAcmSerial
|
||||||
proxy = CdcAcmSerial
|
proxy = CdcAcmSerial
|
||||||
|
|
||||||
self.serial = proxy(
|
self.serial = proxy(self.port, baudrate = self.speed, bytesize = self.databits,
|
||||||
self.port,
|
parity = self.parity, stopbits = self.stopbits, xonxoff = False,
|
||||||
baudrate = self.speed,
|
rtscts = False, timeout = None, inter_byte_timeout = None, dsrdtr = False)
|
||||||
bytesize = self.databits,
|
|
||||||
parity = self.parity,
|
|
||||||
stopbits = self.stopbits,
|
|
||||||
xonxoff = False,
|
|
||||||
rtscts = False,
|
|
||||||
timeout = None,
|
|
||||||
inter_byte_timeout = None,
|
|
||||||
# write_timeout = wtimeout,
|
|
||||||
dsrdtr = False,
|
|
||||||
)
|
|
||||||
|
|
||||||
if vid == 0x0403:
|
if vid == 0x0403:
|
||||||
# Hardware parameters for FTDI devices @ 115200 baud
|
# Hardware parameters for FTDI devices @ 115200 baud
|
||||||
@@ -299,10 +280,9 @@ class WDCL():
|
|||||||
frame = frame.replace(bytes([HDLC.ESC, HDLC.ESC ^ HDLC.ESC_MASK]), bytes([HDLC.ESC]))
|
frame = frame.replace(bytes([HDLC.ESC, HDLC.ESC ^ HDLC.ESC_MASK]), bytes([HDLC.ESC]))
|
||||||
if len(frame) > WDCL.HEADER_MINSIZE: self.process_incoming(frame)
|
if len(frame) > WDCL.HEADER_MINSIZE: self.process_incoming(frame)
|
||||||
self.frame_buffer = self.frame_buffer[frame_end:]
|
self.frame_buffer = self.frame_buffer[frame_end:]
|
||||||
else:
|
|
||||||
flags_remaining = False
|
else: flags_remaining = False
|
||||||
else:
|
else: flags_remaining = False
|
||||||
flags_remaining = False
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.online = False
|
self.online = False
|
||||||
@@ -359,6 +339,7 @@ class Evt():
|
|||||||
ET_MSG = 0x0000
|
ET_MSG = 0x0000
|
||||||
ET_SYSTEM_BOOT = 0x0001
|
ET_SYSTEM_BOOT = 0x0001
|
||||||
ET_CORE_INIT = 0x0002
|
ET_CORE_INIT = 0x0002
|
||||||
|
ET_BOARD_INIT = 0x0003
|
||||||
ET_DRV_UART_INIT = 0x1000
|
ET_DRV_UART_INIT = 0x1000
|
||||||
ET_DRV_USB_CDC_INIT = 0x1010
|
ET_DRV_USB_CDC_INIT = 0x1010
|
||||||
ET_DRV_USB_CDC_HOST_AVAIL = 0x1011
|
ET_DRV_USB_CDC_HOST_AVAIL = 0x1011
|
||||||
@@ -426,77 +407,78 @@ class Evt():
|
|||||||
IF_TYPE_DMA = 0x10
|
IF_TYPE_DMA = 0x10
|
||||||
|
|
||||||
event_descriptions = {
|
event_descriptions = {
|
||||||
ET_SYSTEM_BOOT: "System boot",
|
ET_SYSTEM_BOOT: "System boot",
|
||||||
ET_CORE_INIT: "Core initialization",
|
ET_CORE_INIT: "Core initialization",
|
||||||
ET_DRV_UART_INIT: "UART driver initialization",
|
ET_BOARD_INIT: "Board hardware initialization",
|
||||||
ET_DRV_USB_CDC_INIT: "USB CDC driver initialization",
|
ET_DRV_UART_INIT: "UART driver initialization",
|
||||||
ET_DRV_USB_CDC_HOST_AVAIL: "USB CDC host became available",
|
ET_DRV_USB_CDC_INIT: "USB CDC driver initialization",
|
||||||
ET_DRV_USB_CDC_HOST_SUSPEND: "USB CDC host suspend",
|
ET_DRV_USB_CDC_HOST_AVAIL: "USB CDC host became available",
|
||||||
ET_DRV_USB_CDC_HOST_RESUME: "USB CDC host resume",
|
ET_DRV_USB_CDC_HOST_SUSPEND: "USB CDC host suspend",
|
||||||
ET_DRV_USB_CDC_CONNECTED: "USB CDC host connection",
|
ET_DRV_USB_CDC_HOST_RESUME: "USB CDC host resume",
|
||||||
ET_DRV_USB_CDC_READ_ERR: "USB CDC read error",
|
ET_DRV_USB_CDC_CONNECTED: "USB CDC host connection",
|
||||||
ET_DRV_USB_CDC_OVERFLOW: "USB CDC overflow occurred",
|
ET_DRV_USB_CDC_READ_ERR: "USB CDC read error",
|
||||||
ET_DRV_USB_CDC_DROPPED: "USB CDC dropped bytes",
|
ET_DRV_USB_CDC_OVERFLOW: "USB CDC overflow occurred",
|
||||||
ET_DRV_USB_CDC_TX_TIMEOUT: "USB CDC TX flush timeout",
|
ET_DRV_USB_CDC_DROPPED: "USB CDC dropped bytes",
|
||||||
ET_DRV_I2C_INIT: "I2C driver initialization",
|
ET_DRV_USB_CDC_TX_TIMEOUT: "USB CDC TX flush timeout",
|
||||||
ET_DRV_NVS_INIT: "NVS driver initialization",
|
ET_DRV_I2C_INIT: "I2C driver initialization",
|
||||||
ET_DRV_CRYPTO_INIT: "Cryptography driver initialization",
|
ET_DRV_NVS_INIT: "NVS driver initialization",
|
||||||
ET_DRV_W80211_INIT: "W802.11 driver initialization",
|
ET_DRV_CRYPTO_INIT: "Cryptography driver initialization",
|
||||||
ET_DRV_W80211_CHANNEL: "W802.11 channel configuration",
|
ET_DRV_W80211_INIT: "W802.11 driver initialization",
|
||||||
ET_DRV_W80211_POWER: "W802.11 TX power configuration",
|
ET_DRV_W80211_CHANNEL: "W802.11 channel configuration",
|
||||||
ET_DRV_DISPLAY_INIT: "Display driver initialization",
|
ET_DRV_W80211_POWER: "W802.11 TX power configuration",
|
||||||
|
ET_DRV_DISPLAY_INIT: "Display driver initialization",
|
||||||
ET_DRV_DISPLAY_BUS_AVAILABLE: "Display bus availability",
|
ET_DRV_DISPLAY_BUS_AVAILABLE: "Display bus availability",
|
||||||
ET_DRV_DISPLAY_IO_CONFIGURED: "Display I/O configuration",
|
ET_DRV_DISPLAY_IO_CONFIGURED: "Display I/O configuration",
|
||||||
ET_DRV_DISPLAY_PANEL_CREATED: "Display panel allocation",
|
ET_DRV_DISPLAY_PANEL_CREATED: "Display panel allocation",
|
||||||
ET_DRV_DISPLAY_PANEL_RESET: "Display panel reset",
|
ET_DRV_DISPLAY_PANEL_RESET: "Display panel reset",
|
||||||
ET_DRV_DISPLAY_PANEL_INIT: "Display panel initialization",
|
ET_DRV_DISPLAY_PANEL_INIT: "Display panel initialization",
|
||||||
ET_DRV_DISPLAY_PANEL_ENABLE: "Display panel activation",
|
ET_DRV_DISPLAY_PANEL_ENABLE: "Display panel activation",
|
||||||
ET_DRV_DISPLAY_REMOTE_ENABLE: "Remote display output activation",
|
ET_DRV_DISPLAY_REMOTE_ENABLE: "Remote display output activation",
|
||||||
ET_KRN_LOGGER_INIT: "Logging service initialization",
|
ET_KRN_LOGGER_INIT: "Logging service initialization",
|
||||||
ET_KRN_LOGGER_OUTPUT: "Logging service output activation",
|
ET_KRN_LOGGER_OUTPUT: "Logging service output activation",
|
||||||
ET_KRN_UI_INIT: "User interface service initialization",
|
ET_KRN_UI_INIT: "User interface service initialization",
|
||||||
ET_PROTO_WDCL_INIT: "WDCL protocol initialization",
|
ET_PROTO_WDCL_INIT: "WDCL protocol initialization",
|
||||||
ET_PROTO_WDCL_RUNNING: "WDCL protocol activation",
|
ET_PROTO_WDCL_RUNNING: "WDCL protocol activation",
|
||||||
ET_PROTO_WDCL_CONNECTION: "WDCL host connection",
|
ET_PROTO_WDCL_CONNECTION: "WDCL host connection",
|
||||||
ET_PROTO_WDCL_HOST_ENDPOINT: "Weave host endpoint",
|
ET_PROTO_WDCL_HOST_ENDPOINT: "Weave host endpoint",
|
||||||
ET_PROTO_WEAVE_INIT: "Weave protocol initialization",
|
ET_PROTO_WEAVE_INIT: "Weave protocol initialization",
|
||||||
ET_PROTO_WEAVE_RUNNING: "Weave protocol activation",
|
ET_PROTO_WEAVE_RUNNING: "Weave protocol activation",
|
||||||
ET_PROTO_WEAVE_EP_ALIVE: "Weave endpoint alive",
|
ET_PROTO_WEAVE_EP_ALIVE: "Weave endpoint alive",
|
||||||
ET_PROTO_WEAVE_EP_TIMEOUT: "Weave endpoint disappeared",
|
ET_PROTO_WEAVE_EP_TIMEOUT: "Weave endpoint disappeared",
|
||||||
ET_SRVCTL_REMOTE_DISPLAY: "Remote display service control event",
|
ET_SRVCTL_REMOTE_DISPLAY: "Remote display service control event",
|
||||||
ET_INTERFACE_REGISTERED: "Interface registration",
|
ET_INTERFACE_REGISTERED: "Interface registration",
|
||||||
ET_SYSERR_MEM_EXHAUSTED: "System memory exhausted",
|
ET_SYSERR_MEM_EXHAUSTED: "System memory exhausted",
|
||||||
}
|
}
|
||||||
|
|
||||||
interface_types = {
|
interface_types = {
|
||||||
IF_TYPE_USB: "usb",
|
IF_TYPE_USB: "usb",
|
||||||
IF_TYPE_UART: "uart",
|
IF_TYPE_UART: "uart",
|
||||||
IF_TYPE_W80211: "mw",
|
IF_TYPE_W80211: "mw",
|
||||||
IF_TYPE_BLE: "ble",
|
IF_TYPE_BLE: "ble",
|
||||||
IF_TYPE_LORA: "lora",
|
IF_TYPE_LORA: "lora",
|
||||||
IF_TYPE_ETHERNET: "eth",
|
IF_TYPE_ETHERNET: "eth",
|
||||||
IF_TYPE_WIFI: "wifi",
|
IF_TYPE_WIFI: "wifi",
|
||||||
IF_TYPE_TCP: "tcp",
|
IF_TYPE_TCP: "tcp",
|
||||||
IF_TYPE_UDP: "udp",
|
IF_TYPE_UDP: "udp",
|
||||||
IF_TYPE_IR: "ir",
|
IF_TYPE_IR: "ir",
|
||||||
IF_TYPE_AFSK: "afsk",
|
IF_TYPE_AFSK: "afsk",
|
||||||
IF_TYPE_GPIO: "gpio",
|
IF_TYPE_GPIO: "gpio",
|
||||||
IF_TYPE_SPI: "spi",
|
IF_TYPE_SPI: "spi",
|
||||||
IF_TYPE_I2C: "i2c",
|
IF_TYPE_I2C: "i2c",
|
||||||
IF_TYPE_CAN: "can",
|
IF_TYPE_CAN: "can",
|
||||||
IF_TYPE_DMA: "dma",
|
IF_TYPE_DMA: "dma",
|
||||||
}
|
}
|
||||||
|
|
||||||
channel_descriptions = {
|
channel_descriptions = {
|
||||||
1: "Channel 1 (2412 MHz)",
|
1: "Channel 1 (2412 MHz)",
|
||||||
2: "Channel 2 (2417 MHz)",
|
2: "Channel 2 (2417 MHz)",
|
||||||
3: "Channel 3 (2422 MHz)",
|
3: "Channel 3 (2422 MHz)",
|
||||||
4: "Channel 4 (2427 MHz)",
|
4: "Channel 4 (2427 MHz)",
|
||||||
5: "Channel 5 (2432 MHz)",
|
5: "Channel 5 (2432 MHz)",
|
||||||
6: "Channel 6 (2437 MHz)",
|
6: "Channel 6 (2437 MHz)",
|
||||||
7: "Channel 7 (2442 MHz)",
|
7: "Channel 7 (2442 MHz)",
|
||||||
8: "Channel 8 (2447 MHz)",
|
8: "Channel 8 (2447 MHz)",
|
||||||
9: "Channel 9 (2452 MHz)",
|
9: "Channel 9 (2452 MHz)",
|
||||||
10: "Channel 10 (2457 MHz)",
|
10: "Channel 10 (2457 MHz)",
|
||||||
11: "Channel 11 (2462 MHz)",
|
11: "Channel 11 (2462 MHz)",
|
||||||
12: "Channel 12 (2467 MHz)",
|
12: "Channel 12 (2467 MHz)",
|
||||||
@@ -529,23 +511,23 @@ class Evt():
|
|||||||
}
|
}
|
||||||
|
|
||||||
task_descriptions = {
|
task_descriptions = {
|
||||||
"taskLVGL": "Driver: UI Renderer",
|
"taskLVGL": "Driver: UI Renderer",
|
||||||
"ui_service": "Service: User Interface",
|
"ui_service": "Service: User Interface",
|
||||||
"TinyUSB": "Driver: USB",
|
"TinyUSB": "Driver: USB",
|
||||||
"drv_w80211": "Driver: W802.11",
|
"drv_w80211": "Driver: W802.11",
|
||||||
"system_stats": "System: Stats",
|
"system_stats": "System: Stats",
|
||||||
"core": "System: Core",
|
"core": "System: Core",
|
||||||
"protocol_wdcl": "Protocol: WDCL",
|
"protocol_wdcl": "Protocol: WDCL",
|
||||||
"protocol_weave": "Protocol: Weave",
|
"protocol_weave": "Protocol: Weave",
|
||||||
"tiT": "Protocol: TCP/IP",
|
"tiT": "Protocol: TCP/IP",
|
||||||
"ipc0": "System: CPU 0 IPC",
|
"ipc0": "System: CPU 0 IPC",
|
||||||
"ipc1": "System: CPU 1 IPC",
|
"ipc1": "System: CPU 1 IPC",
|
||||||
"esp_timer": "Driver: Timers",
|
"esp_timer": "Driver: Timers",
|
||||||
"Tmr Svc": "Service: Timers",
|
"Tmr Svc": "Service: Timers",
|
||||||
"kernel_logger": "Service: Logging",
|
"kernel_logger": "Service: Logging",
|
||||||
"remote_display": "Service: Remote Display",
|
"remote_display": "Service: Remote Display",
|
||||||
"wifi": "System: WiFi Hardware",
|
"wifi": "System: WiFi Hardware",
|
||||||
"sys_evt": "System: Kernel Events",
|
"sys_evt": "System: Kernel Events",
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|||||||
@@ -522,6 +522,7 @@ class Link:
|
|||||||
self.rtt = max(measured_rtt, rtt)
|
self.rtt = max(measured_rtt, rtt)
|
||||||
self.status = Link.ACTIVE
|
self.status = Link.ACTIVE
|
||||||
self.activated_at = time.time()
|
self.activated_at = time.time()
|
||||||
|
self.expected_hops = packet.hops
|
||||||
|
|
||||||
if self.rtt != None and self.establishment_cost != None and self.rtt > 0 and self.establishment_cost > 0:
|
if self.rtt != None and self.establishment_cost != None and self.rtt > 0 and self.establishment_cost > 0:
|
||||||
self.establishment_rate = self.establishment_cost/self.rtt
|
self.establishment_rate = self.establishment_cost/self.rtt
|
||||||
|
|||||||
+6
-4
@@ -244,6 +244,9 @@ class Packet:
|
|||||||
self.flags = self.raw[0]
|
self.flags = self.raw[0]
|
||||||
self.hops = self.raw[1]
|
self.hops = self.raw[1]
|
||||||
|
|
||||||
|
if self.hops >= RNS.Transport.PATHFINDER_M:
|
||||||
|
raise ValueError(f"Invalid hop count {self.hops}")
|
||||||
|
|
||||||
self.header_type = (self.flags & 0b01000000) >> 6
|
self.header_type = (self.flags & 0b01000000) >> 6
|
||||||
self.context_flag = (self.flags & 0b00100000) >> 5
|
self.context_flag = (self.flags & 0b00100000) >> 5
|
||||||
self.transport_type = (self.flags & 0b00010000) >> 4
|
self.transport_type = (self.flags & 0b00010000) >> 4
|
||||||
@@ -268,7 +271,7 @@ class Packet:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
RNS.log("Received malformed packet, dropping it. The contained exception was: "+str(e), RNS.LOG_EXTREME) if RNS.sl(RNS.LOG_EXTREME) else None
|
RNS.log(f"Received malformed packet, dropping it. The contained exception was: {e}", RNS.LOG_EXTREME) if RNS.sl(RNS.LOG_EXTREME) else None
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def send(self):
|
def send(self):
|
||||||
@@ -278,6 +281,7 @@ class Packet:
|
|||||||
:returns: A :ref:`RNS.PacketReceipt<api-packetreceipt>` instance if *create_receipt* was set to *True* when the packet was instantiated, if not returns *None*. If the packet could not be sent *False* is returned.
|
:returns: A :ref:`RNS.PacketReceipt<api-packetreceipt>` instance if *create_receipt* was set to *True* when the packet was instantiated, if not returns *None*. If the packet could not be sent *False* is returned.
|
||||||
"""
|
"""
|
||||||
if not self.sent:
|
if not self.sent:
|
||||||
|
if not self.packed: self.pack()
|
||||||
if self.destination.type == RNS.Destination.LINK:
|
if self.destination.type == RNS.Destination.LINK:
|
||||||
if self.destination.status == RNS.Link.CLOSED:
|
if self.destination.status == RNS.Link.CLOSED:
|
||||||
RNS.log("Attempt to transmit over a closed link, dropping packet", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
RNS.log("Attempt to transmit over a closed link, dropping packet", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
||||||
@@ -288,9 +292,7 @@ class Packet:
|
|||||||
else:
|
else:
|
||||||
self.destination.last_outbound = time.time()
|
self.destination.last_outbound = time.time()
|
||||||
self.destination.tx += 1
|
self.destination.tx += 1
|
||||||
self.destination.txbytes += len(self.data)
|
self.destination.txbytes += len(self.ciphertext)
|
||||||
|
|
||||||
if not self.packed: self.pack()
|
|
||||||
|
|
||||||
if RNS.Transport.outbound(self): return self.receipt
|
if RNS.Transport.outbound(self): return self.receipt
|
||||||
else:
|
else:
|
||||||
|
|||||||
+35
-62
@@ -331,7 +331,7 @@ class Transport:
|
|||||||
del path_identity
|
del path_identity
|
||||||
|
|
||||||
if announce_packet != None and receiving_interface != None and blackholed == False:
|
if announce_packet != None and receiving_interface != None and blackholed == False:
|
||||||
announce_packet.unpack()
|
if not announce_packet.unpack(): continue
|
||||||
# We increase the hops, since reading a packet
|
# We increase the hops, since reading a packet
|
||||||
# from cache is equivalent to receiving it again
|
# from cache is equivalent to receiving it again
|
||||||
# over an interface. It is cached with it's non-
|
# over an interface. It is cached with it's non-
|
||||||
@@ -384,7 +384,7 @@ class Transport:
|
|||||||
announce_packet = Transport.get_cached_packet(serialised_entry[7], packet_type="announce")
|
announce_packet = Transport.get_cached_packet(serialised_entry[7], packet_type="announce")
|
||||||
|
|
||||||
if announce_packet != None:
|
if announce_packet != None:
|
||||||
announce_packet.unpack()
|
if not announce_packet.unpack(): continue
|
||||||
# We increase the hops, since reading a packet
|
# We increase the hops, since reading a packet
|
||||||
# from cache is equivalent to receiving it again
|
# from cache is equivalent to receiving it again
|
||||||
# over an interface. It is cached with it's non-
|
# over an interface. It is cached with it's non-
|
||||||
@@ -634,7 +634,7 @@ class Transport:
|
|||||||
|
|
||||||
outgoing.append(new_packet)
|
outgoing.append(new_packet)
|
||||||
|
|
||||||
# This handles an edge case where a peer sends a past
|
# This handles an edge case where a peer sends a path
|
||||||
# request for a destination just after an announce for
|
# request for a destination just after an announce for
|
||||||
# said destination has arrived, but before it has been
|
# said destination has arrived, but before it has been
|
||||||
# rebroadcast locally. In such a case the actual announce
|
# rebroadcast locally. In such a case the actual announce
|
||||||
@@ -1442,10 +1442,8 @@ class Transport:
|
|||||||
ifac = raw[2:2+interface.ifac_size]
|
ifac = raw[2:2+interface.ifac_size]
|
||||||
|
|
||||||
# Generate mask
|
# Generate mask
|
||||||
mask = RNS.Cryptography.hkdf(length=len(raw),
|
mask = RNS.Cryptography.hkdf(length=len(raw), derive_from=ifac,
|
||||||
derive_from=ifac,
|
salt=interface.ifac_key, context=None)
|
||||||
salt=interface.ifac_key,
|
|
||||||
context=None)
|
|
||||||
# Unmask payload
|
# Unmask payload
|
||||||
i = 0; unmasked_raw = b""
|
i = 0; unmasked_raw = b""
|
||||||
for byte in raw:
|
for byte in raw:
|
||||||
@@ -1547,10 +1545,12 @@ class Transport:
|
|||||||
# through a shared Reticulum instance
|
# through a shared Reticulum instance
|
||||||
from_local_client = (packet.receiving_interface in Transport.local_client_interfaces)
|
from_local_client = (packet.receiving_interface in Transport.local_client_interfaces)
|
||||||
for_local_client = (packet.packet_type != RNS.Packet.ANNOUNCE) and (packet.destination_hash in Transport.path_table and Transport.path_table[packet.destination_hash][IDX_PT_HOPS] == 0)
|
for_local_client = (packet.packet_type != RNS.Packet.ANNOUNCE) and (packet.destination_hash in Transport.path_table and Transport.path_table[packet.destination_hash][IDX_PT_HOPS] == 0)
|
||||||
for_local_client_link = (packet.packet_type != RNS.Packet.ANNOUNCE) and (packet.destination_hash in Transport.link_table and Transport.link_table[packet.destination_hash][IDX_LT_RCVD_IF] in Transport.local_client_interfaces)
|
local_client_nh = (packet.packet_type != RNS.Packet.ANNOUNCE) and (packet.destination_hash in Transport.link_table and Transport.link_table[packet.destination_hash][IDX_LT_NH_IF] in Transport.local_client_interfaces)
|
||||||
for_local_client_link |= (packet.packet_type != RNS.Packet.ANNOUNCE) and (packet.destination_hash in Transport.link_table and Transport.link_table[packet.destination_hash][IDX_LT_NH_IF] in Transport.local_client_interfaces)
|
local_client_rh = (packet.packet_type != RNS.Packet.ANNOUNCE) and (packet.destination_hash in Transport.link_table and Transport.link_table[packet.destination_hash][IDX_LT_RCVD_IF] in Transport.local_client_interfaces)
|
||||||
proof_for_local_client = (packet.destination_hash in Transport.reverse_table) and (Transport.reverse_table[packet.destination_hash][IDX_RT_RCVD_IF] in Transport.local_client_interfaces)
|
proof_for_local_client = (packet.destination_hash in Transport.reverse_table) and (Transport.reverse_table[packet.destination_hash][IDX_RT_RCVD_IF] in Transport.local_client_interfaces)
|
||||||
to_local_client = for_local_client or for_local_client_link or proof_for_local_client
|
to_local_client = for_local_client or proof_for_local_client
|
||||||
|
instance_local_link = local_client_nh and local_client_rh
|
||||||
|
for_local_client_link = local_client_nh or local_client_rh
|
||||||
link_request_handled = False
|
link_request_handled = False
|
||||||
|
|
||||||
# Plain broadcast packets from local clients are sent
|
# Plain broadcast packets from local clients are sent
|
||||||
@@ -1728,7 +1728,7 @@ class Transport:
|
|||||||
Transport.add_packet_hash(packet.packet_hash)
|
Transport.add_packet_hash(packet.packet_hash)
|
||||||
|
|
||||||
new_raw = packet.raw[0:1]
|
new_raw = packet.raw[0:1]
|
||||||
new_raw += struct.pack("!B", packet.hops if not from_local_client or Transport.local_hops_delta == 0 else Transport.local_hops_delta)
|
new_raw += struct.pack("!B", packet.hops if not from_local_client or instance_local_link or Transport.local_hops_delta == 0 else Transport.local_hops_delta)
|
||||||
new_raw += packet.raw[2:]
|
new_raw += packet.raw[2:]
|
||||||
Transport.transmit(outbound_interface, new_raw)
|
Transport.transmit(outbound_interface, new_raw)
|
||||||
Transport.link_table[packet.destination_hash][IDX_LT_TIMESTAMP] = time.time()
|
Transport.link_table[packet.destination_hash][IDX_LT_TIMESTAMP] = time.time()
|
||||||
@@ -1790,8 +1790,7 @@ class Transport:
|
|||||||
with Transport.announce_table_lock:
|
with Transport.announce_table_lock:
|
||||||
if packet.destination_hash in Transport.announce_table: Transport.announce_table.pop(packet.destination_hash)
|
if packet.destination_hash in Transport.announce_table: Transport.announce_table.pop(packet.destination_hash)
|
||||||
|
|
||||||
else:
|
else: received_from = packet.destination_hash
|
||||||
received_from = packet.destination_hash
|
|
||||||
|
|
||||||
# Check if this announce should be inserted into
|
# Check if this announce should be inserted into
|
||||||
# announce and destination tables
|
# announce and destination tables
|
||||||
@@ -1997,17 +1996,10 @@ class Transport:
|
|||||||
if is_from_local_client and packet.context == RNS.Packet.PATH_RESPONSE:
|
if is_from_local_client and packet.context == RNS.Packet.PATH_RESPONSE:
|
||||||
for local_interface in Transport.local_client_interfaces:
|
for local_interface in Transport.local_client_interfaces:
|
||||||
if packet.receiving_interface != local_interface:
|
if packet.receiving_interface != local_interface:
|
||||||
new_announce = RNS.Packet(
|
new_announce = RNS.Packet(announce_destination, announce_data, RNS.Packet.ANNOUNCE, # <-- This one?
|
||||||
announce_destination,
|
context = announce_context, header_type = RNS.Packet.HEADER_2,
|
||||||
announce_data,
|
transport_type = Transport.TRANSPORT, transport_id = Transport.identity.hash,
|
||||||
RNS.Packet.ANNOUNCE, # <-- This one?
|
attached_interface = local_interface, context_flag = packet.context_flag)
|
||||||
context = announce_context,
|
|
||||||
header_type = RNS.Packet.HEADER_2,
|
|
||||||
transport_type = Transport.TRANSPORT,
|
|
||||||
transport_id = Transport.identity.hash,
|
|
||||||
attached_interface = local_interface,
|
|
||||||
context_flag = packet.context_flag,
|
|
||||||
)
|
|
||||||
|
|
||||||
new_announce.hops = packet.hops
|
new_announce.hops = packet.hops
|
||||||
new_announce.send()
|
new_announce.send()
|
||||||
@@ -2015,17 +2007,10 @@ class Transport:
|
|||||||
else:
|
else:
|
||||||
for local_interface in Transport.local_client_interfaces:
|
for local_interface in Transport.local_client_interfaces:
|
||||||
if packet.receiving_interface != local_interface:
|
if packet.receiving_interface != local_interface:
|
||||||
new_announce = RNS.Packet(
|
new_announce = RNS.Packet(announce_destination, announce_data, RNS.Packet.ANNOUNCE,
|
||||||
announce_destination,
|
context = announce_context, header_type = RNS.Packet.HEADER_2,
|
||||||
announce_data,
|
transport_type = Transport.TRANSPORT, transport_id = Transport.identity.hash,
|
||||||
RNS.Packet.ANNOUNCE,
|
attached_interface = local_interface, context_flag = packet.context_flag)
|
||||||
context = announce_context,
|
|
||||||
header_type = RNS.Packet.HEADER_2,
|
|
||||||
transport_type = Transport.TRANSPORT,
|
|
||||||
transport_id = Transport.identity.hash,
|
|
||||||
attached_interface = local_interface,
|
|
||||||
context_flag = packet.context_flag,
|
|
||||||
)
|
|
||||||
|
|
||||||
new_announce.hops = packet.hops
|
new_announce.hops = packet.hops
|
||||||
new_announce.send()
|
new_announce.send()
|
||||||
@@ -2047,17 +2032,10 @@ class Transport:
|
|||||||
announce_context = RNS.Packet.NONE
|
announce_context = RNS.Packet.NONE
|
||||||
announce_data = packet.data
|
announce_data = packet.data
|
||||||
|
|
||||||
new_announce = RNS.Packet(
|
new_announce = RNS.Packet(announce_destination, announce_data, RNS.Packet.ANNOUNCE,
|
||||||
announce_destination,
|
context = RNS.Packet.PATH_RESPONSE, header_type = RNS.Packet.HEADER_2,
|
||||||
announce_data,
|
transport_type = Transport.TRANSPORT, transport_id = Transport.identity.hash,
|
||||||
RNS.Packet.ANNOUNCE,
|
attached_interface = attached_interface, context_flag = packet.context_flag)
|
||||||
context = RNS.Packet.PATH_RESPONSE,
|
|
||||||
header_type = RNS.Packet.HEADER_2,
|
|
||||||
transport_type = Transport.TRANSPORT,
|
|
||||||
transport_id = Transport.identity.hash,
|
|
||||||
attached_interface = attached_interface,
|
|
||||||
context_flag = packet.context_flag,
|
|
||||||
)
|
|
||||||
|
|
||||||
new_announce.hops = packet.hops
|
new_announce.hops = packet.hops
|
||||||
new_announce.send()
|
new_announce.send()
|
||||||
@@ -2074,8 +2052,7 @@ class Transport:
|
|||||||
# announce to the tunnels table
|
# announce to the tunnels table
|
||||||
if hasattr(packet.receiving_interface, "tunnel_id") and packet.receiving_interface.tunnel_id != None:
|
if hasattr(packet.receiving_interface, "tunnel_id") and packet.receiving_interface.tunnel_id != None:
|
||||||
with Transport.tunnels_lock:
|
with Transport.tunnels_lock:
|
||||||
if not packet.receiving_interface.tunnel_id in Transport.tunnels:
|
if not packet.receiving_interface.tunnel_id in Transport.tunnels: RNS.log(f"Tunnel ID for {packet.receiving_interface} was not found in tunnel table", RNS.LOG_WARNING)
|
||||||
RNS.log(f"Tunnel ID for {packet.receiving_interface} was not found in tunnel table", RNS.LOG_WARNING)
|
|
||||||
else:
|
else:
|
||||||
tunnel_entry = Transport.tunnels[packet.receiving_interface.tunnel_id]
|
tunnel_entry = Transport.tunnels[packet.receiving_interface.tunnel_id]
|
||||||
paths = tunnel_entry[IDX_TT_PATHS]
|
paths = tunnel_entry[IDX_TT_PATHS]
|
||||||
@@ -2093,10 +2070,10 @@ class Transport:
|
|||||||
# the handlers aspect filter
|
# the handlers aspect filter
|
||||||
execute_callback = False
|
execute_callback = False
|
||||||
announce_identity = RNS.Identity.recall(packet.destination_hash, _no_use=True)
|
announce_identity = RNS.Identity.recall(packet.destination_hash, _no_use=True)
|
||||||
if handler.aspect_filter == None:
|
|
||||||
# If the handlers aspect filter is set to
|
# If the handlers aspect filter is set to
|
||||||
# None, we execute the callback in all cases
|
# None, we execute the callback in all cases
|
||||||
execute_callback = True
|
if handler.aspect_filter == None: execute_callback = True
|
||||||
else:
|
else:
|
||||||
handler_expected_hash = RNS.Destination.hash_from_name_and_identity(handler.aspect_filter, announce_identity)
|
handler_expected_hash = RNS.Destination.hash_from_name_and_identity(handler.aspect_filter, announce_identity)
|
||||||
if packet.destination_hash == handler_expected_hash: execute_callback = True
|
if packet.destination_hash == handler_expected_hash: execute_callback = True
|
||||||
@@ -2184,7 +2161,7 @@ class Transport:
|
|||||||
if packet.context == RNS.Packet.CACHE_REQUEST:
|
if packet.context == RNS.Packet.CACHE_REQUEST:
|
||||||
cached_packet = Transport.get_cached_packet(packet.data)
|
cached_packet = Transport.get_cached_packet(packet.data)
|
||||||
if cached_packet != None:
|
if cached_packet != None:
|
||||||
cached_packet.unpack()
|
if not cached_packet.unpack(): return
|
||||||
RNS.Packet(destination=link, data=cached_packet.data,
|
RNS.Packet(destination=link, data=cached_packet.data,
|
||||||
packet_type=cached_packet.packet_type, context=cached_packet.context).send()
|
packet_type=cached_packet.packet_type, context=cached_packet.context).send()
|
||||||
|
|
||||||
@@ -2211,13 +2188,11 @@ class Transport:
|
|||||||
packet.destination = destination
|
packet.destination = destination
|
||||||
if destination.receive(packet):
|
if destination.receive(packet):
|
||||||
if destination.proof_strategy == RNS.Destination.PROVE_ALL: packet.prove()
|
if destination.proof_strategy == RNS.Destination.PROVE_ALL: packet.prove()
|
||||||
|
|
||||||
elif destination.proof_strategy == RNS.Destination.PROVE_APP:
|
elif destination.proof_strategy == RNS.Destination.PROVE_APP:
|
||||||
if destination.callbacks.proof_requested:
|
if destination.callbacks.proof_requested:
|
||||||
try:
|
try:
|
||||||
if destination.callbacks.proof_requested(packet): packet.prove()
|
if destination.callbacks.proof_requested(packet): packet.prove()
|
||||||
except Exception as e:
|
except Exception as e: RNS.log("Error while executing proof request callback. The contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||||
RNS.log("Error while executing proof request callback. The contained exception was: "+str(e), RNS.LOG_ERROR)
|
|
||||||
|
|
||||||
# Handling for proofs and link-request proofs
|
# Handling for proofs and link-request proofs
|
||||||
elif packet.packet_type == RNS.Packet.PROOF:
|
elif packet.packet_type == RNS.Packet.PROOF:
|
||||||
@@ -2244,16 +2219,14 @@ class Transport:
|
|||||||
if peer_identity.validate(signature, signed_data):
|
if peer_identity.validate(signature, signed_data):
|
||||||
RNS.log("Link request proof validated for transport via "+str(link_entry[IDX_LT_RCVD_IF]), RNS.LOG_EXTREME) if RNS.sl(RNS.LOG_EXTREME) else None
|
RNS.log("Link request proof validated for transport via "+str(link_entry[IDX_LT_RCVD_IF]), RNS.LOG_EXTREME) if RNS.sl(RNS.LOG_EXTREME) else None
|
||||||
new_raw = packet.raw[0:1]
|
new_raw = packet.raw[0:1]
|
||||||
new_raw += struct.pack("!B", packet.hops if not from_local_client or Transport.local_hops_delta == 0 else Transport.local_hops_delta)
|
new_raw += struct.pack("!B", packet.hops if not from_local_client or instance_local_link or Transport.local_hops_delta == 0 else Transport.local_hops_delta)
|
||||||
new_raw += packet.raw[2:]
|
new_raw += packet.raw[2:]
|
||||||
Transport.link_table[packet.destination_hash][IDX_LT_VALIDATED] = True
|
Transport.link_table[packet.destination_hash][IDX_LT_VALIDATED] = True
|
||||||
Transport.transmit(link_entry[IDX_LT_RCVD_IF], new_raw)
|
Transport.transmit(link_entry[IDX_LT_RCVD_IF], new_raw)
|
||||||
if not Transport.owner.is_connected_to_shared_instance:
|
if not Transport.owner.is_connected_to_shared_instance:
|
||||||
RNS.Identity._used_destination_data(link_entry[IDX_LT_DSTHASH])
|
RNS.Identity._used_destination_data(link_entry[IDX_LT_DSTHASH])
|
||||||
|
|
||||||
else:
|
else: RNS.log("Invalid link request proof in transport for link "+RNS.prettyhexrep(packet.destination_hash)+", dropping proof.", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
||||||
RNS.log("Invalid link request proof in transport for link "+RNS.prettyhexrep(packet.destination_hash)+", dropping proof.", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
|
||||||
|
|
||||||
except Exception as e: RNS.log("Could not transport link request proof. The contained exception was: "+str(e), RNS.LOG_DEBUG) if RNS.sl(LOG_DEBUG) else None
|
except Exception as e: RNS.log("Could not transport link request proof. The contained exception was: "+str(e), RNS.LOG_DEBUG) if RNS.sl(LOG_DEBUG) else None
|
||||||
else: RNS.log("Link request proof received on wrong interface, not transporting it.", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
else: RNS.log("Link request proof received on wrong interface, not transporting it.", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
||||||
else: RNS.log("Received link request proof with hop mismatch, not transporting it", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
else: RNS.log("Received link request proof with hop mismatch, not transporting it", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
||||||
@@ -2311,7 +2284,7 @@ class Transport:
|
|||||||
if packet.receiving_interface == reverse_entry[IDX_RT_OUTB_IF]:
|
if packet.receiving_interface == reverse_entry[IDX_RT_OUTB_IF]:
|
||||||
RNS.log("Proof received on correct interface, transporting it via "+str(reverse_entry[IDX_RT_RCVD_IF]), RNS.LOG_EXTREME) if RNS.sl(RNS.LOG_EXTREME) else None
|
RNS.log("Proof received on correct interface, transporting it via "+str(reverse_entry[IDX_RT_RCVD_IF]), RNS.LOG_EXTREME) if RNS.sl(RNS.LOG_EXTREME) else None
|
||||||
new_raw = packet.raw[0:1]
|
new_raw = packet.raw[0:1]
|
||||||
new_raw += struct.pack("!B", packet.hops if not from_local_client or Transport.local_hops_delta == 0 else Transport.local_hops_delta)
|
new_raw += struct.pack("!B", packet.hops if not from_local_client or proof_for_local_client or Transport.local_hops_delta == 0 else Transport.local_hops_delta)
|
||||||
new_raw += packet.raw[2:]
|
new_raw += packet.raw[2:]
|
||||||
Transport.transmit(reverse_entry[IDX_RT_RCVD_IF], new_raw)
|
Transport.transmit(reverse_entry[IDX_RT_RCVD_IF], new_raw)
|
||||||
else:
|
else:
|
||||||
@@ -3008,7 +2981,7 @@ class Transport:
|
|||||||
RNS.log("Not answering path request on roaming-mode interface, since next hop is on same roaming-mode interface", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
RNS.log("Not answering path request on roaming-mode interface, since next hop is on same roaming-mode interface", RNS.LOG_DEBUG) if RNS.sl(RNS.LOG_DEBUG) else None
|
||||||
|
|
||||||
else:
|
else:
|
||||||
packet.unpack()
|
if not packet.unpack(): return
|
||||||
packet.hops = Transport.path_table[destination_hash][IDX_PT_HOPS]
|
packet.hops = Transport.path_table[destination_hash][IDX_PT_HOPS]
|
||||||
|
|
||||||
if requestor_transport_id != None and next_hop == requestor_transport_id:
|
if requestor_transport_id != None and next_hop == requestor_transport_id:
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
__version__ = "1.3.6"
|
__version__ = "1.3.8"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Sphinx build info version 1
|
# Sphinx build info version 1
|
||||||
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
|
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
|
||||||
config: c608aeb54a4bb500d26d78accb0ff325
|
config: 5f1bb7356498498f06570848af4171af
|
||||||
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
tags: 645f666f9bcd5a90fca523b33c5a78b7
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
const DOCUMENTATION_OPTIONS = {
|
const DOCUMENTATION_OPTIONS = {
|
||||||
VERSION: '1.3.6',
|
VERSION: '1.3.8',
|
||||||
LANGUAGE: 'en',
|
LANGUAGE: 'en',
|
||||||
COLLAPSE_INDEX: false,
|
COLLAPSE_INDEX: false,
|
||||||
BUILDER: 'html',
|
BUILDER: 'html',
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Distributed Development - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Distributed Development - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -431,7 +431,7 @@
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Code Examples - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Code Examples - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -3648,7 +3648,7 @@
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>An Explanation of Reticulum for Human Beings - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>An Explanation of Reticulum for Human Beings - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -296,7 +296,7 @@
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="#"><link rel="search" title="Search" href="search.html">
|
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="#"><link rel="search" title="Search" href="search.html">
|
||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 --><title>Index - Reticulum Network Stack 1.3.6 documentation</title>
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 --><title>Index - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -178,7 +178,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -202,7 +202,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -846,7 +846,7 @@
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Getting Started Fast - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Getting Started Fast - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -776,7 +776,7 @@ section of this manual.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Git Over Reticulum - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Git Over Reticulum - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -1594,7 +1594,7 @@ done
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Communications Hardware - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Communications Hardware - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -676,7 +676,7 @@ can be used with Reticulum. This includes virtual software modems such as
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="#"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="#"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -719,7 +719,7 @@ to participate in the development of Reticulum itself.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Configuring Interfaces - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Configuring Interfaces - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -1803,7 +1803,7 @@ interface basis under the relevant interface configuration section.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Reticulum License - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Reticulum License - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -345,7 +345,7 @@ SOFTWARE.
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Building Networks - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Building Networks - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -664,7 +664,7 @@ differently than a mobile device roaming between radio cells.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
Binary file not shown.
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>API Reference - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>API Reference - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -2519,7 +2519,7 @@ will announce it.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<meta name="robots" content="noindex" />
|
<meta name="robots" content="noindex" />
|
||||||
<title>Search - Reticulum Network Stack 1.3.6 documentation</title><link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<title>Search - Reticulum Network Stack 1.3.8 documentation</title><link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="#" role="search">
|
</a><form class="sidebar-search-container" method="get" action="#" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -304,7 +304,7 @@
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Programs Using Reticulum - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Programs Using Reticulum - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -513,7 +513,7 @@ plugin system for expandability.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Support Reticulum - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Support Reticulum - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -383,7 +383,7 @@ circumstances, so we rely on old-fashioned human feedback.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Understanding Reticulum - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Understanding Reticulum - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -1118,7 +1118,7 @@ those risks are acceptable to you.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Using Reticulum on Your System - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Using Reticulum on Your System - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -1639,7 +1639,7 @@ systemctl --user enable rnsd.service
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>What is Reticulum? - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>What is Reticulum? - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -505,7 +505,7 @@ network, and vice versa.</p>
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
<link rel="prefetch" href="_static/rns_logo_512.png" as="image">
|
||||||
|
|
||||||
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25.dev1 -->
|
||||||
<title>Zen of Reticulum - Reticulum Network Stack 1.3.6 documentation</title>
|
<title>Zen of Reticulum - Reticulum Network Stack 1.3.8 documentation</title>
|
||||||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
|
||||||
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
<link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.6 documentation</div></a>
|
<a href="index.html"><div class="brand">Reticulum Network Stack 1.3.8 documentation</div></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="theme-toggle-container theme-toggle-header">
|
<div class="theme-toggle-container theme-toggle-header">
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
<img class="sidebar-logo" src="_static/rns_logo_512.png" alt="Logo"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.6 documentation</span>
|
<span class="sidebar-brand-text">Reticulum Network Stack 1.3.8 documentation</span>
|
||||||
|
|
||||||
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
|
||||||
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
|
||||||
@@ -677,7 +677,7 @@ Imagine a messaging app. You write it once. It works on a laptop connected to fi
|
|||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</div><script src="_static/documentation_options.js?v=70d8fd07"></script>
|
</div><script src="_static/documentation_options.js?v=3cbadadc"></script>
|
||||||
<script src="_static/doctools.js?v=9bcbadda"></script>
|
<script src="_static/doctools.js?v=9bcbadda"></script>
|
||||||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||||||
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
<script src="_static/scripts/furo.js?v=46bd48cc"></script>
|
||||||
|
|||||||
Reference in New Issue
Block a user