From 8d1a5433b2f08885f848f5efea17df38dc6d9def Mon Sep 17 00:00:00 2001 From: rkonfj Date: Sun, 7 Jul 2024 15:34:14 +0800 Subject: [PATCH] vpn: implement link.RouteSubscribe for windows --- go.mod | 1 + go.sum | 2 ++ vpn/link/route_default.go | 2 +- vpn/link/route_windows.go | 28 ++++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 vpn/link/route_windows.go diff --git a/go.mod b/go.mod index 8b87121..1a0786f 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( golang.org/x/sys v0.19.0 golang.org/x/time v0.5.0 golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 + golang.zx2c4.com/wireguard/windows v0.5.3 gopkg.in/yaml.v2 v2.4.0 storj.io/common v0.0.0-20240425113201-9815a85cbc32 tailscale.com v1.56.1 diff --git a/go.sum b/go.sum index 90b35cd..7a67b59 100644 --- a/go.sum +++ b/go.sum @@ -72,6 +72,8 @@ golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeu golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 h1:/jFs0duh4rdb8uIfPMv78iAJGcPKDeqAFnaLBropIC4= golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173/go.mod h1:tkCQ4FQXmpAgYVh++1cq16/dH4QJtmvpRv19DWGAHSA= +golang.zx2c4.com/wireguard/windows v0.5.3 h1:On6j2Rpn3OEMXqBq00QEDC7bWSZrPIHKIus8eIuExIE= +golang.zx2c4.com/wireguard/windows v0.5.3/go.mod h1:9TEe8TJmtwyQebdFwAkEWOPr3prrtqm+REGFifP60hI= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/vpn/link/route_default.go b/vpn/link/route_default.go index d0c02ee..6efd958 100644 --- a/vpn/link/route_default.go +++ b/vpn/link/route_default.go @@ -1,4 +1,4 @@ -//go:build !linux +//go:build !linux && !windows package link diff --git a/vpn/link/route_windows.go b/vpn/link/route_windows.go new file mode 100644 index 0000000..f6c5378 --- /dev/null +++ b/vpn/link/route_windows.go @@ -0,0 +1,28 @@ +package link + +import ( + "context" + "net" + + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" +) + +func RouteSubscribe(ctx context.Context, ch chan<- RouteUpdate) error { + cb, err := winipcfg.RegisterRouteChangeCallback(func(notificationType winipcfg.MibNotificationType, route *winipcfg.MibIPforwardRow2) { + dst := route.DestinationPrefix.Prefix() + ch <- RouteUpdate{ + Type: uint16(notificationType), + Dst: &net.IPNet{IP: net.IP(dst.Addr().AsSlice()), Mask: net.CIDRMask(dst.Bits(), dst.Addr().BitLen())}, + Via: net.IP(route.NextHop.Addr().AsSlice()), + } + }) + if err != nil { + return err + } + go func() { + <-ctx.Done() + cb.Unregister() + close(ch) + }() + return nil +}