diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-11-03 16:58:01 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-11-06 14:36:57 +0100 |
commit | 3135854b7cae9db3e96d1a7203224aacbd41aba7 (patch) | |
tree | 2561d7357770d53a3e58cfeb51600e719cc6c241 /tunnel/winipcfg/types.go | |
parent | global: switch to netip (diff) | |
download | wireguard-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.go | 16 |
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{} } |