Configuration support for interface access codes

This commit is contained in:
Mark Qvist 2022-04-27 13:21:53 +02:00
parent 7c70f9d865
commit cf1ca01a3b
4 changed files with 81 additions and 11 deletions

View File

@ -58,11 +58,12 @@ class Identity:
""" """
# Non-configurable constants # Non-configurable constants
FERNET_VERSION = 0x80 FERNET_VERSION = 0x80
FERNET_OVERHEAD = 54 # In bytes FERNET_OVERHEAD = 57 # In bytes
AES128_BLOCKSIZE = 16 # In bytes OPTIMISED_FERNET_OVERHEAD = 54 # In bytes
HASHLENGTH = 256 # In bits AES128_BLOCKSIZE = 16 # In bytes
SIGLENGTH = KEYSIZE # In bits HASHLENGTH = 256 # In bits
SIGLENGTH = KEYSIZE # In bits
TRUNCATED_HASHLENGTH = RNS.Reticulum.TRUNCATED_HASHLENGTH TRUNCATED_HASHLENGTH = RNS.Reticulum.TRUNCATED_HASHLENGTH
""" """

View File

@ -67,7 +67,7 @@ class Link:
ECPUBSIZE = 32+32 ECPUBSIZE = 32+32
KEYSIZE = 32 KEYSIZE = 32
MDU = math.floor((RNS.Reticulum.MTU-RNS.Reticulum.HEADER_MINSIZE-RNS.Identity.FERNET_OVERHEAD)/RNS.Identity.AES128_BLOCKSIZE)*RNS.Identity.AES128_BLOCKSIZE - 1 MDU = math.floor((RNS.Reticulum.MTU-RNS.Reticulum.IFAC_MIN_SIZE-RNS.Reticulum.HEADER_MINSIZE-RNS.Identity.OPTIMISED_FERNET_OVERHEAD)/RNS.Identity.AES128_BLOCKSIZE)*RNS.Identity.AES128_BLOCKSIZE - 1
ESTABLISHMENT_TIMEOUT_PER_HOP = RNS.Reticulum.DEFAULT_PER_HOP_TIMEOUT ESTABLISHMENT_TIMEOUT_PER_HOP = RNS.Reticulum.DEFAULT_PER_HOP_TIMEOUT
""" """

View File

@ -94,7 +94,7 @@ class Packet:
""" """
PLAIN_MDU = MDU PLAIN_MDU = MDU
""" """
The maximum size of the payload data in a single unencrypted packet The maximum size of the payload data in a single unencrypted packet
""" """
TIMEOUT_PER_HOP = RNS.Reticulum.DEFAULT_PER_HOP_TIMEOUT TIMEOUT_PER_HOP = RNS.Reticulum.DEFAULT_PER_HOP_TIMEOUT

View File

