From 7a75e50facf86d59d16e1cf924580fc81fe489d6 Mon Sep 17 00:00:00 2001 From: Ling Ma Date: Sun, 23 Oct 2022 13:47:35 -0700 Subject: [PATCH] Reevaluate condition on handover retry This change reevaluate conditions on handover retry attempts. Bug: 254023175 Test: atest + basic voice call + data browsing Change-Id: I50efebe9e8047fbc32396a7abbc7e171e94686a8 --- .../telephony/data/DataNetworkController.java | 73 +++++++++++-------- .../data/DataNetworkControllerTest.java | 17 +++++ 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java index c6fba7c838..ffecad39b9 100644 --- a/src/java/com/android/internal/telephony/data/DataNetworkController.java +++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java @@ -1858,11 +1858,6 @@ public class DataNetworkController extends Handler { return dataEvaluation; } - if (mDataRetryManager.isAnyHandoverRetryScheduled(dataNetwork)) { - dataEvaluation.addDataDisallowedReason(DataDisallowedReason.RETRY_SCHEDULED); - return dataEvaluation; - } - // If enhanced handover check is enabled, perform extra checks. if (mDataConfigManager.isEnhancedIwlanHandoverCheckEnabled()) { int targetTransport = DataUtils.getTargetTransport(dataNetwork.getTransport()); @@ -2687,7 +2682,7 @@ public class DataNetworkController extends Handler { logl("onDataNetworkHandoverRetry: Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport) + ", " + dataHandoverRetryEntry); - dataNetwork.startHandover(preferredTransport, dataHandoverRetryEntry); + tryHandoverDataNetwork(dataNetwork, preferredTransport, dataHandoverRetryEntry); } /** @@ -2964,33 +2959,53 @@ public class DataNetworkController extends Handler { continue; } - DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork); - log("onEvaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); - if (!dataEvaluation.containsDisallowedReasons()) { - logl("Start handover " + dataNetwork + " to " - + AccessNetworkConstants.transportTypeToString(preferredTransport)); - dataNetwork.startHandover(preferredTransport, null); - } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY, - DataDisallowedReason.NOT_IN_SERVICE, - DataDisallowedReason.VOPS_NOT_SUPPORTED)) { - logl("onEvaluatePreferredTransport: Handover not allowed. Tear " - + "down " + dataNetwork + " so a new network can be setup on " - + AccessNetworkConstants.transportTypeToString(preferredTransport) - + "."); - tearDownGracefully(dataNetwork, - DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED); - } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE, - DataDisallowedReason.RETRY_SCHEDULED)) { - logl("onEvaluatePreferredTransport: Handover not allowed. " + dataNetwork - + " will remain on " + AccessNetworkConstants.transportTypeToString( - dataNetwork.getTransport())); - } else { - loge("onEvaluatePreferredTransport: Unexpected handover evaluation result."); - } + tryHandoverDataNetwork(dataNetwork, preferredTransport, null/*handoverRetryEntry*/); } } } + /** + * Perform data network handover if condition allows, otherwise tear down the network to allow + * new network setup on the target transport. + * + * @param dataNetwork The network on which the handover occurs + * @param targetTransport The target transport of the handover + * @param dataHandoverRetryEntry {@code null} if the handover attempt is not due to scheduled + * retry + */ + private void tryHandoverDataNetwork(@NonNull DataNetwork dataNetwork, + @TransportType int targetTransport, + @Nullable DataHandoverRetryEntry dataHandoverRetryEntry) { + if (dataHandoverRetryEntry == null // This handover is a new request + && mDataRetryManager.isAnyHandoverRetryScheduled(dataNetwork)) { + log("tryHandoverDataNetwork: retry scheduled for" + dataNetwork + + ", ignore this attempt"); + return; + } + DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork); + log("tryHandoverDataNetwork: " + dataEvaluation + ", " + dataNetwork); + if (!dataEvaluation.containsDisallowedReasons()) { + logl("Start handover " + dataNetwork + " to " + + AccessNetworkConstants.transportTypeToString(targetTransport)); + dataNetwork.startHandover(targetTransport, dataHandoverRetryEntry); + } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY, + DataDisallowedReason.NOT_IN_SERVICE, + DataDisallowedReason.VOPS_NOT_SUPPORTED)) { + logl("tryHandoverDataNetwork: Handover not allowed. Tear down" + + dataNetwork + " so a new network can be setup on " + + AccessNetworkConstants.transportTypeToString(targetTransport)); + tearDownGracefully(dataNetwork, + DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED); + } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE, + DataDisallowedReason.RETRY_SCHEDULED)) { + logl("tryHandoverDataNetwork: Handover not allowed. " + dataNetwork + + " will remain on " + AccessNetworkConstants.transportTypeToString( + dataNetwork.getTransport())); + } else { + loge("tryHandoverDataNetwork: Unexpected handover evaluation result."); + } + } + /** * Update {@link SubscriptionPlan}s from {@link NetworkPolicyManager}. */ diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java index 7b2cf4107d..895be101c1 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java @@ -2074,9 +2074,26 @@ public class DataNetworkControllerTest extends TelephonyTest { assertThat(dataNetwork.getTransport()).isEqualTo( AccessNetworkConstants.TRANSPORT_TYPE_WWAN); + // Set target transport OOS + serviceStateChanged(TelephonyManager.NETWORK_TYPE_UNKNOWN, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* data */ + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* voice */ + NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING, /* iwlan */ + null); setSuccessfulSetupDataResponse(mMockedWlanDataServiceManager, 1); processAllFutureMessages(); + // Verify that data network is still on cellular + assertThat(dataNetwork.getTransport()).isEqualTo( + AccessNetworkConstants.TRANSPORT_TYPE_WWAN); + + // Set target transport back to service + serviceStateChanged(TelephonyManager.NETWORK_TYPE_UNKNOWN, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* data */ + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* voice */ + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, /* iwlan */ + null); + processAllFutureMessages(); dataNetwork = getDataNetworks().get(0); // Verify that data network is handovered to IWLAN -- GitLab