From b42b8d0502da83f0c199f6efe818d1619fb9f70c Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Mon, 19 Jun 2023 22:07:07 +0200 Subject: WIP: Delay DHCP renew until VPN network available --- .../com/wireguard/android/backend/GoBackend.java | 42 +++++++++++++++++----- 1 file changed, 33 insertions(+), 9 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 11928d46..79b724e8 100644 --- a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java +++ b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java @@ -434,6 +434,7 @@ public final class GoBackend implements Backend { Log.i(TAG, "Dhcp: " + resp.getError().getMessage()); Dhcp dhcp = new Dhcp(); + long delayMillis = 1000 * 3600 * 12; // Max renew 12h if (resp.getLeasesList() != null) { for (final Lease lease: resp.getLeasesList()) { @@ -443,6 +444,8 @@ public final class GoBackend implements Backend { dhcp.addLease(new InetNetwork(addr, 128), Duration.ofSeconds(lease.getValidLifetime().getSeconds(), lease.getValidLifetime().getNanos()), Duration.ofSeconds(lease.getPreferredLifetime().getSeconds(), lease.getPreferredLifetime().getNanos())); + long leaseDelayMillis = lease.getValidLifetime().getSeconds() * 1000 + lease.getValidLifetime().getNanos() / 1000; + delayMillis = Math.min(delayMillis, leaseDelayMillis); } catch (UnknownHostException ex) { // Ignore } @@ -468,11 +471,8 @@ public final class GoBackend implements Backend { service.protect(wgGetSocketV6(currentTunnelHandle)); Log.i(TAG, "Dhcp done"); - // TODO fetch expiration time from Dhcp leases - long delayMillis = 1000 * 3600 * 12; // Renew 3/4 * 12h - //long delayMillis = lease.getValidLifetime().getSeconds() * 1000 + lease.getValidLifetime().getNanos() / 1000; - AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); + am.cancel(alarmListener); am.setWindow(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + delayMillis * 3 / 4, delayMillis / 4, null, alarmListener, handler); if (bgp != null) { @@ -682,7 +682,11 @@ public final class GoBackend implements Backend { activeNetwork = connectivityManager.getActiveNetwork(); - if (!connectivityManager.getNetworkCapabilities(activeNetwork).hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)) { + if (activeNetwork == null) { + Log.w(TAG, "Null activeNetwork"); + activeNetwork = null; + } + else if (!connectivityManager.getNetworkCapabilities(activeNetwork).hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)) { Log.w(TAG, "VPN network is active, null activeNetwork"); activeNetwork = null; } @@ -737,10 +741,16 @@ public final class GoBackend implements Backend { public void handleMessage(Message msg) { switch (msg.what) { case MSG_DHCP_EXPIRE: + Log.w(TAG, "DHCP expire: " + ((activeNetwork != null) ? activeNetwork : "disabled")); try { - Log.w(TAG, "Before Dhcp"); - Dhcp(service); // Renew addresses - Log.w(TAG, "After Dhcp"); + if (activeNetwork != null) { + Log.w(TAG, "DHCP before"); + Dhcp(service); // Renew addresses + Log.w(TAG, "DHCP after"); + } else { + Log.w(TAG, "DHCP delay obtain lease"); + obtainDhcpLease = true; + } } catch (Exception ex) { Log.e(TAG, "DHCP failed: " + ex); } @@ -907,7 +917,7 @@ public final class GoBackend implements Backend { @Override public void onAvailable(Network network) { Log.w(TAG, "VPN onAvailable: " + network); - if (obtainDhcpLease) { + if (obtainDhcpLease && activeNetwork != null) { Log.w(TAG, "Obtaindhcplease"); try { Log.w(TAG, "Before Dhcp"); @@ -927,6 +937,20 @@ public final class GoBackend implements Backend { Log.w(TAG, "onAvailable: " + activeNetwork); } + @Override + public void onLosing(Network network, int maxMsToLive) { + Log.w(TAG, "onLosing: " + network + " maxMsToLive: " + maxMsToLive); + // TODO release DHCP? + } + + @Override + public void onLost(Network network) { + Log.w(TAG, "onLost: " + network + " (" + activeNetwork + ")"); + if (network.equals(activeNetwork)) { + activeNetwork = null; + } + } + @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { Log.w(TAG, "onLinkPropertiesChanged: " + network + " is default:" + (network.equals(activeNetwork))); -- cgit v1.2.3