diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-03-05 01:00:06 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-03-05 05:36:21 +0100 |
commit | 35f13442ef6696a877d96957502cd9b0de69b8cf (patch) | |
tree | 777ff3840f07c2463d9ad12e143074dbd09ec029 /service | |
parent | ifaceconfig: trim filtered list (diff) | |
download | wireguard-windows-35f13442ef6696a877d96957502cd9b0de69b8cf.tar.xz wireguard-windows-35f13442ef6696a877d96957502cd9b0de69b8cf.zip |
ifaceconfig: set MTU and monitor for auto mtu changes
Diffstat (limited to 'service')
-rw-r--r-- | service/ifaceconfig.go | 53 | ||||
-rw-r--r-- | service/service_tunnel.go | 2 |
2 files changed, 53 insertions, 2 deletions
diff --git a/service/ifaceconfig.go b/service/ifaceconfig.go index 4569b0ab..b2f93b70 100644 --- a/service/ifaceconfig.go +++ b/service/ifaceconfig.go @@ -59,10 +59,11 @@ func bindSocketRoute(family winipcfg.AddressFamily, device *device.Device, ourLu return nil } -func monitorDefaultRoutes(device *device.Device, guid *windows.GUID) (*winipcfg.RouteChangeCallback, error) { +func monitorDefaultRoutes(device *device.Device, autoMTU bool, guid *windows.GUID) (*winipcfg.RouteChangeCallback, error) { ourLuid, err := winipcfg.InterfaceGuidToLuid(guid) lastLuid4 := uint64(0) lastLuid6 := uint64(0) + lastMtu := uint32(0) if err != nil { return nil, err } @@ -75,6 +76,50 @@ func monitorDefaultRoutes(device *device.Device, guid *windows.GUID) (*winipcfg. if err != nil { return err } + if !autoMTU { + return nil + } + mtu := uint32(0) + if lastLuid4 != 0 { + iface, err := winipcfg.InterfaceFromLUID(lastLuid4) + if err != nil { + return err + } + if iface.Mtu > 0 { + mtu = iface.Mtu + } + } + if lastLuid6 != 0 { + iface, err := winipcfg.InterfaceFromLUID(lastLuid6) + if err != nil { + return err + } + if iface.Mtu > 0 && iface.Mtu < mtu { + mtu = iface.Mtu + } + } + if mtu > 0 && (lastMtu == 0 || lastMtu != mtu) { + //TODO: makesure wireguard-go knows about all MTU changes + iface, err := winipcfg.GetIpInterface(ourLuid, winipcfg.AF_INET) + if err != nil { + return err + } + iface.NlMtu = mtu - 80 + err = iface.Set() + if err != nil { + return err + } + iface, err = winipcfg.GetIpInterface(ourLuid, winipcfg.AF_INET6) + if err != nil { + return err + } + iface.NlMtu = mtu - 80 + err = iface.Set() + if err != nil { + return err + } + lastMtu = mtu + } return nil } err = doIt() @@ -204,6 +249,9 @@ func configureInterface(conf *conf.Config, guid *windows.GUID) error { ipif.UseAutomaticMetric = false ipif.Metric = 0 } + if conf.Interface.Mtu > 0 { + ipif.NlMtu = uint32(conf.Interface.Mtu) + } err = ipif.Set() if err != nil { return err @@ -217,6 +265,9 @@ func configureInterface(conf *conf.Config, guid *windows.GUID) error { ipif.UseAutomaticMetric = false ipif.Metric = 0 } + if conf.Interface.Mtu > 0 { + ipif.NlMtu = uint32(conf.Interface.Mtu) + } ipif.DadTransmits = 0 ipif.RouterDiscoveryBehavior = winipcfg.RouterDiscoveryDisabled err = ipif.Set() diff --git a/service/service_tunnel.go b/service/service_tunnel.go index 4c9b2d63..3dc19f79 100644 --- a/service/service_tunnel.go +++ b/service/service_tunnel.go @@ -143,7 +143,7 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest, dev.IpcSetOperation(bufio.NewReader(strings.NewReader(uapiConf))) guid := wintun.(*tun.NativeTun).GUID() - routeChangeCallback, err = monitorDefaultRoutes(dev, &guid) + routeChangeCallback, err = monitorDefaultRoutes(dev, conf.Interface.Mtu == 0, &guid) if err != nil { logger.Error.Println("Unable to bind sockets to default route:", err) exitCode = ERROR_NETWORK_BUSY |