diff --git a/cmd/tailscaled/depaware.txt b/cmd/tailscaled/depaware.txt index 53f79387c..8b853cbd2 100644 --- a/cmd/tailscaled/depaware.txt +++ b/cmd/tailscaled/depaware.txt @@ -127,7 +127,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/net/tlsdial from tailscale.com/control/controlclient+ tailscale.com/net/tsaddr from tailscale.com/ipn/ipnlocal+ 💣 tailscale.com/net/tshttpproxy from tailscale.com/control/controlclient+ - 💣 tailscale.com/net/tstun from tailscale.com/cmd/tailscaled+ + tailscale.com/net/tstun from tailscale.com/cmd/tailscaled+ tailscale.com/paths from tailscale.com/cmd/tailscaled+ tailscale.com/portlist from tailscale.com/ipn/ipnlocal tailscale.com/safesocket from tailscale.com/ipn/ipnserver+ diff --git a/go.mod b/go.mod index b5fd115e8..7b85b21ad 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e golang.org/x/net v0.0.0-20210614182718-04defd469f4e golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 + golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 golang.org/x/term v0.0.0-20210503060354-a79de5458b56 golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 golang.org/x/tools v0.1.2 diff --git a/go.sum b/go.sum index add86197c..375a2dfc5 100644 --- a/go.sum +++ b/go.sum @@ -810,8 +810,9 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= @@ -987,5 +988,3 @@ mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jC mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7 h1:kAREL6MPwpsk1/PQPFD3Eg7WAQR5mPTWZJaBiG5LDbY= mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/goversion v1.2.0 h1:SPn+NLTiAG7w30IRK/DKp1BjvpWabYgxlLp/+kx5J8w= -rsc.io/goversion v1.2.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo= diff --git a/net/tstun/tap_linux.go b/net/tstun/tap_linux.go index 0e6ef7258..690981d09 100644 --- a/net/tstun/tap_linux.go +++ b/net/tstun/tap_linux.go @@ -9,10 +9,9 @@ "net" "os" "os/exec" - "syscall" - "unsafe" "github.com/insomniacslk/dhcp/dhcpv4" + "golang.org/x/sys/unix" "golang.zx2c4.com/wireguard/tun" "inet.af/netaddr" "inet.af/netstack/tcpip" @@ -32,25 +31,30 @@ func init() { createTAP = createTAPLinux } -func createTAPLinux(tapName, bridgeName string) (dev tun.Device, err error) { - fd, err := syscall.Open("/dev/net/tun", syscall.O_RDWR, 0) +func createTAPLinux(tapName, bridgeName string) (tun.Device, error) { + fd, err := unix.Open("/dev/net/tun", unix.O_RDWR, 0) if err != nil { return nil, err } - var ifr struct { - name [16]byte - flags uint16 - _ [22]byte + + dev, err := openDevice(fd, tapName, bridgeName) + if err != nil { + unix.Close(fd) + return nil, err } - copy(ifr.name[:], tapName) - ifr.flags = syscall.IFF_TAP | syscall.IFF_NO_PI - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), syscall.TUNSETIFF, uintptr(unsafe.Pointer(&ifr))) - if errno != 0 { - syscall.Close(fd) - return nil, errno + + return dev, nil +} + +func openDevice(fd int, tapName, bridgeName string) (tun.Device, error) { + ifr, err := unix.NewIfreq(tapName) + if err != nil { + return nil, err } - if err = syscall.SetNonblock(fd, true); err != nil { - syscall.Close(fd) + + // Flags are stored as a uint16 in the ifreq union. + ifr.SetUint16(unix.IFF_TAP | unix.IFF_NO_PI) + if err := unix.IoctlIfreq(fd, unix.TUNSETIFF, ifr); err != nil { return nil, err } @@ -62,11 +66,13 @@ func createTAPLinux(tapName, bridgeName string) (dev tun.Device, err error) { return nil, err } } - dev, _, err = tun.CreateUnmonitoredTUNFromFD(fd) // TODO: MTU + + // Also sets non-blocking I/O on fd when creating tun.Device. + dev, _, err := tun.CreateUnmonitoredTUNFromFD(fd) // TODO: MTU if err != nil { - syscall.Close(fd) return nil, err } + return dev, nil }