LIVE
Loading live headlines…
Home Trending World Technology Entertainment Gaming Sports Music Science Lifestyle Business About Contact
c/Reticulum by u/ignirtoq 2w ago

No Native Layer 3 Interface?

16 upvotes 0 comments
Hi all. I'm new to reticulum, having found it about 2 weeks ago. I am a software engineer by trade, so it wasn't too big of a learning curve to jump into. I have `rnsd` and `nomadnet` running on a pair of Linux devices, RNode running on a pair of Lilygo T-Echo radios to test LoRa with, and I managed to cross-compile [rns-rs](https://github.com/lelloman/rns-rs) and get its version of `rnsd` running on my OpenWRT router (which is an ARM64 architecture with musl for libc, which presented some headaches). My router vendor doesn't provide pip or the cryptography Python library as installable packages, so rather than muck about with firmware and potentially break my home network entirely, it seemed less risky to compile a binary with minimal dynamic libraries to link and run that. Seems to work.

I have read through the [Zen of Reticulum](https://reticulum.network/manual/zen.html), particularly the [Death to the Address](https://reticulum.network/manual/zen.html#death-to-the-address) section, and I interpreted that as a project goal to replace the Internet Protocol (i.e. IP), a [layer 3](https://osi-model.com/network-layer/) protocol in the OSI model. The [Hardware](https://reticulum.network/hardware.html) section of reticulum.network also seems to jive with that interpretation, as "Any ethernet device" is listed separately from "TCP over IP networks" and "UDP over IP networks."

However, when I read through the [Configuring Interfaces](https://reticulum.network/manual/interfaces.html) section of the manual, all of the options for Ethernet/WiFi seem to be built on top of either TCP or UDP, which are themselves built on IP. The **AutoInterface** uses UDP, the **BackboneInterface** uses TCP, there are specific TCP and UDP interfaces, and then everything else seems to be for more specialized connections (RNodes, serial connections, amateur radio, etc.) or compatibility interfaces with other cryptographic or anonymization protocols (I2P and Yggdrasil). Am I missing something?

I'm not a low-level network programmer, so I am definitely out of my element here and wanted to check with others who may be more knowledgeable in the domain. I have done some reading on building Ethernet frames and was planning to try my hand at writing some kind of EthernetInterface using the [Custom Interfaces](https://reticulum.network/manual/examples.html#example-custominterface) API, but if there's a reason such an implementation doesn't exist, and I would be wasting my time, I wanted to ask. I was planning to do a Python implementation as a prototype and then write an extension to rns-rs to try on my router.

_Update_ : Small update. I have a prototype Python implementation working on my home devices. There's a big caveat to my implementation: in order to get access to raw Ethernet frames required by this interface, `rnsd` needs to be run as root. This makes sense to me because differentiation of network traffic data packets is typically handled by TCP and UDP sockets, so layer 4. I'm doing a layer 3 implementation, so working with layer 2 data, where we have no differentiation of what owns what data, so it has to be handled by root (and honestly should probably be handled in the kernel). This appears to require other processes that want to share the transport instance (e.g. NomadNet) to run as root as well, but I could be doing that part wrong. If any of my reasoning is flawed here, please let me know! Otherwise, I need to clean up error-handling and then I'll post my code on a new repository on Codeberg.
Open discussion