aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tunnel/winipcfg/types.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-11-03 16:58:01 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2021-11-06 14:36:57 +0100
commit3135854b7cae9db3e96d1a7203224aacbd41aba7 (patch)
tree2561d7357770d53a3e58cfeb51600e719cc6c241 /tunnel/winipcfg/types.go
parentglobal: switch to netip (diff)
downloadwireguard-windows-3135854b7cae9db3e96d1a7203224aacbd41aba7.tar.xz
wireguard-windows-3135854b7cae9db3e96d1a7203224aacbd41aba7.zip
winipcfg: handle zones and make things use it
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r--tunnel/winipcfg/types.go16
1 files changed, 14 insertions, 2 deletions
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{}
}