diff options
author | Mikael Magnusson <mikma@users.sourceforge.net> | 2021-11-12 03:25:53 +0100 |
---|---|---|
committer | Mikael Magnusson <mikma@users.sourceforge.net> | 2022-03-18 22:05:31 +0100 |
commit | d8cb7dc666b782b34eff028a0150839a03dd3990 (patch) | |
tree | 8b2d7e56ab5e56fafc4b858f4c61c332ad742937 /tunnel/src/main/java | |
parent | d5fffc635b9736808e0227693f1f461755381e14 (diff) |
tunnel: use gvisor tcpip stack
Configure a stack with two interfaces a tun device connected to Android,
and a WireGuard device connected to the Internet.
Limitation: Only one IPv4 and one IPv6 address is supported currently.
This is a first step towards supporting more advanced scenarios, such as
a per app proxy setting, achieved with a transparent proxy (using goproxy).
Diffstat (limited to 'tunnel/src/main/java')
-rw-r--r-- | tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java index 575f6537..0c368b42 100644 --- a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java +++ b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java @@ -36,6 +36,8 @@ import io.grpc.okhttp.OkHttpChannelBuilder; import io.grpc.stub.StreamObserver; import java.io.File; +import java.net.Inet4Address; +import java.net.Inet6Address; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; @@ -133,7 +135,7 @@ public final class GoBackend implements Backend { private static native void wgTurnOff(int handle); - private static native int wgTurnOn(String ifName, int tunFd, String settings); + private static native int wgTurnOn(String ifName, int tunFd, String settings, String addrIp4, String addrIp6); private static native String wgVersion(); @@ -439,15 +441,24 @@ public final class GoBackend implements Backend { final VpnService.Builder builder = service.getBuilder(); builder.setSession(tunnel.getName()); + InetAddress addrIP4 = null; + InetAddress addrIP6 = null; + for (final String excludedApplication : config.getInterface().getExcludedApplications()) builder.addDisallowedApplication(excludedApplication); for (final String includedApplication : config.getInterface().getIncludedApplications()) builder.addAllowedApplication(includedApplication); - for (final InetNetwork addr : config.getInterface().getAddresses()) + for (final InetNetwork addr : config.getInterface().getAddresses()) { builder.addAddress(addr.getAddress(), addr.getMask()); - + InetAddress ip = addr.getAddress(); + if (ip instanceof Inet4Address) { + addrIP4 = ip; + } else if (ip instanceof Inet6Address) { + addrIP6 = ip; + } + } for (final InetAddress addr : config.getInterface().getDnsServers()) builder.addDnsServer(addr.getHostAddress()); @@ -487,7 +498,7 @@ public final class GoBackend implements Backend { if (tun == null) throw new BackendException(Reason.TUN_CREATION_ERROR); Log.d(TAG, "Go backend " + wgVersion()); - currentTunnelHandle = wgTurnOn(tunnel.getName(), tun.detachFd(), goConfig); + currentTunnelHandle = turnOn(tunnel.getName(), tun.detachFd(), goConfig, config.getInterface().getAddresses()); } if (currentTunnelHandle < 0) throw new BackendException(Reason.GO_ACTIVATION_ERROR_CODE, currentTunnelHandle); |