You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailscale/wgengine
David Anderson 05a52746a4 wgengine/magicsock: fix destination selection logic to work with DERP.
The effect is subtle: when we're not spraying packets, and have not yet
figured out a curAddr, and we're not spraying, we end up sending to
whatever the first IP is in the iteration order. In English, that
means "when we have no idea where to send packets, and we've given
up on sending to everyone, just send to the first addr we see in
the list."

This is, in general, what we want, because the addrs are in sorted
preference order, low to high, and DERP is the least preferred
destination. So, when we have no idea where to send, send to DERP,
right?

... Except for very historical reasons, appendDests iterated through
addresses in _reverse_ order, most preferred to least preferred.
crawshaw@ believes this was part of the earliest handshaking
algorithm magicsock had, where it slowly iterated through possible
destinations and poked handshakes to them one at a time.

Anyway, because of this historical reverse iteration, in the case
described above of "we have no idea where to send", the code would
end up sending to the _most_ preferred candidate address, rather
than the _least_ preferred. So when in doubt, we'd end up firing
packets into the blackhole of some LAN address that doesn't work,
and connectivity would not work.

This case only comes up if all your non-DERP connectivity options
have failed, so we more or less failed to detect it because we
didn't have a pathological test box deployed. Worse, codependent
bug 2839854994 made DERP accidentally
work sometimes anyway by incorrectly exploiting roamAddr behavior,
albeit at the cost of making DERP traffic symmetric. In fixing
DERP to once again be asymmetric, we effectively removed the
bandaid that was concealing this bug.

Signed-Off-By: David Anderson <danderson@tailscale.com>
5 years ago
..
filter
magicsock wgengine/magicsock: fix destination selection logic to work with DERP. 5 years ago
monitor
packet
winnet
faketun.go
ifconfig_windows.go
router_darwin.go
router_darwin_support.go
router_default.go
router_fake.go
router_freebsd.go
router_linux.go wgengine: don't create duplicate iptables rules on Linux, clean up 5 years ago
router_openbsd.go
router_windows.go
rusage.go
rusage_nowindows.go
rusage_windows.go
userspace.go ipn, wgengine/magicsock: add ipn.Prefs.DisableDERP bool 5 years ago
watchdog.go ipn, wgengine/magicsock: add ipn.Prefs.DisableDERP bool 5 years ago
watchdog_test.go
wgengine.go ipn, wgengine/magicsock: add ipn.Prefs.DisableDERP bool 5 years ago