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>main
parent
4c793014af
commit
a5ae21a832
@ -0,0 +1,46 @@ |
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build (darwin && !ios) || (linux && !android)
|
||||
|
||||
package magicsock |
||||
|
||||
import ( |
||||
"syscall" |
||||
) |
||||
|
||||
// getIPProto returns the value of the get/setsockopt proto argument necessary
|
||||
// to set an IP sockopt that corresponds with the string network, which must be
|
||||
// "udp4" or "udp6".
|
||||
func getIPProto(network string) int { |
||||
if network == "udp4" { |
||||
return syscall.IPPROTO_IP |
||||
} |
||||
return syscall.IPPROTO_IPV6 |
||||
} |
||||
|
||||
// connControl allows the caller to run a system call on the socket underlying
|
||||
// Conn specified by the string network, which must be "udp4" or "udp6". If the
|
||||
// pconn type implements the syscall method, this function returns the value of
|
||||
// of the system call fn called with the fd of the socket as its arg (or the
|
||||
// error from rc.Control() if that fails). Otherwise it returns the error
|
||||
// errUnsupportedConnType.
|
||||
func (c *Conn) connControl(network string, fn func(fd uintptr)) error { |
||||
pconn := c.pconn4.pconn |
||||
if network == "udp6" { |
||||
pconn = c.pconn6.pconn |
||||
} |
||||
sc, ok := pconn.(syscall.Conn) |
||||
if !ok { |
||||
return errUnsupportedConnType |
||||
} |
||||
rc, err := sc.SyscallConn() |
||||
if err != nil { |
||||
return err |
||||
} |
||||
return rc.Control(fn) |
||||
} |
||||
|
||||
func CanPMTUD() bool { |
||||
return debugEnablePMTUD() |
||||
} |
||||
Loading…
Reference in new issue