Asymmetric Bonding

I have a zerotier configuration bonded using balance-aware across two ADSL fixed lines, and a 4G mobile connection.

The two ADSL lines have a stable uplink speed of about 12Mbps and a downlink speed of about 40Mbps.

The 4G connection is wildly variable. Although it’s capable in principle of download speeds of ~100Mbps, usually the downlink speed is less than 10Mbps, sometimes less than 1Mbps. The uplink speed, though, is usually more than that of the two ADSL lines put together! (This seems to be quite common for 4G connections for some reason, at least in the UK.)

The problem I’m having is that zerotier measures the connection quality for a link as a single value for both upload and download. That means that in my configuration, zerotier does a great job of using the 4G connection during periods when the downlink is fast and stable, but basically ignores it during periods when the downlink is slow, even though the uplink is usually still fast.

Looking at the code in Bond.cpp, it looks like in principle it should be possible to split a flow into upload and download pairs, and assign the two halves of the flow to different links (but I’m quite probably missing some obvious reason why this is impossible).

In any case it would be nice if zerotier could maintain separate stats for upload and download performance of each link, and take both into account when assigning flows. Ideally, it’d be nice if zerotier could split a flow into upload and download parts and assign those separately. If that’s not possible, most flows are in practice assymetric and it’d be nice if zerotier could take into account whether a flow is mostly-upload or mostly-download and reassign them accordingly to the best-suited link.

I realise this is a big ask! I’d be interested in feedback from developers to let me know if they think what I’m suggesting is even possible, as I’d be interested in taking a crack at it myself.