diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-03-04 03:04:22 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-03-04 03:09:54 +0100 |
commit | 242d06b0872686cd37e25d444586ef2c04c0d419 (patch) | |
tree | 7ded72077c85e0035bd40dbeab562b3bab318a53 | |
parent | ifaceconfig: call setsockopt less often (diff) | |
download | wireguard-windows-242d06b0872686cd37e25d444586ef2c04c0d419.tar.xz wireguard-windows-242d06b0872686cd37e25d444586ef2c04c0d419.zip |
ifaceconfig: deduplicate routes
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | service/ifaceconfig.go | 49 |
2 files changed, 33 insertions, 19 deletions
@@ -6,7 +6,8 @@ all: wireguard.exe resources.syso: ui/icon/icon.ico ui/manifest.xml go.mod go run github.com/akavel/rsrc -manifest ui/manifest.xml -ico ui/icon/icon.ico -arch amd64 -o resources.syso -wireguard.exe: resources.syso +rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) +wireguard.exe: resources.syso $(call rwildcard,,*.go *.c *.h) CC=x86_64-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -ldflags="-H windowsgui" -o $@ run: wireguard.exe diff --git a/service/ifaceconfig.go b/service/ifaceconfig.go index eda8fdb0..c6a8257d 100644 --- a/service/ifaceconfig.go +++ b/service/ifaceconfig.go @@ -6,6 +6,7 @@ package service import ( + "bytes" "encoding/binary" "errors" "golang.org/x/sys/windows" @@ -13,7 +14,7 @@ import ( "golang.zx2c4.com/wireguard/device" "golang.zx2c4.com/wireguard/windows/conf" "net" - "os" + "sort" "unsafe" ) @@ -157,25 +158,37 @@ func configureInterface(conf *conf.Config, guid *windows.GUID) error { return err } - err = iface.FlushRoutes() - if err != nil { - return nil - } - for _, route := range routes { - err = iface.AddRoute(&route, false) - - //TODO: Ignoring duplicate errors like this maybe isn't very reasonable. - // instead we should make sure we're not adding duplicates ourselves when - // inserting the gateway routes. - if syserr, ok := err.(*os.SyscallError); ok { - if syserr.Err == windows.Errno(ERROR_OBJECT_ALREADY_EXISTS) { - err = nil - } + deduplicatedRoutes := make([]*winipcfg.RouteData, routeCount) + routeCount = 0 + sort.Slice(routes, func(i, j int) bool { + if routes[i].Metric < routes[j].Metric { + return true } - - if err != nil { - return err + if bytes.Compare(routes[i].NextHop, routes[j].NextHop) == -1 { + return true + } + if bytes.Compare(routes[i].Destination.IP, routes[j].Destination.IP) == -1 { + return true } + if bytes.Compare(routes[i].Destination.Mask, routes[j].Destination.Mask) == -1 { + return true + } + return false + }) + for i := 0; i < len(routes); i++ { + if i > 0 && routes[i].Metric == routes[i - 1].Metric && + bytes.Equal(routes[i].NextHop, routes[i - 1].NextHop) && + bytes.Equal(routes[i].Destination.IP, routes[i - 1].Destination.IP) && + bytes.Equal(routes[i].Destination.Mask, routes[i - 1].Destination.Mask) { + continue + } + deduplicatedRoutes[routeCount] = &routes[i] + routeCount++ + } + + err = iface.SetRoutes(deduplicatedRoutes, false) + if err != nil { + return nil } err = iface.SetDNS(conf.Interface.Dns) |