net/tstun: return the real interface name at device creation.

This is usually the same as the requested interface, but on some
unixes can vary based on device number allocation, and on Windows
it's the GUID instead of the pretty name, since everything relating
to configuration wants the GUID.

Signed-off-by: David Anderson <danderson@tailscale.com>
This commit is contained in:
David Anderson 2021-04-05 21:45:56 -07:00 committed by Dave Anderson
parent d2f838c058
commit bc4381447f
5 changed files with 39 additions and 14 deletions

View File

@ -338,7 +338,7 @@ func tryEngine(logf logger.Logf, linkMon *monitor.Mon, name string) (e wgengine.
}
useNetstack = name == "userspace-networking"
if !useNetstack {
dev, err := tstun.New(logf, name)
dev, devName, err := tstun.New(logf, name)
if err != nil {
tstun.Diagnose(logf, name)
return nil, false, err
@ -350,13 +350,7 @@ func tryEngine(logf logger.Logf, linkMon *monitor.Mon, name string) (e wgengine.
return nil, false, err
}
conf.Router = r
tunname, err := dev.Name()
if err != nil {
r.Close()
dev.Close()
return nil, false, err
}
conf.DNS = dns.NewOSConfigurator(logf, tunname)
conf.DNS = dns.NewOSConfigurator(logf, devName)
}
e, err = wgengine.NewUserspaceEngine(logf, conf)
if err != nil {

View File

@ -30,6 +30,7 @@
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
"tailscale.com/ipn/ipnserver"
"tailscale.com/logpolicy"
"tailscale.com/net/dns"
"tailscale.com/net/tstun"
"tailscale.com/tempfork/wireguard-windows/firewall"
"tailscale.com/types/logger"
@ -161,7 +162,7 @@ func startIPNServer(ctx context.Context, logid string) error {
var err error
getEngine := func() (wgengine.Engine, error) {
dev, err := tstun.New(logf, "Tailscale")
dev, devName, err := tstun.New(logf, "Tailscale")
if err != nil {
return nil, err
}
@ -173,6 +174,7 @@ func startIPNServer(ctx context.Context, logid string) error {
eng, err := wgengine.NewUserspaceEngine(logf, wgengine.Config{
Tun: dev,
Router: r,
DNS: dns.NewOSConfigurator(logf, devName),
ListenPort: 41641,
})
if err != nil {

View File

@ -28,16 +28,23 @@
// discovery.
const minimalMTU = 1280
// New returns a tun.Device for the requested device name.
func New(logf logger.Logf, tunName string) (tun.Device, error) {
// New returns a tun.Device for the requested device name, along with
// the OS-dependent name that was allocated to the device.
func New(logf logger.Logf, tunName string) (tun.Device, string, error) {
dev, err := tun.CreateTUN(tunName, minimalMTU)
if err != nil {
return nil, err
return nil, "", err
}
if err := waitInterfaceUp(dev, 90*time.Second, logf); err != nil {
return nil, err
dev.Close()
return nil, "", err
}
return dev, nil
name, err := interfaceName(dev)
if err != nil {
dev.Close()
return nil, "", err
}
return dev, name, nil
}
// Diagnose tries to explain a tuntap device creation failure.

View File

@ -0,0 +1,13 @@
// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build !windows
package tstun
import "github.com/tailscale/wireguard-go/tun"
func interfaceName(dev tun.Device) (string, error) {
return dev.Name()
}

View File

@ -8,6 +8,7 @@
"github.com/tailscale/wireguard-go/tun"
"github.com/tailscale/wireguard-go/tun/wintun"
"golang.org/x/sys/windows"
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
)
func init() {
@ -22,3 +23,11 @@ func init() {
}
tun.WintunStaticRequestedGUID = &guid
}
func interfaceName(dev tun.Device) (string, error) {
guid, err := winipcfg.LUID(dev.(*tun.NativeTun).LUID()).GUID()
if err != nil {
return "", err
}
return guid.String(), nil
}