From 62dbeca7323e74d4e08a08a878f429ad0a050616 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 23 May 2018 03:52:26 +0200 Subject: libwg-go: use gopath Signed-off-by: Jason A. Donenfeld --- app/tools/libwg-go/.gitignore | 7 +- app/tools/libwg-go/Makefile | 11 +- app/tools/libwg-go/api-android.go | 174 --------------------- app/tools/libwg-go/jni.c | 45 ------ .../src/git.zx2c4.com/wireguard-go/api-android.go | 162 +++++++++++++++++++ .../libwg-go/src/git.zx2c4.com/wireguard-go/jni.c | 45 ++++++ .../git.zx2c4.com/wireguard-go/tun/api-android.go | 31 ++++ app/tools/wireguard | 2 +- app/tools/wireguard-go | 2 +- 9 files changed, 246 insertions(+), 233 deletions(-) delete mode 100644 app/tools/libwg-go/api-android.go delete mode 100644 app/tools/libwg-go/jni.c create mode 100644 app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/api-android.go create mode 100644 app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/jni.c create mode 100644 app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/tun/api-android.go diff --git a/app/tools/libwg-go/.gitignore b/app/tools/libwg-go/.gitignore index 2a4c5348..c464c736 100644 --- a/app/tools/libwg-go/.gitignore +++ b/app/tools/libwg-go/.gitignore @@ -1,7 +1,2 @@ -go/ -*.go -libwg-go.h -jni.o -gopath/ -goroot/ +src/ .gobuildversion diff --git a/app/tools/libwg-go/Makefile b/app/tools/libwg-go/Makefile index a7828e79..671ffa15 100644 --- a/app/tools/libwg-go/Makefile +++ b/app/tools/libwg-go/Makefile @@ -11,7 +11,6 @@ NDK_GO_ARCH_MAP_arm64 := arm64 NDK_GO_ARCH_MAP_mips := mipsx NDK_GO_ARCH_MAP_mips64 := mips64x -export GOPATH := $(CURDIR)/gopath CLANG_FLAGS := --target=$(ANDROID_LLVM_TRIPLE) --gcc-toolchain=$(ANDROID_TOOLCHAIN_ROOT) --sysroot=$(ANDROID_SYSROOT) export CGO_CFLAGS := $(CLANG_FLAGS) $(CFLAGS) export CGO_LDFLAGS := $(CLANG_FLAGS) $(LDFLAGS) @@ -48,12 +47,12 @@ endif $(shell test "$$(cat .gobuildversion 2>/dev/null)" = "$(GOBUILDVERSION_CURRENT)" || rm -f "$(DESTDIR)/libwg-go.so") -$(DESTDIR)/libwg-go.so: $(FILES) api-android.go jni.c +$(DESTDIR)/libwg-go.so: $(FILES) src/git.zx2c4.com/wireguard-go/api-android.go src/git.zx2c4.com/wireguard-go/tun/api-android.go src/git.zx2c4.com/wireguard-go/jni.c find . -name '*.go' -type l -delete find . -type d -empty -delete - mkdir -p $(subst ../wireguard-go/,./,$(dir $(FILES))) - $(foreach FILE,$(FILES),ln -sfrt $(subst ../wireguard-go/,./,$(dir $(FILE))) $(FILE);) + mkdir -p $(subst ../wireguard-go/,./src/git.zx2c4.com/wireguard-go/,$(dir $(FILES))) + $(foreach FILE,$(FILES),ln -sfrt $(subst ../wireguard-go/,./src/git.zx2c4.com/wireguard-go/,$(dir $(FILE))) $(FILE);) patch -p1 -f -R -s --dry-run -d"$$(go env GOROOT)" < goruntime-boottime-over-monotonic.diff - go get -v -d - go build -v -o $(DESTDIR)/libwg-go.so -buildmode c-shared + GOPATH=$(PWD) go get -v -d git.zx2c4.com/wireguard-go + GOPATH=$(PWD) go build -v -o $(DESTDIR)/libwg-go.so -buildmode c-shared git.zx2c4.com/wireguard-go go version > .gobuildversion diff --git a/app/tools/libwg-go/api-android.go b/app/tools/libwg-go/api-android.go deleted file mode 100644 index faf718ab..00000000 --- a/app/tools/libwg-go/api-android.go +++ /dev/null @@ -1,174 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later - * - * Copyright (C) 2017-2018 Jason A. Donenfeld . All Rights Reserved. - */ - -package main - -// #cgo LDFLAGS: -llog -// #include -import "C" - -import ( - "./rwcancel" - "bufio" - "golang.org/x/sys/unix" - "io/ioutil" - "log" - "math" - "os" - "os/signal" - "runtime" - "strings" - "unsafe" -) - -type AndroidLogger struct { - level C.int - interfaceName string -} - -func (l AndroidLogger) Write(p []byte) (int, error) { - C.__android_log_write(l.level, C.CString("WireGuard/GoBackend/"+l.interfaceName), C.CString(string(p))) - return len(p), nil -} - -var tunnelHandles map[int32]*Device - -func init() { - tunnelHandles = make(map[int32]*Device) - signals := make(chan os.Signal) - signal.Notify(signals, unix.SIGUSR2) - go func() { - buf := make([]byte, os.Getpagesize()) - for { - select { - case <-signals: - n := runtime.Stack(buf, true) - buf[n] = 0 - C.__android_log_write(C.ANDROID_LOG_ERROR, C.CString("WireGuard/GoBackend/Stacktrace"), (*_Ctype_char)(unsafe.Pointer(&buf[0]))) - } - } - }() -} - -//export wgTurnOn -func wgTurnOn(ifnameRef string, tun_fd int32, settings string) int32 { - interfaceName := string([]byte(ifnameRef)) - - logger := &Logger{ - Debug: log.New(&AndroidLogger{level: C.ANDROID_LOG_DEBUG, interfaceName: interfaceName}, "", 0), - Info: log.New(&AndroidLogger{level: C.ANDROID_LOG_INFO, interfaceName: interfaceName}, "", 0), - Error: log.New(&AndroidLogger{level: C.ANDROID_LOG_ERROR, interfaceName: interfaceName}, "", 0), - } - - logger.Debug.Println("Debug log enabled") - - tun := &NativeTun{ - fd: os.NewFile(uintptr(tun_fd), "/dev/tun"), - events: make(chan TUNEvent, 5), - errors: make(chan error, 5), - nopi: true, - } - var err error - - tun.fdCancel, err = rwcancel.NewRWCancel(int(tun_fd)) - if err != nil { - unix.Close(int(tun_fd)) - logger.Error.Println(err) - return -1 - } - name, err := tun.Name() - if err != nil { - unix.Close(int(tun_fd)) - logger.Error.Println(err) - return -1 - } - logger.Info.Println("Attaching to interface", name) - device := NewDevice(tun, logger) - logger.Debug.Println("Interface has MTU", device.tun.mtu) - - bufferedSettings := bufio.NewReadWriter(bufio.NewReader(strings.NewReader(settings)), bufio.NewWriter(ioutil.Discard)) - setError := ipcSetOperation(device, bufferedSettings) - if setError != nil { - unix.Close(int(tun_fd)) - logger.Error.Println(setError) - return -1 - } - - device.Up() - logger.Info.Println("Device started") - - var i int32 - for i = 0; i < math.MaxInt32; i++ { - if _, exists := tunnelHandles[i]; !exists { - break - } - } - if i == math.MaxInt32 { - unix.Close(int(tun_fd)) - return -1 - } - tunnelHandles[i] = device - return i -} - -//export wgTurnOff -func wgTurnOff(tunnelHandle int32) { - device, ok := tunnelHandles[tunnelHandle] - if !ok { - return - } - delete(tunnelHandles, tunnelHandle) - device.Close() -} - -//export wgGetSocketV4 -func wgGetSocketV4(tunnelHandle int32) int32 { - device, ok := tunnelHandles[tunnelHandle] - if !ok { - return -1 - } - native, ok := device.net.bind.(*NativeBind) - if !ok { - return -1 - } - fd := int32(-1) - conn, err := native.ipv4.SyscallConn() - if err != nil { - return -1 - } - err = conn.Control(func(f uintptr) { - fd = int32(f) - }) - if err != nil { - return -1 - } - return fd -} - -//export wgGetSocketV6 -func wgGetSocketV6(tunnelHandle int32) int32 { - device, ok := tunnelHandles[tunnelHandle] - if !ok { - return -1 - } - native, ok := device.net.bind.(*NativeBind) - if !ok { - return -1 - } - fd := int32(-1) - conn, err := native.ipv6.SyscallConn() - if err != nil { - return -1 - } - err = conn.Control(func(f uintptr) { - fd = int32(f) - }) - if err != nil { - return -1 - } - return fd -} - -func main() {} diff --git a/app/tools/libwg-go/jni.c b/app/tools/libwg-go/jni.c deleted file mode 100644 index a0f3d0ba..00000000 --- a/app/tools/libwg-go/jni.c +++ /dev/null @@ -1,45 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later - * - * Copyright © 2017-2018 Jason A. Donenfeld . All Rights Reserved. - */ - -#include - -struct go_string { const char *str; long n; }; -extern int wgTurnOn(struct go_string ifname, int tun_fd, struct go_string settings); -extern void wgTurnOff(int handle); -extern int wgGetSocketV4(int handle); -extern int wgGetSocketV6(int handle); - -JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOn(JNIEnv *env, jclass c, jstring ifname, jint tun_fd, jstring settings) -{ - const char *ifname_str = (*env)->GetStringUTFChars(env, ifname, 0); - size_t ifname_len = (*env)->GetStringUTFLength(env, ifname); - const char *settings_str = (*env)->GetStringUTFChars(env, settings, 0); - size_t settings_len = (*env)->GetStringUTFLength(env, settings); - int ret = wgTurnOn((struct go_string){ - .str = ifname_str, - .n = ifname_len - }, tun_fd, (struct go_string){ - .str = settings_str, - .n = settings_len - }); - (*env)->ReleaseStringUTFChars(env, ifname, ifname_str); - (*env)->ReleaseStringUTFChars(env, settings, settings_str); - return ret; -} - -JNIEXPORT void JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOff(JNIEnv *env, jclass c, jint handle) -{ - wgTurnOff(handle); -} - -JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgGetSocketV4(JNIEnv *env, jclass c, jint handle) -{ - return wgGetSocketV4(handle); -} - -JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgGetSocketV6(JNIEnv *env, jclass c, jint handle) -{ - return wgGetSocketV6(handle); -} diff --git a/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/api-android.go b/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/api-android.go new file mode 100644 index 00000000..24a0eaec --- /dev/null +++ b/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/api-android.go @@ -0,0 +1,162 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (C) 2017-2018 Jason A. Donenfeld . All Rights Reserved. + */ + +package main + +// #cgo LDFLAGS: -llog +// #include +import "C" + +import ( + "bufio" + "git.zx2c4.com/wireguard-go/tun" + "golang.org/x/sys/unix" + "io/ioutil" + "log" + "math" + "os" + "os/signal" + "runtime" + "strings" + "unsafe" +) + +type AndroidLogger struct { + level C.int + interfaceName string +} + +func (l AndroidLogger) Write(p []byte) (int, error) { + C.__android_log_write(l.level, C.CString("WireGuard/GoBackend/"+l.interfaceName), C.CString(string(p))) + return len(p), nil +} + +var tunnelHandles map[int32]*Device + +func init() { + tunnelHandles = make(map[int32]*Device) + signals := make(chan os.Signal) + signal.Notify(signals, unix.SIGUSR2) + go func() { + buf := make([]byte, os.Getpagesize()) + for { + select { + case <-signals: + n := runtime.Stack(buf, true) + buf[n] = 0 + C.__android_log_write(C.ANDROID_LOG_ERROR, C.CString("WireGuard/GoBackend/Stacktrace"), (*_Ctype_char)(unsafe.Pointer(&buf[0]))) + } + } + }() +} + +//export wgTurnOn +func wgTurnOn(ifnameRef string, tun_fd int32, settings string) int32 { + interfaceName := string([]byte(ifnameRef)) + + logger := &Logger{ + Debug: log.New(&AndroidLogger{level: C.ANDROID_LOG_DEBUG, interfaceName: interfaceName}, "", 0), + Info: log.New(&AndroidLogger{level: C.ANDROID_LOG_INFO, interfaceName: interfaceName}, "", 0), + Error: log.New(&AndroidLogger{level: C.ANDROID_LOG_ERROR, interfaceName: interfaceName}, "", 0), + } + + logger.Debug.Println("Debug log enabled") + + tun, name, err := tun.CreateTUNFromFD(int(tun_fd)) + if err != nil { + unix.Close(int(tun_fd)) + logger.Error.Println(err) + return -1 + } + + logger.Info.Println("Attaching to interface", name) + device := NewDevice(tun, logger) + + logger.Debug.Println("Interface has MTU", device.tun.mtu) + + bufferedSettings := bufio.NewReadWriter(bufio.NewReader(strings.NewReader(settings)), bufio.NewWriter(ioutil.Discard)) + setError := ipcSetOperation(device, bufferedSettings) + if setError != nil { + unix.Close(int(tun_fd)) + logger.Error.Println(setError) + return -1 + } + + device.Up() + logger.Info.Println("Device started") + + var i int32 + for i = 0; i < math.MaxInt32; i++ { + if _, exists := tunnelHandles[i]; !exists { + break + } + } + if i == math.MaxInt32 { + unix.Close(int(tun_fd)) + return -1 + } + tunnelHandles[i] = device + return i +} + +//export wgTurnOff +func wgTurnOff(tunnelHandle int32) { + device, ok := tunnelHandles[tunnelHandle] + if !ok { + return + } + delete(tunnelHandles, tunnelHandle) + device.Close() +} + +//export wgGetSocketV4 +func wgGetSocketV4(tunnelHandle int32) int32 { + device, ok := tunnelHandles[tunnelHandle] + if !ok { + return -1 + } + native, ok := device.net.bind.(*NativeBind) + if !ok { + return -1 + } + fd := int32(-1) + conn, err := native.ipv4.SyscallConn() + if err != nil { + return -1 + } + err = conn.Control(func(f uintptr) { + fd = int32(f) + }) + if err != nil { + return -1 + } + return fd +} + +//export wgGetSocketV6 +func wgGetSocketV6(tunnelHandle int32) int32 { + device, ok := tunnelHandles[tunnelHandle] + if !ok { + return -1 + } + native, ok := device.net.bind.(*NativeBind) + if !ok { + return -1 + } + fd := int32(-1) + conn, err := native.ipv6.SyscallConn() + if err != nil { + return -1 + } + err = conn.Control(func(f uintptr) { + fd = int32(f) + }) + if err != nil { + return -1 + } + return fd +} + +func main() {} diff --git a/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/jni.c b/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/jni.c new file mode 100644 index 00000000..a0f3d0ba --- /dev/null +++ b/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/jni.c @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright © 2017-2018 Jason A. Donenfeld . All Rights Reserved. + */ + +#include + +struct go_string { const char *str; long n; }; +extern int wgTurnOn(struct go_string ifname, int tun_fd, struct go_string settings); +extern void wgTurnOff(int handle); +extern int wgGetSocketV4(int handle); +extern int wgGetSocketV6(int handle); + +JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOn(JNIEnv *env, jclass c, jstring ifname, jint tun_fd, jstring settings) +{ + const char *ifname_str = (*env)->GetStringUTFChars(env, ifname, 0); + size_t ifname_len = (*env)->GetStringUTFLength(env, ifname); + const char *settings_str = (*env)->GetStringUTFChars(env, settings, 0); + size_t settings_len = (*env)->GetStringUTFLength(env, settings); + int ret = wgTurnOn((struct go_string){ + .str = ifname_str, + .n = ifname_len + }, tun_fd, (struct go_string){ + .str = settings_str, + .n = settings_len + }); + (*env)->ReleaseStringUTFChars(env, ifname, ifname_str); + (*env)->ReleaseStringUTFChars(env, settings, settings_str); + return ret; +} + +JNIEXPORT void JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOff(JNIEnv *env, jclass c, jint handle) +{ + wgTurnOff(handle); +} + +JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgGetSocketV4(JNIEnv *env, jclass c, jint handle) +{ + return wgGetSocketV4(handle); +} + +JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgGetSocketV6(JNIEnv *env, jclass c, jint handle) +{ + return wgGetSocketV6(handle); +} diff --git a/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/tun/api-android.go b/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/tun/api-android.go new file mode 100644 index 00000000..3cb5753e --- /dev/null +++ b/app/tools/libwg-go/src/git.zx2c4.com/wireguard-go/tun/api-android.go @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (C) 2017-2018 Jason A. Donenfeld . All Rights Reserved. + */ + +package tun + +import ( + "git.zx2c4.com/wireguard-go/rwcancel" + "os" +) + +func CreateTUNFromFD(tun_fd int) (TUNDevice, string, error) { + tun := &nativeTun{ + fd: os.NewFile(uintptr(tun_fd), "/dev/tun"), + events: make(chan TUNEvent, 5), + errors: make(chan error, 5), + nopi: true, + } + var err error + tun.fdCancel, err = rwcancel.NewRWCancel(tun_fd) + if err != nil { + return nil, "", err + } + name, err := tun.Name() + if err != nil { + tun.fdCancel.Cancel() + return nil, "", err + } + return tun, name, nil +} diff --git a/app/tools/wireguard b/app/tools/wireguard index d67d89c7..6977826c 160000 --- a/app/tools/wireguard +++ b/app/tools/wireguard @@ -1 +1 @@ -Subproject commit d67d89c7f9d83d22d750452236b0e16510ab1368 +Subproject commit 6977826c2c9840f79dc2ac6b4206a5f393e9dfb4 diff --git a/app/tools/wireguard-go b/app/tools/wireguard-go index 65a74f31..0b647d1c 160000 --- a/app/tools/wireguard-go +++ b/app/tools/wireguard-go @@ -1 +1 @@ -Subproject commit 65a74f3175855dc41b49332103ada6bb27733291 +Subproject commit 0b647d1ca7e079f3bb2fe95c3ca7c05898315a6e -- cgit v1.2.3-59-g8ed1b