diff options
-rw-r--r-- | conf/dnsresolver_windows.go | 22 | ||||
-rw-r--r-- | tunnel/winipcfg/types.go | 16 |
2 files changed, 23 insertions, 15 deletions
diff --git a/conf/dnsresolver_windows.go b/conf/dnsresolver_windows.go index 3f7f7df8..b09f4603 100644 --- a/conf/dnsresolver_windows.go +++ b/conf/dnsresolver_windows.go @@ -7,11 +7,11 @@ package conf import ( "log" - "strconv" "time" "unsafe" "golang.zx2c4.com/go118/netip" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" "golang.org/x/sys/windows" "golang.zx2c4.com/wireguard/windows/services" @@ -68,18 +68,14 @@ func resolveHostnameOnce(name string) (resolvedIPString string, err error) { defer windows.FreeAddrInfoW(result) var v6 netip.Addr for ; result != nil; result = result.Next { - switch result.Family { - case windows.AF_INET: - return netip.AddrFrom4((*windows.RawSockaddrInet4)(unsafe.Pointer(result.Addr)).Addr).String(), nil - case windows.AF_INET6: - if v6.IsValid() { - continue - } - a := (*windows.RawSockaddrInet6)(unsafe.Pointer(result.Addr)) - v6 = netip.AddrFrom16(a.Addr) - if a.Scope_id != 0 { - v6 = v6.WithZone(strconv.FormatUint(uint64(a.Scope_id), 10)) - } + 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 v6.IsValid() { diff --git a/tunnel/winipcfg/types.go b/tunnel/winipcfg/types.go index 599bf789..04510bea 100644 --- a/tunnel/winipcfg/types.go +++ b/tunnel/winipcfg/types.go @@ -8,6 +8,7 @@ package winipcfg import ( "encoding/binary" "fmt" + "strconv" "unsafe" "golang.zx2c4.com/go118/netip" @@ -767,7 +768,13 @@ func (addr *RawSockaddrInet) SetAddrPort(addrPort netip.AddrPort) error { addr6.Addr = addrPort.Addr().As16() addr6.Port = htons(addrPort.Port()) addr6.Flowinfo = 0 - addr6.Scope_id = 0 + scopeId := uint32(0) + if z := addrPort.Addr().Zone(); z != "" { + if s, err := strconv.ParseUint(z, 10, 32); err == nil { + scopeId = uint32(s) + } + } + addr6.Scope_id = scopeId return nil } return windows.ERROR_INVALID_PARAMETER @@ -790,7 +797,12 @@ func (addr *RawSockaddrInet) Addr() netip.Addr { case windows.AF_INET: return netip.AddrFrom4((*windows.RawSockaddrInet4)(unsafe.Pointer(addr)).Addr) case windows.AF_INET6: - return netip.AddrFrom16((*windows.RawSockaddrInet6)(unsafe.Pointer(addr)).Addr) + raw := (*windows.RawSockaddrInet6)(unsafe.Pointer(addr)) + a := netip.AddrFrom16(raw.Addr) + if raw.Scope_id != 0 { + a = a.WithZone(strconv.FormatUint(uint64(raw.Scope_id), 10)) + } + return a } return netip.Addr{} } |