aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tunnel
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-10-25 14:42:00 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-10-26 11:54:56 +0200
commite9c7358b01ea282646d0f09b201072096aae810f (patch)
treed9e555cddb09544ff5711869d615cb7c9b5a567f /tunnel
parentservices: remove unused pipe path helper (diff)
downloadwireguard-windows-e9c7358b01ea282646d0f09b201072096aae810f.tar.xz
wireguard-windows-e9c7358b01ea282646d0f09b201072096aae810f.zip
services: use more reliable method of detecting boot-up
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'tunnel')
-rw-r--r--tunnel/addressconfig.go13
-rw-r--r--tunnel/service.go32
2 files changed, 23 insertions, 22 deletions
diff --git a/tunnel/addressconfig.go b/tunnel/addressconfig.go
index 86b82097..f315cd15 100644
--- a/tunnel/addressconfig.go
+++ b/tunnel/addressconfig.go
@@ -15,6 +15,7 @@ import (
"golang.org/x/sys/windows"
"golang.zx2c4.com/wireguard/windows/conf"
+ "golang.zx2c4.com/wireguard/windows/services"
"golang.zx2c4.com/wireguard/windows/tunnel/firewall"
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
)
@@ -53,14 +54,14 @@ func cleanupAddressesOnDisconnectedInterfaces(family winipcfg.AddressFamily, add
}
func configureInterface(family winipcfg.AddressFamily, conf *conf.Config, luid winipcfg.LUID) error {
- systemJustBooted := windows.DurationSinceBoot() <= time.Minute*10
+ retryOnFailure := services.StartedAtBoot()
tryTimes := 0
startOver:
var err error
if tryTimes > 0 {
log.Printf("Retrying interface configuration after failure because system just booted (T+%v): %v", windows.DurationSinceBoot(), err)
time.Sleep(time.Second)
- systemJustBooted = systemJustBooted && tryTimes < 15
+ retryOnFailure = retryOnFailure && tryTimes < 15
}
tryTimes++
@@ -135,7 +136,7 @@ startOver:
if !conf.Interface.TableOff {
err = luid.SetRoutesForFamily(family, deduplicatedRoutes)
- if err == windows.ERROR_NOT_FOUND && systemJustBooted {
+ if err == windows.ERROR_NOT_FOUND && retryOnFailure {
goto startOver
} else if err != nil {
return fmt.Errorf("unable to set routes: %w", err)
@@ -147,7 +148,7 @@ startOver:
cleanupAddressesOnDisconnectedInterfaces(family, addresses)
err = luid.SetIPAddressesForFamily(family, addresses)
}
- if err == windows.ERROR_NOT_FOUND && systemJustBooted {
+ if err == windows.ERROR_NOT_FOUND && retryOnFailure {
goto startOver
} else if err != nil {
return fmt.Errorf("unable to set ips: %w", err)
@@ -170,14 +171,14 @@ startOver:
ipif.Metric = 0
}
err = ipif.Set()
- if err == windows.ERROR_NOT_FOUND && systemJustBooted {
+ if err == windows.ERROR_NOT_FOUND && retryOnFailure {
goto startOver
} else if err != nil {
return fmt.Errorf("unable to set metric and MTU: %w", err)
}
err = luid.SetDNS(family, conf.Interface.DNS, conf.Interface.DNSSearch)
- if err == windows.ERROR_NOT_FOUND && systemJustBooted {
+ if err == windows.ERROR_NOT_FOUND && retryOnFailure {
goto startOver
} else if err != nil {
return fmt.Errorf("unable to set DNS: %w", err)
diff --git a/tunnel/service.go b/tunnel/service.go
index 24df3dfe..4a4f5e40 100644
--- a/tunnel/service.go
+++ b/tunnel/service.go
@@ -16,14 +16,12 @@ import (
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/mgr"
-
"golang.zx2c4.com/wireguard/windows/conf"
"golang.zx2c4.com/wireguard/windows/driver"
"golang.zx2c4.com/wireguard/windows/elevate"
"golang.zx2c4.com/wireguard/windows/ringlogger"
"golang.zx2c4.com/wireguard/windows/services"
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
- "golang.zx2c4.com/wireguard/windows/version"
)
type tunnelService struct {
@@ -119,20 +117,22 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest,
log.SetPrefix(fmt.Sprintf("[%s] ", config.Name))
- log.Println("Starting", version.UserAgent())
+ services.PrintStarting()
- if m, err := mgr.Connect(); err == nil {
- if lockStatus, err := m.LockStatus(); err == nil && lockStatus.IsLocked {
- /* If we don't do this, then the driver installation will block forever, because
- * installing a network adapter starts the driver service too. Apparently at boot time,
- * Windows 8.1 locks the SCM for each service start, creating a deadlock if we don't
- * announce that we're running before starting additional services.
- */
- log.Printf("SCM locked for %v by %s, marking service as started", lockStatus.Age, lockStatus.Owner)
- serviceState = svc.Running
- changes <- svc.Status{State: serviceState}
+ if services.StartedAtBoot() {
+ if m, err := mgr.Connect(); err == nil {
+ if lockStatus, err := m.LockStatus(); err == nil && lockStatus.IsLocked {
+ /* If we don't do this, then the driver installation will block forever, because
+ * installing a network adapter starts the driver service too. Apparently at boot time,
+ * Windows 8.1 locks the SCM for each service start, creating a deadlock if we don't
+ * announce that we're running before starting additional services.
+ */
+ log.Printf("SCM locked for %v by %s, marking service as started", lockStatus.Age, lockStatus.Owner)
+ serviceState = svc.Running
+ changes <- svc.Status{State: serviceState}
+ }
+ m.Disconnect()
}
- m.Disconnect()
}
log.Println("Watching network interfaces")
@@ -156,7 +156,7 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest,
log.Printf("Retrying adapter creation after failure because system just booted (T+%v): %v", windows.DurationSinceBoot(), err)
}
adapter, err = driver.CreateAdapter(config.Name, "WireGuard", deterministicGUID(config))
- if err == nil || windows.DurationSinceBoot() > time.Minute*10 {
+ if err == nil || !services.StartedAtBoot() {
break
}
}
@@ -250,7 +250,7 @@ func Run(confPath string) error {
if err != nil {
return err
}
- serviceName, err := services.ServiceNameOfTunnel(name)
+ serviceName, err := conf.ServiceNameOfTunnel(name)
if err != nil {
return err
}