diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-03-03 04:13:43 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-03-03 05:05:02 +0100 |
commit | f91b1b3c2a6a7ea5a6d3b2685b1644bf31291474 (patch) | |
tree | 1e65d49b16732596434901ce42d4d69c8c3c3ea9 /service | |
parent | tunnel: simplify shutdown (diff) | |
download | wireguard-windows-f91b1b3c2a6a7ea5a6d3b2685b1644bf31291474.tar.xz wireguard-windows-f91b1b3c2a6a7ea5a6d3b2685b1644bf31291474.zip |
tunnel: do not rely on submodule
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r-- | service/ifaceconfig.go | 40 | ||||
-rw-r--r-- | service/service_tunnel.go | 28 |
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 } } |