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

Commit 3109d148 authored by Jack Yu's avatar Jack Yu
Browse files

Switch data profile when handover

Carriers might have different APN settings between
cellular and IWLAN. Need to switch to the data profile
for target transport.

Fix: 229766669
Test: Manual + atest DataNetworkControllerTest
Change-Id: I5523f49f439189e58a05c9f31e990feccbe5f7e1
parent fa3761f1
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -224,7 +224,7 @@ public class DataEvaluation {
        RETRY_AFTER_DISCONNECTED,
        RETRY_AFTER_DISCONNECTED,
        /** Data setup retry. */
        /** Data setup retry. */
        DATA_RETRY,
        DATA_RETRY,
        /** Handover between IWLAN and cellular. */
        /** For handover evaluation, or for network tearing down after handover succeeds/fails. */
        DATA_HANDOVER,
        DATA_HANDOVER,
        /** Preferred transport changed. */
        /** Preferred transport changed. */
        PREFERRED_TRANSPORT_CHANGED,
        PREFERRED_TRANSPORT_CHANGED,
+32 −5
Original line number Original line Diff line number Diff line
@@ -542,7 +542,13 @@ public class DataNetwork extends StateMachine {
    private @Nullable KeepaliveTracker mKeepaliveTracker;
    private @Nullable KeepaliveTracker mKeepaliveTracker;


    /** The data profile used to establish this data network. */
    /** The data profile used to establish this data network. */
    private final @NonNull DataProfile mDataProfile;
    private @NonNull DataProfile mDataProfile;

    /**
     * The data profile used for data handover. Some carriers might use different data profile
     * between IWLAN and cellular. Only set before handover started.
     */
    private @Nullable DataProfile mHandoverDataProfile;


    /** The network capabilities of this data network. */
    /** The network capabilities of this data network. */
    private @NonNull NetworkCapabilities mNetworkCapabilities;
    private @NonNull NetworkCapabilities mNetworkCapabilities;
@@ -2872,17 +2878,35 @@ public class DataNetwork extends StateMachine {
        // state in framework, we should set this flag to true as well so the modem will not reject
        // state in framework, we should set this flag to true as well so the modem will not reject
        // the data call setup (because the modem actually thinks the device is roaming).
        // the data call setup (because the modem actually thinks the device is roaming).
        boolean allowRoaming = mPhone.getDataRoamingEnabled()
        boolean allowRoaming = mPhone.getDataRoamingEnabled()
                || (isModemRoaming && (!mPhone.getServiceState().getDataRoaming()
                || (isModemRoaming && (!mPhone.getServiceState().getDataRoaming()));
                /*|| isUnmeteredUseOnly()*/));

        mHandoverDataProfile = mDataProfile;
        int targetNetworkType = getDataNetworkType(targetTransport);
        if (targetNetworkType != TelephonyManager.NETWORK_TYPE_UNKNOWN
                && !mAttachedNetworkRequestList.isEmpty()) {
            TelephonyNetworkRequest networkRequest = mAttachedNetworkRequestList.get(0);
            DataProfile dataProfile = mDataNetworkController.getDataProfileManager()
                    .getDataProfileForNetworkRequest(networkRequest, targetNetworkType);
            // Some carriers have different profiles between cellular and IWLAN. We need to
            // dynamically switch profile, but only when those profiles have same APN name.
            if (dataProfile != null && dataProfile.getApnSetting() != null
                    && mDataProfile.getApnSetting() != null
                    && TextUtils.equals(dataProfile.getApnSetting().getApnName(),
                    mDataProfile.getApnSetting().getApnName())
                    && !dataProfile.equals(mDataProfile)) {
                mHandoverDataProfile = dataProfile;
                log("Used different data profile for handover. " + mDataProfile);
            }
        }


        logl("Start handover from " + AccessNetworkConstants.transportTypeToString(mTransport)
        logl("Start handover from " + AccessNetworkConstants.transportTypeToString(mTransport)
                + " to " + AccessNetworkConstants.transportTypeToString(targetTransport));
                + " to " + AccessNetworkConstants.transportTypeToString(targetTransport));
        // Send the handover request to the target transport data service.
        // Send the handover request to the target transport data service.
        mDataServiceManagers.get(targetTransport).setupDataCall(
        mDataServiceManagers.get(targetTransport).setupDataCall(
                DataUtils.networkTypeToAccessNetworkType(getDataNetworkType(targetTransport)),
                DataUtils.networkTypeToAccessNetworkType(getDataNetworkType(targetTransport)),
                mDataProfile, isModemRoaming, allowRoaming,
                mHandoverDataProfile, isModemRoaming, allowRoaming,
                DataService.REQUEST_REASON_HANDOVER, mLinkProperties, mPduSessionId,
                DataService.REQUEST_REASON_HANDOVER, mLinkProperties, mPduSessionId,
                mNetworkSliceInfo, mDataProfile.getTrafficDescriptor(), true,
                mNetworkSliceInfo, mHandoverDataProfile.getTrafficDescriptor(), true,
                obtainMessage(EVENT_HANDOVER_RESPONSE, retryEntry));
                obtainMessage(EVENT_HANDOVER_RESPONSE, retryEntry));
        transitionTo(mHandoverState);
        transitionTo(mHandoverState);
    }
    }
@@ -2911,6 +2935,9 @@ public class DataNetwork extends StateMachine {
            // Update the logging tag
            // Update the logging tag
            mLogTag = "DN-" + mInitialNetworkAgentId + "-"
            mLogTag = "DN-" + mInitialNetworkAgentId + "-"
                    + ((mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) ? "C" : "I");
                    + ((mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) ? "C" : "I");
            // Switch the data profile. This is no-op in most of the case since almost all carriers
            // use same data profile between IWLAN and cellular.
            mDataProfile = mHandoverDataProfile;
            updateDataNetwork(response);
            updateDataNetwork(response);
            if (mTransport != AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
            if (mTransport != AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
                // Handover from WWAN to WLAN
                // Handover from WWAN to WLAN
+10 −0
Original line number Original line Diff line number Diff line
@@ -2700,6 +2700,11 @@ public class DataNetworkController extends Handler {
        // manager.
        // manager.
        sendMessage(obtainMessage(EVENT_EVALUATE_PREFERRED_TRANSPORT,
        sendMessage(obtainMessage(EVENT_EVALUATE_PREFERRED_TRANSPORT,
                dataNetwork.getApnTypeNetworkCapability(), 0));
                dataNetwork.getApnTypeNetworkCapability(), 0));

        // There might be network we didn't tear down in the last evaluation due to handover in
        // progress. We should evaluate again.
        sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
                DataEvaluationReason.DATA_HANDOVER));
    }
    }


    /**
    /**
@@ -2720,6 +2725,11 @@ public class DataNetworkController extends Handler {
        logl("Handover failed. " + dataNetwork + ", cause=" + DataFailCause.toString(cause)
        logl("Handover failed. " + dataNetwork + ", cause=" + DataFailCause.toString(cause)
                + ", retryDelayMillis=" + retryDelayMillis + "ms, handoverFailureMode="
                + ", retryDelayMillis=" + retryDelayMillis + "ms, handoverFailureMode="
                + DataCallResponse.failureModeToString(handoverFailureMode));
                + DataCallResponse.failureModeToString(handoverFailureMode));
        // There might be network we didn't tear down in the last evaluation due to handover in
        // progress. We should evaluate again.
        sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
                DataEvaluationReason.DATA_HANDOVER));

        if (dataNetwork.getAttachedNetworkRequestList().isEmpty()) {
        if (dataNetwork.getAttachedNetworkRequestList().isEmpty()) {
            log("onDataNetworkHandoverFailed: No network requests attached to " + dataNetwork
            log("onDataNetworkHandoverFailed: No network requests attached to " + dataNetwork
                    + ". No need to retry since the network will be torn down soon.");
                    + ". No need to retry since the network will be torn down soon.");
+104 −19
Original line number Original line Diff line number Diff line
@@ -189,7 +189,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
            .setPreferred(false)
            .setPreferred(false)
            .build();
            .build();


    private final DataProfile mImsDataProfile = new DataProfile.Builder()
    private final DataProfile mImsCellularDataProfile = new DataProfile.Builder()
            .setApnSetting(new ApnSetting.Builder()
            .setApnSetting(new ApnSetting.Builder()
                    .setId(2164)
                    .setId(2164)
                    .setOperatorNumeric("12345")
                    .setOperatorNumeric("12345")
@@ -202,7 +202,6 @@ public class DataNetworkControllerTest extends TelephonyTest {
                    .setRoamingProtocol(ApnSetting.PROTOCOL_IP)
                    .setRoamingProtocol(ApnSetting.PROTOCOL_IP)
                    .setCarrierEnabled(true)
                    .setCarrierEnabled(true)
                    .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
                    .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
                            | TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN
                            | TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT))
                            | TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT))
                    .setLingeringNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
                    .setLingeringNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_LTE
                            | TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN
                            | TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN
@@ -216,6 +215,27 @@ public class DataNetworkControllerTest extends TelephonyTest {
            .setPreferred(false)
            .setPreferred(false)
            .build();
            .build();


    private final DataProfile mImsIwlanDataProfile = new DataProfile.Builder()
            .setApnSetting(new ApnSetting.Builder()
                    .setId(2164)
                    .setOperatorNumeric("12345")
                    .setEntryName("ims_apn")
                    .setApnName("ims_apn")
                    .setUser("user")
                    .setPassword("passwd")
                    .setApnTypeBitmask(ApnSetting.TYPE_IMS)
                    .setProtocol(ApnSetting.PROTOCOL_IPV6)
                    .setRoamingProtocol(ApnSetting.PROTOCOL_IPV6)
                    .setCarrierEnabled(true)
                    .setNetworkTypeBitmask((int) (TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN))
                    .setProfileId(1235)
                    .setMaxConns(321)
                    .setWaitTime(456)
                    .setMaxConnsTime(789)
                    .build())
            .setPreferred(false)
            .build();

    private final DataProfile mEmergencyDataProfile = new DataProfile.Builder()
    private final DataProfile mEmergencyDataProfile = new DataProfile.Builder()
            .setApnSetting(new ApnSetting.Builder()
            .setApnSetting(new ApnSetting.Builder()
                    .setEntryName("DEFAULT EIMS")
                    .setEntryName("DEFAULT EIMS")
@@ -363,6 +383,10 @@ public class DataNetworkControllerTest extends TelephonyTest {
    }
    }


    private void setSuccessfulSetupDataResponse(DataServiceManager dsm, int cid) {
    private void setSuccessfulSetupDataResponse(DataServiceManager dsm, int cid) {
        setSuccessfulSetupDataResponse(dsm, cid, 0L);
    }

    private void setSuccessfulSetupDataResponse(DataServiceManager dsm, int cid, long delay) {
        doAnswer(invocation -> {
        doAnswer(invocation -> {
            final Message msg = (Message) invocation.getArguments()[10];
            final Message msg = (Message) invocation.getArguments()[10];


@@ -378,11 +402,15 @@ public class DataNetworkControllerTest extends TelephonyTest {
            mDataCallResponses.get(transport).put(cid, response);
            mDataCallResponses.get(transport).put(cid, response);
            msg.getData().putParcelable("data_call_response", response);
            msg.getData().putParcelable("data_call_response", response);
            msg.arg1 = DataServiceCallback.RESULT_SUCCESS;
            msg.arg1 = DataServiceCallback.RESULT_SUCCESS;
            msg.sendToTarget();
            msg.getTarget().sendMessageDelayed(msg, delay);


            mDataCallListChangedRegistrants.get(transport).notifyRegistrants(
            final int t = transport;
                    new AsyncResult(transport, new ArrayList<>(mDataCallResponses.get(
            msg.getTarget().postDelayed(() -> {
                            transport).values()), null));
                mDataCallListChangedRegistrants.get(t).notifyRegistrants(
                        new AsyncResult(t, new ArrayList<>(mDataCallResponses.get(
                                t).values()), null));

            }, delay + 100);
            return null;
            return null;
        }).when(dsm).setupDataCall(anyInt(), any(DataProfile.class), anyBoolean(),
        }).when(dsm).setupDataCall(anyInt(), any(DataProfile.class), anyBoolean(),
                anyBoolean(), anyInt(), any(), anyInt(), any(), any(), anyBoolean(),
                anyBoolean(), anyInt(), any(), anyInt(), any(), any(), anyBoolean(),
@@ -661,8 +689,10 @@ public class DataNetworkControllerTest extends TelephonyTest {
            TelephonyNetworkRequest networkRequest =
            TelephonyNetworkRequest networkRequest =
                    (TelephonyNetworkRequest) invocation.getArguments()[0];
                    (TelephonyNetworkRequest) invocation.getArguments()[0];
            int networkType = (int) invocation.getArguments()[1];
            int networkType = (int) invocation.getArguments()[1];
            List<DataProfile> profiles = List.of(mGeneralPurposeDataProfile, mImsDataProfile,
            List<DataProfile> profiles = List.of(mGeneralPurposeDataProfile,
                    mEmergencyDataProfile, mFotaDataProfile, mTetheringDataProfile);
                    mImsCellularDataProfile,
                    mImsIwlanDataProfile, mEmergencyDataProfile, mFotaDataProfile,
                    mTetheringDataProfile);
            for (DataProfile dataProfile : profiles) {
            for (DataProfile dataProfile : profiles) {
                if (dataProfile.canSatisfy(networkRequest.getCapabilities())
                if (dataProfile.canSatisfy(networkRequest.getCapabilities())
                        && (dataProfile.getApnSetting().getNetworkTypeBitmask() == 0
                        && (dataProfile.getApnSetting().getNetworkTypeBitmask() == 0
@@ -917,7 +947,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        processAllMessages();
        processAllMessages();
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
                NetworkCapabilities.NET_CAPABILITY_MMTEL);
                NetworkCapabilities.NET_CAPABILITY_MMTEL);
        verifyConnectedNetworkHasDataProfile(mImsDataProfile);
        verifyConnectedNetworkHasDataProfile(mImsCellularDataProfile);
        List<DataNetwork> dataNetworkList = getDataNetworks();
        List<DataNetwork> dataNetworkList = getDataNetworks();
        assertThat(dataNetworkList.get(0).getLinkProperties().getAddresses()).containsExactly(
        assertThat(dataNetworkList.get(0).getLinkProperties().getAddresses()).containsExactly(
                InetAddresses.parseNumericAddress(IPV4_ADDRESS),
                InetAddresses.parseNumericAddress(IPV4_ADDRESS),
@@ -1646,13 +1676,20 @@ public class DataNetworkControllerTest extends TelephonyTest {
    @Test
    @Test
    public void testHandoverDataNetwork() throws Exception {
    public void testHandoverDataNetwork() throws Exception {
        testSetupImsDataNetwork();
        testSetupImsDataNetwork();

        DataNetwork dataNetwork = getDataNetworks().get(0);
        // Before handover the data profile is the cellular IMS data profile
        verifyConnectedNetworkHasDataProfile(mImsCellularDataProfile);

        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);


        DataNetwork dataNetwork = getDataNetworks().get(0);
        // Verify that IWLAN handover succeeded.
        // Verify that IWLAN handover succeeded.
        assertThat(dataNetwork.getTransport()).isEqualTo(
        assertThat(dataNetwork.getTransport()).isEqualTo(
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);

        // After handover the data profile is the IWLAN IMS data profile
        verifyConnectedNetworkHasDataProfile(mImsIwlanDataProfile);
    }
    }


    @Test
    @Test
@@ -1755,7 +1792,10 @@ public class DataNetworkControllerTest extends TelephonyTest {
        processAllMessages();
        processAllMessages();


        // Bring up IMS PDN on IWLAN
        // Bring up IMS PDN on IWLAN
        testSetupImsDataNetwork();
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS));
        processAllMessages();
        verifyConnectedNetworkHasDataProfile(mImsIwlanDataProfile);


        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
@@ -1846,11 +1886,9 @@ public class DataNetworkControllerTest extends TelephonyTest {


        setFailedSetupDataResponse(mMockedWlanDataServiceManager,
        setFailedSetupDataResponse(mMockedWlanDataServiceManager,
                DataFailCause.HANDOVER_FAILED, -1, true);
                DataFailCause.HANDOVER_FAILED, -1, true);
        doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager)
                .getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
        mDataNetworkControllerUT.removeNetworkRequest(networkRequest);
        mDataNetworkControllerUT.removeNetworkRequest(networkRequest);
        mAccessNetworksManagerCallback.onPreferredTransportChanged(
        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
                NetworkCapabilities.NET_CAPABILITY_IMS);
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
        processAllMessages();
        processAllMessages();


        DataNetwork dataNetwork = getDataNetworks().get(0);
        DataNetwork dataNetwork = getDataNetworks().get(0);
@@ -1900,6 +1938,48 @@ public class DataNetworkControllerTest extends TelephonyTest {


    }
    }


    // Test the device enters from 4G to 3G, and QNS switches the pref just before that happens.
    // Make sure we don't tear down the network and let it handover to IWLAN successfully.
    @Test
    public void testHandoverDataNetworkWhileSwitchTo3G() throws Exception {
        testSetupImsDataNetwork();

        DataNetwork dataNetwork = getDataNetworks().get(0);
        // Before handover the data profile is the cellular IMS data profile
        verifyConnectedNetworkHasDataProfile(mImsCellularDataProfile);

        // Long delay handover
        setSuccessfulSetupDataResponse(mMockedWlanDataServiceManager, 1, 3000);
        doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager)
                .getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
        mAccessNetworksManagerCallback.onPreferredTransportChanged(
                NetworkCapabilities.NET_CAPABILITY_IMS);
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_UMTS,
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
        processAllMessages();

        // Move the time a little bit, handover still not responded.
        moveTimeForward(500);
        processAllMessages();
        dataNetwork = getDataNetworks().get(0);
        // Verify the network is still on cellular, waiting for handover, although already on 3G.
        assertThat(dataNetwork.getTransport()).isEqualTo(
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN);

        // Now handover should complete.
        moveTimeForward(5000);
        processAllMessages();

        dataNetwork = getDataNetworks().get(0);
        // Verify that IWLAN handover succeeded.
        assertThat(dataNetwork.getTransport()).isEqualTo(
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);

        // After handover the data profile is the IWLAN IMS data profile
        verifyConnectedNetworkHasDataProfile(mImsIwlanDataProfile);
    }


    @Test
    @Test
    public void testSetupDataNetworkRetrySuggestedByNetwork() {
    public void testSetupDataNetworkRetrySuggestedByNetwork() {
        setFailedSetupDataResponse(mMockedWwanDataServiceManager, DataFailCause.CONGESTION,
        setFailedSetupDataResponse(mMockedWwanDataServiceManager, DataFailCause.CONGESTION,
@@ -2091,7 +2171,7 @@ public class DataNetworkControllerTest extends TelephonyTest {


        // TAC changes should clear the already-scheduled retry and throttling.
        // TAC changes should clear the already-scheduled retry and throttling.
        assertThat(mDataNetworkControllerUT.getDataRetryManager().isAnySetupRetryScheduled(
        assertThat(mDataNetworkControllerUT.getDataRetryManager().isAnySetupRetryScheduled(
                mImsDataProfile, AccessNetworkConstants.TRANSPORT_TYPE_WWAN)).isFalse();
                mImsCellularDataProfile, AccessNetworkConstants.TRANSPORT_TYPE_WWAN)).isFalse();


        // But DNC should re-evaluate unsatisfied request and setup IMS again.
        // But DNC should re-evaluate unsatisfied request and setup IMS again.
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
@@ -2258,7 +2338,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        doReturn(PhoneConstants.State.OFFHOOK).when(mCT).getState();
        doReturn(PhoneConstants.State.OFFHOOK).when(mCT).getState();
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
                NetworkCapabilities.NET_CAPABILITY_MMTEL);
                NetworkCapabilities.NET_CAPABILITY_MMTEL);
        verifyConnectedNetworkHasDataProfile(mImsDataProfile);
        verifyConnectedNetworkHasDataProfile(mImsCellularDataProfile);
        List<DataNetwork> dataNetworks = getDataNetworks();
        List<DataNetwork> dataNetworks = getDataNetworks();
        assertThat(dataNetworks).hasSize(1);
        assertThat(dataNetworks).hasSize(1);
        dataNetworks.get(0).tearDown(DataNetwork.TEAR_DOWN_REASON_RAT_NOT_ALLOWED);
        dataNetworks.get(0).tearDown(DataNetwork.TEAR_DOWN_REASON_RAT_NOT_ALLOWED);
@@ -2267,7 +2347,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
        // Make sure IMS network is still connected.
        // Make sure IMS network is still connected.
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
                NetworkCapabilities.NET_CAPABILITY_MMTEL);
                NetworkCapabilities.NET_CAPABILITY_MMTEL);
        verifyConnectedNetworkHasDataProfile(mImsDataProfile);
        verifyConnectedNetworkHasDataProfile(mImsCellularDataProfile);


        // Now connectivity service requests to tear down the data network.
        // Now connectivity service requests to tear down the data network.
        mDataNetworkControllerUT.removeNetworkRequest(networkRequest);
        mDataNetworkControllerUT.removeNetworkRequest(networkRequest);
@@ -2627,7 +2707,12 @@ public class DataNetworkControllerTest extends TelephonyTest {
        mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget();
        mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget();
        processAllMessages();
        processAllMessages();


        testSetupImsDataNetwork();
        mDataNetworkControllerUT.addNetworkRequest(
                createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS,
                        NetworkCapabilities.NET_CAPABILITY_MMTEL));
        processAllMessages();
        verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS,
                NetworkCapabilities.NET_CAPABILITY_MMTEL);


        // Change the preference to cellular
        // Change the preference to cellular
        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,