aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--conf/dnsresolver_windows.go22
-rw-r--r--tunnel/winipcfg/types.go16
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{}
}