aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.gitmodules3
-rw-r--r--Makefile29
-rw-r--r--README.md5
-rw-r--r--main.go3
-rw-r--r--service/ifaceconfig.go40
-rw-r--r--service/service_tunnel.go28
m---------wireguard-go0
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
diff --git a/Makefile b/Makefile
index ec369b65..f83a18cd 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/README.md b/README.md
index 949e05e0..9772c996 100644
--- a/README.md
+++ b/README.md
@@ -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
```
diff --git a/main.go b/main.go
index 58526681..d246e019 100644
--- a/main.go
+++ b/main.go
@@ -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