summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author lucaslin <lucaslin@google.com> 2022-08-02 18:55:07 +0800
committer Lucas Lin <lucaslin@google.com> 2022-09-08 03:35:23 +0000
commit85362a4b17f2d848ba8b9ece074e27692851a3e7 (patch)
treed3a6b116105d669fba05146c766106449bfda7f0
parenta7aa18c159238b2df10e5af586a4065104e2ef6d (diff)
Improve the code of handleSessionLost()
Bug: 229350078 Test: atest FrameworksNetTests:VpnTest Change-Id: Ia5fee854fb6017c08b7b7fb7ad666eed9a932195 (cherry picked from commit 8c37a315ff957ffbd09265ffa4acfa7cca497c1e) Merged-In: Ia5fee854fb6017c08b7b7fb7ad666eed9a932195
-rw-r--r--services/core/java/com/android/server/connectivity/Vpn.java115
1 files changed, 34 insertions, 81 deletions
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index fd607c38fe08..7754949ef61f 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -3315,8 +3315,13 @@ public class Vpn {
// Ignore stale runner.
if (mVpnRunner != this) return;
+ String category = null;
+ int errorClass = -1;
+ int errorCode = -1;
if (exception instanceof IkeProtocolException) {
final IkeProtocolException ikeException = (IkeProtocolException) exception;
+ category = VpnManager.CATEGORY_EVENT_IKE_ERROR;
+ errorCode = ikeException.getErrorType();
switch (ikeException.getErrorType()) {
case IkeProtocolException.ERROR_TYPE_NO_PROPOSAL_CHOSEN: // Fallthrough
@@ -3326,105 +3331,53 @@ public class Vpn {
case IkeProtocolException.ERROR_TYPE_FAILED_CP_REQUIRED: // Fallthrough
case IkeProtocolException.ERROR_TYPE_TS_UNACCEPTABLE:
// All the above failures are configuration errors, and are terminal
- // TODO(b/230548427): Remove SDK check once VPN related stuff are
- // decoupled from ConnectivityServiceTest.
- if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) {
- sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_IKE_ERROR,
- VpnManager.ERROR_CLASS_NOT_RECOVERABLE,
- ikeException.getErrorType(),
- getPackage(), mSessionKey, makeVpnProfileStateLocked(),
- network,
- getRedactedNetworkCapabilitiesOfUnderlyingNetwork(
- mUnderlyingNetworkCapabilities),
- getRedactedLinkPropertiesOfUnderlyingNetwork(
- mUnderlyingLinkProperties));
- }
- markFailedAndDisconnect(exception);
- return;
+ errorClass = VpnManager.ERROR_CLASS_NOT_RECOVERABLE;
+ break;
// All other cases possibly recoverable.
default:
// All the above failures are configuration errors, and are terminal
- // TODO(b/230548427): Remove SDK check once VPN related stuff are
- // decoupled from ConnectivityServiceTest.
- if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) {
- sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_IKE_ERROR,
- VpnManager.ERROR_CLASS_RECOVERABLE,
- ikeException.getErrorType(),
- getPackage(), mSessionKey, makeVpnProfileStateLocked(),
- network,
- getRedactedNetworkCapabilitiesOfUnderlyingNetwork(
- mUnderlyingNetworkCapabilities),
- getRedactedLinkPropertiesOfUnderlyingNetwork(
- mUnderlyingLinkProperties));
- }
+ 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) {
- // TODO(b/230548427): Remove SDK check once VPN related stuff are
- // decoupled from ConnectivityServiceTest.
- if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) {
- sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_NETWORK_ERROR,
- VpnManager.ERROR_CLASS_RECOVERABLE,
- VpnManager.ERROR_CODE_NETWORK_LOST,
- getPackage(), mSessionKey, makeVpnProfileStateLocked(),
- network,
- getRedactedNetworkCapabilitiesOfUnderlyingNetwork(
- mUnderlyingNetworkCapabilities),
- getRedactedLinkPropertiesOfUnderlyingNetwork(
- mUnderlyingLinkProperties));
- }
+ category = VpnManager.CATEGORY_EVENT_NETWORK_ERROR;
+ errorClass = VpnManager.ERROR_CLASS_RECOVERABLE;
+ errorCode = VpnManager.ERROR_CODE_NETWORK_LOST;
} else if (exception instanceof IkeNonProtocolException) {
+ category = VpnManager.CATEGORY_EVENT_NETWORK_ERROR;
+ errorClass = VpnManager.ERROR_CLASS_RECOVERABLE;
if (exception.getCause() instanceof UnknownHostException) {
- // TODO(b/230548427): Remove SDK check once VPN related stuff are
- // decoupled from ConnectivityServiceTest.
- if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) {
- sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_NETWORK_ERROR,
- VpnManager.ERROR_CLASS_RECOVERABLE,
- VpnManager.ERROR_CODE_NETWORK_UNKNOWN_HOST,
- getPackage(), mSessionKey, makeVpnProfileStateLocked(),
- network,
- getRedactedNetworkCapabilitiesOfUnderlyingNetwork(
- mUnderlyingNetworkCapabilities),
- getRedactedLinkPropertiesOfUnderlyingNetwork(
- mUnderlyingLinkProperties));
- }
+ errorCode = VpnManager.ERROR_CODE_NETWORK_UNKNOWN_HOST;
} else if (exception.getCause() instanceof IkeTimeoutException) {
- // TODO(b/230548427): Remove SDK check once VPN related stuff are
- // decoupled from ConnectivityServiceTest.
- if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) {
- sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_NETWORK_ERROR,
- VpnManager.ERROR_CLASS_RECOVERABLE,
- VpnManager.ERROR_CODE_NETWORK_PROTOCOL_TIMEOUT,
- getPackage(), mSessionKey, makeVpnProfileStateLocked(),
- network,
- getRedactedNetworkCapabilitiesOfUnderlyingNetwork(
- mUnderlyingNetworkCapabilities),
- getRedactedLinkPropertiesOfUnderlyingNetwork(
- mUnderlyingLinkProperties));
- }
+ errorCode = VpnManager.ERROR_CODE_NETWORK_PROTOCOL_TIMEOUT;
} else if (exception.getCause() instanceof IOException) {
- // TODO(b/230548427): Remove SDK check once VPN related stuff are
- // decoupled from ConnectivityServiceTest.
- if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) {
- sendEventToVpnManagerApp(VpnManager.CATEGORY_EVENT_NETWORK_ERROR,
- VpnManager.ERROR_CLASS_RECOVERABLE,
- VpnManager.ERROR_CODE_NETWORK_IO,
- getPackage(), mSessionKey, makeVpnProfileStateLocked(),
- network,
- getRedactedNetworkCapabilitiesOfUnderlyingNetwork(
- mUnderlyingNetworkCapabilities),
- getRedactedLinkPropertiesOfUnderlyingNetwork(
- mUnderlyingLinkProperties));
- }
+ errorCode = VpnManager.ERROR_CODE_NETWORK_IO;
}
} else if (exception != null) {
Log.wtf(TAG, "onSessionLost: exception = " + exception);
}
- scheduleRetryNewIkeSession();
+ // TODO(b/230548427): Remove SDK check once VPN related stuff are
+ // decoupled from ConnectivityServiceTest.
+ if (SdkLevel.isAtLeastT() && category != null && isVpnApp(mPackage)) {
+ sendEventToVpnManagerApp(category, errorClass, errorCode,
+ getPackage(), mSessionKey, makeVpnProfileStateLocked(),
+ mActiveNetwork,
+ getRedactedNetworkCapabilitiesOfUnderlyingNetwork(
+ mUnderlyingNetworkCapabilities),
+ getRedactedLinkPropertiesOfUnderlyingNetwork(
+ mUnderlyingLinkProperties));
+ }
+
+ if (errorClass == VpnManager.ERROR_CLASS_NOT_RECOVERABLE) {
+ markFailedAndDisconnect(exception);
+ return;
+ } else {
+ scheduleRetryNewIkeSession();
+ }
}
mUnderlyingNetworkCapabilities = null;