Skip to content

Releases: yggdrasil-network/yggdrasil-go

Version 0.3.12

24 Nov 09:48
a9cfa5b
Compare
Choose a tag to compare
Version 0.3.12 Pre-release
Pre-release

Added

  • New API functions SetMaximumSessionMTU and GetMaximumSessionMTU
  • New command line parameters -address and -subnet for getting the address/subnet from the config file, for use with -useconffile or -useconf
  • A warning is now produced in the Yggdrasil output at startup when the MTU in the config is invalid or has been adjusted for some reason

Changed

  • On Linux, outgoing InterfacePeers connections now use SO_BINDTODEVICE to prefer an outgoing interface
  • The genkeys utility is now in cmd rather than misc

Fixed

  • A data race condition has been fixed when updating session coordinates
  • A crash when shutting down when no multicast interfaces are configured has been fixed
  • A deadlock when calling AddPeer multiple times has been fixed
  • A typo in the systemd unit file (for some Linux packages) has been fixed
  • The NodeInfo and admin socket now report unknown correctly when no build name/version is available in the environment at build time
  • The MTU calculation now correctly accounts for ethernet headers when running in TAP mode

Version 0.3.11

25 Oct 08:38
1fbab17
Compare
Choose a tag to compare
Version 0.3.11 Pre-release
Pre-release

Added

  • Support for TLS listeners and peers has been added, allowing the use of tls://host:port in Peers, InterfacePeers and Listen configuration settings - this allows hiding Yggdrasil peerings inside regular TLS connections

