aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tunnel/winipcfg/utils.go
diff options
context:
space:
mode:
Diffstat (limited to 'tunnel/winipcfg/utils.go')
-rw-r--r--tunnel/winipcfg/utils.go26
1 files changed, 26 insertions, 0 deletions
diff --git a/tunnel/winipcfg/utils.go b/tunnel/winipcfg/utils.go
new file mode 100644
index 00000000..c841c40c
--- /dev/null
+++ b/tunnel/winipcfg/utils.go
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package winipcfg
+
+import (
+ "net"
+ "unsafe"
+
+ "golang.org/x/sys/windows"
+)
+
+// SocketAddressToIP function returns IPv4 or IPv6 address from windows.SocketAddress.
+// If the address is neither IPv4 not IPv6 nil is returned.
+//TODO: Remove once https://go-review.googlesource.com/c/sys/+/178577 is merged.
+func SocketAddressToIP(addr *windows.SocketAddress) net.IP {
+ if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(windows.RawSockaddrInet4{}) && addr.Sockaddr.Addr.Family == windows.AF_INET {
+ return (*windows.RawSockaddrInet4)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
+ } else if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(windows.RawSockaddrInet6{}) && addr.Sockaddr.Addr.Family == windows.AF_INET6 {
+ return (*windows.RawSockaddrInet6)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
+ } else {
+ return nil
+ }
+}