diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-02-07 19:19:20 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-02-17 21:14:09 +0100 |
commit | 0ea6f73332cf48374b8a98b16d68e25217ebf068 (patch) | |
tree | 53694268b30823c8973d6ae280ed766f4b44b974 /app/tools/libwg-go/api-android.go | |
parent | b923f7bc57c39687bed225badeac0b35a7dee855 (diff) |
GoBackend: integrate into app
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'app/tools/libwg-go/api-android.go')
-rw-r--r-- | app/tools/libwg-go/api-android.go | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/app/tools/libwg-go/api-android.go b/app/tools/libwg-go/api-android.go new file mode 100644 index 00000000..b2e3da17 --- /dev/null +++ b/app/tools/libwg-go/api-android.go @@ -0,0 +1,111 @@ +package main + +// #cgo LDFLAGS: -llog +// #include <android/log.h> +import "C" + +import ( + "bufio" + "io/ioutil" + "log" + "math" + "os" + "strings" +) + +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) +} + +//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), ""), + events: make(chan TUNEvent, 5), + errors: make(chan error, 5), + } + device := NewDevice(tun, logger) + device.tun.mtu = DefaultMTU //TODO: make dynamic + + bufferedSettings := bufio.NewReadWriter(bufio.NewReader(strings.NewReader(settings)), bufio.NewWriter(ioutil.Discard)) + setError := ipcSetOperation(device, bufferedSettings) + if setError != nil { + logger.Debug.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 wgGetSocketV4 +func wgGetSocketV4(tunnelHandle int32) int32 { + device, ok := tunnelHandles[tunnelHandle] + if !ok { + return -1 + } + native, ok := device.net.bind.(NativeBind) + if !ok { + return -1 + } + return int32(native.sock4) +} + +//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 + } + return int32(native.sock6) +} + +func main() {} |