Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9b2a97a authored by Jack Yu's avatar Jack Yu
Browse files

Retry setup after failed and preference changed

When setup data takes a long time, and QNS changes
preference during this time, we should retry data
setup again on the new transport after setup data
fails.

Fix: 231182246
Test: Manual testing. Also able to repro this with
the new unit test in this CL, and verify the fix
is working.

Merged-In: Iecc9c8ceea0da60f5cbd483c20d269533103bedf
Change-Id: Iecc9c8ceea0da60f5cbd483c20d269533103bedf
parent 5604ce1f
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -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;
        }

@@ -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) {
@@ -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;
                }
@@ -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));
@@ -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)
                            + ".");
@@ -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.");
                }
            }
        }
+43 −1
Original line number Diff line number Diff line
@@ -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];

@@ -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)
@@ -2830,4 +2835,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);
    }
}