c9e4a859ae
In each case, the starting waitgroup did nothing but ensure that the goroutine has launched. Nothing downstream depends on the order in which goroutines launch, and if the Go runtime scheduler is so broken that goroutines don't get launched reasonably promptly, we have much deeper problems. Given all that, simplify the code. Passed a race-enabled stress test 25,000 times without failure. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
/* SPDX-License-Identifier: MIT
|
|
*
|
|
* Copyright (C) 2017-2020 WireGuard LLC. All Rights Reserved.
|
|
*/
|
|
|
|
package device
|
|
|
|
import (
|
|
"sync/atomic"
|
|
|
|
"golang.zx2c4.com/wireguard/tun"
|
|
)
|
|
|
|
const DefaultMTU = 1420
|
|
|
|
func (device *Device) RoutineTUNEventReader() {
|
|
setUp := false
|
|
logDebug := device.log.Debug
|
|
logInfo := device.log.Info
|
|
logError := device.log.Error
|
|
|
|
logDebug.Println("Routine: event worker - started")
|
|
|
|
for event := range device.tun.device.Events() {
|
|
if event&tun.EventMTUUpdate != 0 {
|
|
mtu, err := device.tun.device.MTU()
|
|
old := atomic.LoadInt32(&device.tun.mtu)
|
|
if err != nil {
|
|
logError.Println("Failed to load updated MTU of device:", err)
|
|
} else if int(old) != mtu {
|
|
if mtu+MessageTransportSize > MaxMessageSize {
|
|
logInfo.Println("MTU updated:", mtu, "(too large)")
|
|
} else {
|
|
logInfo.Println("MTU updated:", mtu)
|
|
}
|
|
atomic.StoreInt32(&device.tun.mtu, int32(mtu))
|
|
}
|
|
}
|
|
|
|
if event&tun.EventUp != 0 && !setUp {
|
|
logInfo.Println("Interface set up")
|
|
setUp = true
|
|
device.Up()
|
|
}
|
|
|
|
if event&tun.EventDown != 0 && setUp {
|
|
logInfo.Println("Interface set down")
|
|
setUp = false
|
|
device.Down()
|
|
}
|
|
}
|
|
|
|
logDebug.Println("Routine: event worker - stopped")
|
|
device.state.stopping.Done()
|
|
}
|