mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-11-04 00:55:11 +00:00 
			
		
		
		
	Add an enable/disable argument to setDontFragment() in preparation for dynamic enable/disable of peer path MTU discovery. Add getDontFragment() to get the status of the don't fragment bit from a socket. Updates #311 Co-authored-by: James Tucker <james@tailscale.com> Signed-off-by: Val <valerie@tailscale.com>
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright (c) Tailscale Inc & AUTHORS
 | 
						|
// SPDX-License-Identifier: BSD-3-Clause
 | 
						|
 | 
						|
//go:build linux && !android
 | 
						|
 | 
						|
package magicsock
 | 
						|
 | 
						|
import (
 | 
						|
	"syscall"
 | 
						|
)
 | 
						|
 | 
						|
func getDontFragOpt(network string) int {
 | 
						|
	if network == "udp4" {
 | 
						|
		return syscall.IP_MTU_DISCOVER
 | 
						|
	}
 | 
						|
	return syscall.IPV6_MTU_DISCOVER
 | 
						|
}
 | 
						|
 | 
						|
func (c *Conn) setDontFragment(network string, enable bool) error {
 | 
						|
	optArg := syscall.IP_PMTUDISC_DO
 | 
						|
	if enable == false {
 | 
						|
		optArg = syscall.IP_PMTUDISC_DONT
 | 
						|
	}
 | 
						|
	var err error
 | 
						|
	rcErr := c.connControl(network, func(fd uintptr) {
 | 
						|
		err = syscall.SetsockoptInt(int(fd), getIPProto(network), getDontFragOpt(network), optArg)
 | 
						|
	})
 | 
						|
 | 
						|
	if rcErr != nil {
 | 
						|
		return rcErr
 | 
						|
	}
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (c *Conn) getDontFragment(network string) (bool, error) {
 | 
						|
	var v int
 | 
						|
	var err error
 | 
						|
	rcErr := c.connControl(network, func(fd uintptr) {
 | 
						|
		v, err = syscall.GetsockoptInt(int(fd), getIPProto(network), getDontFragOpt(network))
 | 
						|
	})
 | 
						|
 | 
						|
	if rcErr != nil {
 | 
						|
		return false, rcErr
 | 
						|
	}
 | 
						|
	if v == syscall.IP_PMTUDISC_DO {
 | 
						|
		return true, err
 | 
						|
	}
 | 
						|
	return false, err
 | 
						|
}
 |