summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMathias Hall-Andersen <mathias@hall-andersen.dk>2017-08-22 14:57:32 +0200
committerMathias Hall-Andersen <mathias@hall-andersen.dk>2017-08-22 14:57:32 +0200
commitc6d03ef17f34f7380d95e91a6091a06bce332979 (patch)
tree475cf096e8fd45b8787c1e7b9ecff90880edb043
parent04640eb629f9c6a7bd4561f2a2f5b07195aa6009 (diff)
Update MTU based on netlink messages (linux)
-rw-r--r--src/device.go37
-rw-r--r--src/tun.go44
-rw-r--r--src/tun_linux.go3
3 files changed, 43 insertions, 41 deletions
diff --git a/src/device.go b/src/device.go
index 9bcd2f5..2a0d0ca 100644
--- a/src/device.go
+++ b/src/device.go
@@ -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()
diff --git a/src/tun.go b/src/tun.go
index 1c4c281..b4fbc62 100644
--- a/src/tun.go
+++ b/src/tun.go
@@ -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")
+ }
+ }
+ }
+}
diff --git a/src/tun_linux.go b/src/tun_linux.go
index e752733..b9541c9 100644
--- a/src/tun_linux.go
+++ b/src/tun_linux.go
@@ -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:]