wireguard-go/device
Josh Bleecher Snyder 0bcb822e5b device: overhaul device state management
This commit simplifies device state management.
It creates a single unified state variable and documents its semantics.

It also makes state changes more atomic.
As an example of the sort of bug that occurred due to non-atomic state changes,
the following sequence of events used to occur approximately every 2.5 million test runs:

* RoutineTUNEventReader received an EventDown event.
* It called device.Down, which called device.setUpDown.
* That set device.state.changing, but did not yet attempt to lock device.state.Mutex.
* Test completion called device.Close.
* device.Close locked device.state.Mutex.
* device.Close blocked on a call to device.state.stopping.Wait.
* device.setUpDown then attempted to lock device.state.Mutex and blocked.

Deadlock results. setUpDown cannot progress because device.state.Mutex is locked.
Until setUpDown returns, RoutineTUNEventReader cannot call device.state.stopping.Done.
Until device.state.stopping.Done gets called, device.state.stopping.Wait is blocked.
As long as device.state.stopping.Wait is blocked, device.state.Mutex cannot be unlocked.
This commit fixes that deadlock by holding device.state.mu
when checking that the device is not closed.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
2021-02-08 10:32:07 -08:00
..
alignment_test.go device: use a waiting sync.Pool instead of a channel 2021-02-02 19:32:13 +01:00
allowedips.go global: bump copyright 2021-01-28 17:52:15 +01:00
allowedips_rand_test.go global: bump copyright 2021-01-28 17:52:15 +01:00
allowedips_test.go global: bump copyright 2021-01-28 17:52:15 +01:00
bind_test.go global: bump copyright 2021-01-28 17:52:15 +01:00
constants.go global: bump copyright 2021-01-28 17:52:15 +01:00
cookie.go global: bump copyright 2021-01-28 17:52:15 +01:00
cookie_test.go global: bump copyright 2021-01-28 17:52:15 +01:00
device.go device: overhaul device state management 2021-02-08 10:32:07 -08:00
device_test.go device: overhaul device state management 2021-02-08 10:32:07 -08:00
devicestate_string.go device: overhaul device state management 2021-02-08 10:32:07 -08:00
endpoint_test.go global: bump copyright 2021-01-28 17:52:15 +01:00
indextable.go global: bump copyright 2021-01-28 17:52:15 +01:00
ip.go global: bump copyright 2021-01-28 17:52:15 +01:00
kdf_test.go global: bump copyright 2021-01-28 17:52:15 +01:00
keypair.go global: bump copyright 2021-01-28 17:52:15 +01:00
logger.go global: bump copyright 2021-01-28 17:52:15 +01:00
misc.go global: bump copyright 2021-01-28 17:52:15 +01:00
mobilequirks.go global: bump copyright 2021-01-28 17:52:15 +01:00
noise-helpers.go global: bump copyright 2021-01-28 17:52:15 +01:00
noise-protocol.go global: bump copyright 2021-01-28 17:52:15 +01:00
noise-types.go global: bump copyright 2021-01-28 17:52:15 +01:00
noise_test.go global: bump copyright 2021-01-28 17:52:15 +01:00
peer.go device: overhaul device state management 2021-02-08 10:32:07 -08:00
pools.go device: use a waiting sync.Pool instead of a channel 2021-02-02 19:32:13 +01:00
pools_test.go device: benchmark the waitpool to compare it to the prior channels 2021-02-03 16:59:29 +01:00
queueconstants_android.go global: bump copyright 2021-01-28 17:52:15 +01:00
queueconstants_default.go global: bump copyright 2021-01-28 17:52:15 +01:00
queueconstants_ios.go global: bump copyright 2021-01-28 17:52:15 +01:00
receive.go device: overhaul device state management 2021-02-08 10:32:07 -08:00
send.go device: overhaul device state management 2021-02-08 10:32:07 -08:00
sticky_default.go device: do not include sticky sockets on android 2020-06-07 01:50:20 -06:00
sticky_linux.go global: bump copyright 2021-01-28 17:52:15 +01:00
timers.go device: overhaul device state management 2021-02-08 10:32:07 -08:00
tun.go global: bump copyright 2021-01-28 17:52:15 +01:00
tun_test.go global: bump copyright 2021-01-28 17:52:15 +01:00
uapi.go device: overhaul device state management 2021-02-08 10:32:07 -08:00
version.go version: bump snapshot 2020-11-18 14:24:17 +01:00