aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/service
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-03-03 04:13:43 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2019-03-03 05:05:02 +0100
commit12395d994ce1a83b8f3feb8b95c8c610b1f76890 (patch)
tree1e65d49b16732596434901ce42d4d69c8c3c3ea9 /service
parenttunnel: simplify shutdown (diff)
downloadwireguard-windows-12395d994ce1a83b8f3feb8b95c8c610b1f76890.tar.xz
wireguard-windows-12395d994ce1a83b8f3feb8b95c8c610b1f76890.zip
tunnel: do not rely on submodule
Diffstat (limited to 'service')
-rw-r--r--service/ifaceconfig.go40
-rw-r--r--service/service_tunnel.go28
2 files changed, 22 insertions, 46 deletions
diff --git a/service/ifaceconfig.go b/service/ifaceconfig.go
index f8737128..f70c9639 100644
--- a/service/ifaceconfig.go
+++ b/service/ifaceconfig.go
@@ -10,6 +10,7 @@ import (
"errors"
"golang.org/x/sys/windows"
"golang.zx2c4.com/winipcfg"
+ "golang.zx2c4.com/wireguard/device"
"golang.zx2c4.com/wireguard/windows/conf"
"net"
"os"
@@ -27,7 +28,7 @@ func htonl(val uint32) uint32 {
return *(*uint32)(unsafe.Pointer(&bytes[0]))
}
-func bindSocketRoute(family winipcfg.AddressFamily, bind *NativeBind, ourLuid uint64) error {
+func bindSocketRoute(family winipcfg.AddressFamily, device *device.Device, ourLuid uint64) error {
routes, err := winipcfg.GetRoutes(family)
if err != nil {
return err
@@ -43,52 +44,25 @@ func bindSocketRoute(family winipcfg.AddressFamily, bind *NativeBind, ourLuid ui
index = route.InterfaceIndex
}
}
-
if family == winipcfg.AF_INET {
- sysconn, err := bind.ipv4.SyscallConn()
- if err != nil {
- return err
- }
- err2 := sysconn.Control(func(fd uintptr) {
- err = windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IP, sockoptIP_UNICAST_IF, int(htonl(index)))
- })
- if err2 != nil {
- return err2
- }
- if err != nil {
- return err
- }
- return nil
+ return device.BindSocketToInterface4(index)
} else if family == winipcfg.AF_INET6 {
- sysconn, err := bind.ipv6.SyscallConn()
- if err != nil {
- return err
- }
- err2 := sysconn.Control(func(fd uintptr) {
- // The lack of htonl here is not a bug. MSDN actually specifies big endian for one and little endian for the other.
- err = windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IPV6, sockoptIPV6_UNICAST_IF, int(index))
- })
- if err2 != nil {
- return err2
- }
- if err != nil {
- return err
- }
+ return device.BindSocketToInterface6(index)
}
return nil
}
-func monitorDefaultRoutes(bind *NativeBind, guid *windows.GUID) (*winipcfg.RouteChangeCallback, error) {
+func monitorDefaultRoutes(device *device.Device, guid *windows.GUID) (*winipcfg.RouteChangeCallback, error) {
ourLuid, err := winipcfg.InterfaceGuidToLuid(guid)
if err != nil {
return nil, err
}
doIt := func() error {
- err = bindSocketRoute(winipcfg.AF_INET, bind, ourLuid)
+ err = bindSocketRoute(winipcfg.AF_INET, device, ourLuid)
if err != nil {
return err
}
- err = bindSocketRoute(winipcfg.AF_INET6, bind, ourLuid)
+ err = bindSocketRoute(winipcfg.AF_INET6, device, ourLuid)
if err != nil {
return err
}
diff --git a/service/service_tunnel.go b/service/service_tunnel.go
index b97bea17..4c9b2d63 100644
--- a/service/service_tunnel.go
+++ b/service/service_tunnel.go
@@ -9,6 +9,7 @@ import (
"bufio"
"fmt"
"golang.zx2c4.com/winipcfg"
+ "golang.zx2c4.com/wireguard/ipc"
"log"
"net"
"runtime/debug"
@@ -17,8 +18,9 @@ import (
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/eventlog"
+ "golang.zx2c4.com/wireguard/device"
+ "golang.zx2c4.com/wireguard/tun"
"golang.zx2c4.com/wireguard/windows/conf"
- "golang.zx2c4.com/wireguard/windows/service/tun"
)
type confElogger struct {
@@ -46,7 +48,7 @@ type tunnelService struct {
func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (svcSpecificEC bool, exitCode uint32) {
changes <- svc.Status{State: svc.StartPending}
- var device *Device
+ var dev *device.Device
var uapi net.Listener
var routeChangeCallback *winipcfg.RouteChangeCallback
var elog *eventlog.Log
@@ -59,8 +61,8 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest,
if uapi != nil {
uapi.Close()
}
- if device != nil {
- device.Close()
+ if dev != nil {
+ dev.Close()
}
if elog != nil {
elog.Info(1, "Shutting down")
@@ -89,13 +91,13 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest,
return
}
- logger := &Logger{
+ logger := &device.Logger{
Debug: log.New(&confElogger{elog: elog, conf: conf, level: 1}, "", 0),
Info: log.New(&confElogger{elog: elog, conf: conf, level: 2}, "", 0),
Error: log.New(&confElogger{elog: elog, conf: conf, level: 3}, "", 0),
}
- logger.Info.Println("Starting wireguard-go version", WireGuardGoVersion)
+ logger.Info.Println("Starting wireguard-go version", device.WireGuardGoVersion)
logger.Debug.Println("Debug log enabled")
wintun, err := tun.CreateTUN(conf.Name)
@@ -110,11 +112,11 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest,
return
}
- device = NewDevice(wintun, logger)
- device.Up()
+ dev = device.NewDevice(wintun, logger)
+ dev.Up()
logger.Info.Println("Device started")
- uapi, err = UAPIListen(conf.Name)
+ uapi, err = ipc.UAPIListen(conf.Name)
if err != nil {
logger.Error.Println("Failed to listen on uapi socket:", err)
exitCode = ERROR_PIPE_LISTENING
@@ -127,7 +129,7 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest,
if err != nil {
continue
}
- go ipcHandle(device, conn)
+ go dev.IpcHandle(conn)
}
}()
logger.Info.Println("UAPI listener started")
@@ -138,10 +140,10 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest,
exitCode = ERROR_INVALID_PARAMETER
return
}
- ipcSetOperation(device, bufio.NewReader(strings.NewReader(uapiConf)))
+ dev.IpcSetOperation(bufio.NewReader(strings.NewReader(uapiConf)))
guid := wintun.(*tun.NativeTun).GUID()
- routeChangeCallback, err = monitorDefaultRoutes(device.net.bind.(*NativeBind), &guid)
+ routeChangeCallback, err = monitorDefaultRoutes(dev, &guid)
if err != nil {
logger.Error.Println("Unable to bind sockets to default route:", err)
exitCode = ERROR_NETWORK_BUSY
@@ -168,7 +170,7 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest,
default:
logger.Error.Printf("Unexpected service control request #%d", c)
}
- case <-device.Wait():
+ case <-dev.Wait():
return
}
}