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

Commit 66066973 authored by Sewook Seo's avatar Sewook Seo
Browse files

set KEEP_CONNECTED_FOR_HANDOVER for IWLAN HO

- Update NetworkScore with KEEP_CONNECTED_FOR_HANDOVER to indicate
handover is in-progress.
- Legacy score has not been used to compute Network's reassignment at Connecitivity module, so removed legacy score update from DataNetwork.

Bug: 275470915
Test: FrameworksTelephonyTests
Change-Id: I643cd609838b43c6ef5e84c42da560c587bbbe0d
parent b23e9f13
Loading
Loading
Loading
Loading
+19 −32
Original line number Diff line number Diff line
@@ -496,7 +496,7 @@ public class DataNetwork extends StateMachine {
    private final int mSubId;

    /** The network score of this network. */
    private int mNetworkScore;
    private @NonNull NetworkScore mNetworkScore;

    /**
     * Indicates that
@@ -1036,10 +1036,11 @@ public class DataNetwork extends StateMachine {
                mPhone.getPhoneId());
        final NetworkProvider provider = (null == factory) ? null : factory.getProvider();

        mNetworkScore = getNetworkScore();
        mNetworkScore = new NetworkScore.Builder().setKeepConnectedReason(
                        isHandoverInProgress() ? NetworkScore.KEEP_CONNECTED_FOR_HANDOVER
                                : NetworkScore.KEEP_CONNECTED_NONE).build();
        return new TelephonyNetworkAgent(mPhone, getHandler().getLooper(), this,
                new NetworkScore.Builder().setLegacyInt(mNetworkScore).build(),
                configBuilder.build(), provider,
                mNetworkScore, configBuilder.build(), provider,
                new TelephonyNetworkAgentCallback(getHandler()::post) {
                    @Override
                    public void onValidationStatus(@ValidationStatus int status,
@@ -1169,13 +1170,13 @@ public class DataNetwork extends StateMachine {
                }
                case EVENT_ATTACH_NETWORK_REQUEST: {
                    onAttachNetworkRequests((NetworkRequestList) msg.obj);
                    updateNetworkScore();
                    updateNetworkScore(isHandoverInProgress());
                    break;
                }
                case EVENT_DETACH_NETWORK_REQUEST: {
                    onDetachNetworkRequest((TelephonyNetworkRequest) msg.obj,
                            msg.arg1 != 0 /* shouldRetry */);
                    updateNetworkScore();
                    updateNetworkScore(isHandoverInProgress());
                    break;
                }
                case EVENT_DETACH_ALL_NETWORK_REQUESTS: {
@@ -1461,11 +1462,13 @@ public class DataNetwork extends StateMachine {
            notifyPreciseDataConnectionState();
            mDataNetworkCallback.invokeFromExecutor(
                    () -> mDataNetworkCallback.onHandoverStarted(DataNetwork.this));
            updateNetworkScore(true /* keepConnectedForHandover */);
        }

        @Override
        public void exit() {
            removeMessages(EVENT_STUCK_IN_TRANSIENT_STATE);
            updateNetworkScore(false /* keepConnectedForHandover */);
        }

        @Override
@@ -2990,38 +2993,22 @@ public class DataNetwork extends StateMachine {
        return mLinkStatus;
    }


    /**
     * Update the network score and report to connectivity service if necessary.
     *
     * @param keepConnectedForHandover indicate handover is in progress or not.
     */
    private void updateNetworkScore() {
        int networkScore = getNetworkScore();
        if (networkScore != mNetworkScore) {
            logl("Updating score from " + mNetworkScore + " to " + networkScore);
            mNetworkScore = networkScore;
    private void updateNetworkScore(boolean keepConnectedForHandover) {
        int connectedReason = keepConnectedForHandover
                ? NetworkScore.KEEP_CONNECTED_FOR_HANDOVER : NetworkScore.KEEP_CONNECTED_NONE;
        if (mNetworkScore.getKeepConnectedReason() != connectedReason) {
            mNetworkScore = new NetworkScore.Builder()
                    .setKeepConnectedReason(connectedReason).build();
            mNetworkAgent.sendNetworkScore(mNetworkScore);
        }
    }

    /**
     * @return The network score. The higher score of the network has higher chance to be
     * selected by the connectivity service as active network.
     */
    private int getNetworkScore() {
        // If it's serving a network request that asks NET_CAPABILITY_INTERNET and doesn't have
        // specify a sub id, this data network is considered to be default internet data
        // connection. In this case we assign a slightly higher score of 50. The intention is
        // it will not be replaced by other data networks accidentally in DSDS use case.
        int score = OTHER_NETWORK_SCORE;
        for (TelephonyNetworkRequest networkRequest : mAttachedNetworkRequestList) {
            if (networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                    && networkRequest.getNetworkSpecifier() == null) {
                score = DEFAULT_INTERNET_NETWORK_SCORE;
            }
        }

        return score;
    }

    /**
     * @return Network registration info on the current transport.
     */
+31 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.net.NetworkAgentConfig;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.net.NetworkScore;
import android.net.vcn.VcnManager.VcnNetworkPolicyChangeListener;
import android.net.vcn.VcnNetworkPolicyResult;
import android.os.AsyncResult;
@@ -1023,6 +1024,9 @@ public class DataNetworkTest extends TelephonyTest {
        setupDataNetwork();

        setSuccessfulSetupDataResponse(mMockedWlanDataServiceManager, 456);
        TelephonyNetworkAgent mockNetworkAgent = Mockito.mock(TelephonyNetworkAgent.class);
        replaceInstance(DataNetwork.class, "mNetworkAgent",
                mDataNetworkUT, mockNetworkAgent);
        // Now handover to IWLAN
        mDataNetworkUT.startHandover(AccessNetworkConstants.TRANSPORT_TYPE_WLAN, null);
        processAllMessages();
@@ -1047,6 +1051,18 @@ public class DataNetworkTest extends TelephonyTest {
                .isEqualTo(TelephonyManager.DATA_HANDOVER_IN_PROGRESS);
        assertThat(pdcsList.get(3).getState()).isEqualTo(TelephonyManager.DATA_CONNECTED);

        ArgumentCaptor<NetworkScore> networkScoreCaptor =
                ArgumentCaptor.forClass(NetworkScore.class);
        verify(mockNetworkAgent, times(2))
                .sendNetworkScore(networkScoreCaptor.capture());
        List<NetworkScore> networkScoreList = networkScoreCaptor.getAllValues();

        assertThat(networkScoreList).hasSize(2);
        assertThat(networkScoreList.get(0).getKeepConnectedReason())
                .isEqualTo(NetworkScore.KEEP_CONNECTED_FOR_HANDOVER);
        assertThat(networkScoreList.get(1).getKeepConnectedReason())
                .isEqualTo(NetworkScore.KEEP_CONNECTED_NONE);

        // Now handover back to cellular
        Mockito.clearInvocations(mDataNetworkCallback);
        Mockito.clearInvocations(mLinkBandwidthEstimator);
@@ -1066,6 +1082,9 @@ public class DataNetworkTest extends TelephonyTest {
    public void testHandoverFailed() throws Exception {
        setupDataNetwork();

        TelephonyNetworkAgent mockNetworkAgent = Mockito.mock(TelephonyNetworkAgent.class);
        replaceInstance(DataNetwork.class, "mNetworkAgent",
                mDataNetworkUT, mockNetworkAgent);
        setFailedSetupDataResponse(mMockedWlanDataServiceManager,
                DataServiceCallback.RESULT_ERROR_TEMPORARILY_UNAVAILABLE);
        // Now attempt to handover to IWLAN but fail it.
@@ -1095,6 +1114,18 @@ public class DataNetworkTest extends TelephonyTest {
        assertThat(pdcsList.get(3).getLastCauseCode())
                .isEqualTo(DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE);

        ArgumentCaptor<NetworkScore> networkScoreCaptor =
                ArgumentCaptor.forClass(NetworkScore.class);
        verify(mockNetworkAgent, times(2))
                .sendNetworkScore(networkScoreCaptor.capture());
        List<NetworkScore> networkScoreList = networkScoreCaptor.getAllValues();

        assertThat(networkScoreList).hasSize(2);
        assertThat(networkScoreList.get(0).getKeepConnectedReason())
                .isEqualTo(NetworkScore.KEEP_CONNECTED_FOR_HANDOVER);
        assertThat(networkScoreList.get(1).getKeepConnectedReason())
                .isEqualTo(NetworkScore.KEEP_CONNECTED_NONE);

        // Test source PDN lost during the HO, expect tear down after HO
        setFailedSetupDataResponse(mMockedWlanDataServiceManager,
                DataServiceCallback.RESULT_ERROR_TEMPORARILY_UNAVAILABLE);