]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
Update MTU based on netlink messages (linux)
authorMathias Hall-Andersen <mathias@hall-andersen.dk>
Tue, 22 Aug 2017 12:57:32 +0000 (14:57 +0200)
committerMathias Hall-Andersen <mathias@hall-andersen.dk>
Tue, 22 Aug 2017 12:57:32 +0000 (14:57 +0200)
src/device.go
src/tun.go
src/tun_linux.go

index 9bcd2f58df8f64be17ddf9aeb5013a814d26dad3..2a0d0ca5881ab6170f90a50dae31ca80776010a3 100644 (file)
@@ -176,43 +176,6 @@ func NewDevice(tun TUNDevice, logLevel int) *Device {
        return device
 }
 
-func (device *Device) RoutineTUNEventReader() {
-       logInfo := device.log.Info
-       logError := device.log.Error
-
-       events := device.tun.device.Events()
-
-       for event := range events {
-               if event&TUNEventMTUUpdate != 0 {
-                       mtu, err := device.tun.device.MTU()
-                       if err != nil {
-                               logError.Println("Failed to load updated MTU of device:", err)
-                       } else {
-                               if mtu+MessageTransportSize > MaxMessageSize {
-                                       mtu = MaxMessageSize - MessageTransportSize
-                               }
-                               atomic.StoreInt32(&device.tun.mtu, int32(mtu))
-                       }
-               }
-
-               if event&TUNEventUp != 0 {
-                       if !device.tun.isUp.Get() {
-                               device.tun.isUp.Set(true)
-                               updateUDPConn(device)
-                               logInfo.Println("Interface set up")
-                       }
-               }
-
-               if event&TUNEventDown != 0 {
-                       if device.tun.isUp.Get() {
-                               device.tun.isUp.Set(false)
-                               closeUDPConn(device)
-                               logInfo.Println("Interface set down")
-                       }
-               }
-       }
-}
-
 func (device *Device) LookupPeer(pk NoisePublicKey) *Peer {
        device.mutex.RLock()
        defer device.mutex.RUnlock()
index 1c4c281059faf7344340569762e1a604eeb4f608..b4fbc62cba3a525167c586230e54b79da9d33bca 100644 (file)
@@ -1,8 +1,8 @@
 package main
 
-/*
- * The default MTU of the new device must be 1420
- */
+import (
+       "sync/atomic"
+)
 
 const DefaultMTU = 1420
 
@@ -22,3 +22,41 @@ type TUNDevice interface {
        Events() chan TUNEvent     // returns a constant channel of events related to the device
        Close() error              // stops the device and closes the event channel
 }
+
+func (device *Device) RoutineTUNEventReader() {
+       logInfo := device.log.Info
+       logError := device.log.Error
+
+       for event := range device.tun.device.Events() {
+               if event&TUNEventMTUUpdate != 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 {
+                               atomic.StoreInt32(&device.tun.mtu, int32(mtu))
+                               if mtu+MessageTransportSize > MaxMessageSize {
+                                       logInfo.Println("MTU updated:", mtu, "(too large)")
+                               } else {
+                                       logInfo.Println("MTU updated:", mtu)
+                               }
+                       }
+               }
+
+               if event&TUNEventUp != 0 {
+                       if !device.tun.isUp.Get() {
+                               device.tun.isUp.Set(true)
+                               updateUDPConn(device)
+                               logInfo.Println("Interface set up")
+                       }
+               }
+
+               if event&TUNEventDown != 0 {
+                       if device.tun.isUp.Get() {
+                               device.tun.isUp.Set(false)
+                               closeUDPConn(device)
+                               logInfo.Println("Interface set down")
+                       }
+               }
+       }
+}
index e75273325628aaf9462f81dbac11528fc8f5b134..b9541c9d02e849332fadb2c1f7e3eb0f773897cb 100644 (file)
@@ -85,6 +85,7 @@ func (tun *NativeTun) RoutineNetlinkListener() {
 
                        case unix.RTM_NEWLINK:
                                info := *(*unix.IfInfomsg)(unsafe.Pointer(&remain[unix.SizeofNlMsghdr]))
+                               remain = remain[hdr.Len:]
 
                                if info.Index != tun.index {
                                        // not our interface
@@ -99,7 +100,7 @@ func (tun *NativeTun) RoutineNetlinkListener() {
                                        tun.events <- TUNEventDown
                                }
 
-                               remain = remain[hdr.Len:]
+                               tun.events <- TUNEventMTUUpdate
 
                        default:
                                remain = remain[hdr.Len:]