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

Commit f1eea59b authored by Sarah Chin's avatar Sarah Chin
Browse files

DataServiceManager update binder died behavior

Fail pending requests with ILLEGAL_STATE
Send empty data call list to tear down existing connections

Test: atest DataNetworkControllerTest, DataNetworkTest
Test: manually crash IwlanDataService and verify teardown
Bug: 230004421
Change-Id: I85e7fd9dc267e0d327b73a1948a168faf04b78e4
parent 596ddbac
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1117,6 +1117,7 @@ public class DataNetwork extends StateMachine {

            notifyPreciseDataConnectionState();
            if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
                // Defer setupData until we get the PDU session ID response
                allocatePduSessionId();
                return;
            }
@@ -1154,6 +1155,7 @@ public class DataNetwork extends StateMachine {
                case EVENT_PCO_DATA_RECEIVED:
                case EVENT_WAITING_FOR_TEARING_DOWN_CONDITION_MET:
                    // Defer the request until connected or disconnected.
                    log("Defer message " + eventToString(msg.what));
                    deferMessage(msg);
                    break;
                case EVENT_STUCK_IN_TRANSIENT_STATE:
@@ -1322,6 +1324,7 @@ public class DataNetwork extends StateMachine {
                    // signal. So we only defer the related data call list changed event, and drop
                    // the unrelated.
                    if (shouldDeferDataStateChangedEvent(msg)) {
                        log("Defer message " + eventToString(msg.what));
                        deferMessage(msg);
                    }
                    break;
@@ -1332,6 +1335,7 @@ public class DataNetwork extends StateMachine {
                case EVENT_VOICE_CALL_ENDED:
                case EVENT_VOICE_CALL_STARTED:
                    // Defer the request until handover succeeds or fails.
                    log("Defer message " + eventToString(msg.what));
                    deferMessage(msg);
                    break;
                case EVENT_HANDOVER_RESPONSE:
+3 −15
Original line number Diff line number Diff line
@@ -2440,7 +2440,7 @@ public class DataNetworkController extends Handler {

    /**
     * Track the frequency of setup data failure on each
     * {@link AccessNetworkConstants#TransportType} data service.
     * {@link AccessNetworkConstants.TransportType} data service.
     *
     * @param transport The transport of the data service.
     */
@@ -2614,7 +2614,7 @@ public class DataNetworkController extends Handler {
        }

        if (!mDataSettingsManager.isRecoveryOnBadNetworkEnabled()) {
            log("Ignore data network validation status changed becaused"
            log("Ignore data network validation status changed because "
                    + "data stall recovery is disabled.");
            return;
        }
@@ -2786,19 +2786,7 @@ public class DataNetworkController extends Handler {
        log("onDataServiceBindingChanged: " + AccessNetworkConstants
                .transportTypeToString(transport) + " data service is "
                + (bound ? "bound." : "unbound."));
        if (!bound) {
            if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
                if (!mDataConfigManager.shouldPersistIwlanDataNetworksWhenDataServiceRestarted()) {
                    for (DataNetwork dataNetwork : mDataNetworkList) {
                        if (dataNetwork.getTransport()
                                == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
                            dataNetwork.tearDown(
                                    DataNetwork.TEAR_DOWN_REASON_DATA_SERVICE_NOT_READY);
                        }
                    }
                }
            }
        } else {
        if (bound) {
            mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor(
                    () -> callback.onDataServiceBound(transport)));
        }
+12 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ import com.android.internal.telephony.PhoneConfigurationManager;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.telephony.Rlog;

import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -145,6 +146,17 @@ public class DataServiceManager extends Handler {
            loge(message);
            AnomalyReporter.reportAnomaly(UUID.fromString("fc1956de-c080-45de-8431-a1faab687110"),
                    message);

            // Cancel all pending requests
            for (Message m : mMessageMap.values()) {
                sendCompleteMessage(m, DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE);
            }
            mMessageMap.clear();

            // Tear down all connections
            mLastDataCallResponseList = Collections.EMPTY_LIST;
            mDataCallListChangedRegistrants.notifyRegistrants(
                    new AsyncResult(null, Collections.EMPTY_LIST, null));
        }
    }