Add static tunneling support to Librecast library for pre-configured static endpoints.
The original plan for this milestone was to implement a simple GRE tunnel, similar to what HE.net does for IPv6. We found that it does not fit our needs for a simple to use transitional tunnel. Using GRE requires not opening a port, but a protocol in firewalls, and that fails the "ease of setup" test already.
There is an RFC for multicast tunneling, RFC 7450 "Automatic Multicast Tunneling", support for which was just merged into the latest Linux kernel. The easy (from a coding standpoint) solution would be to just use that.
Unfortunately, there are a couple of problems with AMT:
1. The Linux kernel AMT implementation uses Wireguard, which would add an extra (redundant) layer of encryption on top of the encryption we're already using.
2. The more fundamental problem is that AMT is designed for use by ASNs (large Internet operators), and it is entirely unidirectional. All the sources are assumed to be at the "relay" end of the tunnel. This does not suit our use case of the many-to-many "anyone can be a source" multicast that we use.
We opted for an AMT-esque UDP tunnel. We implemented this as a separate daemon.
We plan to move most of the code into the main Librecast Core API in a future release.
This works through NAT, requires no firewall ports (or protocols) to be enabled, and therefore is simple to set up for end-users. We'll add a TCP fallback for those places where UDP is blocked, but fortunately, UDP is reasonably available.
This code is Pre-alpha
lctunnel connects two IPv6 multicast networks using a UDP tunnel.
It is currently being developed to support the Librecast Project's R&D projects as part of the NGI Zero (Next Generation Internet) Programme.
lctunnel is not fully RFC-compliant for AMT (RFC 7450). AMT is
unidirectional and assumes that all multicast sources are at the "relay" end
of the tunnel. That does not fit with our many-to-many multicast development.
lctunnel is designed to work with
lcroute, but can be used separately.