diff options
Diffstat (limited to 'conf/dnsresolver_windows.go')
-rw-r--r-- | conf/dnsresolver_windows.go | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/conf/dnsresolver_windows.go b/conf/dnsresolver_windows.go index d6c2f1c7..a299c475 100644 --- a/conf/dnsresolver_windows.go +++ b/conf/dnsresolver_windows.go @@ -1,43 +1,41 @@ /* SPDX-License-Identifier: MIT * - * Copyright (C) 2019 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 { + time.Sleep(time.Second * 4) + } resolvedIPString, err = resolveHostnameOnce(name) if err == nil { return } if err == windows.WSATRY_AGAIN { - log.Printf("Temporary DNS error when resolving %s, sleeping for 4 seconds", name) - time.Sleep(time.Second * 4) + 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) - time.Sleep(time.Second * 4) + 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 @@ -65,28 +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 { - addr := unsafe.Pointer(result.Addr) - switch result.Family { - case windows.AF_INET: - a := (*syscall.RawSockaddrInet4)(addr).Addr - return net.IP{a[0], a[1], a[2], a[3]}.String(), nil - case windows.AF_INET6: - if len(ipv6) != 0 { - continue - } - a := (*syscall.RawSockaddrInet6)(addr).Addr - ipv6 = net.IP{a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]}.String() - scope := uint32((*syscall.RawSockaddrInet6)(addr).Scope_id) - if scope != 0 { - ipv6 += fmt.Sprintf("%%%d", scope) - } + 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 +} |