Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +12 −7 Original line number Diff line number Diff line Loading @@ -2538,7 +2538,12 @@ public class DataNetworkController extends Handler { + ". The preferred transport has switched to " + AccessNetworkConstants.transportTypeToString(preferredTransport) + ". " + dataSetupRetryEntry); // Cancel the retry since the preferred transport has already changed, but then // re-evaluate the unsatisfied network requests again so the new network can be brought // up on the new target transport later. dataSetupRetryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED); sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED)); return; } Loading Loading @@ -2850,7 +2855,7 @@ public class DataNetworkController extends Handler { private void onEvaluatePreferredTransport(@NetCapability int capability) { int preferredTransport = mAccessNetworksManager .getPreferredTransportByNetworkCapability(capability); log("evaluatePreferredTransport: " + DataUtils.networkCapabilityToString(capability) log("onEvaluatePreferredTransport: " + DataUtils.networkCapabilityToString(capability) + " preferred on " + AccessNetworkConstants.transportTypeToString(preferredTransport)); for (DataNetwork dataNetwork : mDataNetworkList) { Loading @@ -2858,7 +2863,7 @@ public class DataNetworkController extends Handler { // Check if the data network's current transport is different than from the // preferred transport. If it's different, then handover is needed. if (dataNetwork.getTransport() == preferredTransport) { log("evaluatePreferredTransport:" + dataNetwork + " already on " log("onEvaluatePreferredTransport:" + dataNetwork + " already on " + AccessNetworkConstants.transportTypeToString(preferredTransport)); continue; } Loading @@ -2867,12 +2872,12 @@ public class DataNetworkController extends Handler { // succeeds or fails, preferred transport will be re-evaluate again. Handover will // be performed at that time if needed. if (dataNetwork.isHandoverInProgress()) { log("evaluatePreferredTransport: " + dataNetwork + " handover in progress."); log("onEvaluatePreferredTransport: " + dataNetwork + " handover in progress."); continue; } DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork); log("evaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); log("onEvaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); if (!dataEvaluation.containsDisallowedReasons()) { logl("Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport)); Loading @@ -2880,7 +2885,7 @@ public class DataNetworkController extends Handler { } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY, DataDisallowedReason.NOT_IN_SERVICE, DataDisallowedReason.VOPS_NOT_SUPPORTED)) { logl("evaluatePreferredTransport: Handover not allowed. Tear " logl("onEvaluatePreferredTransport: Handover not allowed. Tear " + "down " + dataNetwork + " so a new network can be setup on " + AccessNetworkConstants.transportTypeToString(preferredTransport) + "."); Loading @@ -2888,11 +2893,11 @@ public class DataNetworkController extends Handler { DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED); } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE, DataDisallowedReason.RETRY_SCHEDULED)) { logl("evaluatePreferredTransport: Handover not allowed. " + dataNetwork logl("onEvaluatePreferredTransport: Handover not allowed. " + dataNetwork + " will remain on " + AccessNetworkConstants.transportTypeToString( dataNetwork.getTransport())); } else { loge("evaluatePreferredTransport: Unexpected handover evaluation result."); loge("onEvaluatePreferredTransport: Unexpected handover evaluation result."); } } } Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +43 −1 Original line number Diff line number Diff line Loading @@ -343,6 +343,11 @@ public class DataNetworkControllerTest extends TelephonyTest { private void setFailedSetupDataResponse(DataServiceManager dsm, @DataFailureCause int cause, long retryMillis, boolean forHandover) { setFailedSetupDataResponse(dsm, cause, retryMillis, forHandover, 0); } private void setFailedSetupDataResponse(DataServiceManager dsm, @DataFailureCause int cause, long retryMillis, boolean forHandover, long delay) { doAnswer(invocation -> { final Message msg = (Message) invocation.getArguments()[10]; Loading @@ -354,7 +359,7 @@ public class DataNetworkControllerTest extends TelephonyTest { .build(); msg.getData().putParcelable("data_call_response", response); msg.arg1 = DataServiceCallback.RESULT_SUCCESS; msg.sendToTarget(); msg.getTarget().sendMessageDelayed(msg, delay); return null; }).when(dsm).setupDataCall(anyInt(), any(DataProfile.class), anyBoolean(), anyBoolean(), forHandover ? eq(DataService.REQUEST_REASON_HANDOVER) Loading Loading @@ -2888,4 +2893,41 @@ public class DataNetworkControllerTest extends TelephonyTest { verify(mMockedDataNetworkControllerCallback).onAnyDataNetworkExistingChanged(eq(false)); verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkDisconnected(); } @Test public void testHandoverWhileSetupDataCallInProgress() throws Exception { // Long delay setup failure setFailedSetupDataResponse(mMockedWwanDataServiceManager, DataFailCause.CONGESTION, DataCallResponse.RETRY_DURATION_UNDEFINED, false, 10000); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS, NetworkCapabilities.NET_CAPABILITY_MMTEL)); processAllMessages(); // Change the preference to IWLAN while setup data is still ongoing. updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS, AccessNetworkConstants.TRANSPORT_TYPE_WLAN); // Data should not be connected. verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS); // There shouldn't be any attempt to bring up IMS on IWLAN even though the preference // has already changed, because the previous setup is still ongoing. verify(mMockedWlanDataServiceManager, never()).setupDataCall(eq(AccessNetworkType.IWLAN), any(DataProfile.class), anyBoolean(), anyBoolean(), anyInt(), any(), anyInt(), any(), any(), anyBoolean(), any(Message.class)); processAllFutureMessages(); // Should setup a new one instead of handover. verify(mMockedWlanDataServiceManager).setupDataCall(eq(AccessNetworkType.IWLAN), any(DataProfile.class), anyBoolean(), anyBoolean(), eq(DataService.REQUEST_REASON_NORMAL), any(), anyInt(), any(), any(), anyBoolean(), any(Message.class)); // IMS should be connected. verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS, NetworkCapabilities.NET_CAPABILITY_MMTEL); } } Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +12 −7 Original line number Diff line number Diff line Loading @@ -2538,7 +2538,12 @@ public class DataNetworkController extends Handler { + ". The preferred transport has switched to " + AccessNetworkConstants.transportTypeToString(preferredTransport) + ". " + dataSetupRetryEntry); // Cancel the retry since the preferred transport has already changed, but then // re-evaluate the unsatisfied network requests again so the new network can be brought // up on the new target transport later. dataSetupRetryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED); sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED)); return; } Loading Loading @@ -2850,7 +2855,7 @@ public class DataNetworkController extends Handler { private void onEvaluatePreferredTransport(@NetCapability int capability) { int preferredTransport = mAccessNetworksManager .getPreferredTransportByNetworkCapability(capability); log("evaluatePreferredTransport: " + DataUtils.networkCapabilityToString(capability) log("onEvaluatePreferredTransport: " + DataUtils.networkCapabilityToString(capability) + " preferred on " + AccessNetworkConstants.transportTypeToString(preferredTransport)); for (DataNetwork dataNetwork : mDataNetworkList) { Loading @@ -2858,7 +2863,7 @@ public class DataNetworkController extends Handler { // Check if the data network's current transport is different than from the // preferred transport. If it's different, then handover is needed. if (dataNetwork.getTransport() == preferredTransport) { log("evaluatePreferredTransport:" + dataNetwork + " already on " log("onEvaluatePreferredTransport:" + dataNetwork + " already on " + AccessNetworkConstants.transportTypeToString(preferredTransport)); continue; } Loading @@ -2867,12 +2872,12 @@ public class DataNetworkController extends Handler { // succeeds or fails, preferred transport will be re-evaluate again. Handover will // be performed at that time if needed. if (dataNetwork.isHandoverInProgress()) { log("evaluatePreferredTransport: " + dataNetwork + " handover in progress."); log("onEvaluatePreferredTransport: " + dataNetwork + " handover in progress."); continue; } DataEvaluation dataEvaluation = evaluateDataNetworkHandover(dataNetwork); log("evaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); log("onEvaluatePreferredTransport: " + dataEvaluation + ", " + dataNetwork); if (!dataEvaluation.containsDisallowedReasons()) { logl("Start handover " + dataNetwork + " to " + AccessNetworkConstants.transportTypeToString(preferredTransport)); Loading @@ -2880,7 +2885,7 @@ public class DataNetworkController extends Handler { } else if (dataEvaluation.containsAny(DataDisallowedReason.NOT_ALLOWED_BY_POLICY, DataDisallowedReason.NOT_IN_SERVICE, DataDisallowedReason.VOPS_NOT_SUPPORTED)) { logl("evaluatePreferredTransport: Handover not allowed. Tear " logl("onEvaluatePreferredTransport: Handover not allowed. Tear " + "down " + dataNetwork + " so a new network can be setup on " + AccessNetworkConstants.transportTypeToString(preferredTransport) + "."); Loading @@ -2888,11 +2893,11 @@ public class DataNetworkController extends Handler { DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED); } else if (dataEvaluation.containsAny(DataDisallowedReason.ILLEGAL_STATE, DataDisallowedReason.RETRY_SCHEDULED)) { logl("evaluatePreferredTransport: Handover not allowed. " + dataNetwork logl("onEvaluatePreferredTransport: Handover not allowed. " + dataNetwork + " will remain on " + AccessNetworkConstants.transportTypeToString( dataNetwork.getTransport())); } else { loge("evaluatePreferredTransport: Unexpected handover evaluation result."); loge("onEvaluatePreferredTransport: Unexpected handover evaluation result."); } } } Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +43 −1 Original line number Diff line number Diff line Loading @@ -343,6 +343,11 @@ public class DataNetworkControllerTest extends TelephonyTest { private void setFailedSetupDataResponse(DataServiceManager dsm, @DataFailureCause int cause, long retryMillis, boolean forHandover) { setFailedSetupDataResponse(dsm, cause, retryMillis, forHandover, 0); } private void setFailedSetupDataResponse(DataServiceManager dsm, @DataFailureCause int cause, long retryMillis, boolean forHandover, long delay) { doAnswer(invocation -> { final Message msg = (Message) invocation.getArguments()[10]; Loading @@ -354,7 +359,7 @@ public class DataNetworkControllerTest extends TelephonyTest { .build(); msg.getData().putParcelable("data_call_response", response); msg.arg1 = DataServiceCallback.RESULT_SUCCESS; msg.sendToTarget(); msg.getTarget().sendMessageDelayed(msg, delay); return null; }).when(dsm).setupDataCall(anyInt(), any(DataProfile.class), anyBoolean(), anyBoolean(), forHandover ? eq(DataService.REQUEST_REASON_HANDOVER) Loading Loading @@ -2888,4 +2893,41 @@ public class DataNetworkControllerTest extends TelephonyTest { verify(mMockedDataNetworkControllerCallback).onAnyDataNetworkExistingChanged(eq(false)); verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkDisconnected(); } @Test public void testHandoverWhileSetupDataCallInProgress() throws Exception { // Long delay setup failure setFailedSetupDataResponse(mMockedWwanDataServiceManager, DataFailCause.CONGESTION, DataCallResponse.RETRY_DURATION_UNDEFINED, false, 10000); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS, NetworkCapabilities.NET_CAPABILITY_MMTEL)); processAllMessages(); // Change the preference to IWLAN while setup data is still ongoing. updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS, AccessNetworkConstants.TRANSPORT_TYPE_WLAN); // Data should not be connected. verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS); // There shouldn't be any attempt to bring up IMS on IWLAN even though the preference // has already changed, because the previous setup is still ongoing. verify(mMockedWlanDataServiceManager, never()).setupDataCall(eq(AccessNetworkType.IWLAN), any(DataProfile.class), anyBoolean(), anyBoolean(), anyInt(), any(), anyInt(), any(), any(), anyBoolean(), any(Message.class)); processAllFutureMessages(); // Should setup a new one instead of handover. verify(mMockedWlanDataServiceManager).setupDataCall(eq(AccessNetworkType.IWLAN), any(DataProfile.class), anyBoolean(), anyBoolean(), eq(DataService.REQUEST_REASON_NORMAL), any(), anyInt(), any(), any(), anyBoolean(), any(Message.class)); // IMS should be connected. verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS, NetworkCapabilities.NET_CAPABILITY_MMTEL); } }