diff options
Diffstat (limited to 'conf/dnsresolver_windows.go')
-rw-r--r-- | conf/dnsresolver_windows.go | 63 |
1 files changed, 35 insertions, 28 deletions
diff --git a/conf/dnsresolver_windows.go b/conf/dnsresolver_windows.go index b17be849..a299c475 100644 --- a/conf/dnsresolver_windows.go +++ b/conf/dnsresolver_windows.go @@ -1,28 +1,26 @@ /* SPDX-License-Identifier: MIT * - * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved. + * Copyright (C) 2019-2022 WireGuard LLC. All Rights Reserved. */ package conf import ( - "fmt" "log" - "net" - "syscall" + "net/netip" "time" "unsafe" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" + "golang.org/x/sys/windows" + "golang.zx2c4.com/wireguard/windows/services" ) -//sys internetGetConnectedState(flags *uint32, reserved uint32) (connected bool) = wininet.InternetGetConnectedState - func resolveHostname(name string) (resolvedIPString string, err error) { maxTries := 10 - systemJustBooted := windows.DurationSinceBoot() <= time.Minute*4 - if systemJustBooted { - maxTries *= 4 + if services.StartedAtBoot() { + maxTries *= 3 } for i := 0; i < maxTries; i++ { if i > 0 { @@ -33,12 +31,11 @@ func resolveHostname(name string) (resolvedIPString string, err error) { return } if err == windows.WSATRY_AGAIN { - log.Printf("Temporary DNS error when resolving %s, sleeping for 4 seconds", name) + log.Printf("Temporary DNS error when resolving %s, so sleeping for 4 seconds", name) continue } - var state uint32 - if err == windows.WSAHOST_NOT_FOUND && systemJustBooted && !internetGetConnectedState(&state, 0) { - log.Printf("Host not found when resolving %s, but no Internet connection available, sleeping for 4 seconds", name) + if err == windows.WSAHOST_NOT_FOUND && services.StartedAtBoot() { + log.Printf("Host not found when resolving %s at boot time, so sleeping for 4 seconds", name) continue } return @@ -66,25 +63,35 @@ func resolveHostnameOnce(name string) (resolvedIPString string, err error) { return } defer windows.FreeAddrInfoW(result) - ipv6 := "" + var v6 netip.Addr for ; result != nil; result = result.Next { - switch result.Family { - case windows.AF_INET: - return (net.IP)((*syscall.RawSockaddrInet4)(unsafe.Pointer(result.Addr)).Addr[:]).String(), nil - case windows.AF_INET6: - if len(ipv6) != 0 { - continue - } - a := (*syscall.RawSockaddrInet6)(unsafe.Pointer(result.Addr)) - ipv6 = (net.IP)(a.Addr[:]).String() - if a.Scope_id != 0 { - ipv6 += fmt.Sprintf("%%%d", a.Scope_id) - } + if result.Family != windows.AF_INET && result.Family != windows.AF_INET6 { + continue + } + addr := (*winipcfg.RawSockaddrInet)(unsafe.Pointer(result.Addr)).Addr() + if addr.Is4() { + return addr.String(), nil + } else if !v6.IsValid() && addr.Is6() { + v6 = addr } } - if len(ipv6) != 0 { - return ipv6, nil + if v6.IsValid() { + return v6.String(), nil } err = windows.WSAHOST_NOT_FOUND return } + +func (config *Config) ResolveEndpoints() error { + for i := range config.Peers { + if config.Peers[i].Endpoint.IsEmpty() { + continue + } + var err error + config.Peers[i].Endpoint.Host, err = resolveHostname(config.Peers[i].Endpoint.Host) + if err != nil { + return err + } + } + return nil +} |