aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tunnel
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-10-25 11:21:09 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-10-26 10:53:05 +0200
commit5dd537e989bbeede0eb7f258b72c75fbb04eefa1 (patch)
tree698b0e0676eec1d5f25c0248504ba93282fa7247 /tunnel
parenttunnel: defer startup until tcp configuration is set (diff)
downloadwireguard-windows-5dd537e989bbeede0eb7f258b72c75fbb04eefa1.tar.xz
wireguard-windows-5dd537e989bbeede0eb7f258b72c75fbb04eefa1.zip
tunnel: convert ips to string for hash table
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'tunnel')
-rw-r--r--tunnel/addressconfig.go26
1 files changed, 12 insertions, 14 deletions
diff --git a/tunnel/addressconfig.go b/tunnel/addressconfig.go
index 7e59c9d1..575185e0 100644
--- a/tunnel/addressconfig.go
+++ b/tunnel/addressconfig.go
@@ -23,20 +23,18 @@ func cleanupAddressesOnDisconnectedInterfaces(family winipcfg.AddressFamily, add
if len(addresses) == 0 {
return
}
- includedInAddresses := func(a net.IPNet) bool {
- // TODO: this makes the whole algorithm O(n^2). But we can't stick net.IPNet in a Go hashmap. Bummer!
- for _, addr := range addresses {
- ip := addr.IP
- if ip4 := ip.To4(); ip4 != nil {
- ip = ip4
- }
- mA, _ := addr.Mask.Size()
- mB, _ := a.Mask.Size()
- if bytes.Equal(ip, a.IP) && mA == mB {
- return true
- }
+ addrToStr := func(addr *net.IPNet) string {
+ ip := addr.IP
+ if ip4 := ip.To4(); ip4 != nil {
+ ip = ip4
}
- return false
+ ones, _ := addr.Mask.Size()
+ ip = append(ip, byte(ones))
+ return string(ip)
+ }
+ addrHash := make(map[string]bool, len(addresses))
+ for i := range addresses {
+ addrHash[addrToStr(&addresses[i])] = true
}
interfaces, err := winipcfg.GetAdaptersAddresses(family, winipcfg.GAAFlagDefault)
if err != nil {
@@ -49,7 +47,7 @@ func cleanupAddressesOnDisconnectedInterfaces(family winipcfg.AddressFamily, add
for address := iface.FirstUnicastAddress; address != nil; address = address.Next {
ip := address.Address.IP()
ipnet := net.IPNet{IP: ip, Mask: net.CIDRMask(int(address.OnLinkPrefixLength), 8*len(ip))}
- if includedInAddresses(ipnet) {
+ if addrHash[addrToStr(&ipnet)] {
log.Printf("Cleaning up stale address %s from interface ā€˜%sā€™", ipnet.String(), iface.FriendlyName())
iface.LUID.DeleteIPAddress(ipnet)
}