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

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

Better support for handover from OOS

When handover from OOS to target transport, use
the last known RAT to match the rule.

Fix: 238599636
Test: atest DataNetworkControllerTest
Merged-In: I5e720dad4486d893d561b461c08da9da728421dd
Change-Id: I5e720dad4486d893d561b461c08da9da728421dd
parent 7ec34710
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -643,6 +643,11 @@ public class DataNetwork extends StateMachine {
     */
    private @TransportType int mTransport;

    /**
     * The last known data network type.
     */
    private @NetworkType int mLastKnownDataNetworkType;

    /** The reason that why setting up this data network is allowed. */
    private @NonNull DataAllowedReason mDataAllowedReason;

@@ -887,6 +892,7 @@ public class DataNetwork extends StateMachine {
            mTrafficDescriptors.add(dataProfile.getTrafficDescriptor());
        }
        mTransport = transport;
        mLastKnownDataNetworkType = getDataNetworkType();
        mDataAllowedReason = dataAllowedReason;
        dataProfile.setLastSetupTimestamp(SystemClock.elapsedRealtime());
        mAttachedNetworkRequestList.addAll(networkRequestList);
@@ -1077,7 +1083,11 @@ public class DataNetwork extends StateMachine {
                    onCarrierConfigUpdated();
                    break;
                case EVENT_SERVICE_STATE_CHANGED: {
                    mDataCallSessionStats.onDrsOrRatChanged(getDataNetworkType());
                    int networkType = getDataNetworkType();
                    mDataCallSessionStats.onDrsOrRatChanged(networkType);
                    if (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN) {
                        mLastKnownDataNetworkType = networkType;
                    }
                    updateSuspendState();
                    updateNetworkCapabilities();
                    break;
@@ -3275,8 +3285,14 @@ public class DataNetwork extends StateMachine {
    }

    /**
     * @return The PCO data map of the network. The key is the PCO id, the value is the PCO data.
     * An empty map if PCO data is not available.
     * @return The last known data network type of the data network.
     */
    public @NetworkType int getLastKnownDataNetworkType() {
        return mLastKnownDataNetworkType;
    }

    /**
     * @return The PCO data received from the network.
     */
    public @NonNull Map<Integer, PcoData> getPcoData() {
        if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN
@@ -3525,6 +3541,8 @@ public class DataNetwork extends StateMachine {
        pw.increaseIndent();
        pw.println("mSubId=" + mSubId);
        pw.println("mTransport=" + AccessNetworkConstants.transportTypeToString(mTransport));
        pw.println("mLastKnownDataNetworkType=" + TelephonyManager
                .getNetworkTypeName(mLastKnownDataNetworkType));
        pw.println("WWAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN));
        pw.println("WLAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN));
        pw.println("mNetworkScore=" + mNetworkScore);
+11 −1
Original line number Diff line number Diff line
@@ -1885,8 +1885,18 @@ public class DataNetworkController extends Handler {
        if (mDataConfigManager.isIwlanHandoverPolicyEnabled()) {
            List<HandoverRule> handoverRules = mDataConfigManager.getHandoverRules();

            int sourceNetworkType = getDataNetworkType(dataNetwork.getTransport());
            if (sourceNetworkType == TelephonyManager.NETWORK_TYPE_UNKNOWN) {
                // Using the data network type stored in the data network. We
                // cache the last known network type in data network controller
                // because data network has much shorter life cycle. It can prevent
                // the obsolete last known network type cached in data network
                // type controller.
                sourceNetworkType = dataNetwork.getLastKnownDataNetworkType();
            }
            int sourceAccessNetwork = DataUtils.networkTypeToAccessNetworkType(
                    getDataNetworkType(dataNetwork.getTransport()));
                    sourceNetworkType);

            int targetAccessNetwork = DataUtils.networkTypeToAccessNetworkType(
                    getDataNetworkType(DataUtils.getTargetTransport(dataNetwork.getTransport())));
            NetworkCapabilities capabilities = dataNetwork.getNetworkCapabilities();
+32 −0
Original line number Diff line number Diff line
@@ -3145,6 +3145,38 @@ public class DataNetworkControllerTest extends TelephonyTest {
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
    }

    @Test
    public void testHandoverDataNetworkSourceOosNoUnknownRule() throws Exception {
        testSetupImsDataNetwork();
        // Configured handover is allowed from OOS to 4G/5G/IWLAN.
        mCarrierConfig.putStringArray(
                CarrierConfigManager.KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY,
                new String[]{
                        "source=EUTRAN|NGRAN|IWLAN, target=EUTRAN|NGRAN|IWLAN, "
                                + "type=disallowed, capabilities=IMS|EIMS|MMS|XCAP|CBS"
                });
        carrierConfigChanged();
        serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
                NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING);

        updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);

        // Verify IMS network was torn down on source first.
        verify(mMockedWwanDataServiceManager).deactivateDataCall(anyInt(),
                eq(DataService.REQUEST_REASON_NORMAL), any(Message.class));

        // Verify that IWLAN is brought up again on IWLAN.
        verify(mMockedWlanDataServiceManager).setupDataCall(anyInt(),
                any(DataProfile.class), anyBoolean(), anyBoolean(),
                eq(DataService.REQUEST_REASON_NORMAL), any(), anyInt(), any(), any(), anyBoolean(),
                any(Message.class));

        DataNetwork dataNetwork = getDataNetworks().get(0);
        assertThat(dataNetwork.getTransport()).isEqualTo(
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
    }

    @Test
    public void testHandoverDataNetworkNonVops() throws Exception {
        ServiceState ss = new ServiceState();