diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-05-01 16:59:13 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-05-01 17:46:28 +0200 |
commit | 168ef61a638e4875b260edbc51551bae0dc34ac3 (patch) | |
tree | 579a18ee07b9cf5427c9bab187707917215b7e5f /device.go | |
parent | Clear src cache if route changes to new ifindex (diff) | |
download | wireguard-go-168ef61a638e4875b260edbc51551bae0dc34ac3.tar.xz wireguard-go-168ef61a638e4875b260edbc51551bae0dc34ac3.zip |
Add missing locks and fix debug output, and try to flush queues
Flushing queues on exit is sort of a partial solution, but this could be
better. Really what we want is for no more packets to be enqueued after
isUp is set to false.
Diffstat (limited to 'device.go')
-rw-r--r-- | device.go | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -339,6 +339,8 @@ func (device *Device) RemovePeer(key NoisePublicKey) { } func (device *Device) RemoveAllPeers() { + device.noise.mutex.Lock() + defer device.noise.mutex.Unlock() device.routing.mutex.Lock() defer device.routing.mutex.Unlock() @@ -354,16 +356,25 @@ func (device *Device) RemoveAllPeers() { } func (device *Device) Close() { - device.log.Info.Println("Device closing") if device.isClosed.Swap(true) { return } - device.signal.stop.Broadcast() + device.log.Info.Println("Device closing") + device.state.changing.Set(true) + device.state.mutex.Lock() + defer device.state.mutex.Unlock() + device.tun.device.Close() device.BindClose() + device.isUp.Set(false) + + device.signal.stop.Broadcast() + device.RemoveAllPeers() device.rate.limiter.Close() + + device.state.changing.Set(false) device.log.Info.Println("Interface closed") } |