Skip to content

Commit 3135854

Browse files
committed
winipcfg: handle zones and make things use it
Signed-off-by: Jason A. Donenfeld <[email protected]>
1 parent 25d879e commit 3135854

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

conf/dnsresolver_windows.go

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ package conf
77

88
import (
99
"log"
10-
"strconv"
1110
"time"
1211
"unsafe"
1312

1413
"golang.zx2c4.com/go118/netip"
14+
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
1515

1616
"golang.org/x/sys/windows"
1717
"golang.zx2c4.com/wireguard/windows/services"
@@ -68,18 +68,14 @@ func resolveHostnameOnce(name string) (resolvedIPString string, err error) {
6868
defer windows.FreeAddrInfoW(result)
6969
var v6 netip.Addr
7070
for ; result != nil; result = result.Next {
71-
switch result.Family {
72-
case windows.AF_INET:
73-
return netip.AddrFrom4((*windows.RawSockaddrInet4)(unsafe.Pointer(result.Addr)).Addr).String(), nil
74-
case windows.AF_INET6:
75-
if v6.IsValid() {
76-
continue
77-
}
78-
a := (*windows.RawSockaddrInet6)(unsafe.Pointer(result.Addr))
79-
v6 = netip.AddrFrom16(a.Addr)
80-
if a.Scope_id != 0 {
81-
v6 = v6.WithZone(strconv.FormatUint(uint64(a.Scope_id), 10))
82-
}
71+
if result.Family != windows.AF_INET && result.Family != windows.AF_INET6 {
72+
continue
73+
}
74+
addr := (*winipcfg.RawSockaddrInet)(unsafe.Pointer(result.Addr)).Addr()
75+
if addr.Is4() {
76+
return addr.String(), nil
77+
} else if !v6.IsValid() && addr.Is6() {
78+
v6 = addr
8379
}
8480
}
8581
if v6.IsValid() {

tunnel/winipcfg/types.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package winipcfg
88
import (
99
"encoding/binary"
1010
"fmt"
11+
"strconv"
1112
"unsafe"
1213

1314
"golang.zx2c4.com/go118/netip"
@@ -767,7 +768,13 @@ func (addr *RawSockaddrInet) SetAddrPort(addrPort netip.AddrPort) error {
767768
addr6.Addr = addrPort.Addr().As16()
768769
addr6.Port = htons(addrPort.Port())
769770
addr6.Flowinfo = 0
770-
addr6.Scope_id = 0
771+
scopeId := uint32(0)
772+
if z := addrPort.Addr().Zone(); z != "" {
773+
if s, err := strconv.ParseUint(z, 10, 32); err == nil {
774+
scopeId = uint32(s)
775+
}
776+
}
777+
addr6.Scope_id = scopeId
771778
return nil
772779
}
773780
return windows.ERROR_INVALID_PARAMETER
@@ -790,7 +797,12 @@ func (addr *RawSockaddrInet) Addr() netip.Addr {
790797
case windows.AF_INET:
791798
return netip.AddrFrom4((*windows.RawSockaddrInet4)(unsafe.Pointer(addr)).Addr)
792799
case windows.AF_INET6:
793-
return netip.AddrFrom16((*windows.RawSockaddrInet6)(unsafe.Pointer(addr)).Addr)
800+
raw := (*windows.RawSockaddrInet6)(unsafe.Pointer(addr))
801+
a := netip.AddrFrom16(raw.Addr)
802+
if raw.Scope_id != 0 {
803+
a = a.WithZone(strconv.FormatUint(uint64(raw.Scope_id), 10))
804+
}
805+
return a
794806
}
795807
return netip.Addr{}
796808
}

0 commit comments

Comments
 (0)