summaryrefslogtreecommitdiffhomepage
path: root/src/tun.go
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 /src/tun.go
parent04640eb629f9c6a7bd4561f2a2f5b07195aa6009 (diff)
Update MTU based on netlink messages (linux)
Diffstat (limited to 'src/tun.go')
-rw-r--r--src/tun.go44
1 files changed, 41 insertions, 3 deletions
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")
+ }
+ }
+ }
+}