summaryrefslogtreecommitdiffhomepage
path: root/tunnel
diff options
context:
space:
mode:
Diffstat (limited to 'tunnel')
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/Dhcp.java31
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java31
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/Tunnel.java7
-rw-r--r--tunnel/src/main/java/com/wireguard/config/InetNetwork.java2
4 files changed, 60 insertions, 11 deletions
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/Dhcp.java b/tunnel/src/main/java/com/wireguard/android/backend/Dhcp.java
new file mode 100644
index 00000000..59a3e69c
--- /dev/null
+++ b/tunnel/src/main/java/com/wireguard/android/backend/Dhcp.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2017-2023 WireGuard LLC. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.wireguard.android.backend;
+
+import com.wireguard.config.InetNetwork;
+import com.wireguard.util.NonNullForAll;
+
+import java.util.Set;
+
+/**
+ * Class representing DHCP info for a {@link Tunnel} instance.
+ */
+@NonNullForAll
+public class Dhcp {
+ private Set<InetNetwork> addresses;
+
+ Dhcp(Set<InetNetwork> addresses) {
+ this.addresses = addresses;
+ }
+
+ public Set<InetNetwork> getAddresses() {
+ return addresses;
+ }
+
+ public String toString() {
+ return "DHCP";
+ }
+}
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 cf88aa2a..438bf9e8 100644
--- a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
+++ b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
@@ -74,6 +74,7 @@ import java.net.URL;
import java.time.Instant;
import java.nio.ByteOrder;
import java.util.Collections;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -390,8 +391,23 @@ public final class GoBackend implements Backend {
DhcpResponse resp = stub.dhcp(request);
Log.i(TAG, "Dhcp: " + resp.getError().getMessage());
+ Set<InetNetwork> addresses = new LinkedHashSet<>();
+ if (resp.getLeasesList() != null) {
+ for (final Lease lease: resp.getLeasesList()) {
+ try {
+ InetAddress addr = InetAddress.getByAddress(lease.getAddress().getAddress().toByteArray());
+ Log.i(TAG, "Lease: " + addr);
+ addresses.add(new InetNetwork(addr, 128));
+ } catch (UnknownHostException ex) {
+ // Ignore
+ }
+ }
+ }
+
+ Dhcp dhcp = new Dhcp(addresses);
+
// Replace the vpn tunnel
- final VpnService.Builder builder = getBuilder(currentTunnel.getName(), currentConfig, service, resp.getLeasesList());
+ final VpnService.Builder builder = getBuilder(currentTunnel.getName(), currentConfig, service, dhcp.getAddresses());
Log.i(TAG, "Builder: " + builder);
@@ -408,6 +424,7 @@ public final class GoBackend implements Backend {
service.protect(wgGetSocketV4(currentTunnelHandle));
service.protect(wgGetSocketV6(currentTunnelHandle));
Log.i(TAG, "Dhcp done");
+ currentTunnel.onDhcpChange(dhcp);
}
private int getConnectionOwnerUid(int protocol, InetSocketAddress local, InetSocketAddress remote) {
@@ -492,7 +509,7 @@ public final class GoBackend implements Backend {
Log.i(TAG, "Exit streamReverse");
}
- private VpnService.Builder getBuilder(final String name, @Nullable final Config config, final VpnService service, @Nullable final List<Lease> leases) throws PackageManager.NameNotFoundException {
+ private VpnService.Builder getBuilder(final String name, @Nullable final Config config, final VpnService service, @Nullable final Set<InetNetwork> leases) throws PackageManager.NameNotFoundException {
Log.i(TAG, "Builder 1");
final VpnService.Builder builder = service.getBuilder();
Log.i(TAG, "Builder 2");
@@ -508,14 +525,8 @@ public final class GoBackend implements Backend {
Log.i(TAG, "Builder 5");
if (leases != null) {
- for (final Lease lease: leases) {
- try {
- InetAddress addr = InetAddress.getByAddress(lease.getAddress().getAddress().toByteArray());
- Log.i(TAG, "Lease: " + addr);
- builder.addAddress(addr, 128);
- } catch (UnknownHostException ex) {
- // Ignore
- }
+ for (final InetNetwork lease: leases) {
+ builder.addAddress(lease.getAddress(), lease.getMask());
}
}
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/Tunnel.java b/tunnel/src/main/java/com/wireguard/android/backend/Tunnel.java
index 1a67a530..fc94375b 100644
--- a/tunnel/src/main/java/com/wireguard/android/backend/Tunnel.java
+++ b/tunnel/src/main/java/com/wireguard/android/backend/Tunnel.java
@@ -61,6 +61,13 @@ public interface Tunnel {
}
}
+ /**
+ * React to a change of DHCP of the tunnel. Should only be directly called by Backend.
+ *
+ * @param newDhcp The new DHCP info of the tunnel.
+ */
+ void onDhcpChange(Dhcp newDhcp);
+
void onEndpointChange(Key publicKey, @Nullable InetEndpoint newEndpoint);
void onAllowedIpsChange(Key publicKey, @Nullable List<InetNetwork> addNetworks, @Nullable List<InetNetwork> removeNetworks);
diff --git a/tunnel/src/main/java/com/wireguard/config/InetNetwork.java b/tunnel/src/main/java/com/wireguard/config/InetNetwork.java
index 4a918044..02ccd946 100644
--- a/tunnel/src/main/java/com/wireguard/config/InetNetwork.java
+++ b/tunnel/src/main/java/com/wireguard/config/InetNetwork.java
@@ -20,7 +20,7 @@ public final class InetNetwork {
private final InetAddress address;
private final int mask;
- private InetNetwork(final InetAddress address, final int mask) {
+ public InetNetwork(final InetAddress address, final int mask) {
this.address = address;
this.mask = mask;
}