44package tun
55
66import (
7- "bytes"
87 "errors"
98 "fmt"
109 "log"
11- "net"
10+ "net/netip "
1211
1312 "github.com/yggdrasil-network/yggdrasil-go/src/config"
1413 "golang.org/x/sys/windows"
@@ -89,13 +88,9 @@ func (tun *TunAdapter) setupAddress(addr string) error {
8988 return errors .New ("Can't configure IPv6 address as TUN adapter is not present" )
9089 }
9190 if intf , ok := tun .iface .(* wgtun.NativeTun ); ok {
92- if ipaddr , ipnet , err := net . ParseCIDR (addr ); err == nil {
91+ if ipnet , err := netip . ParsePrefix (addr ); err == nil {
9392 luid := winipcfg .LUID (intf .LUID ())
94- addresses := append ([]net.IPNet {}, net.IPNet {
95- IP : ipaddr ,
96- Mask : ipnet .Mask ,
97- })
98-
93+ addresses := []netip.Prefix {ipnet }
9994 err := luid .SetIPAddressesForFamily (windows .AF_INET6 , addresses )
10095 if err == windows .ERROR_OBJECT_ALREADY_EXISTS {
10196 cleanupAddressesOnDisconnectedInterfaces (windows .AF_INET6 , addresses )
@@ -118,24 +113,13 @@ func (tun *TunAdapter) setupAddress(addr string) error {
118113 * SPDX-License-Identifier: MIT
119114 * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
120115 */
121- func cleanupAddressesOnDisconnectedInterfaces (family winipcfg.AddressFamily , addresses []net. IPNet ) {
116+ func cleanupAddressesOnDisconnectedInterfaces (family winipcfg.AddressFamily , addresses []netip. Prefix ) {
122117 if len (addresses ) == 0 {
123118 return
124119 }
125- includedInAddresses := func (a net.IPNet ) bool {
126- // TODO: this makes the whole algorithm O(n^2). But we can't stick net.IPNet in a Go hashmap. Bummer!
127- for _ , addr := range addresses {
128- ip := addr .IP
129- if ip4 := ip .To4 (); ip4 != nil {
130- ip = ip4
131- }
132- mA , _ := addr .Mask .Size ()
133- mB , _ := a .Mask .Size ()
134- if bytes .Equal (ip , a .IP ) && mA == mB {
135- return true
136- }
137- }
138- return false
120+ addrHash := make (map [netip.Addr ]bool , len (addresses ))
121+ for i := range addresses {
122+ addrHash [addresses [i ].Addr ()] = true
139123 }
140124 interfaces , err := winipcfg .GetAdaptersAddresses (family , winipcfg .GAAFlagDefault )
141125 if err != nil {
@@ -146,11 +130,10 @@ func cleanupAddressesOnDisconnectedInterfaces(family winipcfg.AddressFamily, add
146130 continue
147131 }
148132 for address := iface .FirstUnicastAddress ; address != nil ; address = address .Next {
149- ip := address .Address .IP ()
150- ipnet := net.IPNet {IP : ip , Mask : net .CIDRMask (int (address .OnLinkPrefixLength ), 8 * len (ip ))}
151- if includedInAddresses (ipnet ) {
152- log .Printf ("Cleaning up stale address %s from interface ‘%s’" , ipnet .String (), iface .FriendlyName ())
153- iface .LUID .DeleteIPAddress (ipnet )
133+ if ip , _ := netip .AddrFromSlice (address .Address .IP ()); addrHash [ip ] {
134+ prefix := netip .PrefixFrom (ip , int (address .OnLinkPrefixLength ))
135+ log .Printf ("Cleaning up stale address %s from interface ‘%s’" , prefix .String (), iface .FriendlyName ())
136+ iface .LUID .DeleteIPAddress (prefix )
154137 }
155138 }
156139 }
0 commit comments