675ff32e6c
The old code silently accepted negative MTUs. It also set MTUs above the maximum. It also had hard to follow deeply nested conditionals. Add more paranoid handling, and make the code more straight-line. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
/* SPDX-License-Identifier: MIT
|
|
*
|
|
* Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
|
|
*/
|
|
|
|
package device
|
|
|
|
import (
|
|
"fmt"
|
|
"sync/atomic"
|
|
|
|
"golang.zx2c4.com/wireguard/tun"
|
|
)
|
|
|
|
const DefaultMTU = 1420
|
|
|
|
func (device *Device) RoutineTUNEventReader() {
|
|
setUp := false
|
|
device.log.Verbosef("Routine: event worker - started")
|
|
|
|
for event := range device.tun.device.Events() {
|
|
if event&tun.EventMTUUpdate != 0 {
|
|
mtu, err := device.tun.device.MTU()
|
|
if err != nil {
|
|
device.log.Errorf("Failed to load updated MTU of device: %v", err)
|
|
continue
|
|
}
|
|
if mtu < 0 {
|
|
device.log.Errorf("MTU not updated to negative value: %v", mtu)
|
|
continue
|
|
}
|
|
var tooLarge string
|
|
if mtu > MaxContentSize {
|
|
tooLarge = fmt.Sprintf(" (too large, capped at %v)", MaxContentSize)
|
|
mtu = MaxContentSize
|
|
}
|
|
old := atomic.SwapInt32(&device.tun.mtu, int32(mtu))
|
|
if int(old) != mtu {
|
|
device.log.Verbosef("MTU updated: %v%s", mtu, tooLarge)
|
|
}
|
|
}
|
|
|
|
if event&tun.EventUp != 0 && !setUp {
|
|
device.log.Verbosef("Interface set up")
|
|
setUp = true
|
|
device.Up()
|
|
}
|
|
|
|
if event&tun.EventDown != 0 && setUp {
|
|
device.log.Verbosef("Interface set down")
|
|
setUp = false
|
|
device.Down()
|
|
}
|
|
}
|
|
|
|
device.log.Verbosef("Routine: event worker - stopped")
|
|
}
|