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

Commit f15fec95 authored by Robert Greenwalt's avatar Robert Greenwalt Committed by Android (Google) Code Review
Browse files

Merge "Add logging for telephony network requests." into mnc-dev

parents d9c3a08d 2dde8b16
Loading
Loading
Loading
Loading
+41 −7
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.Context;
import android.net.NetworkConfig;
import android.telephony.Rlog;
import android.text.TextUtils;
import android.util.LocalLog;

import com.android.internal.R;
import com.android.internal.telephony.DctConstants;
@@ -271,16 +272,48 @@ public class ApnContext {
        }
    }

    public void incRefCount() {
    private final ArrayList<LocalLog> mLocalLogs = new ArrayList<LocalLog>();

    public void requestLog(String str) {
        synchronized (mRefCountLock) {
            for (LocalLog l : mLocalLogs) {
                l.log(str);
            }
        }
    }

    public void incRefCount(LocalLog log) {
        synchronized (mRefCountLock) {
            if (mRefCount == 0) {
               // we wanted to leave the last in so it could actually capture the tear down
               // of the network
               requestLog("clearing log with size=" + mLocalLogs.size());
               mLocalLogs.clear();
            }
            if (mLocalLogs.contains(log)) {
                log.log("ApnContext.incRefCount has duplicate add - " + mRefCount);
            } else {
                mLocalLogs.add(log);
                log.log("ApnContext.incRefCount - " + mRefCount);
            }
            if (mRefCount++ == 0) {
                mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), true);
            }
        }
    }

    public void decRefCount() {
    public void decRefCount(LocalLog log) {
        synchronized (mRefCountLock) {
            // leave the last log alive to capture the actual tear down
            if (mRefCount != 1) {
                if (mLocalLogs.remove(log)) {
                    log.log("ApnContext.decRefCount - " + mRefCount);
                } else {
                    log.log("ApnContext.decRefCount didn't find log - " + mRefCount);
                }
            } else {
                log.log("ApnContext.decRefCount - 1");
            }
            if (mRefCount-- == 1) {
                mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), false);
            }
@@ -290,13 +323,14 @@ public class ApnContext {
    @Override
    public synchronized String toString() {
        // We don't print mDataConnection because its recursive.
        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" + mWaitingApns +
                "} mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown +
                " mApnSetting={" + mApnSetting + "} mReason=" + mReason +
                " mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}";
        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" +
                mWaitingApns + "} mWaitingApnsPermanentFailureCountDown=" +
                mWaitingApnsPermanentFailureCountDown + " mApnSetting={" + mApnSetting +
                "} mReason=" + mReason + " mDataEnabled=" + mDataEnabled + " mDependencyMet=" +
                mDependencyMet + "}";
    }

    protected void log(String s) {
    private void log(String s) {
        Rlog.d(LOG_TAG, "[ApnContext:" + mApnType + "] " + s);
    }

+32 −19
Original line number Diff line number Diff line
@@ -516,6 +516,7 @@ public final class DataConnection extends StateMachine {
        if (DBG) log("onConnect: carrier='" + mApnSetting.carrier
                + "' APN='" + mApnSetting.apn
                + "' proxy='" + mApnSetting.proxy + "' port='" + mApnSetting.port + "'");
        if (cp.mApnContext != null) cp.mApnContext.requestLog("DataConnection.onConnect");

        // Check if we should fake an error.
        if (mDcTesterFailBringUpAll.getDcFailBringUp().mCounter  > 0) {
@@ -583,9 +584,10 @@ public final class DataConnection extends StateMachine {
     */
    private void tearDownData(Object o) {
        int discReason = RILConstants.DEACTIVATE_REASON_NONE;
        ApnContext apnContext = null;
        if ((o != null) && (o instanceof DisconnectParams)) {
            DisconnectParams dp = (DisconnectParams)o;

            apnContext = dp.mApnContext;
            if (TextUtils.equals(dp.mReason, Phone.REASON_RADIO_TURNED_OFF)) {
                discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF;
            } else if (TextUtils.equals(dp.mReason, Phone.REASON_PDP_RESET)) {
@@ -595,11 +597,15 @@ public final class DataConnection extends StateMachine {
        if (mPhone.mCi.getRadioState().isOn()
                || (mPhone.getServiceState().getRilDataRadioTechnology()
                        == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN )) {
            if (DBG) log("tearDownData radio is on, call deactivateDataCall");
            String str = "tearDownData radio is on, call deactivateDataCall";
            if (DBG) log(str);
            if (apnContext != null) apnContext.requestLog(str);
            mPhone.mCi.deactivateDataCall(mCid, discReason,
                    obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o));
        } else {
            if (DBG) log("tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately");
            String str = "tearDownData radio is off sendMessage EVENT_DEACTIVATE_DONE immediately";
            if (DBG) log(str);
            if (apnContext != null) apnContext.requestLog(str);
            AsyncResult ar = new AsyncResult(o, null, null);
            sendMessage(obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, ar));
        }
@@ -1606,6 +1612,9 @@ public final class DataConnection extends StateMachine {
                        log("DcActivatingState onSetupConnectionCompleted result=" + result
                                + " dc=" + DataConnection.this);
                    }
                    if (cp.mApnContext != null) {
                        cp.mApnContext.requestLog("onSetupConnectionCompleted result=" + result);
                    }
                    switch (result) {
                        case SUCCESS:
                            // All is well
@@ -1632,16 +1641,16 @@ public final class DataConnection extends StateMachine {
                        case ERR_RilError:
                            int delay = mDcRetryAlarmController.getSuggestedRetryTime(
                                                                    DataConnection.this, ar);
                            if (DBG) {
                                log("DcActivatingState: ERR_RilError "
                            String str = "DcActivatingState: ERR_RilError "
                                    + " delay=" + delay
                                    + " isRetryNeeded=" + mRetryManager.isRetryNeeded()
                                    + " result=" + result
                                    + " result.isRestartRadioFail=" +
                                    result.mFailCause.isRestartRadioFail()
                                    + " result.isPermanentFail=" +
                                        mDct.isPermanentFail(result.mFailCause));
                            }
                                    mDct.isPermanentFail(result.mFailCause);
                            if (DBG) log(str);
                            if (cp.mApnContext != null) cp.mApnContext.requestLog(str);
                            if (result.mFailCause.isRestartRadioFail()) {
                                if (DBG) log("DcActivatingState: ERR_RilError restart radio");
                                mDct.sendRestartRadio();
@@ -1960,10 +1969,14 @@ public final class DataConnection extends StateMachine {
                    break;

                case EVENT_DEACTIVATE_DONE:
                    if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount="
                            + mApnContexts.size());
                    AsyncResult ar = (AsyncResult) msg.obj;
                    DisconnectParams dp = (DisconnectParams) ar.userObj;

                    String str = "DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE RefCount="
                            + mApnContexts.size();
                    if (DBG) log(str);
                    if (dp.mApnContext != null) dp.mApnContext.requestLog(str);

                    if (dp.mTag == mTag) {
                        // Transition to inactive but send notifications after
                        // we've entered the mInactive state.
@@ -2002,10 +2015,10 @@ public final class DataConnection extends StateMachine {
                    AsyncResult ar = (AsyncResult) msg.obj;
                    ConnectionParams cp = (ConnectionParams) ar.userObj;
                    if (cp.mTag == mTag) {
                        if (DBG) {
                            log("DcDisconnectionErrorCreatingConnection" +
                                " msg.what=EVENT_DEACTIVATE_DONE");
                        }
                        String str = "DcDisconnectionErrorCreatingConnection" +
                                " msg.what=EVENT_DEACTIVATE_DONE";
                        if (DBG) log(str);
                        if (cp.mApnContext != null) cp.mApnContext.requestLog(str);

                        // Transition to inactive but send notifications after
                        // we've entered the mInactive state.
+19 −7
Original line number Diff line number Diff line
@@ -16,13 +16,14 @@

package com.android.internal.telephony.dataconnection;

import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
import com.android.internal.telephony.PhoneConstants;

import android.net.NetworkRequest;
import android.os.Message;
import android.telephony.Rlog;
import android.util.LocalLog;

import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
import com.android.internal.telephony.PhoneConstants;

public class DcSwitchAsyncChannel extends AsyncChannel {
    private static final boolean DBG = true;
@@ -60,12 +61,23 @@ public class DcSwitchAsyncChannel extends AsyncChannel {

    public static class RequestInfo {
        boolean executed;
        NetworkRequest request;
        int priority;
        final NetworkRequest request;
        final int priority;
        private final LocalLog requestLog;

        public RequestInfo(NetworkRequest request, int priority) {
        public RequestInfo(NetworkRequest request, int priority, LocalLog l) {
            this.request = request;
            this.priority = priority;
            this.requestLog = l;
            this.executed = false;
        }

        public void log(String str) {
            requestLog.log(str);
        }

        public LocalLog getLog() {
            return requestLog;
        }

        @Override
+4 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ public class DcSwitchStateMachine extends StateMachine {
            switch (msg.what) {
                case DcSwitchAsyncChannel.REQ_CONNECT: {
                    RequestInfo apnRequest = (RequestInfo)msg.obj;
                    apnRequest.log("DcSwitchStateMachine.IdleState: REQ_CONNECT");
                    if (DBG) log("IdleState: REQ_CONNECT, apnRequest=" + apnRequest);
                    transitionTo(mAttachingState);
                    retVal = HANDLED;
@@ -160,6 +161,7 @@ public class DcSwitchStateMachine extends StateMachine {
            switch (msg.what) {
                case DcSwitchAsyncChannel.REQ_CONNECT: {
                    RequestInfo apnRequest = (RequestInfo)msg.obj;
                    apnRequest.log("DcSwitchStateMachine.AttachingState: REQ_CONNECT");
                    if (DBG) log("AttachingState: REQ_CONNECT, apnRequest=" + apnRequest);

                    // do nothing - wait til we attach and then we'll execute all requests
@@ -245,6 +247,7 @@ public class DcSwitchStateMachine extends StateMachine {
            switch (msg.what) {
                case DcSwitchAsyncChannel.REQ_CONNECT: {
                    RequestInfo apnRequest = (RequestInfo)msg.obj;
                    apnRequest.log("DcSwitchStateMachine.AttachedState: REQ_CONNECT");
                    if (DBG) log("AttachedState: REQ_CONNECT, apnRequest=" + apnRequest);

                    DctController.getInstance().executeRequest(apnRequest);
@@ -301,6 +304,7 @@ public class DcSwitchStateMachine extends StateMachine {
            switch (msg.what) {
                case DcSwitchAsyncChannel.REQ_CONNECT: {
                    RequestInfo apnRequest = (RequestInfo)msg.obj;
                    apnRequest.log("DcSwitchStateMachine.DetachingState: REQ_CONNECT");
                    if (DBG) log("DetachingState: REQ_CONNECT, apnRequest=" + apnRequest);

                    // can't process this now - wait until we return to idle
+46 −28
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.LocalLog;
import android.view.WindowManager;
import android.telephony.Rlog;

@@ -252,18 +253,20 @@ public final class DcTracker extends DcTrackerBase {
    }

    @Override
    public void incApnRefCount(String name) {
    public void incApnRefCount(String name, LocalLog log) {
        ApnContext apnContext = mApnContexts.get(name);
        log.log("DcTracker.incApnRefCount on " + name + " found " + apnContext);
        if (apnContext != null) {
            apnContext.incRefCount();
            apnContext.incRefCount(log);
        }
    }

    @Override
    public void decApnRefCount(String name) {
    public void decApnRefCount(String name, LocalLog log) {
        ApnContext apnContext = mApnContexts.get(name);
        log.log("DcTracker.decApnRefCount on " + name + " found " + apnContext);
        if (apnContext != null) {
            apnContext.decRefCount();
            apnContext.decRefCount(log);
        }
    }

@@ -832,6 +835,7 @@ public final class DcTracker extends DcTrackerBase {
                    " due to " + apnContext.getReason() + " apnContext=" + apnContext);
            log("trySetupData with mIsPsRestricted=" + mIsPsRestricted);
        }
        apnContext.requestLog("trySetupData due to " + apnContext.getReason());

        if (mPhone.getSimulatedRadioControl() != null) {
            // Assume data is connected on the simulator
@@ -855,7 +859,9 @@ public final class DcTracker extends DcTrackerBase {
                (isDataAllowed(apnContext) &&
                getAnyDataEnabled(checkUserDataEnabled) && !isEmergency()))) {
            if (apnContext.getState() == DctConstants.State.FAILED) {
                if (DBG) log("trySetupData: make a FAILED ApnContext IDLE so its reusable");
                String str ="trySetupData: make a FAILED ApnContext IDLE so its reusable";
                if (DBG) log(str);
                apnContext.requestLog(str);
                apnContext.setState(DctConstants.State.IDLE);
            }
            int radioTech = mPhone.getServiceState().getRilDataRadioTechnology();
@@ -867,7 +873,9 @@ public final class DcTracker extends DcTrackerBase {
                if (waitingApns.isEmpty()) {
                    notifyNoData(DcFailCause.MISSING_UNKNOWN_APN, apnContext);
                    notifyOffApnsOfAvailability(apnContext.getReason());
                    if (DBG) log("trySetupData: X No APN found retValue=false");
                    String str = "trySetupData: X No APN found retValue=false";
                    if (DBG) log(str);
                    apnContext.requestLog(str);
                    return false;
                } else {
                    apnContext.setWaitingApns(waitingApns);
@@ -893,7 +901,16 @@ public final class DcTracker extends DcTrackerBase {
                mPhone.notifyDataConnectionFailed(apnContext.getReason(), apnContext.getApnType());
            }
            notifyOffApnsOfAvailability(apnContext.getReason());
            if (DBG) log ("trySetupData: X apnContext not 'ready' retValue=false");
            String str = "trySetupData: X apnContext not 'ready' retValue=false";
            apnContext.requestLog(str);
            if (DBG) {
                log(str);
                if (!apnContext.isConnectable()) log("apnContext.isConnectable = false");
                if (!isDataAllowed(apnContext)) log("isDataAllowed = false");
                if (!getAnyDataEnabled(checkUserDataEnabled)) {
                    log("getAnyDataEnabled(" + checkUserDataEnabled + ") = false");
                }
            }
            return false;
        }
    }
@@ -989,10 +1006,10 @@ public final class DcTracker extends DcTrackerBase {
        }

        DcAsyncChannel dcac = apnContext.getDcAc();
        if (DBG) {
            log("cleanUpConnection: E tearDown=" + tearDown + " reason=" + apnContext.getReason() +
                    " apnContext=" + apnContext);
        }
        String str = "cleanUpConnection: tearDown=" + tearDown + " reason=" +
                apnContext.getReason();
        if (DBG) log(str + " apnContext=" + apnContext);
        apnContext.requestLog(str);
        if (tearDown) {
            if (apnContext.isDisconnected()) {
                // The request is tearDown and but ApnContext is not connected.
@@ -1000,10 +1017,9 @@ public final class DcTracker extends DcTrackerBase {
                apnContext.setState(DctConstants.State.IDLE);
                if (!apnContext.isReady()) {
                    if (dcac != null) {
                        if (DBG) {
                            log("cleanUpConnection: teardown, disconnected, !ready apnContext="
                                    + apnContext);
                        }
                        str = "cleanUpConnection: teardown, disconnectd, !ready";
                        if (DBG) log(str + " apnContext=" + apnContext);
                        apnContext.requestLog(str);
                        dcac.tearDown(apnContext, "", null);
                    }
                    apnContext.setDataConnectionAc(null);
@@ -1027,10 +1043,9 @@ public final class DcTracker extends DcTrackerBase {
                                disconnectAll = true;
                            }
                        }
                        if (DBG) {
                            log("cleanUpConnection: tearing down" + (disconnectAll ? " all" :"")
                                    + "apnContext=" + apnContext);
                        }
                        str = "cleanUpConnection: tearing down" + (disconnectAll ? " all" : "");
                        if (DBG) log(str + "apnContext=" + apnContext);
                        apnContext.requestLog(str);
                        Message msg = obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, apnContext);
                        if (disconnectAll) {
                            apnContext.getDcAc().tearDownAll(apnContext.getReason(), msg);
@@ -1045,6 +1060,7 @@ public final class DcTracker extends DcTrackerBase {
                    // apn is connected but no reference to dcac.
                    // Should not be happen, but reset the state in case.
                    apnContext.setState(DctConstants.State.IDLE);
                    apnContext.requestLog("cleanUpConnection: connected, bug no DCAC");
                    mPhone.notifyDataConnection(apnContext.getReason(),
                                                apnContext.getApnType());
                }
@@ -1062,10 +1078,9 @@ public final class DcTracker extends DcTrackerBase {
        if (dcac != null) {
            cancelReconnectAlarm(apnContext);
        }
        if (DBG) {
            log("cleanUpConnection: X tearDown=" + tearDown + " reason=" + apnContext.getReason() +
                    " apnContext=" + apnContext + " dcac=" + apnContext.getDcAc());
        }
        str = "cleanUpConnection: X tearDown=" + tearDown + " reason=" + apnContext.getReason();
        if (DBG) log(str + " apnContext=" + apnContext + " dcac=" + apnContext.getDcAc());
        apnContext.requestLog(str);
    }

    /**
@@ -1222,6 +1237,7 @@ public final class DcTracker extends DcTrackerBase {

    private boolean setupData(ApnContext apnContext, int radioTech) {
        if (DBG) log("setupData: apnContext=" + apnContext);
        apnContext.requestLog("setupData");
        ApnSetting apnSetting;
        DcAsyncChannel dcac = null;

@@ -1518,11 +1534,12 @@ public final class DcTracker extends DcTrackerBase {
    private void applyNewState(ApnContext apnContext, boolean enabled, boolean met) {
        boolean cleanup = false;
        boolean trySetup = false;
        if (DBG) {
            log("applyNewState(" + apnContext.getApnType() + ", " + enabled +
        String str ="applyNewState(" + apnContext.getApnType() + ", " + enabled +
                "(" + apnContext.isEnabled() + "), " + met + "(" +
                    apnContext.getDependencyMet() +"))");
        }
                apnContext.getDependencyMet() +"))";
        if (DBG) log(str);
        apnContext.requestLog(str);

        if (apnContext.isReady()) {
            cleanup = true;
            if (enabled && met) {
@@ -1534,6 +1551,7 @@ public final class DcTracker extends DcTrackerBase {
                    case DISCONNECTING:
                        // We're "READY" and active so just return
                        if (DBG) log("applyNewState: 'ready' so return");
                        apnContext.requestLog("applyNewState state=" + state + ", so return");
                        return;
                    case IDLE:
                        // fall through: this is unexpected but if it happens cleanup and try setup
Loading