Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +44 −29 Original line number Diff line number Diff line Loading @@ -1859,11 +1859,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()); Loading Loading @@ -2692,7 +2687,7 @@ public class DataNetworkController extends Handler { logl("onDataNetworkHandoverRetry: Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport) + ", " + dataHandoverRetryEntry); dataNetwork.startHandover(preferredTransport, dataHandoverRetryEntry); tryHandoverDataNetwork(dataNetwork, preferredTransport, dataHandoverRetryEntry); } /** Loading Loading @@ -2969,30 +2964,50 @@ public class DataNetworkController extends Handler { continue; } 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("onEvaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); log("tryHandoverDataNetwork: " + dataEvaluation + ", " + dataNetwork); if (!dataEvaluation.containsDisallowedReasons()) { logl("Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport)); dataNetwork.startHandover(preferredTransport, null); + 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("onEvaluatePreferredTransport: Handover not allowed. Tear " + "down " + dataNetwork + " so a new network can be setup on " + AccessNetworkConstants.transportTypeToString(preferredTransport) + "."); 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("onEvaluatePreferredTransport: Handover not allowed. " + dataNetwork logl("tryHandoverDataNetwork: Handover not allowed. " + dataNetwork + " will remain on " + AccessNetworkConstants.transportTypeToString( dataNetwork.getTransport())); } else { loge("onEvaluatePreferredTransport: Unexpected handover evaluation result."); } } loge("tryHandoverDataNetwork: Unexpected handover evaluation result."); } } Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +17 −0 Original line number Diff line number Diff line Loading @@ -2184,9 +2184,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 Loading Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +44 −29 Original line number Diff line number Diff line Loading @@ -1859,11 +1859,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()); Loading Loading @@ -2692,7 +2687,7 @@ public class DataNetworkController extends Handler { logl("onDataNetworkHandoverRetry: Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport) + ", " + dataHandoverRetryEntry); dataNetwork.startHandover(preferredTransport, dataHandoverRetryEntry); tryHandoverDataNetwork(dataNetwork, preferredTransport, dataHandoverRetryEntry); } /** Loading Loading @@ -2969,30 +2964,50 @@ public class DataNetworkController extends Handler { continue; } 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("onEvaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); log("tryHandoverDataNetwork: " + dataEvaluation + ", " + dataNetwork); if (!dataEvaluation.containsDisallowedReasons()) { logl("Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport)); dataNetwork.startHandover(preferredTransport, null); + 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("onEvaluatePreferredTransport: Handover not allowed. Tear " + "down " + dataNetwork + " so a new network can be setup on " + AccessNetworkConstants.transportTypeToString(preferredTransport) + "."); 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("onEvaluatePreferredTransport: Handover not allowed. " + dataNetwork logl("tryHandoverDataNetwork: Handover not allowed. " + dataNetwork + " will remain on " + AccessNetworkConstants.transportTypeToString( dataNetwork.getTransport())); } else { loge("onEvaluatePreferredTransport: Unexpected handover evaluation result."); } } loge("tryHandoverDataNetwork: Unexpected handover evaluation result."); } } Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +17 −0 Original line number Diff line number Diff line Loading @@ -2184,9 +2184,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 Loading