@ -71,12 +71,12 @@ class Reticulum:
other programs to use on demand. other programs to use on demand.
""" """
# Future minimum will probably be locked in at 244 bytes to support # Future minimum will probably be locked in at 251 bytes to support
# networks with segments of different MTUs. Absolute minimum is 211. # networks with segments of different MTUs. Absolute minimum is 219.
MTU = 500 MTU = 500
""" """
The MTU that Reticulum adheres to, and will expect other peers to The MTU that Reticulum adheres to, and will expect other peers to
adhere to. By default, the MTU is 500 bytes. In custom RNS network adhere to. By default, the MTU is 507 bytes. In custom RNS network
implementations, it is possible to change this value, but doing so will implementations, it is possible to change this value, but doing so will
completely break compatibility with all other RNS networks. An identical completely break compatibility with all other RNS networks. An identical
MTU is a prerequisite for peers to communicate in the same network. MTU is a prerequisite for peers to communicate in the same network.
@ -121,8 +121,9 @@ class Reticulum:
HEADER_MINSIZE = 2+1+(TRUNCATED_HASHLENGTH//8)*1 HEADER_MINSIZE = 2+1+(TRUNCATED_HASHLENGTH//8)*1
HEADER_MAXSIZE = 2+1+(TRUNCATED_HASHLENGTH//8)*2 HEADER_MAXSIZE = 2+1+(TRUNCATED_HASHLENGTH//8)*2
IFAC_MIN_SIZE = 1
MDU = MTU - HEADER_MAXSIZE MDU = MTU - HEADER_MAXSIZE - IFAC_MIN_SIZE
router = None router = None
config = None config = None
@ -323,6 +324,12 @@ class Reticulum:
interface_names = [] interface_names = []
for name in self.config["interfaces"]: for name in self.config["interfaces"]:
if not name in interface_names: if not name in interface_names:
# TODO: We really need to generalise this way of instantiating
# and configuring interfaces. Ideally, interfaces should just
# have a conrfig dict passed to their init method, and return
# a ready interface, onto which this routine can configure any
# generic or extra parameters.
c = self.config["interfaces"][name] c = self.config["interfaces"][name]
interface_mode = Interface.Interface.MODE_FULL interface_mode = Interface.Interface.MODE_FULL
@ -343,6 +350,21 @@ class Reticulum:
elif c["mode"] == "pointtopoint" or c["mode"] == "ptp": elif c["mode"] == "pointtopoint" or c["mode"] == "ptp":
interface_mode = Interface.Interface.MODE_POINT_TO_POINT interface_mode = Interface.Interface.MODE_POINT_TO_POINT
ifac_size = None
if "ifac_size" in c:
if c.as_int("ifac_size") >= Reticulum.IFAC_MIN_SIZE:
ifac_size = c.as_int("ifac_size")
ifac_netname = None
if "ifac_netname" in c:
if c.as_int("ifac_netname") >= Reticulum.IFAC_MIN_SIZE:
ifac_netname = c.as_int("ifac_netname")
ifac_netkey = None
if "ifac_netkey" in c:
if c.as_int("ifac_netkey") >= Reticulum.IFAC_MIN_SIZE:
ifac_netkey = c.as_int("ifac_netkey")
configured_bitrate = None configured_bitrate = None
if "bitrate" in c: if "bitrate" in c:
if c.as_int("bitrate") >= Reticulum.MINIMUM_BITRATE: if c.as_int("bitrate") >= Reticulum.MINIMUM_BITRATE:
@ -354,6 +376,8 @@ class Reticulum:
announce_cap = c.as_float("announce_cap")/100.0 announce_cap = c.as_float("announce_cap")/100.0
try: try:
interface = None
if (("interface_enabled" in c) and c.as_bool("interface_enabled") == True) or (("enabled" in c) and c.as_bool("enabled") == True): if (("interface_enabled" in c) and c.as_bool("interface_enabled") == True) or (("enabled" in c) and c.as_bool("enabled") == True):
if c["type"] == "AutoInterface": if c["type"] == "AutoInterface":
if not RNS.vendor.platformutils.is_windows(): if not RNS.vendor.platformutils.is_windows():
@ -387,6 +411,10 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 16
else: else:
RNS.log("AutoInterface is not currently supported on Windows, disabling interface.", RNS.LOG_ERROR); RNS.log("AutoInterface is not currently supported on Windows, disabling interface.", RNS.LOG_ERROR);
@ -430,6 +458,10 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 16
if c["type"] == "TCPServerInterface": if c["type"] == "TCPServerInterface":
@ -467,6 +499,10 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 16
if c["type"] == "TCPClientInterface": if c["type"] == "TCPClientInterface":
@ -501,6 +537,10 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 16
if c["type"] == "I2PInterface": if c["type"] == "I2PInterface":
@ -531,6 +571,10 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 16
if c["type"] == "SerialInterface": if c["type"] == "SerialInterface":
@ -565,6 +609,10 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 8
if c["type"] == "KISSInterface": if c["type"] == "KISSInterface":
preamble = int(c["preamble"]) if "preamble" in c else None preamble = int(c["preamble"]) if "preamble" in c else None
@ -612,6 +660,10 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 8
if c["type"] == "AX25KISSInterface": if c["type"] == "AX25KISSInterface":
preamble = int(c["preamble"]) if "preamble" in c else None preamble = int(c["preamble"]) if "preamble" in c else None
@ -660,6 +712,10 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 8
if c["type"] == "RNodeInterface": if c["type"] == "RNodeInterface":
frequency = int(c["frequency"]) if "frequency" in c else None frequency = int(c["frequency"]) if "frequency" in c else None
@ -702,6 +758,19 @@ class Reticulum:
interface.announce_cap = announce_cap interface.announce_cap = announce_cap
if configured_bitrate: if configured_bitrate:
interface.bitrate = configured_bitrate interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 8
if interface != None:
interface.ifac_netname = ifac_netname
interface.ifac_netkey = ifac_netkey
# TODO: Remove
RNS.log("Interface ready: "+str(interface))
RNS.Transport.interfaces.append(interface)
else: else:
RNS.log("Skipping disabled interface \""+name+"\"", RNS.LOG_DEBUG) RNS.log("Skipping disabled interface \""+name+"\"", RNS.LOG_DEBUG)