tools: let wg(8) play with userspace implementation
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
7689905c78
commit
8028d708cb
@ -21,6 +21,7 @@ add_custom_target(libwg-go.so WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib
|
|||||||
ANDROID_TOOLCHAIN_ROOT=${ANDROID_TOOLCHAIN_ROOT}
|
ANDROID_TOOLCHAIN_ROOT=${ANDROID_TOOLCHAIN_ROOT}
|
||||||
ANDROID_LLVM_TRIPLE=${ANDROID_LLVM_TRIPLE}
|
ANDROID_LLVM_TRIPLE=${ANDROID_LLVM_TRIPLE}
|
||||||
ANDROID_SYSROOT=${ANDROID_SYSROOT}
|
ANDROID_SYSROOT=${ANDROID_SYSROOT}
|
||||||
|
ANDROID_PACKAGE_NAME=${ANDROID_PACKAGE_NAME}
|
||||||
CFLAGS=${CMAKE_C_FLAGS}\ -Wno-unused-command-line-argument
|
CFLAGS=${CMAKE_C_FLAGS}\ -Wno-unused-command-line-argument
|
||||||
LDFLAGS=${CMAKE_SHARED_LINKER_FLAGS}\ -fuse-ld=gold
|
LDFLAGS=${CMAKE_SHARED_LINKER_FLAGS}\ -fuse-ld=gold
|
||||||
DESTDIR=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
|
DESTDIR=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
|
||||||
|
@ -54,5 +54,5 @@ $(DESTDIR)/libwg-go.so: $(FILES) src/git.zx2c4.com/wireguard-go/api-android.go s
|
|||||||
mkdir -p $(subst ../wireguard-go/,./src/git.zx2c4.com/wireguard-go/,$(dir $(FILES)))
|
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);)
|
$(foreach FILE,$(FILES),ln -sfrt $(subst ../wireguard-go/,./src/git.zx2c4.com/wireguard-go/,$(dir $(FILE))) $(FILE);)
|
||||||
GOPATH=$(PWD) go get -v -d git.zx2c4.com/wireguard-go
|
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
|
GOPATH=$(PWD) go build -ldflags="-X main.socketDirectory=/data/data/$(ANDROID_PACKAGE_NAME)/cache/wireguard" -v -o $(DESTDIR)/libwg-go.so -buildmode c-shared git.zx2c4.com/wireguard-go
|
||||||
go version > .gobuildversion
|
go version > .gobuildversion
|
||||||
|
@ -16,6 +16,7 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"runtime"
|
"runtime"
|
||||||
@ -33,11 +34,16 @@ func (l AndroidLogger) Write(p []byte) (int, error) {
|
|||||||
return len(p), nil
|
return len(p), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var tunnelHandles map[int32]*Device
|
type TunnelHandle struct {
|
||||||
|
device *Device
|
||||||
|
uapi net.Listener
|
||||||
|
}
|
||||||
|
|
||||||
|
var tunnelHandles map[int32]TunnelHandle
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
roamingDisabled = true
|
roamingDisabled = true
|
||||||
tunnelHandles = make(map[int32]*Device)
|
tunnelHandles = make(map[int32]TunnelHandle)
|
||||||
signals := make(chan os.Signal)
|
signals := make(chan os.Signal)
|
||||||
signal.Notify(signals, unix.SIGUSR2)
|
signal.Notify(signals, unix.SIGUSR2)
|
||||||
go func() {
|
go func() {
|
||||||
@ -85,6 +91,29 @@ func wgTurnOn(ifnameRef string, tun_fd int32, settings string) int32 {
|
|||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uapiFile, err := UAPIOpen(name)
|
||||||
|
if err != nil {
|
||||||
|
unix.Close(int(tun_fd))
|
||||||
|
logger.Error.Println(err)
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
uapi, err := UAPIListen(name, uapiFile)
|
||||||
|
if err != nil {
|
||||||
|
uapiFile.Close()
|
||||||
|
unix.Close(int(tun_fd))
|
||||||
|
logger.Error.Println(err)
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
conn, err := uapi.Accept()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go ipcHandle(device, conn)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
device.Up()
|
device.Up()
|
||||||
logger.Info.Println("Device started")
|
logger.Info.Println("Device started")
|
||||||
|
|
||||||
@ -98,27 +127,28 @@ func wgTurnOn(ifnameRef string, tun_fd int32, settings string) int32 {
|
|||||||
unix.Close(int(tun_fd))
|
unix.Close(int(tun_fd))
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
tunnelHandles[i] = device
|
tunnelHandles[i] = TunnelHandle{device: device, uapi: uapi}
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
||||||
//export wgTurnOff
|
//export wgTurnOff
|
||||||
func wgTurnOff(tunnelHandle int32) {
|
func wgTurnOff(tunnelHandle int32) {
|
||||||
device, ok := tunnelHandles[tunnelHandle]
|
handle, ok := tunnelHandles[tunnelHandle]
|
||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
delete(tunnelHandles, tunnelHandle)
|
delete(tunnelHandles, tunnelHandle)
|
||||||
device.Close()
|
handle.uapi.Close()
|
||||||
|
handle.device.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
//export wgGetSocketV4
|
//export wgGetSocketV4
|
||||||
func wgGetSocketV4(tunnelHandle int32) int32 {
|
func wgGetSocketV4(tunnelHandle int32) int32 {
|
||||||
device, ok := tunnelHandles[tunnelHandle]
|
handle, ok := tunnelHandles[tunnelHandle]
|
||||||
if !ok {
|
if !ok {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
native, ok := device.net.bind.(*NativeBind)
|
native, ok := handle.device.net.bind.(*NativeBind)
|
||||||
if !ok {
|
if !ok {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
@ -138,11 +168,11 @@ func wgGetSocketV4(tunnelHandle int32) int32 {
|
|||||||
|
|
||||||
//export wgGetSocketV6
|
//export wgGetSocketV6
|
||||||
func wgGetSocketV6(tunnelHandle int32) int32 {
|
func wgGetSocketV6(tunnelHandle int32) int32 {
|
||||||
device, ok := tunnelHandles[tunnelHandle]
|
handle, ok := tunnelHandles[tunnelHandle]
|
||||||
if !ok {
|
if !ok {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
native, ok := device.net.bind.(*NativeBind)
|
native, ok := handle.device.net.bind.(*NativeBind)
|
||||||
if !ok {
|
if !ok {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 6b3b1c3b918fcb9bbf1d876ad6d58c38932a2469
|
Subproject commit 3ad3e83c7aea762c7030b7aa7485f48083d7d9a9
|
Loading…
Reference in New Issue
Block a user