From cd86ba92eca722812ee592001e9b566bf50183b6 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 2 Oct 2018 18:12:30 +0200 Subject: Rewrite bridge build system Signed-off-by: Jason A. Donenfeld --- wireguard-go-bridge/Makefile | 52 ++++---- wireguard-go-bridge/src/api-ios.go | 137 +++++++++++++++++++++ .../src/git.zx2c4.com/wireguard-go/api-ios.go | 137 --------------------- .../git.zx2c4.com/wireguard-go/queueconstants.go | 16 --- .../src/git.zx2c4.com/wireguard-go/tun/tun_ios.go | 83 ------------- wireguard-go-bridge/src/queueconstants.go | 16 +++ wireguard-go-bridge/src/tun/tun_ios.go | 83 +++++++++++++ wireguard-go-bridge/xcode-build-helper.sh | 23 ---- 8 files changed, 266 insertions(+), 281 deletions(-) create mode 100644 wireguard-go-bridge/src/api-ios.go delete mode 100644 wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/api-ios.go delete mode 100644 wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/queueconstants.go delete mode 100644 wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/tun/tun_ios.go create mode 100644 wireguard-go-bridge/src/queueconstants.go create mode 100644 wireguard-go-bridge/src/tun/tun_ios.go delete mode 100755 wireguard-go-bridge/xcode-build-helper.sh (limited to 'wireguard-go-bridge') diff --git a/wireguard-go-bridge/Makefile b/wireguard-go-bridge/Makefile index 9cc98c7..7b98c92 100644 --- a/wireguard-go-bridge/Makefile +++ b/wireguard-go-bridge/Makefile @@ -2,50 +2,58 @@ # # Copyright (C) 2018 Jason A. Donenfeld . All Rights Reserved. -FILES := $(filter-out %/main.go %/queueconstants.go,$(wildcard ../wireguard-go/*/*.go) $(wildcard ../wireguard-go/*.go)) +UPSTREAM_FILES := $(filter-out %/main.go %/queueconstants.go,$(wildcard ../wireguard-go/*/*.go) $(wildcard ../wireguard-go/*.go)) +DOWNSTREAM_FILES := $(wildcard src/*.go) $(wildcard src/*/*.go) -ARCHES := arm64 armv7 x86_64 +ARCHS ?= arm64 armv7 x86_64 GOARCH_arm64 := arm64 GOARCH_armv7 := arm GOARCH_x86_64 := amd64 -CGO_FLAGS_x86_64 := -arch x86_64 -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) -CGO_FLAGS_arm64 := -arch arm64 -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -CGO_FLAGS_armv7 := -arch armv7 -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) +DEPLOYMENT_CFLAGS := $(DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX)$($(DEPLOYMENT_TARGET_CLANG_ENV_NAME)) +CGO_FLAGS_x86_64 := -arch x86_64 -isysroot $(shell xcrun --sdk iphonesimulator --show-sdk-path) $(DEPLOYMENT_CFLAGS) +CGO_FLAGS_arm64 := -arch arm64 -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) $(DEPLOYMENT_CFLAGS) +CGO_FLAGS_armv7 := -arch armv7 -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) $(DEPLOYMENT_CFLAGS) CC_x86_64 := $(shell xcrun --sdk iphonesimulator --find clang) CC_arm64 := $(shell xcrun --sdk iphoneos --find clang) CC_armv7 := $(shell xcrun --sdk iphoneos --find clang) +CONFIGURATION_BUILD_DIR ?= $(CURDIR)/out +CONFIGURATION_TEMP_DIR ?= $(CURDIR)/.tmp +DESTDIR ?= $(CONFIGURATION_BUILD_DIR) +GOBUILDDIR ?= $(CONFIGURATION_TEMP_DIR)/wireguard-go-bridge export GOOS := darwin export CGO_ENABLED := 1 -default: libwg-go.a +build: $(DESTDIR)/libwg-go.a -src/.prepared: $(FILES) src/git.zx2c4.com/wireguard-go/api-ios.go src/git.zx2c4.com/wireguard-go/tun/tun_ios.go - find . -name '*.go' -type l -delete - find . -type d -empty -delete - mkdir -p $(subst ../wireguard-go/,./src/git.zx2c4.com/wireguard-go/,$(dir $(FILES))) - $(foreach FILE,$(FILES),ln -sf $(abspath $(FILE)) $(subst ../wireguard-go/,./src/git.zx2c4.com/wireguard-go/,$(dir $(FILE)))$(notdir $(FILE));) - GOPATH=$(CURDIR) go get -v -d git.zx2c4.com/wireguard-go +$(GOBUILDDIR)/src/.prepared: $(UPSTREAM_FILES) $(DOWNSTREAM_FILES) + rm -rf $(GOBUILDDIR)/src + mkdir -p $(subst ../wireguard-go/,$(GOBUILDDIR)/src/git.zx2c4.com/wireguard-go/,$(dir $(UPSTREAM_FILES))) + mkdir -p $(subst src/,$(GOBUILDDIR)/src/git.zx2c4.com/wireguard-go/,$(dir $(DOWNSTREAM_FILES))) + $(foreach FILE,$(UPSTREAM_FILES),ln -sf $(abspath $(FILE)) $(subst ../wireguard-go/,$(GOBUILDDIR)/src/git.zx2c4.com/wireguard-go/,$(dir $(FILE)))$(notdir $(FILE));) + $(foreach FILE,$(DOWNSTREAM_FILES),ln -sf $(abspath $(FILE)) $(subst src/,$(GOBUILDDIR)/src/git.zx2c4.com/wireguard-go/,$(dir $(FILE)))$(notdir $(FILE));) + GOPATH=$(GOBUILDDIR) go get -v -d git.zx2c4.com/wireguard-go touch $@ define libwg-go-a -libwg-go-$(1).a: $(FILES) src/git.zx2c4.com/wireguard-go/api-ios.go src/git.zx2c4.com/wireguard-go/tun/tun_ios.go src/.prepared +$(GOBUILDDIR)/libwg-go-$(1).a: $(UPSTREAM_FILES) $(DOWNSTREAM_FILES) $(GOBUILDDIR)/src/.prepared CC="$(CC_$(1))" \ CGO_CFLAGS="$(CGO_FLAGS_$(1))" \ CGO_LDFLAGS="$(CGO_FLAGS_$(1))" \ GOARCH=$(GOARCH_$(1)) \ - GOPATH=$(CURDIR) \ - go build -tags ios -v -o libwg-go-$(1).a -buildmode c-archive git.zx2c4.com/wireguard-go - @rm -f libwg-go-$(1).h + GOPATH=$(GOBUILDDIR) \ + go build -tags ios -v -o $(GOBUILDDIR)/libwg-go-$(1).a -buildmode c-archive git.zx2c4.com/wireguard-go + @rm -f $(GOBUILDDIR)/libwg-go-$(1).h endef -$(foreach ARCH,$(ARCHES),$(eval $(call libwg-go-a,$(ARCH)))) +$(foreach ARCH,$(ARCHS),$(eval $(call libwg-go-a,$(ARCH)))) -libwg-go.a: $(foreach ARCH,$(ARCHES),libwg-go-$(ARCH).a) +$(DESTDIR)/libwg-go.a: $(foreach ARCH,$(ARCHS),$(GOBUILDDIR)/libwg-go-$(ARCH).a) + mkdir -p $(DESTDIR) xcrun --sdk iphoneos lipo -create -output $@ $^ -example: example.c libwg-go.a - xcrun --sdk iphoneos clang -framework CoreFoundation -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -arch arm64 -arch armv7 -L. -lwg-go -o example example.c +$(DESTDIR)/example: example.c $(DESTDIR)/libwg-go.a + xcrun --sdk iphoneos clang -framework CoreFoundation -isysroot $(shell xcrun --sdk iphoneos --show-sdk-path) -arch arm64 -arch armv7 -L$(DESTDIR) -lwg-go -o $@ $< clean: - rm -f libwg-go.a $(foreach ARCH,$(ARCHES),libwg-go-$(ARCH).a) example + rm -rf $(GOBUILDDIR) $(DESTDIR)/libwg-go.a $(DESTDIR)/example -.PHONY: clean default +.PHONY: clean build diff --git a/wireguard-go-bridge/src/api-ios.go b/wireguard-go-bridge/src/api-ios.go new file mode 100644 index 0000000..dcc588f --- /dev/null +++ b/wireguard-go-bridge/src/api-ios.go @@ -0,0 +1,137 @@ +/* SPDX-License-Identifier: GPL-2.0 + * + * Copyright (C) 2018 Jason A. Donenfeld . All Rights Reserved. + */ + +package main + +// #include +// #include +// static void callLogger(void *func, int level, const char *tag, const char *msg) +// { +// ((void(*)(int, const char *, const char *))func)(level, tag, msg); +// } +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" + "errors" +) + +var loggerFunc unsafe.Pointer +var versionString *C.char + +type CLogger struct { + level C.int + interfaceName string +} + +func (l *CLogger) Write(p []byte) (int, error) { + if uintptr(loggerFunc) == 0 { + return 0, errors.New("No logger initialized") + } + tag := C.CString("WireGuard/GoBackend/"+l.interfaceName) + message := C.CString(string(p)) + C.callLogger(loggerFunc, l.level, tag, message) + C.free(unsafe.Pointer(tag)) + C.free(unsafe.Pointer(message)) + return len(p), nil +} + +var tunnelHandles map[int32]*Device + +func init() { + versionString = C.CString(WireGuardGoVersion) + roamingDisabled = true + 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 + if uintptr(loggerFunc) != 0 { + tag := C.CString("WireGuard/GoBackend/Stacktrace") + C.callLogger(loggerFunc, 0, tag, (*_Ctype_char)(unsafe.Pointer(&buf[0]))) + C.free(unsafe.Pointer(tag)) + } + } + } + }() +} + +//export wgSetLogger +func wgSetLogger(loggerFn uintptr) { + loggerFunc = unsafe.Pointer(loggerFn) +} + +//export wgTurnOn +func wgTurnOn(ifnameRef string, settings string, readFn uintptr, writeFn uintptr, ctx uintptr) int32 { + interfaceName := string([]byte(ifnameRef)) + + logger := &Logger{ + Debug: log.New(&CLogger{level: 0, interfaceName: interfaceName}, "", 0), + Info: log.New(&CLogger{level: 1, interfaceName: interfaceName}, "", 0), + Error: log.New(&CLogger{level: 2, interfaceName: interfaceName}, "", 0), + } + + logger.Debug.Println("Debug log enabled") + + tun := tun.CreateTUN(1280, unsafe.Pointer(readFn), unsafe.Pointer(writeFn), unsafe.Pointer(ctx)) + logger.Info.Println("Attaching to interface") + 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 { + 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 { + 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 wgVersion +func wgVersion() *C.char { + return versionString +} + +func main() {} diff --git a/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/api-ios.go b/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/api-ios.go deleted file mode 100644 index dcc588f..0000000 --- a/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/api-ios.go +++ /dev/null @@ -1,137 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 - * - * Copyright (C) 2018 Jason A. Donenfeld . All Rights Reserved. - */ - -package main - -// #include -// #include -// static void callLogger(void *func, int level, const char *tag, const char *msg) -// { -// ((void(*)(int, const char *, const char *))func)(level, tag, msg); -// } -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" - "errors" -) - -var loggerFunc unsafe.Pointer -var versionString *C.char - -type CLogger struct { - level C.int - interfaceName string -} - -func (l *CLogger) Write(p []byte) (int, error) { - if uintptr(loggerFunc) == 0 { - return 0, errors.New("No logger initialized") - } - tag := C.CString("WireGuard/GoBackend/"+l.interfaceName) - message := C.CString(string(p)) - C.callLogger(loggerFunc, l.level, tag, message) - C.free(unsafe.Pointer(tag)) - C.free(unsafe.Pointer(message)) - return len(p), nil -} - -var tunnelHandles map[int32]*Device - -func init() { - versionString = C.CString(WireGuardGoVersion) - roamingDisabled = true - 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 - if uintptr(loggerFunc) != 0 { - tag := C.CString("WireGuard/GoBackend/Stacktrace") - C.callLogger(loggerFunc, 0, tag, (*_Ctype_char)(unsafe.Pointer(&buf[0]))) - C.free(unsafe.Pointer(tag)) - } - } - } - }() -} - -//export wgSetLogger -func wgSetLogger(loggerFn uintptr) { - loggerFunc = unsafe.Pointer(loggerFn) -} - -//export wgTurnOn -func wgTurnOn(ifnameRef string, settings string, readFn uintptr, writeFn uintptr, ctx uintptr) int32 { - interfaceName := string([]byte(ifnameRef)) - - logger := &Logger{ - Debug: log.New(&CLogger{level: 0, interfaceName: interfaceName}, "", 0), - Info: log.New(&CLogger{level: 1, interfaceName: interfaceName}, "", 0), - Error: log.New(&CLogger{level: 2, interfaceName: interfaceName}, "", 0), - } - - logger.Debug.Println("Debug log enabled") - - tun := tun.CreateTUN(1280, unsafe.Pointer(readFn), unsafe.Pointer(writeFn), unsafe.Pointer(ctx)) - logger.Info.Println("Attaching to interface") - 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 { - 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 { - 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 wgVersion -func wgVersion() *C.char { - return versionString -} - -func main() {} diff --git a/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/queueconstants.go b/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/queueconstants.go deleted file mode 100644 index 410af14..0000000 --- a/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/queueconstants.go +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 - * - * Copyright (C) 2017-2018 WireGuard LLC. All Rights Reserved. - */ - -package main - -/* Fit within memory limits for iOS */ - -const ( - QueueOutboundSize = 1024 - QueueInboundSize = 1024 - QueueHandshakeSize = 1024 - MaxSegmentSize = 1700 - PreallocatedBuffersPerPool = 1024 -) diff --git a/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/tun/tun_ios.go b/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/tun/tun_ios.go deleted file mode 100644 index 93a0503..0000000 --- a/wireguard-go-bridge/src/git.zx2c4.com/wireguard-go/tun/tun_ios.go +++ /dev/null @@ -1,83 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 - * - * Copyright (C) 2018 Jason A. Donenfeld . All Rights Reserved. - */ - -package tun - -// #include -// static ssize_t callFnWithCtx(const void *func, const void *ctx, const void *buffer, size_t len) -// { -// return ((ssize_t(*)(const void *, const unsigned char *, size_t))func)(ctx, buffer, len); -// } -import "C" - -import ( - "os" - "syscall" - "unsafe" -) - -type nativeTun struct { - events chan TUNEvent - mtu int - readFn unsafe.Pointer - writeFn unsafe.Pointer - ctx unsafe.Pointer -} - -func CreateTUN(mtu int, readFn unsafe.Pointer, writeFn unsafe.Pointer, ctx unsafe.Pointer) TUNDevice { - tun := &nativeTun{ - events: make(chan TUNEvent, 10), - mtu: mtu, - readFn: readFn, - writeFn: writeFn, - ctx: ctx, - } - tun.events <- TUNEventUp - return tun -} - -func (tun *nativeTun) Name() (string, error) { - return "tun", nil -} - -func (tun *nativeTun) File() *os.File { - return nil -} - -func (tun *nativeTun) Events() chan TUNEvent { - return tun.events -} - -func (tun *nativeTun) Read(buff []byte, offset int) (int, error) { - ret := C.callFnWithCtx(tun.readFn, tun.ctx, unsafe.Pointer(&buff[offset]), C.size_t(len(buff) - offset)) - if ret < 0 { - return 0, syscall.Errno(-ret) - } - return int(ret), nil -} - -func (tun *nativeTun) Write(buff []byte, offset int) (int, error) { - ret := C.callFnWithCtx(tun.writeFn, tun.ctx, unsafe.Pointer(&buff[offset]), C.size_t(len(buff) - offset)) - if ret < 0 { - return 0, syscall.Errno(-ret) - } - return int(ret), nil -} - -func (tun *nativeTun) Close() error { - if tun.events != nil { - close(tun.events) - } - return nil -} - -func (tun *nativeTun) setMTU(n int) error { - tun.mtu = n - return nil -} - -func (tun *nativeTun) MTU() (int, error) { - return tun.mtu, nil -} diff --git a/wireguard-go-bridge/src/queueconstants.go b/wireguard-go-bridge/src/queueconstants.go new file mode 100644 index 0000000..410af14 --- /dev/null +++ b/wireguard-go-bridge/src/queueconstants.go @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 + * + * Copyright (C) 2017-2018 WireGuard LLC. All Rights Reserved. + */ + +package main + +/* Fit within memory limits for iOS */ + +const ( + QueueOutboundSize = 1024 + QueueInboundSize = 1024 + QueueHandshakeSize = 1024 + MaxSegmentSize = 1700 + PreallocatedBuffersPerPool = 1024 +) diff --git a/wireguard-go-bridge/src/tun/tun_ios.go b/wireguard-go-bridge/src/tun/tun_ios.go new file mode 100644 index 0000000..93a0503 --- /dev/null +++ b/wireguard-go-bridge/src/tun/tun_ios.go @@ -0,0 +1,83 @@ +/* SPDX-License-Identifier: GPL-2.0 + * + * Copyright (C) 2018 Jason A. Donenfeld . All Rights Reserved. + */ + +package tun + +// #include +// static ssize_t callFnWithCtx(const void *func, const void *ctx, const void *buffer, size_t len) +// { +// return ((ssize_t(*)(const void *, const unsigned char *, size_t))func)(ctx, buffer, len); +// } +import "C" + +import ( + "os" + "syscall" + "unsafe" +) + +type nativeTun struct { + events chan TUNEvent + mtu int + readFn unsafe.Pointer + writeFn unsafe.Pointer + ctx unsafe.Pointer +} + +func CreateTUN(mtu int, readFn unsafe.Pointer, writeFn unsafe.Pointer, ctx unsafe.Pointer) TUNDevice { + tun := &nativeTun{ + events: make(chan TUNEvent, 10), + mtu: mtu, + readFn: readFn, + writeFn: writeFn, + ctx: ctx, + } + tun.events <- TUNEventUp + return tun +} + +func (tun *nativeTun) Name() (string, error) { + return "tun", nil +} + +func (tun *nativeTun) File() *os.File { + return nil +} + +func (tun *nativeTun) Events() chan TUNEvent { + return tun.events +} + +func (tun *nativeTun) Read(buff []byte, offset int) (int, error) { + ret := C.callFnWithCtx(tun.readFn, tun.ctx, unsafe.Pointer(&buff[offset]), C.size_t(len(buff) - offset)) + if ret < 0 { + return 0, syscall.Errno(-ret) + } + return int(ret), nil +} + +func (tun *nativeTun) Write(buff []byte, offset int) (int, error) { + ret := C.callFnWithCtx(tun.writeFn, tun.ctx, unsafe.Pointer(&buff[offset]), C.size_t(len(buff) - offset)) + if ret < 0 { + return 0, syscall.Errno(-ret) + } + return int(ret), nil +} + +func (tun *nativeTun) Close() error { + if tun.events != nil { + close(tun.events) + } + return nil +} + +func (tun *nativeTun) setMTU(n int) error { + tun.mtu = n + return nil +} + +func (tun *nativeTun) MTU() (int, error) { + return tun.mtu, nil +} diff --git a/wireguard-go-bridge/xcode-build-helper.sh b/wireguard-go-bridge/xcode-build-helper.sh deleted file mode 100755 index b5b467d..0000000 --- a/wireguard-go-bridge/xcode-build-helper.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -cd "$PROJECT_DIR"/wireguard-go-bridge -case $1 in - clean) - make clean - ;; - *) - if [ -e "$DERIVED_FILE_DIR/libwg-go.a" ] - then - echo "Clean before building" - else - make - fi - - ;; -esac - -if [ -f "libwg-go.a" ] -then - mkdir -p "$DERIVED_FILE_DIR" - mv *.a "$DERIVED_FILE_DIR" - ln -sf "$DERIVED_FILE_DIR/libwg-go.a" libwg-go.a -fi -- cgit v1.2.3-59-g8ed1b