wireguard-go/device/tun.go
Josh Bleecher Snyder 3516ccc1e2 device: remove device.state.stopping from RoutineTUNEventReader
The TUN event reader does three things: Change MTU, device up, and device down.
Changing the MTU after the device is closed does no harm.
Device up and device down don't make sense after the device is closed,
but we can check that condition before proceeding with changeState.
There's thus no reason to block device.Close on RoutineTUNEventReader exiting.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
2021-02-08 10:32:07 -08:00

51 lines
1.1 KiB
Go

/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
*/
package device
import (
"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()
old := atomic.LoadInt32(&device.tun.mtu)
if err != nil {
device.log.Errorf("Failed to load updated MTU of device: %v", err)
} else if int(old) != mtu {
if mtu+MessageTransportSize > MaxMessageSize {
device.log.Verbosef("MTU updated: %v (too large)", mtu)
} else {
device.log.Verbosef("MTU updated: %v", mtu)
}
atomic.StoreInt32(&device.tun.mtu, int32(mtu))
}
}
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")
}