Changed

  • Go 1.13 or later is now required for building Yggdrasil
  • Some exported API functions have been updated to work with standard Go interfaces:
    • net.Conn instead of yggdrasil.Conn
    • net.Dialer (the interface it would satisfy if it wasn't a concrete type) instead of yggdrasil.Dialer
    • net.Listener instead of yggdrasil.Listener
  • Session metadata is now updated correctly when a search completes for a node to which we already have an open session
  • Multicast module reloading behaviour has been improved

Fixed

  • An incorrectly held mutex in the crypto-key routing code has been fixed
  • Multicast module no longer opens a listener socket if no multicast interfaces are configured

Version 0.3.10

10 Oct 20:16
1c81e43
Compare
Choose a tag to compare
Version 0.3.10 Pre-release
Pre-release

Added

  • The core library now includes several unit tests for peering and yggdrasil.Conn connections

Changed

  • On recent Linux kernels, Yggdrasil will now set the tcp_congestion_control algorithm used for its own TCP sockets to BBR, which reduces latency under load
  • The systemd service configuration in contrib (and, by extension, some of our packages) now attemps to load the tun module, in case TUN/TAP support is available but not loaded, and it restricts Yggdrasil to the CAP_NET_ADMIN capability for managing the TUN/TAP adapter, rather than letting it do whatever the (typically root) user can do

Fixed

  • The yggdrasil.Conn.RemoteAddr() function no longer blocks, fixing a deadlock when CKR is used while under heavy load

Version 0.3.9

27 Sep 08:54
6ddb0f9
Compare
Choose a tag to compare
Version 0.3.9 Pre-release
Pre-release

Added

  • Yggdrasil will now complain more verbosely when a peer URI is incorrectly formatted
  • Soft-shutdown methods have been added, allowing a node to shut down gracefully when terminated
  • New multicast interval logic which sends multicast beacons more often when Yggdrasil is first started to increase the chance of finding nearby nodes quickly after startup

Changed

  • The switch now buffers packets more eagerly in an attempt to give the best link a chance to send, which appears to reduce packet reordering when crossing aggregate sets of peerings
  • Substantial amounts of the codebase have been refactored to use the actor model, which should substantially reduce the chance of deadlocks
  • Nonce tracking in sessions has been modified so that memory usage is reduced whilst still only allowing duplicate packets within a small window
  • Soft-reconfiguration support has been simplified using new actor functions
  • The garbage collector threshold has been adjusted for mobile builds
  • The maximum queue size is now managed exclusively by the switch rather than by the core

Fixed

  • The broken hjson-go dependency which affected builds of the previous version has now been resolved in the module manifest
  • Some minor memory leaks in the switch have been fixed, which improves memory usage on mobile builds
  • A memory leak in the add-peer loop has been fixed
  • The admin socket now reports the correct URI strings for SOCKS peers in getPeers
  • A race condition when dialling a remote node by both the node address and routed prefix simultaneously has been fixed
  • A race condition between the router and the dial code resulting in a panic has been fixed
  • A panic which could occur when the TUN/TAP interface disappears (e.g. during soft-shutdown) has been fixed
  • A bug in the semantic versioning script which accompanies Yggdrasil for builds has been fixed
  • A panic which could occur when the TUN/TAP interface reads an undersized/corrupted packet has been fixed

Version 0.3.8

21 Aug 17:20
562a7d1
Compare
Choose a tag to compare
Version 0.3.8 Pre-release
Pre-release

Changed

  • Yggdrasil can now send multiple packets from the switch at once, which results in improved throughput with smaller packets or lower MTUs
  • Performance has been slightly improved by not allocating cancellations where not necessary
  • Crypto-key routing options have been renamed for clarity
    • IPv4Sources is now named IPv4LocalSubnets
    • IPv6Sources is now named IPv6LocalSubnets
    • IPv4Destinations is now named IPv4RemoteSubnets
    • IPv6Destinations is now named IPv6RemoteSubnets
    • The old option names will continue to be accepted by the configuration parser for now but may not be indefinitely
  • When presented with multiple paths between two nodes, the switch now prefers the most recently used port when possible instead of the least recently used, helping to reduce packet reordering
  • New nonce tracking should help to reduce the number of packets dropped as a result of multiple/aggregate paths or congestion control in the switch

Fixed

  • Security vulnerability: Address verification was not strict enough, which could result in a malicious session sending traffic with unexpected or spoofed source or destination addresses which Yggdrasil could fail to reject
    • Versions 0.3.6 and 0.3.7 are vulnerable - users of these versions should upgrade as soon as possible
    • Versions 0.3.5 and earlier are not affected
  • A deadlock was fixed in the session code which could result in Yggdrasil failing to pass traffic after some time

Version 0.3.7

18 Aug 10:22
009d9c9
Compare
Choose a tag to compare
Version 0.3.7 Pre-release
Pre-release

Changed

  • The switch should now forward packets along a single path more consistently in cases where congestion is low and multiple equal-length paths exist, which should improve stability and result in fewer out-of-order packets
  • Sessions should now be more tolerant of out-of-order packets, by replacing a bitmask with a variable sized heap+map structure to track recently received nonces, which should reduce the number of packets dropped due to reordering when multiple paths are used or multiple independent flows are transmitted through the same session
  • The admin socket can no longer return a dotfile representation of the known parts of the network, this could be rebuilt by clients using information from getSwitchPeers,getDHT and getSessions

Fixed

  • A number of significant performance regressions introduced in version 0.3.6 have been fixed, resulting in better performance
  • Flow labels are now used to prioritise traffic flows again correctly
  • In low-traffic scenarios where there are multiple peerings between a pair of nodes, Yggdrasil now prefers the most active peering instead of the least active, helping to reduce packet reordering
  • The Listen statement, when configured as a string rather than an array, will now be parsed correctly
  • The admin socket now returns coords as a correct array of unsigned 64-bit integers, rather than the internal representation
  • The admin socket now returns box_pub_key in string format again
  • Sessions no longer leak/block when no listener (e.g. TUN/TAP) is configured
  • Incoming session connections no longer block when a session already exists, which results in less leaked goroutines
  • Flooded sessions will no longer block other sessions
  • Searches are now cleaned up properly and a couple of edge-cases with duplicate searches have been fixed
  • A number of minor allocation and pointer fixes

Version 0.3.6

03 Aug 11:03
a296629
Compare
Choose a tag to compare
Version 0.3.6 Pre-release
Pre-release

Added

  • Yggdrasil now has a public API with interfaces such as yggdrasil.ConnDialer, yggdrasil.ConnListener and yggdrasil.Conn for using Yggdrasil as a transport directly within applications
  • Session gatekeeper functions, part of the API, which can be used to control whether to allow or reject incoming or outgoing sessions dynamically (compared to the previous fixed whitelist/blacklist approach)
  • Support for logging to files or syslog (where supported)
  • Platform defaults now include the ability to set sane defaults for multicast interfaces

Changed

  • Following a massive refactoring exercise, Yggdrasil's codebase has now been broken out into modules
  • Core node functionality in the yggdrasil package with a public API
    • This allows Yggdrasil to be integrated directly into other applications and used as a transport
    • IP-specific code has now been moved out of the core yggdrasil package, making Yggdrasil effectively protocol-agnostic
  • Multicast peer discovery functionality is now in the multicast package
  • Admin socket functionality is now in the admin package and uses the Yggdrasil public API
  • TUN/TAP, ICMPv6 and all IP-specific functionality is now in the tuntap package
  • PPROF debug output is now sent to stderr instead of stdout
  • Node IPv6 addresses on macOS are now configured as secured
  • Upstream dependency references have been updated, which includes a number of fixes in the Water library

Fixed

  • Multicast discovery is no longer disabled if the nominated interfaces aren't available on the system yet, e.g. during boot
  • Multicast interfaces are now re-evaluated more frequently so that Yggdrasil doesn't need to be restarted to use interfaces that have become available since startup
  • Admin socket error cases are now handled better
  • Various fixes in the TUN/TAP module, particularly surrounding Windows platform support
  • Invalid keys will now cause the node to fail to start, rather than starting but silently not working as before
  • Session MTUs are now always calculated correctly, in some cases they were incorrectly defaulting to 1280 before
  • Multiple searches now don't take place for a single connection
  • Concurrency bugs fixed
  • Fixed a number of bugs in the ICMPv6 neighbor solicitation in the TUN/TAP code
  • A case where peers weren't always added correctly if one or more peers were unreachable has been fixed
  • Searches which include the local node are now handled correctly
  • Lots of small bug tweaks and clean-ups throughout the codebase

Version 0.3.5

13 Mar 23:05
c11f08f
Compare
Choose a tag to compare
Version 0.3.5 Pre-release
Pre-release

Fixed

  • The AllowedEncryptionPublicKeys option has now been fixed to handle incoming connections properly and no longer blocks outgoing connections (this was broken in v0.3.4)
  • Multicast TCP listeners will now be stopped correctly when the link-local address on the interface changes or disappears altogether

Version 0.3.4

12 Mar 10:02
43643e0
Compare
Choose a tag to compare
Version 0.3.4 Pre-release
Pre-release

Added

  • Support for multiple listeners (although currently only TCP listeners are supported)
  • New multicast behaviour where each multicast interface is given it's own link-local listener and does not depend on the Listen configuration
  • Blocking detection in the switch to avoid parenting a blocked peer
  • Support for adding and removing listeners and multicast interfaces when reloading configuration during runtime
  • Yggdrasil will now attempt to clean up UNIX admin sockets on startup if left behind by a previous crash
  • Admin socket getTunnelRouting and setTunnelRouting calls for enabling and disabling crypto-key routing during runtime
  • On macOS, Yggdrasil will now try to wake up AWDL on start-up when awdl0 is a configured multicast interface, to keep it awake after system sleep, and to stop waking it when no longer needed
  • Added LinkLocalTCPPort option for controlling the port number that link-local TCP listeners will listen on by default when setting up MulticastInterfaces (a node restart is currently required for changes to LinkLocalTCPPort to take effect - it cannot be updated by reloading config during runtime)

Changed

  • The Listen configuration statement is now an array instead of a string
  • The Listen configuration statement should now conform to the same formatting as peers with the protocol prefix, e.g. tcp://[::]:0
  • Session workers are now non-blocking
  • Multicast interval is now fixed at every 15 seconds and network interfaces are reevaluated for eligibility on each interval (where before the interval depended upon the number of configured multicast interfaces and evaluation only took place at startup)
  • Dead connections are now closed in the link handler as opposed to the switch
  • Peer forwarding is now prioritised instead of randomised

Fixed

  • Admin socket getTunTap call now returns properly instead of claiming no interface is enabled in all cases
  • Handling of getRoutes etc in yggdrasilctl is now working
  • Local interface names are no longer leaked in multicast packets
  • Link-local TCP connections, particularly those initiated because of multicast beacons, are now always correctly scoped for the target interface
  • Yggdrasil now correctly responds to multicast interfaces going up and down during runtime