aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/service
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-03-05 01:00:06 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2019-03-05 05:36:21 +0100
commit35f13442ef6696a877d96957502cd9b0de69b8cf (patch)
tree777ff3840f07c2463d9ad12e143074dbd09ec029 /service
parentifaceconfig: trim filtered list (diff)
downloadwireguard-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.go53
-rw-r--r--service/service_tunnel.go2
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