diff options
| author | 2022-09-21 14:22:33 +0000 | |
|---|---|---|
| committer | 2022-09-21 14:22:33 +0000 | |
| commit | f55958fcfd3ce855455f38aed07325ebae2b2906 (patch) | |
| tree | edcbebbb4a450a5dcf40192ae7a184a684394e5c | |
| parent | 6196e669fb1e416dbfa9c7b32ab308aab61a770c (diff) | |
| parent | fc43b2a00da83fc73c450c5a1fd6150f8b3aae45 (diff) | |
Merge "Disconnect VPN when the underlying network is lost"
| -rw-r--r-- | services/core/java/com/android/server/connectivity/Vpn.java | 69 |
1 files changed, 36 insertions, 33 deletions
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index ff154e463cb6..6a53978175af 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -3210,41 +3210,44 @@ public class Vpn { return; } - if (mSession != null && mMobikeEnabled) { - Log.d( - TAG, - "IKE Session has mobility. Delay handleSessionLost for losing network " - + network - + " on session with token " - + mCurrentToken); - - final int token = mCurrentToken; - // Delay the teardown in case a new network will be available soon. For example, - // during handover between two WiFi networks, Android will disconnect from the - // first WiFi and then connects to the second WiFi. - mScheduledHandleNetworkLostFuture = - mExecutor.schedule( - () -> { - if (isActiveToken(token)) { - handleSessionLost(null /* exception */, network); - } else { - Log.d( - TAG, - "Scheduled handleSessionLost fired for " - + "obsolete token " - + token); + Log.d(TAG, "Schedule a delay handleSessionLost for losing network " + + network + + " on session with token " + + mCurrentToken); + + final int token = mCurrentToken; + // Delay the teardown in case a new network will be available soon. For example, + // during handover between two WiFi networks, Android will disconnect from the + // first WiFi and then connects to the second WiFi. + mScheduledHandleNetworkLostFuture = + mExecutor.schedule( + () -> { + if (isActiveToken(token)) { + handleSessionLost(new IkeNetworkLostException(network), + network); + + synchronized (Vpn.this) { + // Ignore stale runner. + if (mVpnRunner != this) return; + + updateState(DetailedState.DISCONNECTED, + "Network lost"); } + } else { + Log.d( + TAG, + "Scheduled handleSessionLost fired for " + + "obsolete token " + + token); + } + + // Reset mScheduledHandleNetworkLostFuture since it's + // already run on executor thread. + mScheduledHandleNetworkLostFuture = null; + }, + NETWORK_LOST_TIMEOUT_MS, + TimeUnit.MILLISECONDS); - // Reset mScheduledHandleNetworkLostFuture since it's - // already run on executor thread. - mScheduledHandleNetworkLostFuture = null; - }, - NETWORK_LOST_TIMEOUT_MS, - TimeUnit.MILLISECONDS); - } else { - Log.d(TAG, "Call handleSessionLost for losing network " + network); - handleSessionLost(null /* exception */, network); - } } private void cancelHandleNetworkLostTimeout() { |