aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tunnel/defaultroutemonitor.go
diff options
context:
space:
mode:
Diffstat (limited to 'tunnel/defaultroutemonitor.go')
-rw-r--r--tunnel/defaultroutemonitor.go160
1 files changed, 0 insertions, 160 deletions
diff --git a/tunnel/defaultroutemonitor.go b/tunnel/defaultroutemonitor.go
deleted file mode 100644
index 3af9042c..00000000
--- a/tunnel/defaultroutemonitor.go
+++ /dev/null
@@ -1,160 +0,0 @@
-/* SPDX-License-Identifier: MIT
- *
- * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
- */
-
-package tunnel
-
-import (
- "log"
- "sync"
- "time"
-
- "golang.org/x/sys/windows"
- "golang.zx2c4.com/wireguard/conn"
- "golang.zx2c4.com/wireguard/device"
- "golang.zx2c4.com/wireguard/tun"
- "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
-)
-
-func bindSocketRoute(family winipcfg.AddressFamily, device *device.Device, ourLUID winipcfg.LUID, lastLUID *winipcfg.LUID, lastIndex *uint32, blackholeWhenLoop bool) error {
- r, err := winipcfg.GetIPForwardTable2(family)
- if err != nil {
- return err
- }
- lowestMetric := ^uint32(0)
- index := uint32(0) // Zero is "unspecified", which for IP_UNICAST_IF resets the value, which is what we want.
- luid := winipcfg.LUID(0) // Hopefully luid zero is unspecified, but hard to find docs saying so.
- for i := range r {
- if r[i].DestinationPrefix.PrefixLength != 0 || r[i].InterfaceLUID == ourLUID {
- continue
- }
- ifrow, err := r[i].InterfaceLUID.Interface()
- if err != nil || ifrow.OperStatus != winipcfg.IfOperStatusUp {
- continue
- }
-
- iface, err := r[i].InterfaceLUID.IPInterface(family)
- if err != nil {
- continue
- }
-
- if r[i].Metric+iface.Metric < lowestMetric {
- lowestMetric = r[i].Metric + iface.Metric
- index = r[i].InterfaceIndex
- luid = r[i].InterfaceLUID
- }
- }
- if luid == *lastLUID && index == *lastIndex {
- return nil
- }
- *lastLUID = luid
- *lastIndex = index
- blackhole := blackholeWhenLoop && index == 0
- bind, _ := device.Bind().(conn.BindSocketToInterface)
- if bind == nil {
- return nil
- }
- if family == windows.AF_INET {
- log.Printf("Binding v4 socket to interface %d (blackhole=%v)", index, blackhole)
- return bind.BindSocketToInterface4(index, blackhole)
- } else if family == windows.AF_INET6 {
- log.Printf("Binding v6 socket to interface %d (blackhole=%v)", index, blackhole)
- return bind.BindSocketToInterface6(index, blackhole)
- }
- return nil
-}
-
-func monitorDefaultRoutes(family winipcfg.AddressFamily, device *device.Device, autoMTU bool, blackholeWhenLoop bool, tun *tun.NativeTun) ([]winipcfg.ChangeCallback, error) {
- var minMTU uint32
- if family == windows.AF_INET {
- minMTU = 576
- } else if family == windows.AF_INET6 {
- minMTU = 1280
- }
- ourLUID := winipcfg.LUID(tun.LUID())
- lastLUID := winipcfg.LUID(0)
- lastIndex := ^uint32(0)
- lastMTU := uint32(0)
- doIt := func() error {
- err := bindSocketRoute(family, device, ourLUID, &lastLUID, &lastIndex, blackholeWhenLoop)
- if err != nil {
- return err
- }
- if !autoMTU {
- return nil
- }
- mtu := uint32(0)
- if lastLUID != 0 {
- iface, err := lastLUID.Interface()
- if err != nil {
- return err
- }
- if iface.MTU > 0 {
- mtu = iface.MTU
- }
- }
- if mtu > 0 && lastMTU != mtu {
- iface, err := ourLUID.IPInterface(family)
- if err != nil {
- return err
- }
- iface.NLMTU = mtu - 80
- if iface.NLMTU < minMTU {
- iface.NLMTU = minMTU
- }
- err = iface.Set()
- if err != nil {
- return err
- }
- tun.ForceMTU(int(iface.NLMTU)) // TODO: having one MTU for both v4 and v6 kind of breaks the windows model, so right now this just gets the second one which is... bad.
- lastMTU = mtu
- }
- return nil
- }
- err := doIt()
- if err != nil {
- return nil, err
- }
-
- firstBurst := time.Time{}
- burstMutex := sync.Mutex{}
- burstTimer := time.AfterFunc(time.Hour*200, func() {
- burstMutex.Lock()
- firstBurst = time.Time{}
- doIt()
- burstMutex.Unlock()
- })
- burstTimer.Stop()
- bump := func() {
- burstMutex.Lock()
- burstTimer.Reset(time.Millisecond * 150)
- if firstBurst.IsZero() {
- firstBurst = time.Now()
- } else if time.Since(firstBurst) > time.Second*2 {
- firstBurst = time.Time{}
- burstTimer.Stop()
- doIt()
- }
- burstMutex.Unlock()
- }
-
- cbr, err := winipcfg.RegisterRouteChangeCallback(func(notificationType winipcfg.MibNotificationType, route *winipcfg.MibIPforwardRow2) {
- if route != nil && route.DestinationPrefix.PrefixLength == 0 {
- bump()
- }
- })
- if err != nil {
- return nil, err
- }
- cbi, err := winipcfg.RegisterInterfaceChangeCallback(func(notificationType winipcfg.MibNotificationType, iface *winipcfg.MibIPInterfaceRow) {
- if notificationType == winipcfg.MibParameterNotification {
- bump()
- }
- })
- if err != nil {
- cbr.Unregister()
- return nil, err
- }
- return []winipcfg.ChangeCallback{cbr, cbi}, nil
-}