Compare commits

...

52 Commits

Author SHA1 Message Date
Mark Qvist cff268926d Updated changelog 2023-09-14 00:22:02 +02:00
Mark Qvist 6fa88f4e4a Updated manual 2023-09-14 00:21:23 +02:00
Mark Qvist ab8e6791fe Updated changelog 2023-09-14 00:21:08 +02:00
Mark Qvist 13c45cc59a Added channel stat reporting and airtime controls to RNode interface 2023-09-13 21:15:32 +02:00
Mark Qvist 67c468884f Added channel load and airtime stats to rnstatus output 2023-09-13 20:07:53 +02:00
Mark Qvist f028d44609 Added airtime config info to docs 2023-09-13 20:07:31 +02:00
Mark Qvist 18b952e612 Added airtime config options, improved periodic data persist 2023-09-13 20:07:07 +02:00
Mark Qvist 25178d8f50 Updated docs 2023-09-13 13:37:37 +02:00
Mark Qvist 1c0b7c00fd Updated version 2023-09-13 13:24:50 +02:00
Mark Qvist 2439761529 Prevent answering path requests on roaming-mode interfaces for next-hop instances on same roaming-mode interface 2023-09-13 13:03:22 +02:00
Mark Qvist 8803dd5b65 Catch error when undefined next-hop path data is returned 2023-09-13 13:02:05 +02:00
Mark Qvist d15d04eae5 Updated debug logging 2023-09-13 13:01:14 +02:00
Mark Qvist bf40f74a4a Updated documentation build 2023-09-05 12:08:59 +02:00
Mark Qvist c0339c0f46 Updated testnet info 2023-08-30 02:15:34 +02:00
Mark Qvist b64bb166c0 Updated testnet info 2023-08-30 01:50:12 +02:00
Mark Qvist 31d30030dc Updated readme 2023-08-29 18:50:05 +02:00
Mark Qvist 556e111a98 Updated manual 2023-08-15 17:09:20 +02:00
Mark Qvist 70b0dd621b Updated install section 2023-08-15 11:27:22 +02:00
Mark Qvist f7d3212651 Updated install section 2023-08-15 11:00:59 +02:00
Mark Qvist 0a29f0cfa1 Updated changelog 2023-08-15 10:38:29 +02:00
Mark Qvist 97153ad59d Updated explanation text 2023-08-15 10:30:49 +02:00
Mark Qvist bc8378fb60 Merge branch 'master' of github.com:markqvist/Reticulum 2023-08-15 10:27:15 +02:00
markqvist 3320cf8da8 Merge pull request #363 from blackjack75/master
Added suggestion to use lower baudrate if flashing fails on ESP32
2023-08-15 10:26:57 +02:00
markqvist bb53bd3f27 Merge pull request #362 from Erethon/eeprom-dump-dir
rnodeconf: Dump eeprom under specific directory
2023-08-15 10:25:17 +02:00
Mark Qvist 73eed59fab Updated docs 2023-08-15 10:23:51 +02:00
Santiago Lema 91ede52634 Added suggestion to use lower baudrate if flashing fails on ESP32 2023-08-14 20:47:40 +02:00
Dionysis Grigoropoulos 93f13a98b2 rnodeconf: Dump eeprom under specific directory 2023-08-14 20:08:40 +03:00
Mark Qvist c87c5c9709 Updated docs 2023-08-14 16:46:00 +02:00
markqvist b0c6c53430 Merge pull request #360 from Erethon/set-baud-rate-when-flashing
rnodeconf: Add option to set baud when flashing
2023-08-14 16:42:26 +02:00
Mark Qvist 94a5222390 Updated version 2023-08-13 20:38:41 +02:00
Dionysis Grigoropoulos 98bb304060 rnodeconf: Add option to set baud when flashing 2023-08-12 02:37:05 +03:00
Mark Qvist 08bfd923ea Fixed possible invalid comparison in link watchdog job 2023-08-05 15:10:00 +02:00
Mark Qvist ae28f04ce4 Added bytes input to destination hash convenience functions 2023-07-10 00:54:02 +02:00
Mark Qvist 024a742f2a Updated changelog 2023-07-09 16:51:54 +02:00
Mark Qvist df184f3e54 Updated docs 2023-07-09 16:48:45 +02:00
Mark Qvist 5542410afa Updated version 2023-07-09 16:45:52 +02:00
Mark Qvist 99205cdc0f Fixed typo in rnid 2023-07-09 16:29:40 +02:00
Mark Qvist 8c936af963 Merge branch 'master' of github.com:markqvist/Reticulum 2023-06-29 22:12:30 +02:00
Mark Qvist 7fe751e74f Updated documentation 2023-06-29 16:52:06 +02:00
markqvist 6d551578c3 Merge pull request #325 from npetrangelo/patch-3
Update __init__.py
2023-06-22 20:05:37 +02:00
markqvist 40c85fb607 Merge pull request #330 from Erethon/rnodeconf-device-selection
Fix bug in device selection of rnodeconf
2023-06-22 20:00:42 +02:00
Dionysis Grigoropoulos 743736b376 Fix bug in device selection of rnodeconf 2023-06-21 00:02:11 +03:00
Mark Qvist 7fdb431d70 Updated changelog 2023-06-13 19:27:53 +02:00
Mark Qvist ebcc3d8912 Updated manual 2023-06-13 19:27:07 +02:00
Mark Qvist 32e29a54c3 Updated manual 2023-06-13 19:21:03 +02:00
Mark Qvist 049733c4b6 Fixed race condition for link initiators on timed out link establishment 2023-06-13 19:20:54 +02:00
Mark Qvist 420d58527d Merge branch 'master' of github.com:markqvist/Reticulum 2023-06-13 16:11:28 +02:00
Mark Qvist bab779a34c Fixed race condition for link initiators on timed out link establishment 2023-06-13 16:10:47 +02:00
markqvist 45aa71b2b7 Merge pull request #326 from SebastianObi/master
RNodeInterface - Fixed missing init of 'r_stat_snr'.
2023-06-07 18:40:50 +02:00
SebastianObi 6dcfe2cad6 Fixed missing init of 'r_stat_snr'.
This this will otherwise lead to the error:
AttributeError: 'RNodeInterface' object has no attribute 'r_stat_snr'
2023-06-07 17:43:14 +02:00
SebastianObi f206047908 Fixed missing init of 'r_stat_snr'.
This this will otherwise lead to the error:
AttributeError: 'RNodeInterface' object has no attribute 'r_stat_snr'
2023-06-07 17:42:44 +02:00
Nathan Petrangelo 6ce979a7de Update __init__.py
Auto convert log messages to strings on the way in
2023-06-05 17:31:52 -04:00
58 changed files with 1009 additions and 13679 deletions
+60 -1
View File
@@ -1,6 +1,65 @@
### 2023-09-14: RNS β 0.5.8
This maintenance release contains a number of usability improvements to Reticulum and related tools.
**Changes**
- Various documentation updates
- Improved path-resolution in mixed networks with roaming-mode nodes
- Added channel load and airtime stats to `rnstatus` output
**Release Hashes**
```
27ba5cdc4724fc8c7211c3b504f097f6adf47f7b80775e6297e4c4e621ef6348 rns-0.5.8-py3-none-any.whl
1ea1c949763c9478ec48f064f7f7864d9f859101ab91b44400879371f490800f rnspure-0.5.8-py3-none-any.whl
```
### 2023-08-14: RNS β 0.5.7
This maintenance release contains a number of bugfixes and quality improvements to Reticulum and related tools.
**Changes**
- Added bytes input to destination hash convenience functions
- Fixed possible invalid comparison in link watchdog job
- Add option to `rnodeconf` to set baud rate when flashing
- Added better explanation in `rnodeconf` when flashing fails
- Fixed EEPROM dump directory in `rnodeconf`
**Release Hashes**
```
867fbb5c73c2a49a75e1f8f3e9f376b507b683328e26c64d4387acd0cc1dbbc7 rns-0.5.7-py3-none-any.whl
7bab2865264b32208e023b5c4bbe88c37f51e3176ca4a8cf332d95f59a6d7f2c rnspure-0.5.7-py3-none-any.whl
```
### 2023-07-09: RNS β 0.5.6
This maintenance release contains a few bugfixes.
**Changes**
- Fixed an issue in `rnodeconf` that prevented Heltec LoRa32 v2 boards from being flashed.
- Fixed a typo in the `rnid` utility.
**Release Hashes**
```
255a5b4bac28326c6b2cc85f43b26dcb0606404a4abd2dfa8244937155838973 rns-0.5.6-py3-none-any.whl
1510b6da4641ceaa4c599a142e498c7e2c1ae12035868f9db1c111e5600161e9 rnspure-0.5.6-py3-none-any.whl
```
### 2023-06-13: RNS β 0.5.5
This maintenance release brings a single bugfix.
**Changes**
- Fixed a race condition for link initiators on timed out link establishments.
**Release Hashes**
```
4ae61d28bf981a7cb853c179e9de3b56b350d2dc984fb671a21d38c4ce5b449e rns-0.5.5-py3-none-any.whl
ed417cbd3c90e9f1b68565a3411ca5c9bc936b495300fd1ace3c4a6414aabd5a rnspure-0.5.5-py3-none-any.whl
```
### 2023-05-19: RNS β 0.5.4 ### 2023-05-19: RNS β 0.5.4
This maintenance release brings a single bugfix This maintenance release brings a single bugfix.
**Changes** **Changes**
- Fixed a potential race condition when timed-out link receives a late establishment proof a few milliseconds after it has timed out. - Fixed a potential race condition when timed-out link receives a late establishment proof a few milliseconds after it has timed out.
+23 -8
View File
@@ -63,7 +63,8 @@ For more info, see [reticulum.network](https://reticulum.network/)
- Low cost of keeping links open at only 0.44 bits per second - Low cost of keeping links open at only 0.44 bits per second
## Roadmap ## Roadmap
While Reticulum is already a fully featured and functional networking stack, many improvements and additions are actively being worked on, and planned for the future. While Reticulum is already a fully featured and functional networking stack,
many improvements and additions are actively being worked on, and planned for the future.
To learn more about the direction and future of Reticulum, please see the [Development Roadmap](./Roadmap.md). To learn more about the direction and future of Reticulum, please see the [Development Roadmap](./Roadmap.md).
@@ -108,14 +109,28 @@ you want to do. For full details and examples, have a look at the
[Getting Started Fast](https://markqvist.github.io/Reticulum/manual/gettingstartedfast.html) [Getting Started Fast](https://markqvist.github.io/Reticulum/manual/gettingstartedfast.html)
section of the [Reticulum Manual](https://markqvist.github.io/Reticulum/manual/). section of the [Reticulum Manual](https://markqvist.github.io/Reticulum/manual/).
To simply install Reticulum and related utilities on your system, the easiest way is via pip: To simply install Reticulum and related utilities on your system, the easiest way is via `pip`.
You can then start any program that uses Reticulum, or start Reticulum as a system service with
[the rnsd utility](https://markqvist.github.io/Reticulum/manual/using.html#the-rnsd-utility).
```bash ```bash
pip install rns pip install rns
``` ```
You can then start any program that uses Reticulum, or start Reticulum as a If you are using an operating system that blocks normal user package installation via `pip`,
system service with [the rnsd utility](https://markqvist.github.io/Reticulum/manual/using.html#the-rnsd-utility). you can return `pip` to normal behaviour by editing the `~/.config/pip/pip.conf` file,
and adding the following directive in the `[global]` section:
```text
[global]
break-system-packages = true
```
Alternatively, you can use the `pipx` tool to install Reticulum in an isolated environment:
```bash
pipx install rns
```
When first started, Reticulum will create a default configuration file, When first started, Reticulum will create a default configuration file,
providing basic connectivity to other Reticulum peers that might be locally providing basic connectivity to other Reticulum peers that might be locally
@@ -227,11 +242,11 @@ I2P. Just add one of the following interfaces to your Reticulum configuration
file: file:
``` ```
# TCP/IP interface to the RNS Dublin Hub # TCP/IP interface to the RNS Amsterdam Hub
[[RNS Testnet Dublin]] [[RNS Testnet Amsterdam]]
type = TCPClientInterface type = TCPClientInterface
enabled = yes enabled = yes
target_host = dublin.connect.reticulum.network target_host = amsterdam.connect.reticulum.network
target_port = 4965 target_port = 4965
# TCP/IP interface to the BetweenTheBorders Hub (community-provided) # TCP/IP interface to the BetweenTheBorders Hub (community-provided)
@@ -245,7 +260,7 @@ file:
[[RNS Testnet I2P Hub]] [[RNS Testnet I2P Hub]]
type = I2PInterface type = I2PInterface
enabled = yes enabled = yes
peers = pmlm3l5rpympihoy2o5ago43kluei2jjjzsalcuiuylbve3mwi2a.b32.i2p peers = g3br23bvx3lq5uddcsjii74xgmn6y5q325ovrkq2zw2wbzbqgbuq.b32.i2p
``` ```
The testnet also contains a number of [Nomad Network](https://github.com/markqvist/nomadnet) nodes, and LXMF propagation nodes. The testnet also contains a number of [Nomad Network](https://github.com/markqvist/nomadnet) nodes, and LXMF propagation nodes.
+6 -1
View File
@@ -99,7 +99,12 @@ class Destination:
name_hash = RNS.Identity.full_hash(Destination.expand_name(None, app_name, *aspects).encode("utf-8"))[:(RNS.Identity.NAME_HASH_LENGTH//8)] name_hash = RNS.Identity.full_hash(Destination.expand_name(None, app_name, *aspects).encode("utf-8"))[:(RNS.Identity.NAME_HASH_LENGTH//8)]
addr_hash_material = name_hash addr_hash_material = name_hash
if identity != None: if identity != None:
addr_hash_material += identity.hash if isinstance(identity, RNS.Identity):
addr_hash_material += identity.hash
elif isinstance(identity, bytes) and len(identity) == RNS.Reticulum.TRUNCATED_HASHLENGTH//8:
addr_hash_material += identity
else:
raise TypeError("Invalid material supplied for destination hash calculation")
return RNS.Identity.full_hash(addr_hash_material)[:RNS.Reticulum.TRUNCATED_HASHLENGTH//8] return RNS.Identity.full_hash(addr_hash_material)[:RNS.Reticulum.TRUNCATED_HASHLENGTH//8]
+102 -4
View File
@@ -43,21 +43,21 @@ class KISS():
CMD_CR = 0x05 CMD_CR = 0x05
CMD_RADIO_STATE = 0x06 CMD_RADIO_STATE = 0x06
CMD_RADIO_LOCK = 0x07 CMD_RADIO_LOCK = 0x07
CMD_ST_ALOCK = 0x0B
CMD_LT_ALOCK = 0x0C
CMD_DETECT = 0x08 CMD_DETECT = 0x08
CMD_IMPLICIT = 0x09
CMD_LEAVE = 0x0A CMD_LEAVE = 0x0A
CMD_READY = 0x0F CMD_READY = 0x0F
CMD_STAT_RX = 0x21 CMD_STAT_RX = 0x21
CMD_STAT_TX = 0x22 CMD_STAT_TX = 0x22
CMD_STAT_RSSI = 0x23 CMD_STAT_RSSI = 0x23
CMD_STAT_SNR = 0x24 CMD_STAT_SNR = 0x24
CMD_STAT_CHTM = 0x25
CMD_BLINK = 0x30 CMD_BLINK = 0x30
CMD_RANDOM = 0x40 CMD_RANDOM = 0x40
CMD_FB_EXT = 0x41 CMD_FB_EXT = 0x41
CMD_FB_READ = 0x42 CMD_FB_READ = 0x42
CMD_FB_WRITE = 0x43 CMD_FB_WRITE = 0x43
CMD_FB_READL = 0x44
CMD_BT_CTRL = 0x46
CMD_PLATFORM = 0x48 CMD_PLATFORM = 0x48
CMD_MCU = 0x49 CMD_MCU = 0x49
CMD_FW_VERSION = 0x50 CMD_FW_VERSION = 0x50
@@ -315,7 +315,7 @@ class RNodeInterface(Interface):
self, owner, name, port, frequency = None, bandwidth = None, txpower = None, self, owner, name, port, frequency = None, bandwidth = None, txpower = None,
sf = None, cr = None, flow_control = False, id_interval = None, sf = None, cr = None, flow_control = False, id_interval = None,
allow_bluetooth = False, target_device_name = None, allow_bluetooth = False, target_device_name = None,
target_device_address = None, id_callsign = None): target_device_address = None, id_callsign = None, st_alock = None, lt_alock = None):
import importlib import importlib
if RNS.vendor.platformutils.is_android(): if RNS.vendor.platformutils.is_android():
self.on_android = True self.on_android = True
@@ -373,6 +373,8 @@ class RNodeInterface(Interface):
self.cr = cr self.cr = cr
self.state = KISS.RADIO_STATE_OFF self.state = KISS.RADIO_STATE_OFF
self.bitrate = 0 self.bitrate = 0
self.st_alock = st_alock
self.lt_alock = lt_alock
self.platform = None self.platform = None
self.display = None self.display = None
self.mcu = None self.mcu = None
@@ -395,7 +397,14 @@ class RNodeInterface(Interface):
self.r_stat_rx = None self.r_stat_rx = None
self.r_stat_tx = None self.r_stat_tx = None
self.r_stat_rssi = None self.r_stat_rssi = None
self.r_stat_snr = None
self.r_st_alock = None
self.r_lt_alock = None
self.r_random = None self.r_random = None
self.r_airtime_short = 0.0
self.r_airtime_long = 0.0
self.r_channel_load_short = 0.0
self.r_channel_load_long = 0.0
self.packet_queue = [] self.packet_queue = []
self.flow_control = flow_control self.flow_control = flow_control
@@ -426,6 +435,14 @@ class RNodeInterface(Interface):
RNS.log("Invalid coding rate configured for "+str(self), RNS.LOG_ERROR) RNS.log("Invalid coding rate configured for "+str(self), RNS.LOG_ERROR)
self.validcfg = False self.validcfg = False
if (self.st_alock and (self.st_alock < 0.0 or self.st_alock > 100.0)):
RNS.log("Invalid short-term airtime limit configured for "+str(self), RNS.LOG_ERROR)
self.validcfg = False
if (self.lt_alock and (self.lt_alock < 0.0 or self.lt_alock > 100.0)):
RNS.log("Invalid long-term airtime limit configured for "+str(self), RNS.LOG_ERROR)
self.validcfg = False
if id_interval != None and id_callsign != None: if id_interval != None and id_callsign != None:
if (len(id_callsign.encode("utf-8")) <= RNodeInterface.CALLSIGN_MAX_LEN): if (len(id_callsign.encode("utf-8")) <= RNodeInterface.CALLSIGN_MAX_LEN):
self.should_id = True self.should_id = True
@@ -616,6 +633,12 @@ class RNodeInterface(Interface):
self.setCodingRate() self.setCodingRate()
time.sleep(0.15) time.sleep(0.15)
self.setSTALock()
time.sleep(0.15)
self.setLTALock()
time.sleep(0.15)
self.setRadioState(KISS.RADIO_STATE_ON) self.setRadioState(KISS.RADIO_STATE_ON)
time.sleep(0.15) time.sleep(0.15)
@@ -740,6 +763,30 @@ class RNodeInterface(Interface):
if written != len(kiss_command): if written != len(kiss_command):
raise IOError("An IO error occurred while configuring coding rate for "+str(self)) raise IOError("An IO error occurred while configuring coding rate for "+str(self))
def setSTALock(self):
if self.st_alock != None:
at = int(self.st_alock*100)
c1 = at >> 8 & 0xFF
c2 = at & 0xFF
data = KISS.escape(bytes([c1])+bytes([c2]))
kiss_command = bytes([KISS.FEND])+bytes([KISS.CMD_ST_ALOCK])+data+bytes([KISS.FEND])
written = self.write_mux(kiss_command)
if written != len(kiss_command):
raise IOError("An IO error occurred while configuring short-term airtime limit for "+str(self))
def setLTALock(self):
if self.lt_alock != None:
at = int(self.lt_alock*100)
c1 = at >> 8 & 0xFF
c2 = at & 0xFF
data = KISS.escape(bytes([c1])+bytes([c2]))
kiss_command = bytes([KISS.FEND])+bytes([KISS.CMD_LT_ALOCK])+data+bytes([KISS.FEND])
written = self.write_mux(kiss_command)
if written != len(kiss_command):
raise IOError("An IO error occurred while configuring long-term airtime limit for "+str(self))
def setRadioState(self, state): def setRadioState(self, state):
self.state = state self.state = state
kiss_command = bytes([KISS.FEND])+bytes([KISS.CMD_RADIO_STATE])+bytes([state])+bytes([KISS.FEND]) kiss_command = bytes([KISS.FEND])+bytes([KISS.CMD_RADIO_STATE])+bytes([state])+bytes([KISS.FEND])
@@ -993,6 +1040,57 @@ class RNodeInterface(Interface):
self.r_stat_rssi = byte-RNodeInterface.RSSI_OFFSET self.r_stat_rssi = byte-RNodeInterface.RSSI_OFFSET
elif (command == KISS.CMD_STAT_SNR): elif (command == KISS.CMD_STAT_SNR):
self.r_stat_snr = int.from_bytes(bytes([byte]), byteorder="big", signed=True) * 0.25 self.r_stat_snr = int.from_bytes(bytes([byte]), byteorder="big", signed=True) * 0.25
elif (command == KISS.CMD_ST_ALOCK):
if (byte == KISS.FESC):
escape = True
else:
if (escape):
if (byte == KISS.TFEND):
byte = KISS.FEND
if (byte == KISS.TFESC):
byte = KISS.FESC
escape = False
command_buffer = command_buffer+bytes([byte])
if (len(command_buffer) == 2):
at = command_buffer[0] << 8 | command_buffer[1]
self.r_st_alock = at/100.0
RNS.log(str(self)+" Radio reporting short-term airtime limit is "+str(self.r_st_alock)+"%", RNS.LOG_DEBUG)
elif (command == KISS.CMD_LT_ALOCK):
if (byte == KISS.FESC):
escape = True
else:
if (escape):
if (byte == KISS.TFEND):
byte = KISS.FEND
if (byte == KISS.TFESC):
byte = KISS.FESC
escape = False
command_buffer = command_buffer+bytes([byte])
if (len(command_buffer) == 2):
at = command_buffer[0] << 8 | command_buffer[1]
self.r_lt_alock = at/100.0
RNS.log(str(self)+" Radio reporting long-term airtime limit is "+str(self.r_lt_alock)+"%", RNS.LOG_DEBUG)
elif (command == KISS.CMD_STAT_CHTM):
if (byte == KISS.FESC):
escape = True
else:
if (escape):
if (byte == KISS.TFEND):
byte = KISS.FEND
if (byte == KISS.TFESC):
byte = KISS.FESC
escape = False
command_buffer = command_buffer+bytes([byte])
if (len(command_buffer) == 8):
ats = command_buffer[0] << 8 | command_buffer[1]
atl = command_buffer[2] << 8 | command_buffer[3]
cus = command_buffer[4] << 8 | command_buffer[5]
cul = command_buffer[6] << 8 | command_buffer[7]
self.r_airtime_short = ats/100.0
self.r_airtime_long = atl/100.0
self.r_channel_load_short = cus/100.0
self.r_channel_load_long = cul/100.0
elif (command == KISS.CMD_RANDOM): elif (command == KISS.CMD_RANDOM):
self.r_random = byte self.r_random = byte
elif (command == KISS.CMD_PLATFORM): elif (command == KISS.CMD_PLATFORM):
+98 -1
View File
@@ -43,6 +43,8 @@ class KISS():
CMD_CR = 0x05 CMD_CR = 0x05
CMD_RADIO_STATE = 0x06 CMD_RADIO_STATE = 0x06
CMD_RADIO_LOCK = 0x07 CMD_RADIO_LOCK = 0x07
CMD_ST_ALOCK = 0x0B
CMD_LT_ALOCK = 0x0C
CMD_DETECT = 0x08 CMD_DETECT = 0x08
CMD_LEAVE = 0x0A CMD_LEAVE = 0x0A
CMD_READY = 0x0F CMD_READY = 0x0F
@@ -50,6 +52,7 @@ class KISS():
CMD_STAT_TX = 0x22 CMD_STAT_TX = 0x22
CMD_STAT_RSSI = 0x23 CMD_STAT_RSSI = 0x23
CMD_STAT_SNR = 0x24 CMD_STAT_SNR = 0x24
CMD_STAT_CHTM = 0x25
CMD_BLINK = 0x30 CMD_BLINK = 0x30
CMD_RANDOM = 0x40 CMD_RANDOM = 0x40
CMD_FB_EXT = 0x41 CMD_FB_EXT = 0x41
@@ -98,7 +101,7 @@ class RNodeInterface(Interface):
RECONNECT_WAIT = 5 RECONNECT_WAIT = 5
def __init__(self, owner, name, port, frequency = None, bandwidth = None, txpower = None, sf = None, cr = None, flow_control = False, id_interval = None, id_callsign = None): def __init__(self, owner, name, port, frequency = None, bandwidth = None, txpower = None, sf = None, cr = None, flow_control = False, id_interval = None, id_callsign = None, st_alock = None, lt_alock = None):
if RNS.vendor.platformutils.is_android(): if RNS.vendor.platformutils.is_android():
raise SystemError("Invlaid interface type. The Android-specific RNode interface must be used on Android") raise SystemError("Invlaid interface type. The Android-specific RNode interface must be used on Android")
@@ -135,6 +138,8 @@ class RNodeInterface(Interface):
self.cr = cr self.cr = cr
self.state = KISS.RADIO_STATE_OFF self.state = KISS.RADIO_STATE_OFF
self.bitrate = 0 self.bitrate = 0
self.st_alock = st_alock
self.lt_alock = lt_alock
self.platform = None self.platform = None
self.display = None self.display = None
self.mcu = None self.mcu = None
@@ -157,7 +162,14 @@ class RNodeInterface(Interface):
self.r_stat_rx = None self.r_stat_rx = None
self.r_stat_tx = None self.r_stat_tx = None
self.r_stat_rssi = None self.r_stat_rssi = None
self.r_stat_snr = None
self.r_st_alock = None
self.r_lt_alock = None
self.r_random = None self.r_random = None
self.r_airtime_short = 0.0
self.r_airtime_long = 0.0
self.r_channel_load_short = 0.0
self.r_channel_load_long = 0.0
self.packet_queue = [] self.packet_queue = []
self.flow_control = flow_control self.flow_control = flow_control
@@ -185,6 +197,14 @@ class RNodeInterface(Interface):
RNS.log("Invalid coding rate configured for "+str(self), RNS.LOG_ERROR) RNS.log("Invalid coding rate configured for "+str(self), RNS.LOG_ERROR)
self.validcfg = False self.validcfg = False
if (self.st_alock and (self.st_alock < 0.0 or self.st_alock > 100.0)):
RNS.log("Invalid short-term airtime limit configured for "+str(self), RNS.LOG_ERROR)
self.validcfg = False
if (self.lt_alock and (self.lt_alock < 0.0 or self.lt_alock > 100.0)):
RNS.log("Invalid long-term airtime limit configured for "+str(self), RNS.LOG_ERROR)
self.validcfg = False
if id_interval != None and id_callsign != None: if id_interval != None and id_callsign != None:
if (len(id_callsign.encode("utf-8")) <= RNodeInterface.CALLSIGN_MAX_LEN): if (len(id_callsign.encode("utf-8")) <= RNodeInterface.CALLSIGN_MAX_LEN):
self.should_id = True self.should_id = True
@@ -280,6 +300,8 @@ class RNodeInterface(Interface):
self.setTXPower() self.setTXPower()
self.setSpreadingFactor() self.setSpreadingFactor()
self.setCodingRate() self.setCodingRate()
self.setSTALock()
self.setLTALock()
self.setRadioState(KISS.RADIO_STATE_ON) self.setRadioState(KISS.RADIO_STATE_ON)
def detect(self): def detect(self):
@@ -384,6 +406,30 @@ class RNodeInterface(Interface):
if written != len(kiss_command): if written != len(kiss_command):
raise IOError("An IO error occurred while configuring coding rate for "+str(self)) raise IOError("An IO error occurred while configuring coding rate for "+str(self))
def setSTALock(self):
if self.st_alock != None:
at = int(self.st_alock*100)
c1 = at >> 8 & 0xFF
c2 = at & 0xFF
data = KISS.escape(bytes([c1])+bytes([c2]))
kiss_command = bytes([KISS.FEND])+bytes([KISS.CMD_ST_ALOCK])+data+bytes([KISS.FEND])
written = self.serial.write(kiss_command)
if written != len(kiss_command):
raise IOError("An IO error occurred while configuring short-term airtime limit for "+str(self))
def setLTALock(self):
if self.lt_alock != None:
at = int(self.lt_alock*100)
c1 = at >> 8 & 0xFF
c2 = at & 0xFF
data = KISS.escape(bytes([c1])+bytes([c2]))
kiss_command = bytes([KISS.FEND])+bytes([KISS.CMD_LT_ALOCK])+data+bytes([KISS.FEND])
written = self.serial.write(kiss_command)
if written != len(kiss_command):
raise IOError("An IO error occurred while configuring long-term airtime limit for "+str(self))
def setRadioState(self, state): def setRadioState(self, state):
self.state = state self.state = state
kiss_command = bytes([KISS.FEND])+bytes([KISS.CMD_RADIO_STATE])+bytes([state])+bytes([KISS.FEND]) kiss_command = bytes([KISS.FEND])+bytes([KISS.CMD_RADIO_STATE])+bytes([state])+bytes([KISS.FEND])
@@ -621,6 +667,57 @@ class RNodeInterface(Interface):
self.r_stat_rssi = byte-RNodeInterface.RSSI_OFFSET self.r_stat_rssi = byte-RNodeInterface.RSSI_OFFSET
elif (command == KISS.CMD_STAT_SNR): elif (command == KISS.CMD_STAT_SNR):
self.r_stat_snr = int.from_bytes(bytes([byte]), byteorder="big", signed=True) * 0.25 self.r_stat_snr = int.from_bytes(bytes([byte]), byteorder="big", signed=True) * 0.25
elif (command == KISS.CMD_ST_ALOCK):
if (byte == KISS.FESC):
escape = True
else:
if (escape):
if (byte == KISS.TFEND):
byte = KISS.FEND
if (byte == KISS.TFESC):
byte = KISS.FESC
escape = False
command_buffer = command_buffer+bytes([byte])
if (len(command_buffer) == 2):
at = command_buffer[0] << 8 | command_buffer[1]
self.r_st_alock = at/100.0
RNS.log(str(self)+" Radio reporting short-term airtime limit is "+str(self.r_st_alock)+"%", RNS.LOG_DEBUG)
elif (command == KISS.CMD_LT_ALOCK):
if (byte == KISS.FESC):
escape = True
else:
if (escape):
if (byte == KISS.TFEND):
byte = KISS.FEND
if (byte == KISS.TFESC):
byte = KISS.FESC
escape = False
command_buffer = command_buffer+bytes([byte])
if (len(command_buffer) == 2):
at = command_buffer[0] << 8 | command_buffer[1]
self.r_lt_alock = at/100.0
RNS.log(str(self)+" Radio reporting long-term airtime limit is "+str(self.r_lt_alock)+"%", RNS.LOG_DEBUG)
elif (command == KISS.CMD_STAT_CHTM):
if (byte == KISS.FESC):
escape = True
else:
if (escape):
if (byte == KISS.TFEND):
byte = KISS.FEND
if (byte == KISS.TFESC):
byte = KISS.FESC
escape = False
command_buffer = command_buffer+bytes([byte])
if (len(command_buffer) == 8):
ats = command_buffer[0] << 8 | command_buffer[1]
atl = command_buffer[2] << 8 | command_buffer[3]
cus = command_buffer[4] << 8 | command_buffer[5]
cul = command_buffer[6] << 8 | command_buffer[7]
self.r_airtime_short = ats/100.0
self.r_airtime_long = atl/100.0
self.r_channel_load_short = cus/100.0
self.r_channel_load_long = cul/100.0
elif (command == KISS.CMD_RANDOM): elif (command == KISS.CMD_RANDOM):
self.r_random = byte self.r_random = byte
elif (command == KISS.CMD_PLATFORM): elif (command == KISS.CMD_PLATFORM):
+50 -37
View File
@@ -264,41 +264,50 @@ class Link:
self.had_outbound() self.had_outbound()
def validate_proof(self, packet): def validate_proof(self, packet):
if self.status == Link.PENDING: try:
if self.initiator and len(packet.data) == RNS.Identity.SIGLENGTH//8+Link.ECPUBSIZE//2: if self.status == Link.PENDING:
peer_pub_bytes = packet.data[RNS.Identity.SIGLENGTH//8:RNS.Identity.SIGLENGTH//8+Link.ECPUBSIZE//2] if self.initiator and len(packet.data) == RNS.Identity.SIGLENGTH//8+Link.ECPUBSIZE//2:
peer_sig_pub_bytes = self.destination.identity.get_public_key()[Link.ECPUBSIZE//2:Link.ECPUBSIZE] peer_pub_bytes = packet.data[RNS.Identity.SIGLENGTH//8:RNS.Identity.SIGLENGTH//8+Link.ECPUBSIZE//2]
self.load_peer(peer_pub_bytes, peer_sig_pub_bytes) peer_sig_pub_bytes = self.destination.identity.get_public_key()[Link.ECPUBSIZE//2:Link.ECPUBSIZE]
self.handshake() self.load_peer(peer_pub_bytes, peer_sig_pub_bytes)
self.handshake()
self.establishment_cost += len(packet.raw) self.establishment_cost += len(packet.raw)
signed_data = self.link_id+self.peer_pub_bytes+self.peer_sig_pub_bytes signed_data = self.link_id+self.peer_pub_bytes+self.peer_sig_pub_bytes
signature = packet.data[:RNS.Identity.SIGLENGTH//8] signature = packet.data[:RNS.Identity.SIGLENGTH//8]
if self.destination.identity.validate(signature, signed_data): if self.destination.identity.validate(signature, signed_data):
self.rtt = time.time() - self.request_time if self.status != Link.HANDSHAKE:
self.attached_interface = packet.receiving_interface raise IOError("Invalid link state for proof validation: "+str(self.status))
self.__remote_identity = self.destination.identity
self.status = Link.ACTIVE
self.activated_at = time.time()
self.last_proof = self.activated_at
RNS.Transport.activate_link(self)
RNS.log("Link "+str(self)+" established with "+str(self.destination)+", RTT is "+str(round(self.rtt, 3))+"s", RNS.LOG_VERBOSE)
if self.rtt != None and self.establishment_cost != None and self.rtt > 0 and self.establishment_cost > 0: self.rtt = time.time() - self.request_time
self.establishment_rate = self.establishment_cost/self.rtt self.attached_interface = packet.receiving_interface
self.__remote_identity = self.destination.identity
self.status = Link.ACTIVE
self.activated_at = time.time()
self.last_proof = self.activated_at
RNS.Transport.activate_link(self)
RNS.log("Link "+str(self)+" established with "+str(self.destination)+", RTT is "+str(round(self.rtt, 3))+"s", RNS.LOG_VERBOSE)
rtt_data = umsgpack.packb(self.rtt) if self.rtt != None and self.establishment_cost != None and self.rtt > 0 and self.establishment_cost > 0:
rtt_packet = RNS.Packet(self, rtt_data, context=RNS.Packet.LRRTT) self.establishment_rate = self.establishment_cost/self.rtt
rtt_packet.send()
self.had_outbound()
if self.callbacks.link_established != None: rtt_data = umsgpack.packb(self.rtt)
thread = threading.Thread(target=self.callbacks.link_established, args=(self,)) rtt_packet = RNS.Packet(self, rtt_data, context=RNS.Packet.LRRTT)
thread.daemon = True rtt_packet.send()
thread.start() self.had_outbound()
else:
RNS.log("Invalid link proof signature received by "+str(self)+". Ignoring.", RNS.LOG_DEBUG) if self.callbacks.link_established != None:
thread = threading.Thread(target=self.callbacks.link_established, args=(self,))
thread.daemon = True
thread.start()
else:
RNS.log("Invalid link proof signature received by "+str(self)+". Ignoring.", RNS.LOG_DEBUG)
except Exception as e:
self.status = Link.CLOSED
RNS.log("An error ocurred while validating link request proof on "+str(self)+".", RNS.LOG_ERROR)
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
def identify(self, identity): def identify(self, identity):
@@ -501,7 +510,11 @@ class Link:
def __watchdog_job(self): def __watchdog_job(self):
while not self.status == Link.CLOSED: while not self.status == Link.CLOSED:
while (self.watchdog_lock): while (self.watchdog_lock):
sleep(max(self.rtt, 0.025)) rtt_wait = 0.025
if hasattr(self, "rtt") and self.rtt:
rtt_wait = self.rtt
sleep(max(rtt_wait, 0.025))
if not self.status == Link.CLOSED: if not self.status == Link.CLOSED:
# Link was initiated, but no response # Link was initiated, but no response
@@ -520,16 +533,16 @@ class Link:
next_check = self.request_time + self.establishment_timeout next_check = self.request_time + self.establishment_timeout
sleep_time = next_check - time.time() sleep_time = next_check - time.time()
if time.time() >= self.request_time + self.establishment_timeout: if time.time() >= self.request_time + self.establishment_timeout:
if self.initiator:
RNS.log("Timeout waiting for link request proof", RNS.LOG_DEBUG)
else:
RNS.log("Timeout waiting for RTT packet from link initiator", RNS.LOG_DEBUG)
self.status = Link.CLOSED self.status = Link.CLOSED
self.teardown_reason = Link.TIMEOUT self.teardown_reason = Link.TIMEOUT
self.link_closed() self.link_closed()
sleep_time = 0.001 sleep_time = 0.001
if self.initiator:
RNS.log("Timeout waiting for link request proof", RNS.LOG_DEBUG)
else:
RNS.log("Timeout waiting for RTT packet from link initiator", RNS.LOG_DEBUG)
elif self.status == Link.ACTIVE: elif self.status == Link.ACTIVE:
activated_at = self.activated_at if self.activated_at != None else 0 activated_at = self.activated_at if self.activated_at != None else 0
last_inbound = max(max(self.last_inbound, self.last_proof), activated_at) last_inbound = max(max(self.last_inbound, self.last_proof), activated_at)
@@ -847,7 +860,7 @@ class Link:
try: try:
self.fernet = Fernet(self.derived_key) self.fernet = Fernet(self.derived_key)
except Exception as e: except Exception as e:
RNS.log("Could not "+str(self)+" instantiate Fernet while performin encryption on link. The contained exception was: "+str(e), RNS.LOG_ERROR) RNS.log("Could not instantiate Fernet while performin encryption on link "+str(self)+". The contained exception was: "+str(e), RNS.LOG_ERROR)
raise e raise e
return self.fernet.encrypt(plaintext) return self.fernet.encrypt(plaintext)
+2 -1
View File
@@ -476,7 +476,8 @@ class Resource:
if sleep_time < 0: if sleep_time < 0:
if self.retries_left > 0: if self.retries_left > 0:
RNS.log("Timed out waiting for parts, requesting retry", RNS.LOG_DEBUG) ms = "" if self.outstanding_parts == 1 else "s"
RNS.log("Timed out waiting for "+str(self.outstanding_parts)+" part"+ms+", requesting retry", RNS.LOG_DEBUG)
if self.window > self.window_min: if self.window > self.window_min:
self.window -= 1 self.window -= 1
if self.window_max > self.window_min: if self.window_max > self.window_min:
+21 -3
View File
@@ -133,6 +133,7 @@ class Reticulum:
JOB_INTERVAL = 5*60 JOB_INTERVAL = 5*60
CLEAN_INTERVAL = 15*60 CLEAN_INTERVAL = 15*60
PERSIST_INTERVAL = 60*60*12 PERSIST_INTERVAL = 60*60*12
GRACIOUS_PERSIST_INTERVAL = 60*5
router = None router = None
config = None config = None
@@ -288,7 +289,6 @@ class Reticulum:
if now > self.last_data_persist+Reticulum.PERSIST_INTERVAL: if now > self.last_data_persist+Reticulum.PERSIST_INTERVAL:
self.__persist_data() self.__persist_data()
self.last_data_persist = time.time()
time.sleep(Reticulum.JOB_INTERVAL) time.sleep(Reticulum.JOB_INTERVAL)
@@ -835,6 +835,8 @@ class Reticulum:
flow_control = c.as_bool("flow_control") if "flow_control" in c else False flow_control = c.as_bool("flow_control") if "flow_control" in c else False
id_interval = int(c["id_interval"]) if "id_interval" in c else None id_interval = int(c["id_interval"]) if "id_interval" in c else None
id_callsign = c["id_callsign"] if "id_callsign" in c else None id_callsign = c["id_callsign"] if "id_callsign" in c else None
st_alock = float(c["airtime_limit_short"]) if "airtime_limit_short" in c else None
lt_alock = float(c["airtime_limit_long"]) if "airtime_limit_long" in c else None
port = c["port"] if "port" in c else None port = c["port"] if "port" in c else None
@@ -852,7 +854,9 @@ class Reticulum:
cr = codingrate, cr = codingrate,
flow_control = flow_control, flow_control = flow_control,
id_interval = id_interval, id_interval = id_interval,
id_callsign = id_callsign id_callsign = id_callsign,
st_alock = st_alock,
lt_alock = lt_alock
) )
if "outgoing" in c and c.as_bool("outgoing") == False: if "outgoing" in c and c.as_bool("outgoing") == False:
@@ -960,11 +964,13 @@ class Reticulum:
RNS.Transport.interfaces.append(interface) RNS.Transport.interfaces.append(interface)
def _should_persist_data(self): def _should_persist_data(self):
self.__persist_data() if time.time() > self.last_data_persist+Reticulum.GRACIOUS_PERSIST_INTERVAL:
self.__persist_data()
def __persist_data(self): def __persist_data(self):
RNS.Transport.persist_data() RNS.Transport.persist_data()
RNS.Identity.persist_data() RNS.Identity.persist_data()
self.last_data_persist = time.time()
def __clean_caches(self): def __clean_caches(self):
RNS.log("Cleaning resource and packet caches...", RNS.LOG_EXTREME) RNS.log("Cleaning resource and packet caches...", RNS.LOG_EXTREME)
@@ -1089,6 +1095,18 @@ class Reticulum:
else: else:
ifstats["tunnelstate"] = None ifstats["tunnelstate"] = None
if hasattr(interface, "r_airtime_short"):
ifstats["airtime_short"] = interface.r_airtime_short
if hasattr(interface, "r_airtime_long"):
ifstats["airtime_long"] = interface.r_airtime_long
if hasattr(interface, "r_channel_load_short"):
ifstats["channel_load_short"] = interface.r_channel_load_short
if hasattr(interface, "r_channel_load_long"):
ifstats["channel_load_long"] = interface.r_channel_load_long
if hasattr(interface, "bitrate"): if hasattr(interface, "bitrate"):
if interface.bitrate != None: if interface.bitrate != None:
ifstats["bitrate"] = interface.bitrate ifstats["bitrate"] = interface.bitrate
+36 -30
View File
@@ -1741,6 +1741,8 @@ class Transport:
def activate_link(link): def activate_link(link):
RNS.log("Activating link "+str(link), RNS.LOG_EXTREME) RNS.log("Activating link "+str(link), RNS.LOG_EXTREME)
if link in Transport.pending_links: if link in Transport.pending_links:
if link.status != RNS.Link.ACTIVE:
raise IOError("Invalid link state for link activation: "+str(link.status))
Transport.pending_links.remove(link) Transport.pending_links.remove(link)
Transport.active_links.append(link) Transport.active_links.append(link)
link.status = RNS.Link.ACTIVE link.status = RNS.Link.ACTIVE
@@ -2045,40 +2047,44 @@ class Transport:
next_hop = Transport.destination_table[destination_hash][1] next_hop = Transport.destination_table[destination_hash][1]
received_from = Transport.destination_table[destination_hash][5] received_from = Transport.destination_table[destination_hash][5]
if requestor_transport_id != None and next_hop == requestor_transport_id: if attached_interface.mode == RNS.Interfaces.Interface.Interface.MODE_ROAMING and attached_interface == received_from:
# TODO: Find a bandwidth efficient way to invalidate our RNS.log("Not answering path request on roaming-mode interface, since next hop is on same roaming-mode interface", RNS.LOG_DEBUG)
# known path on this signal. The obvious way of signing
# path requests with transport instance keys is quite
# inefficient. There is probably a better way. Doing
# path invalidation here would decrease the network
# convergence time. Maybe just drop it?
RNS.log("Not answering path request for "+RNS.prettyhexrep(destination_hash)+interface_str+", since next hop is the requestor", RNS.LOG_DEBUG)
else: else:
RNS.log("Answering path request for "+RNS.prettyhexrep(destination_hash)+interface_str+", path is known", RNS.LOG_DEBUG) if requestor_transport_id != None and next_hop == requestor_transport_id:
# TODO: Find a bandwidth efficient way to invalidate our
now = time.time() # known path on this signal. The obvious way of signing
retries = Transport.PATHFINDER_R # path requests with transport instance keys is quite
local_rebroadcasts = 0 # inefficient. There is probably a better way. Doing
block_rebroadcasts = True # path invalidation here would decrease the network
announce_hops = packet.hops # convergence time. Maybe just drop it?
RNS.log("Not answering path request for "+RNS.prettyhexrep(destination_hash)+interface_str+", since next hop is the requestor", RNS.LOG_DEBUG)
if is_from_local_client:
retransmit_timeout = now
else: else:
# TODO: Look at this timing RNS.log("Answering path request for "+RNS.prettyhexrep(destination_hash)+interface_str+", path is known", RNS.LOG_DEBUG)
retransmit_timeout = now + Transport.PATH_REQUEST_GRACE # + (RNS.rand() * Transport.PATHFINDER_RW)
# This handles an edge case where a peer sends a past now = time.time()
# request for a destination just after an announce for retries = Transport.PATHFINDER_R
# said destination has arrived, but before it has been local_rebroadcasts = 0
# rebroadcast locally. In such a case the actual announce block_rebroadcasts = True
# is temporarily held, and then reinserted when the path announce_hops = packet.hops
# request has been served to the peer.
if packet.destination_hash in Transport.announce_table:
held_entry = Transport.announce_table[packet.destination_hash]
Transport.held_announces[packet.destination_hash] = held_entry
Transport.announce_table[packet.destination_hash] = [now, retransmit_timeout, retries, received_from, announce_hops, packet, local_rebroadcasts, block_rebroadcasts, attached_interface] if is_from_local_client:
retransmit_timeout = now
else:
# TODO: Look at this timing
retransmit_timeout = now + Transport.PATH_REQUEST_GRACE # + (RNS.rand() * Transport.PATHFINDER_RW)
# This handles an edge case where a peer sends a past
# request for a destination just after an announce for
# said destination has arrived, but before it has been
# rebroadcast locally. In such a case the actual announce
# is temporarily held, and then reinserted when the path
# request has been served to the peer.
if packet.destination_hash in Transport.announce_table:
held_entry = Transport.announce_table[packet.destination_hash]
Transport.held_announces[packet.destination_hash] = held_entry
Transport.announce_table[packet.destination_hash] = [now, retransmit_timeout, retries, received_from, announce_hops, packet, local_rebroadcasts, block_rebroadcasts, attached_interface]
elif is_from_local_client: elif is_from_local_client:
# Forward path request on all interfaces # Forward path request on all interfaces
+1 -1
View File
@@ -69,7 +69,7 @@ def main():
parser.add_argument("-q", "--quiet", action="count", default=0, help="decrease verbosity") parser.add_argument("-q", "--quiet", action="count", default=0, help="decrease verbosity")
parser.add_argument("-a", "--announce", metavar="aspects", action="store", default=None, help="announce a destination based on this Identity") parser.add_argument("-a", "--announce", metavar="aspects", action="store", default=None, help="announce a destination based on this Identity")
parser.add_argument("-H", "--hash", metavar="aspects", action="store", default=None, help="show destination hash5s for other aspects for this Identity") parser.add_argument("-H", "--hash", metavar="aspects", action="store", default=None, help="show destination hashes for other aspects for this Identity")
parser.add_argument("-e", "--encrypt", metavar="path", action="store", default=None, help="encrypt file") parser.add_argument("-e", "--encrypt", metavar="path", action="store", default=None, help="encrypt file")
parser.add_argument("-d", "--decrypt", metavar="path", action="store", default=None, help="decrypt file") parser.add_argument("-d", "--decrypt", metavar="path", action="store", default=None, help="decrypt file")
parser.add_argument("-s", "--sign", metavar="path", action="store", default=None, help="sign file") parser.add_argument("-s", "--sign", metavar="path", action="store", default=None, help="sign file")
Regular → Executable
+34 -26
View File
@@ -237,6 +237,7 @@ try:
EXT_DIR = CNF_DIR+"/extracted" EXT_DIR = CNF_DIR+"/extracted"
RT_PATH = CNF_DIR+"/recovery_esptool.py" RT_PATH = CNF_DIR+"/recovery_esptool.py"
TK_DIR = CNF_DIR+"/trusted_keys" TK_DIR = CNF_DIR+"/trusted_keys"
ROM_DIR = CNF_DIR+"/eeprom"
if not os.path.isdir(CNF_DIR): if not os.path.isdir(CNF_DIR):
os.makedirs(CNF_DIR) os.makedirs(CNF_DIR)
@@ -248,6 +249,8 @@ try:
os.makedirs(EXT_DIR) os.makedirs(EXT_DIR)
if not os.path.isdir(TK_DIR): if not os.path.isdir(TK_DIR):
os.makedirs(TK_DIR) os.makedirs(TK_DIR)
if not os.path.isdir(ROM_DIR):
os.makedirs(ROM_DIR)
except Exception as e: except Exception as e:
print("No access to directory "+str(CNF_DIR)+". This utility needs file system access to store firmware and data files. Cannot continue.") print("No access to directory "+str(CNF_DIR)+". This utility needs file system access to store firmware and data files. Cannot continue.")
@@ -1131,6 +1134,7 @@ def main():
parser.add_argument("-e", "--extract", action="store_true", help="Extract firmware from connected RNode for later use") parser.add_argument("-e", "--extract", action="store_true", help="Extract firmware from connected RNode for later use")
parser.add_argument("-E", "--use-extracted", action="store_true", help="Use the extracted firmware for autoinstallation or update") parser.add_argument("-E", "--use-extracted", action="store_true", help="Use the extracted firmware for autoinstallation or update")
parser.add_argument("-C", "--clear-cache", action="store_true", help="Clear locally cached firmware files") parser.add_argument("-C", "--clear-cache", action="store_true", help="Clear locally cached firmware files")
parser.add_argument("--baud-flash", action="store", metavar="baud_flash", type=str, default="921600", help="Set specific baud rate when flashing device. Default is 921600")
parser.add_argument("-N", "--normal", action="store_true", help="Switch device to normal mode") parser.add_argument("-N", "--normal", action="store_true", help="Switch device to normal mode")
parser.add_argument("-T", "--tnc", action="store_true", help="Switch device to TNC mode") parser.add_argument("-T", "--tnc", action="store_true", help="Switch device to TNC mode")
@@ -1348,11 +1352,11 @@ def main():
hash_f.close() hash_f.close()
extraction_parts = [ extraction_parts = [
("bootloader", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud 921600 --before default_reset --after hard_reset read_flash 0x1000 0x4650 \""+EXT_DIR+"/extracted_rnode_firmware.bootloader\""), ("bootloader", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud "+args.baud_flash+" --before default_reset --after hard_reset read_flash 0x1000 0x4650 \""+EXT_DIR+"/extracted_rnode_firmware.bootloader\""),
("partition table", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud 921600 --before default_reset --after hard_reset read_flash 0x8000 0xC00 \""+EXT_DIR+"/extracted_rnode_firmware.partitions\""), ("partition table", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud "+args.baud_flash+" --before default_reset --after hard_reset read_flash 0x8000 0xC00 \""+EXT_DIR+"/extracted_rnode_firmware.partitions\""),
("app boot", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud 921600 --before default_reset --after hard_reset read_flash 0xe000 0x2000 \""+EXT_DIR+"/extracted_rnode_firmware.boot_app0\""), ("app boot", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud "+args.baud_flash+" --before default_reset --after hard_reset read_flash 0xe000 0x2000 \""+EXT_DIR+"/extracted_rnode_firmware.boot_app0\""),
("application image", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud 921600 --before default_reset --after hard_reset read_flash 0x10000 0x200000 \""+EXT_DIR+"/extracted_rnode_firmware.bin\""), ("application image", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud "+args.baud_flash+" --before default_reset --after hard_reset read_flash 0x10000 0x200000 \""+EXT_DIR+"/extracted_rnode_firmware.bin\""),
("console image", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud 921600 --before default_reset --after hard_reset read_flash 0x210000 0x1F0000 \""+EXT_DIR+"/extracted_console_image.bin\""), ("console image", "python \""+CNF_DIR+"/recovery_esptool.py\" --chip esp32 --port "+port_path+" --baud "+args.baud_flash+" --before default_reset --after hard_reset read_flash 0x210000 0x1F0000 \""+EXT_DIR+"/extracted_console_image.bin\""),
] ]
import subprocess, shlex import subprocess, shlex
for part, command in extraction_parts: for part, command in extraction_parts:
@@ -1494,7 +1498,7 @@ def main():
selected_product = None selected_product = None
try: try:
c_dev = int(input()) c_dev = int(input())
if c_dev < 1 or c_dev > 6: if c_dev < 1 or c_dev > 7:
raise ValueError() raise ValueError()
elif c_dev == 1: elif c_dev == 1:
selected_product = ROM.PRODUCT_RNODE selected_product = ROM.PRODUCT_RNODE
@@ -2055,7 +2059,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2073,7 +2077,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2091,7 +2095,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2109,7 +2113,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2127,7 +2131,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2145,7 +2149,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2163,7 +2167,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2181,7 +2185,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2199,7 +2203,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2217,7 +2221,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2235,7 +2239,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2253,7 +2257,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2271,7 +2275,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2289,7 +2293,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2307,7 +2311,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2325,7 +2329,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2343,7 +2347,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2361,7 +2365,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2378,7 +2382,7 @@ def main():
sys.executable, flasher, sys.executable, flasher,
"--chip", "esp32", "--chip", "esp32",
"--port", args.port, "--port", args.port,
"--baud", "921600", "--baud", args.baud_flash,
"--before", "default_reset", "--before", "default_reset",
"--after", "hard_reset", "--after", "hard_reset",
"write_flash", "-z", "write_flash", "-z",
@@ -2466,6 +2470,10 @@ def main():
RNS.log("Waiting for ESP32 reset...") RNS.log("Waiting for ESP32 reset...")
time.sleep(7) time.sleep(7)
else: else:
RNS.log("Error from flasher ("+str(flash_status)+") while writing.")
RNS.log("Some boards have trouble flashing at high speeds, and you can")
RNS.log("try flashing with a lower baud rate, as in this example:")
RNS.log("rnodeconf --autoinstall --baud-flash 115200")
exit() exit()
except Exception as e: except Exception as e:
@@ -2673,7 +2681,7 @@ def main():
try: try:
timestamp = time.time() timestamp = time.time()
filename = str(time.strftime("%Y-%m-%d_%H-%M-%S")) filename = str(time.strftime("%Y-%m-%d_%H-%M-%S"))
path = "./eeprom/"+filename+".eeprom" path = ROM_DIR + filename + ".eeprom"
file = open(path, "wb") file = open(path, "wb")
file.write(rnode.eeprom) file.write(rnode.eeprom)
file.close() file.close()
+12 -7
View File
@@ -187,15 +187,20 @@ def program_setup(configdir, table, rates, drop, destination_hexhash, verbosity,
if RNS.Transport.has_path(destination_hash): if RNS.Transport.has_path(destination_hash):
hops = RNS.Transport.hops_to(destination_hash) hops = RNS.Transport.hops_to(destination_hash)
next_hop = RNS.prettyhexrep(reticulum.get_next_hop(destination_hash)) next_hop_bytes = reticulum.get_next_hop(destination_hash)
next_hop_interface = reticulum.get_next_hop_if_name(destination_hash) if next_hop_bytes == None:
print("\r \rError: Invalid path data returned")
if hops != 1: sys.exit(1)
ms = "s"
else: else:
ms = "" next_hop = RNS.prettyhexrep(next_hop_bytes)
next_hop_interface = reticulum.get_next_hop_if_name(destination_hash)
print("\rPath found, destination "+RNS.prettyhexrep(destination_hash)+" is "+str(hops)+" hop"+ms+" away via "+next_hop+" on "+next_hop_interface) if hops != 1:
ms = "s"
else:
ms = ""
print("\rPath found, destination "+RNS.prettyhexrep(destination_hash)+" is "+str(hops)+" hop"+ms+" away via "+next_hop+" on "+next_hop_interface)
else: else:
print("\r \rPath not found") print("\r \rPath not found")
sys.exit(1) sys.exit(1)
+6
View File
@@ -147,6 +147,12 @@ def program_setup(configdir, dispall=False, verbosity=0, name_filter=None,json=F
if "bitrate" in ifstat and ifstat["bitrate"] != None: if "bitrate" in ifstat and ifstat["bitrate"] != None:
print(" Rate : {ss}".format(ss=speed_str(ifstat["bitrate"]))) print(" Rate : {ss}".format(ss=speed_str(ifstat["bitrate"])))
if "airtime_short" in ifstat and "airtime_long" in ifstat:
print(" Airtime : {atl}% (1h), {ats}% (15s)".format(ats=str(ifstat["airtime_short"]),atl=str(ifstat["airtime_long"])))
if "channel_load_short" in ifstat and "channel_load_long" in ifstat:
print(" Ch.Load : {atl}% (1h), {ats}% (15s)".format(ats=str(ifstat["channel_load_short"]),atl=str(ifstat["channel_load_long"])))
if "peers" in ifstat and ifstat["peers"] != None: if "peers" in ifstat and ifstat["peers"] != None:
print(" Peers : {np} reachable".format(np=ifstat["peers"])) print(" Peers : {np} reachable".format(np=ifstat["peers"]))
+1 -1
View File
@@ -105,7 +105,7 @@ def timestamp_str(time_s):
def log(msg, level=3, _override_destination = False): def log(msg, level=3, _override_destination = False):
global _always_override_destination, compact_log_fmt global _always_override_destination, compact_log_fmt
msg = str(msg)
if loglevel >= level: if loglevel >= level:
if not compact_log_fmt: if not compact_log_fmt:
logstring = "["+timestamp_str(time.time())+"] ["+loglevelname(level)+"] "+msg logstring = "["+timestamp_str(time.time())+"] ["+loglevelname(level)+"] "+msg
+1 -1
View File
@@ -1 +1 @@
__version__ = "0.5.4" __version__ = "0.5.8"
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1,4 +1,4 @@
# Sphinx build info version 1 # Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 0047216ec03de95cb42793af804179e2 config: 71ad04f9b77e073c86e777694a7a1080
tags: 645f666f9bcd5a90fca523b33c5a78b7 tags: 645f666f9bcd5a90fca523b33c5a78b7
@@ -219,11 +219,11 @@ by adding one of the following interfaces to your ``.reticulum/config`` file:
.. code:: .. code::
# TCP/IP interface to the Dublin hub # TCP/IP interface to the RNS Amsterdam Hub
[[RNS Testnet Dublin]] [[RNS Testnet Amsterdam]]
type = TCPClientInterface type = TCPClientInterface
enabled = yes enabled = yes
target_host = dublin.connect.reticulum.network target_host = amsterdam.connect.reticulum.network
target_port = 4965 target_port = 4965
# TCP/IP interface to the BetweenTheBorders Hub (community-provided) # TCP/IP interface to the BetweenTheBorders Hub (community-provided)
@@ -233,11 +233,11 @@ by adding one of the following interfaces to your ``.reticulum/config`` file:
target_host = betweentheborders.com target_host = betweentheborders.com
target_port = 4242 target_port = 4242
# Interface to I2P hub A # Interface to Testnet I2P Hub
[[RNS Testnet I2P Hub A]] [[RNS Testnet I2P Hub]]
type = I2PInterface type = I2PInterface
enabled = yes enabled = yes
peers = uxg5kubabakh3jtnvsipingbr5574dle7bubvip7llfvwx2tgrua.b32.i2p peers = g3br23bvx3lq5uddcsjii74xgmn6y5q325ovrkq2zw2wbzbqgbuq.b32.i2p
Many other Reticulum instances are connecting to this testnet, and you can also join it Many other Reticulum instances are connecting to this testnet, and you can also join it
via other entry points if you know them. There is absolutely no control over the network via other entry points if you know them. There is absolutely no control over the network
+16 -1
View File
@@ -365,6 +365,7 @@ can be used, and offers full control over LoRa parameters.
# out identification on the channel with # out identification on the channel with
# a set interval by configuring the # a set interval by configuring the
# following two parameters. # following two parameters.
# id_callsign = MYCALL-0 # id_callsign = MYCALL-0
# id_interval = 600 # id_interval = 600
@@ -372,7 +373,21 @@ can be used, and offers full control over LoRa parameters.
# with low amounts of RAM, using packet # with low amounts of RAM, using packet
# flow control can be useful. By default # flow control can be useful. By default
# it is disabled. # it is disabled.
flow_control = False
# flow_control = False
# It is possible to limit the airtime
# utilisation of an RNode by using the
# following two configuration options.
# The short-term limit is applied in a
# window of approximately 15 seconds,
# and the long-term limit is enforced
# over a rolling 60 minute window. Both
# options are specified in percent.
# airtime_limit_long = 1.5
# airtime_limit_short = 33
.. _interfaces-serial: .. _interfaces-serial:
+1 -1
View File
@@ -858,7 +858,7 @@ both on general-purpose CPUs and on microcontrollers. The necessary primitives a
* Ed25519 for signatures * Ed25519 for signatures
* X22519 for ECDH key exchanges * X25519 for ECDH key exchanges
* HKDF for key derivation * HKDF for key derivation
@@ -1,134 +0,0 @@
/*
* _sphinx_javascript_frameworks_compat.js
* ~~~~~~~~~~
*
* Compatability shim for jQuery and underscores.js.
*
* WILL BE REMOVED IN Sphinx 6.0
* xref RemovedInSphinx60Warning
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
+47 -25
View File
@@ -4,7 +4,7 @@
* *
* Sphinx stylesheet -- basic theme. * Sphinx stylesheet -- basic theme.
* *
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
@@ -236,16 +236,6 @@ div.body p, div.body dd, div.body li, div.body blockquote {
a.headerlink { a.headerlink {
visibility: hidden; visibility: hidden;
} }
a.brackets:before,
span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
}
h1:hover > a.headerlink, h1:hover > a.headerlink,
h2:hover > a.headerlink, h2:hover > a.headerlink,
@@ -334,11 +324,17 @@ aside.sidebar {
p.sidebar-title { p.sidebar-title {
font-weight: bold; font-weight: bold;
} }
nav.contents,
aside.topic,
div.admonition, div.topic, blockquote { div.admonition, div.topic, blockquote {
clear: left; clear: left;
} }
/* -- topics ---------------------------------------------------------------- */ /* -- topics ---------------------------------------------------------------- */
nav.contents,
aside.topic,
div.topic { div.topic {
border: 1px solid #ccc; border: 1px solid #ccc;
padding: 7px; padding: 7px;
@@ -377,6 +373,8 @@ div.body p.centered {
div.sidebar > :last-child, div.sidebar > :last-child,
aside.sidebar > :last-child, aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child, div.topic > :last-child,
div.admonition > :last-child { div.admonition > :last-child {
margin-bottom: 0; margin-bottom: 0;
@@ -384,6 +382,8 @@ div.admonition > :last-child {
div.sidebar::after, div.sidebar::after,
aside.sidebar::after, aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after, div.topic::after,
div.admonition::after, div.admonition::after,
blockquote::after { blockquote::after {
@@ -608,19 +608,27 @@ ol.simple p,
ul.simple p { ul.simple p {
margin-bottom: 0; margin-bottom: 0;
} }
dl.footnote > dt,
dl.citation > dt {
float: left;
margin-right: 0.5em;
}
dl.footnote > dd, aside.footnote > span,
dl.citation > dd { div.citation > span {
float: left;
}
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
padding-right: 0.5em;
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em; margin-bottom: 0em;
} }
aside.footnote > p:last-of-type:after,
dl.footnote > dd:after, div.citation > p:last-of-type:after {
dl.citation > dd:after {
content: ""; content: "";
clear: both; clear: both;
} }
@@ -636,10 +644,6 @@ dl.field-list > dt {
padding-left: 0.5em; padding-left: 0.5em;
padding-right: 5px; padding-right: 5px;
} }
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd { dl.field-list > dd {
padding-left: 0.5em; padding-left: 0.5em;
@@ -666,6 +670,16 @@ dd {
margin-left: 30px; margin-left: 30px;
} }
.sig dd {
margin-top: 0px;
margin-bottom: 0px;
}
.sig dl {
margin-top: 0px;
margin-bottom: 0px;
}
dl > dd:last-child, dl > dd:last-child,
dl > dd:last-child > :last-child { dl > dd:last-child > :last-child {
margin-bottom: 0; margin-bottom: 0;
@@ -734,6 +748,14 @@ abbr, acronym {
cursor: help; cursor: help;
} }
.translated {
background-color: rgba(207, 255, 207, 0.2)
}
.untranslated {
background-color: rgba(255, 207, 207, 0.2)
}
/* -- code displays --------------------------------------------------------- */ /* -- code displays --------------------------------------------------------- */
pre { pre {
+2 -1
View File
@@ -35,7 +35,8 @@ div.highlight {
position: relative; position: relative;
} }
.highlight:hover button.copybtn { /* Show the copybutton */
.highlight:hover button.copybtn, button.copybtn.success {
opacity: 1; opacity: 1;
} }
+36 -8
View File
@@ -20,7 +20,7 @@ const messages = {
}, },
'fr' : { 'fr' : {
'copy': 'Copier', 'copy': 'Copier',
'copy_to_clipboard': 'Copié dans le presse-papier', 'copy_to_clipboard': 'Copier dans le presse-papier',
'copy_success': 'Copié !', 'copy_success': 'Copié !',
'copy_failure': 'Échec de la copie', 'copy_failure': 'Échec de la copie',
}, },
@@ -102,18 +102,25 @@ const clearSelection = () => {
} }
} }
// Changes tooltip text for two seconds, then changes it back // Changes tooltip text for a moment, then changes it back
// We want the timeout of our `success` class to be a bit shorter than the
// tooltip and icon change, so that we can hide the icon before changing back.
var timeoutIcon = 2000;
var timeoutSuccessClass = 1500;
const temporarilyChangeTooltip = (el, oldText, newText) => { const temporarilyChangeTooltip = (el, oldText, newText) => {
el.setAttribute('data-tooltip', newText) el.setAttribute('data-tooltip', newText)
el.classList.add('success') el.classList.add('success')
setTimeout(() => el.setAttribute('data-tooltip', oldText), 2000) // Remove success a little bit sooner than we change the tooltip
setTimeout(() => el.classList.remove('success'), 2000) // So that we can use CSS to hide the copybutton first
setTimeout(() => el.classList.remove('success'), timeoutSuccessClass)
setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon)
} }
// Changes the copy button icon for two seconds, then changes it back // Changes the copy button icon for two seconds, then changes it back
const temporarilyChangeIcon = (el) => { const temporarilyChangeIcon = (el) => {
el.innerHTML = iconCheck; el.innerHTML = iconCheck;
setTimeout(() => {el.innerHTML = iconCopy}, 2000) setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon)
} }
const addCopyButtonToCodeCells = () => { const addCopyButtonToCodeCells = () => {
@@ -125,7 +132,8 @@ const addCopyButtonToCodeCells = () => {
} }
// Add copybuttons to all of our code cells // Add copybuttons to all of our code cells
const codeCells = document.querySelectorAll('div.highlight pre') const COPYBUTTON_SELECTOR = 'div.highlight pre';
const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR)
codeCells.forEach((codeCell, index) => { codeCells.forEach((codeCell, index) => {
const id = codeCellId(index) const id = codeCellId(index)
codeCell.setAttribute('id', id) codeCell.setAttribute('id', id)
@@ -141,10 +149,25 @@ function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
} }
/**
* Removes excluded text from a Node.
*
* @param {Node} target Node to filter.
* @param {string} exclude CSS selector of nodes to exclude.
* @returns {DOMString} Text from `target` with text removed.
*/
function filterText(target, exclude) {
const clone = target.cloneNode(true); // clone as to not modify the live DOM
if (exclude) {
// remove excluded nodes
clone.querySelectorAll(exclude).forEach(node => node.remove());
}
return clone.innerText;
}
// Callback when a copy button is clicked. Will be passed the node that was clicked // Callback when a copy button is clicked. Will be passed the node that was clicked
// should then grab the text and replace pieces of text that shouldn't be used in output // should then grab the text and replace pieces of text that shouldn't be used in output
function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") {
var regexp; var regexp;
var match; var match;
@@ -199,7 +222,12 @@ function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onl
var copyTargetText = (trigger) => { var copyTargetText = (trigger) => {
var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); var target = document.querySelector(trigger.attributes['data-clipboard-target'].value);
return formatCopyText(target.innerText, '', false, true, true, true, '', '')
// get filtered text
let exclude = '.linenos';
let text = filterText(target, exclude);
return formatCopyText(text, '', false, true, true, true, '', '')
} }
// Initialize with a callback so we can modify the text before copy // Initialize with a callback so we can modify the text before copy
+16 -1
View File
@@ -2,10 +2,25 @@ function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
} }
/**
* Removes excluded text from a Node.
*
* @param {Node} target Node to filter.
* @param {string} exclude CSS selector of nodes to exclude.
* @returns {DOMString} Text from `target` with text removed.
*/
export function filterText(target, exclude) {
const clone = target.cloneNode(true); // clone as to not modify the live DOM
if (exclude) {
// remove excluded nodes
clone.querySelectorAll(exclude).forEach(node => node.remove());
}
return clone.innerText;
}
// Callback when a copy button is clicked. Will be passed the node that was clicked // Callback when a copy button is clicked. Will be passed the node that was clicked
// should then grab the text and replace pieces of text that shouldn't be used in output // should then grab the text and replace pieces of text that shouldn't be used in output
export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") {
var regexp; var regexp;
var match; var match;
+1 -1
View File
@@ -4,7 +4,7 @@
* *
* Base JavaScript utilities for all Sphinx HTML documentation. * Base JavaScript utilities for all Sphinx HTML documentation.
* *
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
+1 -1
View File
@@ -1,6 +1,6 @@
var DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '0.5.4 beta', VERSION: '0.5.8 beta',
LANGUAGE: 'en', LANGUAGE: 'en',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,
BUILDER: 'html', BUILDER: 'html',
-10881
View File
File diff suppressed because it is too large Load Diff
-2
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -5,7 +5,7 @@
* This script contains the language-specific data used by searchtools.js, * This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter. * namely the list of stopwords, stemmer, scorer and splitter.
* *
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
+5 -2
View File
@@ -22,6 +22,7 @@
.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ .highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
.highlight .gd { color: #a40000 } /* Generic.Deleted */ .highlight .gd { color: #a40000 } /* Generic.Deleted */
.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #ef2929 } /* Generic.Error */ .highlight .gr { color: #ef2929 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .gi { color: #00A000 } /* Generic.Inserted */
@@ -101,12 +102,13 @@ body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */
body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */
body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
body[data-theme="dark"] .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */ body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */ body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */
body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
body[data-theme="dark"] .highlight .gr { color: #d22323 } /* Generic.Error */ body[data-theme="dark"] .highlight .gr { color: #d22323 } /* Generic.Error */
body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */ body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */
@@ -186,12 +188,13 @@ body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */
body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */
body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
body:not([data-theme="light"]) .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */ body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */ body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */
body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
body:not([data-theme="light"]) .highlight .gr { color: #d22323 } /* Generic.Error */ body:not([data-theme="light"]) .highlight .gr { color: #d22323 } /* Generic.Error */
body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */ body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */
@@ -1,7 +0,0 @@
/*!
* gumshoejs v5.1.2 (patched by @pradyunsg)
* A simple, framework-agnostic scrollspy script.
* (c) 2019 Chris Ferdinandi
* MIT License
* http://github.com/cferdinandi/gumshoe
*/
+1 -1
View File
@@ -4,7 +4,7 @@
* *
* Sphinx JavaScript utilities for the full-text search. * Sphinx JavaScript utilities for the full-text search.
* *
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+19 -22
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Support Reticulum" href="support.html" /><link rel="prev" title="Building Networks" href="networks.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Support Reticulum" href="support.html" /><link rel="prev" title="Building Networks" href="networks.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Code Examples - Reticulum Network Stack 0.5.4 beta documentation</title> <title>Code Examples - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -2064,7 +2064,7 @@ data between peers of a <code class="docutils literal notranslate"><span class="
<span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">&quot;Client disconnected&quot;</span><span class="p">)</span> <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">&quot;Client disconnected&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">server_message_received</span><span class="p">(</span><span class="n">message</span><span class="p">):</span> <span class="k">def</span> <span class="nf">server_message_received</span><span class="p">(</span><span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span> <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A message handler</span> <span class="sd"> A message handler</span>
<span class="sd"> @param message: An instance of a subclass of MessageBase</span> <span class="sd"> @param message: An instance of a subclass of MessageBase</span>
<span class="sd"> @return: True if message was handled</span> <span class="sd"> @return: True if message was handled</span>
@@ -2413,7 +2413,7 @@ binary data between peers of a <code class="docutils literal notranslate"><span
<span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">&quot;Client disconnected&quot;</span><span class="p">)</span> <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">&quot;Client disconnected&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">server_buffer_ready</span><span class="p">(</span><span class="n">ready_bytes</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span> <span class="k">def</span> <span class="nf">server_buffer_ready</span><span class="p">(</span><span class="n">ready_bytes</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span> <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Callback from buffer when buffer has data available</span> <span class="sd"> Callback from buffer when buffer has data available</span>
<span class="sd"> :param ready_bytes: The number of bytes ready to read</span> <span class="sd"> :param ready_bytes: The number of bytes ready to read</span>
@@ -3322,14 +3322,11 @@ interface to efficiently pass files of any size over a Reticulum <a class="refer
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+17 -20
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>An Explanation of Reticulum for Human Beings - Reticulum Network Stack 0.5.4 beta documentation</title> <title>An Explanation of Reticulum for Human Beings - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -257,14 +257,11 @@
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+15 -18
View File
@@ -4,12 +4,12 @@
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<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" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/><title>Index - Reticulum Network Stack 0.5.4 beta documentation</title> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/><title>Index - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -139,7 +139,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -159,16 +159,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -723,14 +723,11 @@
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+23 -26
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Using Reticulum on Your System" href="using.html" /><link rel="prev" title="What is Reticulum?" href="whatis.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Using Reticulum on Your System" href="using.html" /><link rel="prev" title="What is Reticulum?" href="whatis.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Getting Started Fast - Reticulum Network Stack 0.5.4 beta documentation</title> <title>Getting Started Fast - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -387,11 +387,11 @@ easier setup, use TCP.</p>
<h2>Connect to the Public Testnet<a class="headerlink" href="#connect-to-the-public-testnet" title="Permalink to this heading">#</a></h2> <h2>Connect to the Public Testnet<a class="headerlink" href="#connect-to-the-public-testnet" title="Permalink to this heading">#</a></h2>
<p>An experimental public testnet has been made accessible over both I2P and TCP. You can join it <p>An experimental public testnet has been made accessible over both I2P and TCP. You can join it
by adding one of the following interfaces to your <code class="docutils literal notranslate"><span class="pre">.reticulum/config</span></code> file:</p> by adding one of the following interfaces to your <code class="docutils literal notranslate"><span class="pre">.reticulum/config</span></code> file:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># TCP/IP interface to the Dublin hub</span> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># TCP/IP interface to the RNS Amsterdam Hub</span>
<span class="p">[[</span><span class="n">RNS</span> <span class="n">Testnet</span> <span class="n">Dublin</span><span class="p">]]</span> <span class="p">[[</span><span class="n">RNS</span> <span class="n">Testnet</span> <span class="n">Amsterdam</span><span class="p">]]</span>
<span class="nb">type</span> <span class="o">=</span> <span class="n">TCPClientInterface</span> <span class="nb">type</span> <span class="o">=</span> <span class="n">TCPClientInterface</span>
<span class="n">enabled</span> <span class="o">=</span> <span class="n">yes</span> <span class="n">enabled</span> <span class="o">=</span> <span class="n">yes</span>
<span class="n">target_host</span> <span class="o">=</span> <span class="n">dublin</span><span class="o">.</span><span class="n">connect</span><span class="o">.</span><span class="n">reticulum</span><span class="o">.</span><span class="n">network</span> <span class="n">target_host</span> <span class="o">=</span> <span class="n">amsterdam</span><span class="o">.</span><span class="n">connect</span><span class="o">.</span><span class="n">reticulum</span><span class="o">.</span><span class="n">network</span>
<span class="n">target_port</span> <span class="o">=</span> <span class="mi">4965</span> <span class="n">target_port</span> <span class="o">=</span> <span class="mi">4965</span>
<span class="c1"># TCP/IP interface to the BetweenTheBorders Hub (community-provided)</span> <span class="c1"># TCP/IP interface to the BetweenTheBorders Hub (community-provided)</span>
@@ -401,11 +401,11 @@ by adding one of the following interfaces to your <code class="docutils literal
<span class="n">target_host</span> <span class="o">=</span> <span class="n">betweentheborders</span><span class="o">.</span><span class="n">com</span> <span class="n">target_host</span> <span class="o">=</span> <span class="n">betweentheborders</span><span class="o">.</span><span class="n">com</span>
<span class="n">target_port</span> <span class="o">=</span> <span class="mi">4242</span> <span class="n">target_port</span> <span class="o">=</span> <span class="mi">4242</span>
<span class="c1"># Interface to I2P hub A</span> <span class="c1"># Interface to Testnet I2P Hub</span>
<span class="p">[[</span><span class="n">RNS</span> <span class="n">Testnet</span> <span class="n">I2P</span> <span class="n">Hub</span> <span class="n">A</span><span class="p">]]</span> <span class="p">[[</span><span class="n">RNS</span> <span class="n">Testnet</span> <span class="n">I2P</span> <span class="n">Hub</span><span class="p">]]</span>
<span class="nb">type</span> <span class="o">=</span> <span class="n">I2PInterface</span> <span class="nb">type</span> <span class="o">=</span> <span class="n">I2PInterface</span>
<span class="n">enabled</span> <span class="o">=</span> <span class="n">yes</span> <span class="n">enabled</span> <span class="o">=</span> <span class="n">yes</span>
<span class="n">peers</span> <span class="o">=</span> <span class="n">uxg5kubabakh3jtnvsipingbr5574dle7bubvip7llfvwx2tgrua</span><span class="o">.</span><span class="n">b32</span><span class="o">.</span><span class="n">i2p</span> <span class="n">peers</span> <span class="o">=</span> <span class="n">g3br23bvx3lq5uddcsjii74xgmn6y5q325ovrkq2zw2wbzbqgbuq</span><span class="o">.</span><span class="n">b32</span><span class="o">.</span><span class="n">i2p</span>
</pre></div> </pre></div>
</div> </div>
<p>Many other Reticulum instances are connecting to this testnet, and you can also join it <p>Many other Reticulum instances are connecting to this testnet, and you can also join it
@@ -737,14 +737,11 @@ section of this manual.</p>
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+17 -20
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Supported Interfaces" href="interfaces.html" /><link rel="prev" title="Understanding Reticulum" href="understanding.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Supported Interfaces" href="interfaces.html" /><link rel="prev" title="Understanding Reticulum" href="understanding.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Communications Hardware - Reticulum Network Stack 0.5.4 beta documentation</title> <title>Communications Hardware - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -499,14 +499,11 @@ connectivity for client devices.</p>
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+17 -20
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="What is Reticulum?" href="whatis.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="What is Reticulum?" href="whatis.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Reticulum Network Stack 0.5.4 beta documentation</title> <title>Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="#"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="#"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="#"> <div class="sidebar-sticky"><a class="sidebar-brand" href="#">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -464,14 +464,11 @@ to participate in the development of Reticulum itself.</p>
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+32 -21
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Building Networks" href="networks.html" /><link rel="prev" title="Communications Hardware" href="hardware.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Building Networks" href="networks.html" /><link rel="prev" title="Communications Hardware" href="hardware.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Supported Interfaces - Reticulum Network Stack 0.5.4 beta documentation</title> <title>Supported Interfaces - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -527,6 +527,7 @@ can be used, and offers full control over LoRa parameters.</p>
<span class="c1"># out identification on the channel with</span> <span class="c1"># out identification on the channel with</span>
<span class="c1"># a set interval by configuring the</span> <span class="c1"># a set interval by configuring the</span>
<span class="c1"># following two parameters.</span> <span class="c1"># following two parameters.</span>
<span class="c1"># id_callsign = MYCALL-0</span> <span class="c1"># id_callsign = MYCALL-0</span>
<span class="c1"># id_interval = 600</span> <span class="c1"># id_interval = 600</span>
@@ -534,7 +535,20 @@ can be used, and offers full control over LoRa parameters.</p>
<span class="c1"># with low amounts of RAM, using packet</span> <span class="c1"># with low amounts of RAM, using packet</span>
<span class="c1"># flow control can be useful. By default</span> <span class="c1"># flow control can be useful. By default</span>
<span class="c1"># it is disabled.</span> <span class="c1"># it is disabled.</span>
<span class="n">flow_control</span> <span class="o">=</span> <span class="kc">False</span>
<span class="c1"># flow_control = False</span>
<span class="c1"># It is possible to limit the airtime</span>
<span class="c1"># utilisation of an RNode by using the</span>
<span class="c1"># following two configuration options.</span>
<span class="c1"># The short-term limit is applied in a</span>
<span class="c1"># window of approximately 15 seconds,</span>
<span class="c1"># and the long-term limit is enforced</span>
<span class="c1"># over a rolling 60 minute window. Both</span>
<span class="c1"># options are specified in percent.</span>
<span class="c1"># airtime_limit_long = 1.5</span>
<span class="c1"># airtime_limit_short = 33</span>
</pre></div> </pre></div>
</div> </div>
</section> </section>
@@ -1006,14 +1020,11 @@ that a large span of network types can seamlessly <em>co-exist</em> and intercon
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+17 -20
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Code Examples" href="examples.html" /><link rel="prev" title="Supported Interfaces" href="interfaces.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Code Examples" href="examples.html" /><link rel="prev" title="Supported Interfaces" href="interfaces.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Building Networks - Reticulum Network Stack 0.5.4 beta documentation</title> <title>Building Networks - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -467,14 +467,11 @@ connected outliers are now an integral part of the network.</p>
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
Binary file not shown.
+151 -154
View File
File diff suppressed because it is too large Load Diff
+14 -17
View File
@@ -4,11 +4,11 @@
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="#" /> <meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="#" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/><title>Search - Reticulum Network Stack 0.5.4 beta documentation</title><link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/><title>Search - Reticulum Network Stack 0.5.8 beta documentation</title><link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -138,7 +138,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -158,16 +158,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -262,15 +262,12 @@
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
<script src="_static/searchtools.js"></script> <script src="_static/searchtools.js"></script>
<script src="_static/language_data.js"></script> <script src="_static/language_data.js"></script>
File diff suppressed because one or more lines are too long
+17 -20
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="API Reference" href="reference.html" /><link rel="prev" title="Code Examples" href="examples.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="API Reference" href="reference.html" /><link rel="prev" title="Code Examples" href="examples.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Support Reticulum - Reticulum Network Stack 0.5.4 beta documentation</title> <title>Support Reticulum - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -330,14 +330,11 @@ report issues, suggest functionality and contribute code to Reticulum.</p>
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+18 -21
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Communications Hardware" href="hardware.html" /><link rel="prev" title="Using Reticulum on Your System" href="using.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Communications Hardware" href="hardware.html" /><link rel="prev" title="Using Reticulum on Your System" href="using.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Understanding Reticulum - Reticulum Network Stack 0.5.4 beta documentation</title> <title>Understanding Reticulum - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -1061,7 +1061,7 @@ cryptographic primitives, with widely available implementations that can be used
both on general-purpose CPUs and on microcontrollers. The necessary primitives are:</p> both on general-purpose CPUs and on microcontrollers. The necessary primitives are:</p>
<ul class="simple"> <ul class="simple">
<li><p>Ed25519 for signatures</p></li> <li><p>Ed25519 for signatures</p></li>
<li><p>X22519 for ECDH key exchanges</p></li> <li><p>X25519 for ECDH key exchanges</p></li>
<li><p>HKDF for key derivation</p></li> <li><p>HKDF for key derivation</p></li>
<li><p>Fernet for encrypted tokens</p> <li><p>Fernet for encrypted tokens</p>
<ul> <ul>
@@ -1196,14 +1196,11 @@ those risks are acceptable to you.</p>
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+17 -20
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Understanding Reticulum" href="understanding.html" /><link rel="prev" title="Getting Started Fast" href="gettingstartedfast.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Understanding Reticulum" href="understanding.html" /><link rel="prev" title="Getting Started Fast" href="gettingstartedfast.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>Using Reticulum on Your System - Reticulum Network Stack 0.5.4 beta documentation</title> <title>Using Reticulum on Your System - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -812,14 +812,11 @@ WantedBy=multi-user.target
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+17 -20
View File
@@ -2,16 +2,16 @@
<html class="no-js" lang="en"> <html class="no-js" lang="en">
<head><meta charset="utf-8"/> <head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Getting Started Fast" href="gettingstartedfast.html" /><link rel="prev" title="Reticulum Network Stack Manual" href="index.html" /> <link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Getting Started Fast" href="gettingstartedfast.html" /><link rel="prev" title="Reticulum Network Stack Manual" href="index.html" />
<meta name="generator" content="sphinx-5.2.2, furo 2022.09.29"/> <meta name="generator" content="sphinx-7.1.2, furo 2022.09.29.dev1"/>
<title>What is Reticulum? - Reticulum Network Stack 0.5.4 beta documentation</title> <title>What is Reticulum? - Reticulum Network Stack 0.5.8 beta documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" /> <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=a746c00c" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=189ec851f9bb375a2509b67be1f64f0cf212b702" />
<link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" /> <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<link rel="stylesheet" type="text/css" href="_static/custom.css" /> <link rel="stylesheet" type="text/css" href="_static/custom.css?v=bb3cebc5" />
@@ -141,7 +141,7 @@
</label> </label>
</div> </div>
<div class="header-center"> <div class="header-center">
<a href="index.html"><div class="brand">Reticulum Network Stack 0.5.4 beta documentation</div></a> <a href="index.html"><div class="brand">Reticulum Network Stack 0.5.8 beta 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">
@@ -161,16 +161,16 @@
<aside class="sidebar-drawer"> <aside class="sidebar-drawer">
<div class="sidebar-container"> <div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="index.html"> <div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<div class="sidebar-logo-container"> <div class="sidebar-logo-container">
<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 0.5.4 beta documentation</span> <span class="sidebar-brand-text">Reticulum Network Stack 0.5.8 beta 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">
<input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default"> <input type="hidden" name="area" value="default">
</form> </form>
@@ -434,14 +434,11 @@ want to help out with this, or can help sponsor an audit, please do get in touch
</aside> </aside>
</div> </div>
</div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6d0dd1f9"></script>
<script src="_static/jquery.js"></script> <script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/underscore.js"></script> <script src="_static/sphinx_highlight.js?v=4825356b"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/scripts/furo.js?v=2c7c1115"></script>
<script src="_static/doctools.js"></script> <script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/sphinx_highlight.js"></script> <script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/scripts/furo.js"></script>
<script src="_static/clipboard.min.js"></script>
<script src="_static/copybutton.js"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -219,11 +219,11 @@ by adding one of the following interfaces to your ``.reticulum/config`` file:
.. code:: .. code::
# TCP/IP interface to the Dublin hub # TCP/IP interface to the RNS Amsterdam Hub
[[RNS Testnet Dublin]] [[RNS Testnet Amsterdam]]
type = TCPClientInterface type = TCPClientInterface
enabled = yes enabled = yes
target_host = dublin.connect.reticulum.network target_host = amsterdam.connect.reticulum.network
target_port = 4965 target_port = 4965
# TCP/IP interface to the BetweenTheBorders Hub (community-provided) # TCP/IP interface to the BetweenTheBorders Hub (community-provided)
@@ -233,11 +233,11 @@ by adding one of the following interfaces to your ``.reticulum/config`` file:
target_host = betweentheborders.com target_host = betweentheborders.com
target_port = 4242 target_port = 4242
# Interface to I2P hub A # Interface to Testnet I2P Hub
[[RNS Testnet I2P Hub A]] [[RNS Testnet I2P Hub]]
type = I2PInterface type = I2PInterface
enabled = yes enabled = yes
peers = uxg5kubabakh3jtnvsipingbr5574dle7bubvip7llfvwx2tgrua.b32.i2p peers = g3br23bvx3lq5uddcsjii74xgmn6y5q325ovrkq2zw2wbzbqgbuq.b32.i2p
Many other Reticulum instances are connecting to this testnet, and you can also join it Many other Reticulum instances are connecting to this testnet, and you can also join it
via other entry points if you know them. There is absolutely no control over the network via other entry points if you know them. There is absolutely no control over the network
+16 -1
View File
@@ -365,6 +365,7 @@ can be used, and offers full control over LoRa parameters.
# out identification on the channel with # out identification on the channel with
# a set interval by configuring the # a set interval by configuring the
# following two parameters. # following two parameters.
# id_callsign = MYCALL-0 # id_callsign = MYCALL-0
# id_interval = 600 # id_interval = 600
@@ -372,7 +373,21 @@ can be used, and offers full control over LoRa parameters.
# with low amounts of RAM, using packet # with low amounts of RAM, using packet
# flow control can be useful. By default # flow control can be useful. By default
# it is disabled. # it is disabled.
flow_control = False
# flow_control = False
# It is possible to limit the airtime
# utilisation of an RNode by using the
# following two configuration options.
# The short-term limit is applied in a
# window of approximately 15 seconds,
# and the long-term limit is enforced
# over a rolling 60 minute window. Both
# options are specified in percent.
# airtime_limit_long = 1.5
# airtime_limit_short = 33
.. _interfaces-serial: .. _interfaces-serial:
+1 -1
View File
@@ -858,7 +858,7 @@ both on general-purpose CPUs and on microcontrollers. The necessary primitives a
* Ed25519 for signatures * Ed25519 for signatures
* X22519 for ECDH key exchanges * X25519 for ECDH key exchanges
* HKDF for key derivation * HKDF for key derivation