aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/conf/dnsresolver_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'conf/dnsresolver_windows.go')
-rw-r--r--conf/dnsresolver_windows.go63
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
+}