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

Commit 7bca93c8 authored by Ling Ma's avatar Ling Ma Committed by Jack Yu
Browse files

Migrate DataCallSessionStats from old data stack to new data stack

DataCallSessionStats is used to record each data network connection.

Test: atest
Bug: 217375910
Merged-In: I6119d3efdffcc5e2cf3eefe71a52261d0ea8f0f5
Change-Id: I6119d3efdffcc5e2cf3eefe71a52261d0ea8f0f5
parent bd48dc7c
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ import com.android.internal.telephony.data.DataNetworkController.NetworkRequestL
import com.android.internal.telephony.data.DataRetryManager.DataHandoverRetryEntry;
import com.android.internal.telephony.data.DataRetryManager.DataRetryEntry;
import com.android.internal.telephony.data.TelephonyNetworkAgent.TelephonyNetworkAgentCallback;
import com.android.internal.telephony.metrics.DataCallSessionStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IState;
@@ -446,6 +447,10 @@ public class DataNetwork extends StateMachine {
    /** The log tag. */
    private String mLogTag;

    /** Metrics of per data network connection. */
    private final DataCallSessionStats mDataCallSessionStats;


    /**
     * The unique context id assigned by the data service in {@link DataCallResponse#getId()}. One
     * for {@link AccessNetworkConstants#TRANSPORT_TYPE_WWAN} and one for
@@ -762,6 +767,7 @@ public class DataNetwork extends StateMachine {
                        sendMessage(EVENT_SUBSCRIPTION_PLAN_OVERRIDE);
                    }});
        mDataConfigManager = mDataNetworkController.getDataConfigManager();
        mDataCallSessionStats = new DataCallSessionStats(mPhone);
        mDataNetworkCallback = callback;
        mDataProfile = dataProfile;
        mTransport = transport;
@@ -879,6 +885,7 @@ public class DataNetwork extends StateMachine {
                    updateSuspendState();
                    updateTcpBufferSizes();
                    updateBandwidthFromDataConfig();
                    updateDataCallSessionStatsOfDrsOrRatChange((AsyncResult) msg.obj);
                    break;
                }
                case EVENT_ATTACH_NETWORK_REQUEST: {
@@ -1218,6 +1225,7 @@ public class DataNetwork extends StateMachine {
            quit();
            notifyPreciseDataConnectionState();
            mNetworkAgent.unregister();
            mDataCallSessionStats.onDataCallDisconnected(mFailCause);

            if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN
                    && mPduSessionId != DataCallResponse.PDU_SESSION_ID_NOT_SET) {
@@ -1594,6 +1602,19 @@ public class DataNetwork extends StateMachine {
        return mDataProfile;
    }

    /**
     * Once RIL Data Radio Technology changes, the new radio technology will be returned in
     * AsyncResult.
     * See
     * {@link com.android.internal.telephony.ServiceStateTracker#registerForDataRegStateOrRatChanged}
     *
     * @param ar RegistrationInfo: {@code Pair(drs, rat)}
     */
    private void updateDataCallSessionStatsOfDrsOrRatChange(AsyncResult ar) {
        Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>) ar.result;
        mDataCallSessionStats.onDrsOrRatChanged(drsRatPair.second);
    }

    /**
     * Update data suspended state.
     */
