github.com/tailscale/wireguard-go@v0.0.20201119-0.20210522003738-46b531feb08a/device/tun.go (about)

     1  /* SPDX-License-Identifier: MIT
     2   *
     3   * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
     4   */
     5  
     6  package device
     7  
     8  import (
     9  	"fmt"
    10  	"sync/atomic"
    11  
    12  	"github.com/tailscale/wireguard-go/tun"
    13  )
    14  
    15  const DefaultMTU = 1420
    16  
    17  func (device *Device) RoutineTUNEventReader() {
    18  	device.log.Verbosef("Routine: event worker - started")
    19  
    20  	for event := range device.tun.device.Events() {
    21  		if event&tun.EventMTUUpdate != 0 {
    22  			mtu, err := device.tun.device.MTU()
    23  			if err != nil {
    24  				device.log.Errorf("Failed to load updated MTU of device: %v", err)
    25  				continue
    26  			}
    27  			if mtu < 0 {
    28  				device.log.Errorf("MTU not updated to negative value: %v", mtu)
    29  				continue
    30  			}
    31  			var tooLarge string
    32  			if mtu > MaxContentSize {
    33  				tooLarge = fmt.Sprintf(" (too large, capped at %v)", MaxContentSize)
    34  				mtu = MaxContentSize
    35  			}
    36  			old := atomic.SwapInt32(&device.tun.mtu, int32(mtu))
    37  			if int(old) != mtu {
    38  				device.log.Verbosef("MTU updated: %v%s", mtu, tooLarge)
    39  			}
    40  		}
    41  
    42  		if event&tun.EventUp != 0 {
    43  			device.log.Verbosef("Interface up requested")
    44  			device.Up()
    45  		}
    46  
    47  		if event&tun.EventDown != 0 {
    48  			device.log.Verbosef("Interface down requested")
    49  			device.Down()
    50  		}
    51  	}
    52  
    53  	device.log.Verbosef("Routine: event worker - stopped")
    54  }