|
|
|
@ -39,12 +39,8 @@ import (
|
|
|
|
|
// address a few rare corner cases, but is unlikely to significantly
|
|
|
|
|
// help with MTU issues compared to a static 1280B implementation.
|
|
|
|
|
func monitorDefaultRoutes(tun *tun.NativeTun) (*winipcfg.RouteChangeCallback, error) {
|
|
|
|
|
guid := tun.GUID()
|
|
|
|
|
ourLuid, err := winipcfg.LUIDFromGUID(&guid)
|
|
|
|
|
ourLuid := winipcfg.LUID(tun.LUID())
|
|
|
|
|
lastMtu := uint32(0)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error mapping GUID %v to LUID: %w", guid, err)
|
|
|
|
|
}
|
|
|
|
|
doIt := func() error {
|
|
|
|
|
mtu, err := getDefaultRouteMTU()
|
|
|
|
|
if err != nil {
|
|
|
|
@ -91,7 +87,7 @@ func monitorDefaultRoutes(tun *tun.NativeTun) (*winipcfg.RouteChangeCallback, er
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
err = doIt()
|
|
|
|
|
err := doIt()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
@ -159,7 +155,7 @@ func getDefaultRouteMTU() (uint32, error) {
|
|
|
|
|
|
|
|
|
|
// setPrivateNetwork marks the provided network adapter's category to private.
|
|
|
|
|
// It returns (false, nil) if the adapter was not found.
|
|
|
|
|
func setPrivateNetwork(ifcGUID *windows.GUID) (bool, error) {
|
|
|
|
|
func setPrivateNetwork(ifcLUID winipcfg.LUID) (bool, error) {
|
|
|
|
|
// NLM_NETWORK_CATEGORY values.
|
|
|
|
|
const (
|
|
|
|
|
categoryPublic = 0
|
|
|
|
@ -167,6 +163,11 @@ func setPrivateNetwork(ifcGUID *windows.GUID) (bool, error) {
|
|
|
|
|
categoryDomain = 2
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
ifcGUID, err := ifcLUID.GUID()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, fmt.Errorf("ifcLUID.GUID: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Lock OS thread when using OLE, which seems to be a requirement
|
|
|
|
|
// from the Microsoft docs. go-ole doesn't seem to handle it automatically.
|
|
|
|
|
// https://github.com/tailscale/tailscale/issues/921#issuecomment-727526807
|
|
|
|
@ -222,12 +223,8 @@ func setPrivateNetwork(ifcGUID *windows.GUID) (bool, error) {
|
|
|
|
|
return false, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// interfaceFromGUID returns IPAdapterAddresses with specified GUID.
|
|
|
|
|
func interfaceFromGUID(guid *windows.GUID, flags winipcfg.GAAFlags) (*winipcfg.IPAdapterAddresses, error) {
|
|
|
|
|
luid, err := winipcfg.LUIDFromGUID(guid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
// interfaceFromLUID returns IPAdapterAddresses with specified GUID.
|
|
|
|
|
func interfaceFromLUID(luid winipcfg.LUID, flags winipcfg.GAAFlags) (*winipcfg.IPAdapterAddresses, error) {
|
|
|
|
|
addresses, err := winipcfg.GetAdaptersAddresses(windows.AF_UNSPEC, flags)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
@ -237,13 +234,13 @@ func interfaceFromGUID(guid *windows.GUID, flags winipcfg.GAAFlags) (*winipcfg.I
|
|
|
|
|
return addr, nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil, fmt.Errorf("interfaceFromGUID: interface with LUID %v (from GUID %v) not found", luid, guid)
|
|
|
|
|
return nil, fmt.Errorf("interfaceFromLUID: interface with LUID %v not found", luid)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func configureInterface(cfg *Config, tun *tun.NativeTun) error {
|
|
|
|
|
const mtu = 0
|
|
|
|
|
guid := tun.GUID()
|
|
|
|
|
iface, err := interfaceFromGUID(&guid,
|
|
|
|
|
luid := winipcfg.LUID(tun.LUID())
|
|
|
|
|
iface, err := interfaceFromLUID(luid,
|
|
|
|
|
// Issue 474: on early boot, when the network is still
|
|
|
|
|
// coming up, if the Tailscale service comes up first,
|
|
|
|
|
// the Tailscale adapter it finds might not have the
|
|
|
|
@ -260,7 +257,7 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) error {
|
|
|
|
|
// does.
|
|
|
|
|
const tries = 20
|
|
|
|
|
for i := 0; i < tries; i++ {
|
|
|
|
|
found, err := setPrivateNetwork(&guid)
|
|
|
|
|
found, err := setPrivateNetwork(luid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Printf("setPrivateNetwork(try=%d): %v", i, err)
|
|
|
|
|
} else {
|
|
|
|
@ -271,7 +268,7 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) error {
|
|
|
|
|
}
|
|
|
|
|
time.Sleep(1 * time.Second)
|
|
|
|
|
}
|
|
|
|
|
log.Printf("setPrivateNetwork: adapter %v not found after %d tries, giving up", guid, tries)
|
|
|
|
|
log.Printf("setPrivateNetwork: adapter LUID %v not found after %d tries, giving up", luid, tries)
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
var firstGateway4 *net.IP
|
|
|
|
@ -353,7 +350,7 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) error {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Re-read interface after syncAddresses.
|
|
|
|
|
iface, err = interfaceFromGUID(&guid,
|
|
|
|
|
iface, err = interfaceFromLUID(luid,
|
|
|
|
|
// Issue 474: on early boot, when the network is still
|
|
|
|
|
// coming up, if the Tailscale service comes up first,
|
|
|
|
|
// the Tailscale adapter it finds might not have the
|
|
|
|
|