@@ -1679,6 +1700,10 @@ public class DataNetwork extends StateMachine {
                        trafficDescriptor, matchAllRuleAllowed,
                        obtainMessage(EVENT_SETUP_DATA_CALL_RESPONSE));

        int apnTypeBitmask = mDataProfile.getApnSetting() != null
                ? mDataProfile.getApnSetting().getApnTypeBitmask() : ApnSetting.TYPE_NONE;
        mDataCallSessionStats.onSetupDataCall(apnTypeBitmask);

        logl("setupData: accessNetwork="
                + AccessNetworkType.toString(accessNetwork) + ", " + mDataProfile
                + ", isModemRoaming=" + isModemRoaming + ", allowRoaming=" + allowRoaming
@@ -1934,6 +1959,18 @@ public class DataNetwork extends StateMachine {
                            DataNetwork.this, requestList, mFailCause, retryDelayMillis));
            transitionTo(mDisconnectedState);
        }

        int apnTypeBitmask = ApnSetting.TYPE_NONE;
        int protocol = ApnSetting.PROTOCOL_UNKNOWN;
        if (mDataProfile.getApnSetting() != null) {
            apnTypeBitmask = mDataProfile.getApnSetting().getApnTypeBitmask();
            protocol = mDataProfile.getApnSetting().getProtocol();
        }
        mDataCallSessionStats.onSetupDataCallResponse(response,
                getDataNetworkType(),
                apnTypeBitmask,
                protocol,
                mFailCause);
    }

    /**
@@ -1962,6 +1999,7 @@ public class DataNetwork extends StateMachine {
        // TODO: Need to support DataService.REQUEST_REASON_SHUTDOWN
        mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport),
                DataService.REQUEST_REASON_NORMAL, null);
        mDataCallSessionStats.setDeactivateDataCallReason(DataService.REQUEST_REASON_NORMAL);
        mInvokedDataDeactivation = true;
    }

+2 −1
Original line number Diff line number Diff line
@@ -2794,7 +2794,8 @@ public class DataConnection extends StateMachine {
                    }
                    retVal = HANDLED;
                    mDataCallSessionStats
                            .onSetupDataCallResponse(dataCallResponse, cp.mRilRat,
                            .onSetupDataCallResponse(dataCallResponse,
                                    ServiceState.rilRadioTechnologyToNetworkType(cp.mRilRat),
                                    getApnTypeBitmask(), mApnSetting.getProtocol(),
                                    result.mFailCause);
                    break;
+2 −4
Original line number Diff line number Diff line
@@ -74,14 +74,14 @@ public class DataCallSessionStats {
     * Updates the ongoing dataCall's atom for data call response event.
     *
     * @param response setup Data call response
     * @param radioTechnology The data call RAT
     * @param currentRat The data call current Network Type
     * @param apnTypeBitmask APN type bitmask
     * @param protocol Data connection protocol
     * @param failureCause failure cause as per android.telephony.DataFailCause
     */
    public synchronized void onSetupDataCallResponse(
            @Nullable DataCallResponse response,
            @RilRadioTechnology int radioTechnology,
            @NetworkType int currentRat,
            @ApnType int apnTypeBitmask,
            @ProtocolType int protocol,
            @DataFailureCause int failureCause) {
@@ -92,7 +92,6 @@ public class DataCallSessionStats {
            return;
        }

        @NetworkType int currentRat = ServiceState.rilRadioTechnologyToNetworkType(radioTechnology);
        if (currentRat != TelephonyManager.NETWORK_TYPE_UNKNOWN) {
            mDataCallSession.ratAtEnd = currentRat;
            mDataCallSession.bandAtEnd =
@@ -113,7 +112,6 @@ public class DataCallSessionStats {
                    (int) Math.min(response.getRetryDurationMillis(), Integer.MAX_VALUE);
            // If setup has failed, then store the atom
            if (failureCause != DataFailCause.NONE) {
                mDataCallSession.failureCause = failureCause;
                mDataCallSession.oosAtEnd = getIsOos();
                mDataCallSession.setupFailed = true;
                mDataCallSession.ongoing = false;
+42 −16
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import android.telephony.Annotation.DataFailureCause;
import android.telephony.DataFailCause;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PreciseDataConnectionState;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
@@ -54,11 +55,13 @@ import android.telephony.data.NetworkSliceInfo;
import android.telephony.data.TrafficDescriptor;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.Pair;
import android.util.SparseArray;

import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.data.DataEvaluation.DataAllowedReason;
import com.android.internal.telephony.data.DataNetwork.DataNetworkCallback;
import com.android.internal.telephony.metrics.DataCallSessionStats;

import org.junit.After;
import org.junit.Before;
@@ -130,6 +133,7 @@ public class DataNetworkTest extends TelephonyTest {

    // Mocked classes
    private DataNetworkCallback mDataNetworkCallback;
    private DataCallSessionStats mDataCallSessionStats;

    private final NetworkRegistrationInfo mIwlanNetworkRegistrationInfo =
            new NetworkRegistrationInfo.Builder()
@@ -193,10 +197,17 @@ public class DataNetworkTest extends TelephonyTest {
                any(Message.class));
    }

    private void sendServiceStateChangedEvent(@ServiceState.RegState int dataRegState,
            @ServiceState.RilRadioTechnology int rat) {
        mDataNetworkUT.obtainMessage(9/*EVENT_SERVICE_STATE_CHANGED*/,
                new AsyncResult(null, new Pair<>(dataRegState, rat), null)).sendToTarget();
    }

    @Before
    public void setUp() throws Exception {
        super.setUp(getClass().getSimpleName());
        mDataNetworkCallback = Mockito.mock(DataNetworkCallback.class);
        mDataCallSessionStats = Mockito.mock(DataCallSessionStats.class);
        doReturn(true).when(mPhone).isUsingNewDataStack();
        doAnswer(invocation -> {
            ((Runnable) invocation.getArguments()[0]).run();
@@ -241,7 +252,7 @@ public class DataNetworkTest extends TelephonyTest {
    // The purpose of this test is to make sure the network request insertion/removal works as
    // expected, and make sure it is always sorted.
    @Test
    public void testCreateDataNetwork() {
    public void testCreateDataNetwork() throws Exception {
        DataNetworkController.NetworkRequestList
                networkRequestList = new DataNetworkController.NetworkRequestList();
        networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder()
@@ -252,9 +263,12 @@ public class DataNetworkTest extends TelephonyTest {

        mDataNetworkUT = new DataNetwork(mPhone, Looper.myLooper(), mDataServiceManagers,
                mInternetDataProfile, networkRequestList,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN, DataAllowedReason.NORMAL,
                mDataNetworkCallback);
        mDataNetworkUT.sendMessage(9/*EVENT_SERVICE_STATE_CHANGED*/);
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                DataAllowedReason.NORMAL, mDataNetworkCallback);
        replaceInstance(DataNetwork.class, "mDataCallSessionStats",
                mDataNetworkUT, mDataCallSessionStats);
        sendServiceStateChangedEvent(ServiceState.STATE_IN_SERVICE,
                ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);

        processAllMessages();
        verify(mSimulatedCommandsVerifier, never()).allocatePduSessionId(any(Message.class));
@@ -305,7 +319,7 @@ public class DataNetworkTest extends TelephonyTest {
    }

    @Test
    public void testCreateDataNetworkOnEnterpriseSlice() {
    public void testCreateDataNetworkOnEnterpriseSlice() throws Exception {
        DataNetworkController.NetworkRequestList
                networkRequestList = new DataNetworkController.NetworkRequestList();
        networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder()
@@ -324,7 +338,10 @@ public class DataNetworkTest extends TelephonyTest {
                mInternetDataProfile, networkRequestList,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN, DataAllowedReason.NORMAL,
                mDataNetworkCallback);
        mDataNetworkUT.sendMessage(9/*EVENT_SERVICE_STATE_CHANGED*/);
        replaceInstance(DataNetwork.class, "mDataCallSessionStats",
                mDataNetworkUT, mDataCallSessionStats);
        sendServiceStateChangedEvent(ServiceState.STATE_IN_SERVICE,
                ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);

        processAllMessages();

@@ -334,7 +351,7 @@ public class DataNetworkTest extends TelephonyTest {
    }

    @Test
    public void testCreateDataNetworkOnUrllcSlice() {
    public void testCreateDataNetworkOnUrllcSlice() throws Exception {
        DataNetworkController.NetworkRequestList
                networkRequestList = new DataNetworkController.NetworkRequestList();
        networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder()
@@ -352,7 +369,10 @@ public class DataNetworkTest extends TelephonyTest {
                mInternetDataProfile, networkRequestList,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN, DataAllowedReason.NORMAL,
                mDataNetworkCallback);
        mDataNetworkUT.sendMessage(9/*EVENT_SERVICE_STATE_CHANGED*/);
        replaceInstance(DataNetwork.class, "mDataCallSessionStats",
                mDataNetworkUT, mDataCallSessionStats);
        sendServiceStateChangedEvent(ServiceState.STATE_IN_SERVICE,
                ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);

        processAllMessages();

@@ -362,7 +382,7 @@ public class DataNetworkTest extends TelephonyTest {
    }

    @Test
    public void testCreateDataNetworkOnEmbbSlice() {
    public void testCreateDataNetworkOnEmbbSlice() throws Exception {
        DataNetworkController.NetworkRequestList
                networkRequestList = new DataNetworkController.NetworkRequestList();
        networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder()
@@ -380,7 +400,10 @@ public class DataNetworkTest extends TelephonyTest {
                mInternetDataProfile, networkRequestList,
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN, DataAllowedReason.NORMAL,
                mDataNetworkCallback);
        mDataNetworkUT.sendMessage(9/*EVENT_SERVICE_STATE_CHANGED*/);
        replaceInstance(DataNetwork.class, "mDataCallSessionStats",
                mDataNetworkUT, mDataCallSessionStats);
        sendServiceStateChangedEvent(ServiceState.STATE_IN_SERVICE,
                ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);

        processAllMessages();

@@ -391,7 +414,7 @@ public class DataNetworkTest extends TelephonyTest {

    // The purpose of this test is to make sure data could be torn down properly.
    @Test
    public void testTearDown() {
    public void testTearDown() throws Exception {
        testCreateDataNetwork();
        sendTearDownEvent(AccessNetworkConstants.TRANSPORT_TYPE_WWAN, 123,
                DataFailCause.EMM_DETACHED);
@@ -424,7 +447,7 @@ public class DataNetworkTest extends TelephonyTest {
    }

    @Test
    public void testCreateDataNetworkOnIwlan() {
    public void testCreateDataNetworkOnIwlan() throws Exception {
        doReturn(mIwlanNetworkRegistrationInfo).when(mServiceState).getNetworkRegistrationInfo(
                eq(NetworkRegistrationInfo.DOMAIN_PS),
                eq(AccessNetworkConstants.TRANSPORT_TYPE_WLAN));
@@ -442,7 +465,10 @@ public class DataNetworkTest extends TelephonyTest {
        mDataNetworkUT = new DataNetwork(mPhone, Looper.myLooper(), mDataServiceManagers,
                mImsDataProfile, networkRequestList, AccessNetworkConstants.TRANSPORT_TYPE_WLAN,
                DataAllowedReason.NORMAL, mDataNetworkCallback);
        mDataNetworkUT.sendMessage(9/*EVENT_SERVICE_STATE_CHANGED*/);
        replaceInstance(DataNetwork.class, "mDataCallSessionStats",
                mDataNetworkUT, mDataCallSessionStats);
        sendServiceStateChangedEvent(ServiceState.STATE_IN_SERVICE,
                ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN);

        processAllMessages();
        verify(mSimulatedCommandsVerifier).allocatePduSessionId(any(Message.class));
@@ -491,7 +517,7 @@ public class DataNetworkTest extends TelephonyTest {
    }

    @Test
    public void testTearDownIwlan() {
    public void testTearDownIwlan() throws Exception {
        testCreateDataNetworkOnIwlan();
        sendTearDownEvent(AccessNetworkConstants.TRANSPORT_TYPE_WLAN, 123,
                DataFailCause.EMM_DETACHED);
@@ -523,7 +549,7 @@ public class DataNetworkTest extends TelephonyTest {
    }

    @Test
    public void testHandover() {
    public void testHandover() throws Exception {
        testCreateDataNetwork();

        setSuccessfulSetupDataResponse(mMockedWlanDataServiceManager, 456);
@@ -565,7 +591,7 @@ public class DataNetworkTest extends TelephonyTest {
    }

    @Test
    public void testHandoverFailed() {
    public void testHandoverFailed() throws Exception {
        testCreateDataNetwork();

        setFailedSetupDataResponse(mMockedWlanDataServiceManager,