Update MTU based on netlink messages (linux)
This commit is contained in:
		
							parent
							
								
									04640eb629
								
							
						
					
					
						commit
						c6d03ef17f
					
				@ -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()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										44
									
								
								src/tun.go
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								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")
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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:]
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user