libwg-go: reenable sticky sockets, just slightly less sticky

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld
2018-05-24 18:39:29 +02:00
parent 5754df6b71
commit 23c4174fcd
4 changed files with 54 additions and 23 deletions
@@ -85,6 +85,7 @@ func wgTurnOn(ifnameRef string, tun_fd int32, settings string) int32 {
}
device.Up()
device.net.bind.(*NativeBind).clearSourceOnAllRouteChanges = true
logger.Info.Println("Device started")
var i int32
@@ -121,18 +122,7 @@ func wgGetSocketV4(tunnelHandle int32) int32 {
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
return int32(native.sock4)
}
//export wgGetSocketV6
@@ -145,18 +135,41 @@ func wgGetSocketV6(tunnelHandle int32) int32 {
if !ok {
return -1
}
fd := int32(-1)
conn, err := native.ipv6.SyscallConn()
if err != nil {
return -1
return int32(native.sock6)
}
//export wgPutSocketV4
func wgPutSocketV4(tunnelHandle int32) {
device, ok := tunnelHandles[tunnelHandle]
if !ok {
return
}
err = conn.Control(func(f uintptr) {
fd = int32(f)
})
if err != nil {
return -1
native, ok := device.net.bind.(*NativeBind)
if !ok {
return
}
fwmark, err := unix.GetsockoptInt(native.sock6, unix.SOL_SOCKET, unix.SO_MARK)
if err == nil {
native.lastMark = uint32(fwmark)
device.net.fwmark = uint32(fwmark)
}
}
//export wgPutSocketV6
func wgPutSocketV6(tunnelHandle int32) {
device, ok := tunnelHandles[tunnelHandle]
if !ok {
return
}
native, ok := device.net.bind.(*NativeBind)
if !ok {
return
}
fwmark, err := unix.GetsockoptInt(native.sock6, unix.SOL_SOCKET, unix.SO_MARK)
if err == nil {
native.lastMark = uint32(fwmark)
device.net.fwmark = uint32(fwmark)
}
return fd
}
func main() {}
@@ -10,6 +10,8 @@ extern int wgTurnOn(struct go_string ifname, int tun_fd, struct go_string settin
extern void wgTurnOff(int handle);
extern int wgGetSocketV4(int handle);
extern int wgGetSocketV6(int handle);
extern void wgPutSocketV4(int handle);
extern void wgPutSocketV6(int handle);
JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgTurnOn(JNIEnv *env, jclass c, jstring ifname, jint tun_fd, jstring settings)
{
@@ -43,3 +45,13 @@ JNIEXPORT jint JNICALL Java_com_wireguard_android_backend_GoBackend_wgGetSocketV
{
return wgGetSocketV6(handle);
}
JNIEXPORT void JNICALL Java_com_wireguard_android_backend_GoBackend_wgPutSocketV4(JNIEnv *env, jclass c, jint handle)
{
wgPutSocketV4(handle);
}
JNIEXPORT void JNICALL Java_com_wireguard_android_backend_GoBackend_wgPutSocketV6(JNIEnv *env, jclass c, jint handle)
{
wgPutSocketV6(handle);
}