diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-10-25 11:21:09 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-10-26 10:53:05 +0200 |
commit | 5dd537e989bbeede0eb7f258b72c75fbb04eefa1 (patch) | |
tree | 698b0e0676eec1d5f25c0248504ba93282fa7247 | |
parent | tunnel: defer startup until tcp configuration is set (diff) | |
download | wireguard-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>
-rw-r--r-- | tunnel/addressconfig.go | 26 |
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) } |