Merge "Minor cleanups in VPN"

This commit is contained in:
Yan Yan
2022-06-22 20:35:05 +00:00
committed by Gerrit Code Review

View File

@@ -2712,8 +2712,8 @@ public class Vpn {
*/ */
@NonNull private final ScheduledThreadPoolExecutor mExecutor; @NonNull private final ScheduledThreadPoolExecutor mExecutor;
@Nullable private ScheduledFuture<?> mScheduledHandleNetworkLostTimeout; @Nullable private ScheduledFuture<?> mScheduledHandleNetworkLostFuture;
@Nullable private ScheduledFuture<?> mScheduledHandleRetryIkeSessionTimeout; @Nullable private ScheduledFuture<?> mScheduledHandleRetryIkeSessionFuture;
/** Signal to ensure shutdown is honored even if a new Network is connected. */ /** Signal to ensure shutdown is honored even if a new Network is connected. */
private boolean mIsRunning = true; private boolean mIsRunning = true;
@@ -2955,6 +2955,8 @@ public class Vpn {
} }
try { try {
mTunnelIface.setUnderlyingNetwork(mIkeConnectionInfo.getNetwork());
// Transforms do not need to be persisted; the IkeSession will keep // Transforms do not need to be persisted; the IkeSession will keep
// them alive for us // them alive for us
mIpSecManager.applyTunnelModeTransform(mTunnelIface, direction, transform); mIpSecManager.applyTunnelModeTransform(mTunnelIface, direction, transform);
@@ -3136,13 +3138,13 @@ public class Vpn {
// If the default network is lost during the retry delay, the mActiveNetwork will be // If the default network is lost during the retry delay, the mActiveNetwork will be
// null, and the new IKE session won't be established until there is a new default // null, and the new IKE session won't be established until there is a new default
// network bringing up. // network bringing up.
mScheduledHandleRetryIkeSessionTimeout = mScheduledHandleRetryIkeSessionFuture =
mExecutor.schedule(() -> { mExecutor.schedule(() -> {
startOrMigrateIkeSession(mActiveNetwork); startOrMigrateIkeSession(mActiveNetwork);
// Reset mScheduledHandleRetryIkeSessionTimeout since it's already run on // Reset mScheduledHandleRetryIkeSessionFuture since it's already run on
// executor thread. // executor thread.
mScheduledHandleRetryIkeSessionTimeout = null; mScheduledHandleRetryIkeSessionFuture = null;
}, retryDelay, TimeUnit.SECONDS); }, retryDelay, TimeUnit.SECONDS);
} }
@@ -3185,12 +3187,10 @@ public class Vpn {
mActiveNetwork = null; mActiveNetwork = null;
} }
if (mScheduledHandleNetworkLostTimeout != null if (mScheduledHandleNetworkLostFuture != null) {
&& !mScheduledHandleNetworkLostTimeout.isCancelled()
&& !mScheduledHandleNetworkLostTimeout.isDone()) {
final IllegalStateException exception = final IllegalStateException exception =
new IllegalStateException( new IllegalStateException(
"Found a pending mScheduledHandleNetworkLostTimeout"); "Found a pending mScheduledHandleNetworkLostFuture");
Log.i( Log.i(
TAG, TAG,
"Unexpected error in onDefaultNetworkLost. Tear down session", "Unexpected error in onDefaultNetworkLost. Tear down session",
@@ -3207,13 +3207,26 @@ public class Vpn {
+ " on session with token " + " on session with token "
+ mCurrentToken); + mCurrentToken);
final int token = mCurrentToken;
// Delay the teardown in case a new network will be available soon. For example, // 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 // during handover between two WiFi networks, Android will disconnect from the
// first WiFi and then connects to the second WiFi. // first WiFi and then connects to the second WiFi.
mScheduledHandleNetworkLostTimeout = mScheduledHandleNetworkLostFuture =
mExecutor.schedule( mExecutor.schedule(
() -> { () -> {
handleSessionLost(null, network); if (isActiveToken(token)) {
handleSessionLost(null, network);
} 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, NETWORK_LOST_TIMEOUT_MS,
TimeUnit.MILLISECONDS); TimeUnit.MILLISECONDS);
@@ -3224,28 +3237,26 @@ public class Vpn {
} }
private void cancelHandleNetworkLostTimeout() { private void cancelHandleNetworkLostTimeout() {
if (mScheduledHandleNetworkLostTimeout != null if (mScheduledHandleNetworkLostFuture != null) {
&& !mScheduledHandleNetworkLostTimeout.isDone()) {
// It does not matter what to put in #cancel(boolean), because it is impossible // It does not matter what to put in #cancel(boolean), because it is impossible
// that the task tracked by mScheduledHandleNetworkLostTimeout is // that the task tracked by mScheduledHandleNetworkLostFuture is
// in-progress since both that task and onDefaultNetworkChanged are submitted to // in-progress since both that task and onDefaultNetworkChanged are submitted to
// mExecutor who has only one thread. // mExecutor who has only one thread.
Log.d(TAG, "Cancel the task for handling network lost timeout"); Log.d(TAG, "Cancel the task for handling network lost timeout");
mScheduledHandleNetworkLostTimeout.cancel(false /* mayInterruptIfRunning */); mScheduledHandleNetworkLostFuture.cancel(false /* mayInterruptIfRunning */);
mScheduledHandleNetworkLostTimeout = null; mScheduledHandleNetworkLostFuture = null;
} }
} }
private void cancelRetryNewIkeSessionFuture() { private void cancelRetryNewIkeSessionFuture() {
if (mScheduledHandleRetryIkeSessionTimeout != null if (mScheduledHandleRetryIkeSessionFuture != null) {
&& !mScheduledHandleRetryIkeSessionTimeout.isDone()) {
// It does not matter what to put in #cancel(boolean), because it is impossible // It does not matter what to put in #cancel(boolean), because it is impossible
// that the task tracked by mScheduledHandleRetryIkeSessionTimeout is // that the task tracked by mScheduledHandleRetryIkeSessionFuture is
// in-progress since both that task and onDefaultNetworkChanged are submitted to // in-progress since both that task and onDefaultNetworkChanged are submitted to
// mExecutor who has only one thread. // mExecutor who has only one thread.
Log.d(TAG, "Cancel the task for handling new ike session timeout"); Log.d(TAG, "Cancel the task for handling new ike session timeout");
mScheduledHandleRetryIkeSessionTimeout.cancel(false /* mayInterruptIfRunning */); mScheduledHandleRetryIkeSessionFuture.cancel(false /* mayInterruptIfRunning */);
mScheduledHandleRetryIkeSessionTimeout = null; mScheduledHandleRetryIkeSessionFuture = null;
} }
} }
@@ -3285,7 +3296,7 @@ public class Vpn {
} }
private void handleSessionLost(@Nullable Exception exception, @Nullable Network network) { private void handleSessionLost(@Nullable Exception exception, @Nullable Network network) {
// Cancel mScheduledHandleNetworkLostTimeout if the session it is going to terminate is // Cancel mScheduledHandleNetworkLostFuture if the session it is going to terminate is
// already terminated due to other failures. // already terminated due to other failures.
cancelHandleNetworkLostTimeout(); cancelHandleNetworkLostTimeout();