Update MTU based on netlink messages (linux)
This commit is contained in:
		
							parent
							
								
									04640eb629
								
							
						
					
					
						commit
						c6d03ef17f
					
				
					 3 changed files with 43 additions and 41 deletions
				
			
		|  | @ -176,43 +176,6 @@ func NewDevice(tun TUNDevice, logLevel int) *Device { | ||||||
| 	return 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 { | func (device *Device) LookupPeer(pk NoisePublicKey) *Peer { | ||||||
| 	device.mutex.RLock() | 	device.mutex.RLock() | ||||||
| 	defer device.mutex.RUnlock() | 	defer device.mutex.RUnlock() | ||||||
|  |  | ||||||
							
								
								
									
										44
									
								
								src/tun.go
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								src/tun.go
									
									
									
									
									
								
							|  | @ -1,8 +1,8 @@ | ||||||
| package main | package main | ||||||
| 
 | 
 | ||||||
| /* | import ( | ||||||
|  * The default MTU of the new device must be 1420 | 	"sync/atomic" | ||||||
|  */ | ) | ||||||
| 
 | 
 | ||||||
| const DefaultMTU = 1420 | const DefaultMTU = 1420 | ||||||
| 
 | 
 | ||||||
|  | @ -22,3 +22,41 @@ type TUNDevice interface { | ||||||
| 	Events() chan TUNEvent     // returns a constant channel of events related to the device
 | 	Events() chan TUNEvent     // returns a constant channel of events related to the device
 | ||||||
| 	Close() error              // stops the device and closes the event channel
 | 	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: | 			case unix.RTM_NEWLINK: | ||||||
| 				info := *(*unix.IfInfomsg)(unsafe.Pointer(&remain[unix.SizeofNlMsghdr])) | 				info := *(*unix.IfInfomsg)(unsafe.Pointer(&remain[unix.SizeofNlMsghdr])) | ||||||
|  | 				remain = remain[hdr.Len:] | ||||||
| 
 | 
 | ||||||
| 				if info.Index != tun.index { | 				if info.Index != tun.index { | ||||||
| 					// not our interface
 | 					// not our interface
 | ||||||
|  | @ -99,7 +100,7 @@ func (tun *NativeTun) RoutineNetlinkListener() { | ||||||
| 					tun.events <- TUNEventDown | 					tun.events <- TUNEventDown | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				remain = remain[hdr.Len:] | 				tun.events <- TUNEventMTUUpdate | ||||||
| 
 | 
 | ||||||
| 			default: | 			default: | ||||||
| 				remain = remain[hdr.Len:] | 				remain = remain[hdr.Len:] | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue