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 | |
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>
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | Makefile | 29 | ||||
-rw-r--r-- | README.md | 5 | ||||
-rw-r--r-- | main.go | 3 | ||||
-rw-r--r-- | service/ifaceconfig.go | 40 | ||||
-rw-r--r-- | service/service_tunnel.go | 28 | ||||
m--------- | wireguard-go | 0 |
7 files changed, 29 insertions, 79 deletions
diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index b8270fa5..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "wireguard-go"] - path = wireguard-go - url = https://git.zx2c4.com/wireguard-go @@ -3,35 +3,16 @@ CFLAGS += -Wall -std=gnu11 all: wireguard.exe -BUILDDIR := .tmp -rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) -DOWNSTREAM_FILES := $(filter-out %/.tmp wireguard-go/%,$(call rwildcard,,*.go *.c *.h)) go.mod -UPSTREAM_FILES := $(filter-out $(addprefix %/,$(DOWNSTREAM_FILES)) %/.tmp %/main_windows.go,$(call rwildcard,wireguard-go/,*.go)) +resources.syso: ui/icon/icon.ico ui/manifest.xml go.mod + go run github.com/akavel/rsrc -manifest ui/manifest.xml -ico ui/icon/icon.ico -arch amd64 -o resources.syso -define copy-src-to-build -$(BUILDDIR)/$(3)/$(patsubst $(1)%,%,$(2)): $(2) - @mkdir -vp "$$(dir $$@)" - @cp -vp "$$<" "$$@" - @$$(if $(3),sed -i 's:golang.zx2c4.com/wireguard:golang.zx2c4.com/wireguard/windows/$(3):;s:package main:package $(3):' "$$@",) -$(BUILDDIR)/.prepared: $(BUILDDIR)/$(3)/$(patsubst $(1)%,%,$(2)) -endef - -$(foreach FILE,$(UPSTREAM_FILES),$(eval $(call copy-src-to-build,wireguard-go/,$(FILE),service))) -$(foreach FILE,$(DOWNSTREAM_FILES),$(eval $(call copy-src-to-build,,$(FILE)))) - -$(BUILDDIR)/.prepared: - touch "$@" - -$(BUILDDIR)/resources.syso: ui/icon/icon.ico ui/manifest.xml $(BUILDDIR)/go.mod - cd "$(BUILDDIR)" && go run github.com/akavel/rsrc -manifest ../ui/manifest.xml -ico ../ui/icon/icon.ico -arch amd64 -o resources.syso - -wireguard.exe: $(BUILDDIR)/.prepared $(BUILDDIR)/resources.syso - cd "$(BUILDDIR)" && CC=x86_64-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -ldflags="-H windowsgui" -o ../$@ +wireguard.exe: resources.syso + CC=x86_64-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -ldflags="-H windowsgui" -o $@ run: wireguard.exe wine wireguard.exe clean: - rm -rf "$(BUILDDIR)" wireguard.exe + rm -rf resources.syso wireguard.exe .PHONY: run clean all @@ -18,16 +18,13 @@ $ git clone --recursive https://git.zx2c4.com/wireguard-windows ### Building -Currently a mess while we transition a few things, so you'll actually need to use WSL. Here are instructions for [Ubuntu 18.04 from the Windows Store](https://www.microsoft.com/en-us/p/ubuntu-1804-lts/9n9tngvndl3q) on WSL: +The use of cgo/mingw makes it slightly easier to compile from WSL. Here are instructions for [Ubuntu 18.04 from the Windows Store](https://www.microsoft.com/en-us/p/ubuntu-1804-lts/9n9tngvndl3q) on WSL: ``` $ sudo apt update $ sudo apt install mingw-w64 make $ curl https://dl.google.com/go/go1.12.linux-amd64.tar.gz | tar xzf - $ export PATH="$PWD/go/bin:$PATH" -$ mkdir "$HOME/.go" -$ export GOPATH="$HOME/.go" -$ go get github.com/akavel/rsrc $ cd /mnt/c/Users/YourUsername/Projects/wireguard-windows $ make ``` @@ -33,14 +33,13 @@ func fatal(v ...interface{}) { messageBoxEx(0, windows.StringToUTF16Ptr(fmt.Sprint(v...)), windows.StringToUTF16Ptr("Error"), 0x00000010, 0) } - func usage() { builder := strings.Builder{} for _, flag := range flags { builder.WriteString(fmt.Sprintf(" %s\n", flag)) } msg := fmt.Sprintf("Usage: %s [\n%s]", os.Args[0], builder.String()) - messageBoxEx(0, windows.StringToUTF16Ptr(msg), windows.StringToUTF16Ptr("Command Line Options"), 0x00000040, 0) + messageBoxEx(0, windows.StringToUTF16Ptr(msg), windows.StringToUTF16Ptr("Command Line Options"), 0x00000040, 0) os.Exit(1) } 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 } } diff --git a/wireguard-go b/wireguard-go deleted file mode 160000 -Subproject d435be35cac49af9367b2005d831d55e570c4b1 |