Merge "Tidy up VPN code" am: 147ce8dbf9 am: 89f9b1c2af

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2157796

Change-Id: I6964cae4a3de35b032ebacccdbb19f6de6bf08a0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Lucas Lin
2022-08-02 08:44:33 +00:00
committed by Automerger Merge Worker

View File

@@ -222,6 +222,11 @@ public class Vpn {
*/ */
private static final int VPN_DEFAULT_SCORE = 101; private static final int VPN_DEFAULT_SCORE = 101;
/**
* The initial token value of IKE session.
*/
private static final int STARTING_TOKEN = -1;
// TODO: create separate trackers for each unique VPN to support // TODO: create separate trackers for each unique VPN to support
// automated reconnection // automated reconnection
@@ -785,7 +790,7 @@ public class Vpn {
} }
} }
private boolean isVpnApp(String packageName) { private static boolean isVpnApp(String packageName) {
return packageName != null && !VpnConfig.LEGACY_VPN.equals(packageName); return packageName != null && !VpnConfig.LEGACY_VPN.equals(packageName);
} }
@@ -2589,7 +2594,7 @@ public class Vpn {
} }
@Nullable @Nullable
protected synchronized NetworkCapabilities getRedactedNetworkCapabilitiesOfUnderlyingNetwork( private synchronized NetworkCapabilities getRedactedNetworkCapabilities(
NetworkCapabilities nc) { NetworkCapabilities nc) {
if (nc == null) return null; if (nc == null) return null;
return mConnectivityManager.getRedactedNetworkCapabilitiesForPackage( return mConnectivityManager.getRedactedNetworkCapabilitiesForPackage(
@@ -2597,8 +2602,7 @@ public class Vpn {
} }
@Nullable @Nullable
protected synchronized LinkProperties getRedactedLinkPropertiesOfUnderlyingNetwork( private synchronized LinkProperties getRedactedLinkProperties(LinkProperties lp) {
LinkProperties lp) {
if (lp == null) return null; if (lp == null) return null;
return mConnectivityManager.getRedactedLinkPropertiesForPackage(lp, mOwnerUID, mPackage); return mConnectivityManager.getRedactedLinkPropertiesForPackage(lp, mOwnerUID, mPackage);
} }
@@ -2712,11 +2716,13 @@ public class Vpn {
private boolean mIsRunning = true; private boolean mIsRunning = true;
/** /**
* The token used by the primary/current/active IKE session. * The token that identifies the most recently created IKE session.
* *
* <p>This token MUST be updated when the VPN switches to use a new IKE session. * <p>This token is monotonically increasing and will never be reset in the lifetime of this
* Ikev2VpnRunner, but it does get reset across runs. It also MUST be accessed on the
* executor thread and updated when a new IKE session is created.
*/ */
private int mCurrentToken = -1; private int mCurrentToken = STARTING_TOKEN;
@Nullable private IpSecTunnelInterface mTunnelIface; @Nullable private IpSecTunnelInterface mTunnelIface;
@Nullable private Network mActiveNetwork; @Nullable private Network mActiveNetwork;
@@ -3208,7 +3214,7 @@ public class Vpn {
mExecutor.schedule( mExecutor.schedule(
() -> { () -> {
if (isActiveToken(token)) { if (isActiveToken(token)) {
handleSessionLost(null, network); handleSessionLost(null /* exception */, network);
} else { } else {
Log.d( Log.d(
TAG, TAG,
@@ -3225,7 +3231,7 @@ public class Vpn {
TimeUnit.MILLISECONDS); TimeUnit.MILLISECONDS);
} else { } else {
Log.d(TAG, "Call handleSessionLost for losing network " + network); Log.d(TAG, "Call handleSessionLost for losing network " + network);
handleSessionLost(null, network); handleSessionLost(null /* exception */, network);
} }
} }
@@ -3293,10 +3299,15 @@ public class Vpn {
// already terminated due to other failures. // already terminated due to other failures.
cancelHandleNetworkLostTimeout(); cancelHandleNetworkLostTimeout();
synchronized (Vpn.this) {
String category = null; String category = null;
int errorClass = -1; int errorClass = -1;
int errorCode = -1; int errorCode = -1;
if (exception instanceof IllegalArgumentException) {
// Failed to build IKE/ChildSessionParams; fatal profile configuration error
markFailedAndDisconnect(exception);
return;
}
if (exception instanceof IkeProtocolException) { if (exception instanceof IkeProtocolException) {
final IkeProtocolException ikeException = (IkeProtocolException) exception; final IkeProtocolException ikeException = (IkeProtocolException) exception;
category = VpnManager.CATEGORY_EVENT_IKE_ERROR; category = VpnManager.CATEGORY_EVENT_IKE_ERROR;
@@ -3314,13 +3325,8 @@ public class Vpn {
break; break;
// All other cases possibly recoverable. // All other cases possibly recoverable.
default: default:
// All the above failures are configuration errors, and are terminal
errorClass = VpnManager.ERROR_CLASS_RECOVERABLE; errorClass = VpnManager.ERROR_CLASS_RECOVERABLE;
} }
} else if (exception instanceof IllegalArgumentException) {
// Failed to build IKE/ChildSessionParams; fatal profile configuration error
markFailedAndDisconnect(exception);
return;
} else if (exception instanceof IkeNetworkLostException) { } else if (exception instanceof IkeNetworkLostException) {
category = VpnManager.CATEGORY_EVENT_NETWORK_ERROR; category = VpnManager.CATEGORY_EVENT_NETWORK_ERROR;
errorClass = VpnManager.ERROR_CLASS_RECOVERABLE; errorClass = VpnManager.ERROR_CLASS_RECOVERABLE;
@@ -3339,16 +3345,16 @@ public class Vpn {
Log.wtf(TAG, "onSessionLost: exception = " + exception); Log.wtf(TAG, "onSessionLost: exception = " + exception);
} }
synchronized (Vpn.this) {
// TODO(b/230548427): Remove SDK check once VPN related stuff are // TODO(b/230548427): Remove SDK check once VPN related stuff are
// decoupled from ConnectivityServiceTest. // decoupled from ConnectivityServiceTest.
if (SdkLevel.isAtLeastT() && category != null && isVpnApp(mPackage)) { if (SdkLevel.isAtLeastT() && category != null && isVpnApp(mPackage)) {
sendEventToVpnManagerApp(category, errorClass, errorCode, sendEventToVpnManagerApp(category, errorClass, errorCode,
getPackage(), mSessionKey, makeVpnProfileStateLocked(), getPackage(), mSessionKey, makeVpnProfileStateLocked(),
mActiveNetwork, mActiveNetwork,
getRedactedNetworkCapabilitiesOfUnderlyingNetwork( getRedactedNetworkCapabilities(mUnderlyingNetworkCapabilities),
mUnderlyingNetworkCapabilities), getRedactedLinkProperties(mUnderlyingLinkProperties));
getRedactedLinkPropertiesOfUnderlyingNetwork( }
mUnderlyingLinkProperties));
} }
if (errorClass == VpnManager.ERROR_CLASS_NOT_RECOVERABLE) { if (errorClass == VpnManager.ERROR_CLASS_NOT_RECOVERABLE) {
@@ -3357,7 +3363,6 @@ public class Vpn {
} else { } else {
scheduleRetryNewIkeSession(); scheduleRetryNewIkeSession();
} }
}
mUnderlyingNetworkCapabilities = null; mUnderlyingNetworkCapabilities = null;
mUnderlyingLinkProperties = null; mUnderlyingLinkProperties = null;