It’s been nearly five months since we released version 0.3.5 of Yggdrasil. In that time we’ve seen the node count rise to over 400 nodes on the public network at times (over 80% of which are running the latest released version) and we’ve gained valuable insight to the kinds of challenges that our users have. We’ve worked to fix a number of bugs and to improve Yggdrasil.
In terms of lines of code changed, version 0.3.6 is the biggest release of Yggdrasil to date, with several thousands of lines of code affected. It represents a massive refactoring exercise in which we’ve broken up and modularised the code, dividing core Yggdrasil functionality, TUN/TAP, admin socket and multicast features into their own respective Go packages.
Most of the user-facing changes in this release are fairly minimal, however some bugs have been corrected. A complete list is available in the changelog.
Highlights include peers now being added correctly even when one or more configured peers are unavailable or unreachable. Multicast interfaces are also being evaluated more frequently now, which can help if an interface becomes available or goes down after Yggdrasil has already started.
A number of bugs have been fixed in the TUN/TAP and IP-specific code, including problems that affected ICMPv6 and Neighbour Discovery in TAP mode specifically. This helps reliability on platforms where TAP mode is used more commonly, e.g. on BSD platforms or on Windows, although this also improves TAP support on Linux too.
Around the previous release, it became obvious to us that our codebase was
turning into a monolith. We had pretty much all of the necessary behaviour in
yggdrasil package to run a single node, but this made our codebase
inflexible and difficult to maintain and extend. It also meant that Yggdrasil
was virtually impossible to integrate into other applications.
Our refactoring efforts in version 0.3.6 mean that our codebase is now easier to manage and to understand. It also includes the first taste of our API! The API makes it possible to take the Yggdrasil core, drop it into your own Go application and use the Yggdrasil network as a fully end-to-end encrypted and distributed transport layer. We’ve also moved all of the IP-specific code into the TUN/TAP module, which means that Yggdrasil’s core now provides a completely protocol-agnostic transport.
Documentation on how to use the API to integrate Yggdrasil into your own
applications will follow soon—watch this space! In the meantime,
godoc can be
used to examine our new API functions.
Please note though that API functions are not yet finalised and may be subject to change in future versions. Yggdrasil is still alpha-grade software at this point so all of the usual warnings apply.
We enjoy great support from our community in bringing and packaging Yggdrasil on new platforms. Since the release of version 0.3.5, the following third-party packages have cropped up, and we are very grateful to the maintainers:
We expect that any third-party packages which have not yet been updated for v0.3.6 will be updated soon!
We are aware of a few outstanding issues with Windows, which are largely related to one or two bugs in the Water library which we use for TUN/TAP support. We are hoping to address these problems with the maintainer of this library soon. Using Yggdrasil in router-only mode does work as expected, but some bugs when using the TAP adapter still remain. In the meantime, we’d certainly welcome any assistance in maintaining the Windows port of Yggdrasil.
The iOS build has been largely neglected due to API changes, although hopefully a new TestFlight build for version 0.3.6 will be available before too long.
We recommend that all Yggdrasil users always run the latest version of the code wherever possible, so please upgrade as soon as it is convenient. New downloads are available from our Builds page and Neil’s S3 repositories are up-to-date for Debian and EdgeRouter installs.
If you have installed through a package manager, you should be able to upgrade
in-place as soon as the new packages are available. On macOS, you can simply
install the new
.pkg from the builds page over the top of the old one. On
Windows, and on any installation where the binary was installed by hand, you can
simply replace the
yggdrasilctl binaries with the newly
Building from source is simple if you have Git and Go 1.11 or later installed:
git clone https://github.com/yggdrasil-network/yggdrasil-go