diff options
| author | 2022-08-02 18:55:07 +0800 | |
|---|---|---|
| committer | 2022-09-08 03:35:23 +0000 | |
| commit | 85362a4b17f2d848ba8b9ece074e27692851a3e7 (patch) | |
| tree | d3a6b116105d669fba05146c766106449bfda7f0 | |
| parent | a7aa18c159238b2df10e5af586a4065104e2ef6d (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.java | 115 |
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; |