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
Josh Bleecher Snyder 99705aa6b7 net/tstun: split TUN events channel into up/down and MTU
We had a long-standing bug in which our TUN events channel
was being received from simultaneously in two places.

The first is wireguard-go.

At wgengine/userspace.go:366, we pass e.tundev to wireguard-go,
which starts a goroutine (RoutineTUNEventReader)
that receives from that channel and uses events to adjust the MTU
and bring the device up/down.

At wgengine/userspace.go:374, we launch a goroutine that
receives from e.tundev, logs MTU changes, and triggers
state updates when up/down changes occur.

Events were getting delivered haphazardly between the two of them.

We don't really want wireguard-go to receive the up/down events;
we control the state of the device explicitly by calling device.Up.
And the userspace.go loop MTU logging duplicates logging that
wireguard-go does when it received MTU updates.

So this change splits the single TUN events channel into up/down
and other (aka MTU), and sends them to the parties that ought
to receive them.

I'm actually a bit surprised that this hasn't caused more visible trouble.
If a down event went to wireguard-go but the subsequent up event
went to userspace.go, we could end up with the wireguard-go device disappearing.

I believe that this may also (somewhat accidentally) be a fix for #1790.

Signed-off-by: Josh Bleecher Snyder <josharian@gmail.com>
5 years ago
..
bench wgengine/bench: improved rate selection. 5 years ago
filter net/packet, wgengine/{filter,tstun}: add TSMP ping 5 years ago
magicsock health, wgenegine: fix receive func health checks yet again 5 years ago
monitor wgengine/monitor: reduce Linux log spam on down 5 years ago
netstack wgengine/netstack: log error when acceptUDP fails 5 years ago
router wgengine/router{win}: ignore broadcast routes added by Windows when removing routes. 5 years ago
wgcfg wgengine/wgcfg/nmcfg: consolidate exit node log lines 5 years ago
wglog wgengine/wglog: allow wireguard-go receive routines to log 5 years ago
winnet wgengine/winnet: don't build on non-windows 5 years ago
pendopen.go wgengine: quiet connection failure diagnostics for exit nodes 5 years ago
userspace.go net/tstun: split TUN events channel into up/down and MTU 5 years ago
userspace_ext_test.go cmd/tailscaled, wgengine{,/netstack}: add netstack hybrid mode, add to Windows 5 years ago
userspace_test.go cmd/tailscaled, wgengine{,/netstack}: add netstack hybrid mode, add to Windows 5 years ago
watchdog.go wgengine: take in dns.Config, split out to resolver.Config and dns.OSConfig. 5 years ago
watchdog_test.go wgengine: extend TestWatchdog timeout on macOS 5 years ago
wgengine.go tailcfg: add Endpoint, EndpointType, MapRequest.EndpointType 5 years ago