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

Commit ea16d1a0 authored by Wink Saville's avatar Wink Saville Committed by The Android Automerger
Browse files

Restart, cleanup or retry inactve connections.

Instead of retrying all inactive connections, restart radio on very bad
errors, clean those that are permanent failures and retry
the others.

Bug: 10131736
Change-Id: I2527b18d6cda52c55fb94be58fbb1a7a86818ef9
parent f3b64fae
Loading
Loading
Loading
Loading
+33 −5
Original line number Diff line number Diff line
@@ -1213,13 +1213,29 @@ public final class DataConnection extends StateMachine {
                            if (DBG) {
                                log("DcActivatingState: ERR_RilError "
                                        + " delay=" + delay
                                        + " isRetryNeeded=" + mRetryManager.isRetryNeeded());
                            }
                            if ((delay >= 0) && (result.mFailCause.isPermanentFail() == false)) {
                                        + " isRetryNeeded=" + mRetryManager.isRetryNeeded()
                                        + " result=" + result
                                        + " result.isRestartRadioFail=" +
                                                result.mFailCause.isRestartRadioFail()
                                        + " result.isPermanentFail=" +
                                                result.mFailCause.isPermanentFail());
                            }
                            if (result.mFailCause.isRestartRadioFail()) {
                                if (DBG) log("DcActivatingState: ERR_RilError restart radio");
                                mDct.sendRestartRadio();
                                mInactiveState.setEnterNotificationParams(cp, result.mFailCause);
                                transitionTo(mInactiveState);
                            } else if (result.mFailCause.isPermanentFail()) {
                                if (DBG) log("DcActivatingState: ERR_RilError perm error");
                                mInactiveState.setEnterNotificationParams(cp, result.mFailCause);
                                transitionTo(mInactiveState);
                            } else if (delay >= 0) {
                                if (DBG) log("DcActivatingState: ERR_RilError retry");
                                mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION,
                                                            mTag, delay);
                                transitionTo(mRetryingState);
                            } else {
                                if (DBG) log("DcActivatingState: ERR_RilError no retry");
                                mInactiveState.setEnterNotificationParams(cp, result.mFailCause);
                                transitionTo(mInactiveState);
                            }
@@ -1259,13 +1275,25 @@ public final class DataConnection extends StateMachine {
                                    + " isRetryNeeded=" + mRetryManager.isRetryNeeded()
                                    + " dc=" + DataConnection.this);
                        }
                        if (mRetryManager.isRetryNeeded() && (cause.isPermanentFail() == false)) {
                        if (cause.isRestartRadioFail()) {
                            if (DBG) {
                                log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE"
                                        + " restart radio");
                            }
                            mDct.sendRestartRadio();
                            mInactiveState.setEnterNotificationParams(cp, cause);
                            transitionTo(mInactiveState);
                        } else if (cause.isPermanentFail()) {
                            if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE perm er");
                            mInactiveState.setEnterNotificationParams(cp, cause);
                            transitionTo(mInactiveState);
                        } else if ((retryDelay >= 0) && (mRetryManager.isRetryNeeded())) {
                            if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE retry");
                            mDcRetryAlarmController.startRetryAlarm(EVENT_RETRY_CONNECTION, mTag,
                                                            retryDelay);
                            transitionTo(mRetryingState);
                        } else {
                            // Transition to inactive but send notifications after
                            // we've entered the mInactive state.
                            if (DBG) log("DcActivatingState: EVENT_GET_LAST_FAIL_DONE no retry");
                            mInactiveState.setEnterNotificationParams(cp, cause);
                            transitionTo(mInactiveState);
                        }
+12 −2
Original line number Diff line number Diff line
@@ -224,8 +224,18 @@ class DcController extends StateMachine {
                    if (DBG) log("onDataStateChanged: Found ConnId=" + newState.cid
                            + " newState=" + newState.toString());
                    if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_INACTIVE) {
                        DcFailCause failCause = DcFailCause.fromInt(newState.status);
                        if (DBG) log("onDataStateChanged: inactive failCause=" + failCause);
                        if (failCause.isRestartRadioFail()) {
                            if (DBG) log("onDataStateChanged: X restart radio");
                            mDct.sendRestartRadio();
                        } else if (failCause.isPermanentFail()) {
                            if (DBG) log("onDataStateChanged: inactive, add to cleanup list");
                            apnsToCleanup.addAll(dc.mApnContexts);
                        } else {
                            if (DBG) log("onDataStateChanged: inactive, add to retry list");
                            dcsToRetry.add(dc);
                        }
                    } else {
                        // Its active so update the DataConnections link properties
                        UpdateLinkPropertyResult result = dc.updateLinkProperty(newState);
+6 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ public enum DcFailCause {
    SERVICE_OPTION_NOT_SUBSCRIBED(0x21),    /* no retry */
    SERVICE_OPTION_OUT_OF_ORDER(0x22),
    NSAPI_IN_USE(0x23),                     /* no retry */
    REGULAR_DEACTIVATION(0x24),             /* Restart radio */
    ONLY_IPV4_ALLOWED(0x32),                /* no retry */
    ONLY_IPV6_ALLOWED(0x33),                /* no retry */
    ONLY_SINGLE_BEARER_ALLOWED(0x34),
@@ -78,6 +79,11 @@ public enum DcFailCause {
        return mErrorCode;
    }

    /** Radio has failed such that the radio should be restarted */
    public boolean isRestartRadioFail() {
        return (this == REGULAR_DEACTIVATION);
    }

    public boolean isPermanentFail() {
        return (this == OPERATOR_BARRED) || (this == MISSING_UNKNOWN_APN) ||
               (this == UNKNOWN_PDP_ADDRESS_TYPE) || (this == USER_AUTHENTICATION) ||
+10 −0
Original line number Diff line number Diff line
@@ -779,6 +779,10 @@ public abstract class DcTrackerBase extends Handler {
                onUpdateIcc();
                break;
            }
            case DctConstants.EVENT_RESTART_RADIO: {
                restartRadio();
                break;
            }
            default:
                Rlog.e("DATA", "Unidentified event msg=" + msg);
                break;
@@ -1505,6 +1509,12 @@ public abstract class DcTrackerBase extends Handler {
        sendMessage(msg);
    }

    void sendRestartRadio() {
        if (DBG)log("sendRestartRadio:");
        Message msg = obtainMessage(DctConstants.EVENT_RESTART_RADIO);
        sendMessage(msg);
    }

    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        pw.println("DataConnectionTrackerBase:");
        pw.println(" RADIO_TESTS=" + RADIO_TESTS);