summaryrefslogtreecommitdiffhomepage
path: root/tunnel/src/main/java
diff options
context:
space:
mode:
authorMikael Magnusson <mikma@users.sourceforge.net>2021-11-12 03:25:53 +0100
committerMikael Magnusson <mikma@users.sourceforge.net>2022-03-18 22:05:31 +0100
commitd8cb7dc666b782b34eff028a0150839a03dd3990 (patch)
tree8b2d7e56ab5e56fafc4b858f4c61c332ad742937 /tunnel/src/main/java
parentd5fffc635b9736808e0227693f1f461755381e14 (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.java19
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);