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

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

Handle RADIO_NOT_AVAILABLE in deactivateDataCall

Test: atest DataNetworkTest, DataNetworkControllerTest, DcTrackerTest
Bug: 221174412
Change-Id: I073622fa4cb0ea12bacf5f95354aa38f7a44d1f8
parent d046442f
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -71,7 +71,13 @@ public class DataResponse extends IRadioDataResponse.Stub {
     * @param responseInfo Response info struct containing response type, serial no. and error
     * @param responseInfo Response info struct containing response type, serial no. and error
     */
     */
    public void deactivateDataCallResponse(RadioResponseInfo responseInfo) {
    public void deactivateDataCallResponse(RadioResponseInfo responseInfo) {
        RadioResponse.responseVoid(RIL.DATA_SERVICE, mRil, responseInfo);
        RILRequest rr = mRil.processResponse(RIL.DATA_SERVICE, responseInfo);

        if (rr != null) {
            int response = responseInfo.error;
            RadioResponse.sendMessageResponse(rr.mResult, response);
            mRil.processResponseDone(rr, responseInfo, response);
        }
    }
    }


    /**
    /**
+7 −1
Original line number Original line Diff line number Diff line
@@ -740,7 +740,13 @@ public class RadioResponse extends IRadioResponse.Stub {
     * @param responseInfo Response info struct containing response type, serial no. and error
     * @param responseInfo Response info struct containing response type, serial no. and error
     */
     */
    public void deactivateDataCallResponse(RadioResponseInfo responseInfo) {
    public void deactivateDataCallResponse(RadioResponseInfo responseInfo) {
        responseVoid(responseInfo);
        RILRequest rr = mRil.processResponse(responseInfo);

        if (rr != null) {
            int response = responseInfo.error;
            sendMessageResponse(rr.mResult, response);
            mRil.processResponseDone(rr, responseInfo, response);
        }
    }
    }


    /**
    /**
+8 −4
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.internal.telephony.data;
import static android.telephony.data.DataServiceCallback.RESULT_SUCCESS;
import static android.telephony.data.DataServiceCallback.RESULT_SUCCESS;


import android.annotation.Nullable;
import android.annotation.Nullable;
import android.hardware.radio.RadioError;
import android.net.LinkProperties;
import android.net.LinkProperties;
import android.os.AsyncResult;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Handler;
@@ -51,7 +52,7 @@ public class CellularDataService extends DataService {
    private static final boolean DBG = false;
    private static final boolean DBG = false;


    private static final int SETUP_DATA_CALL_COMPLETE               = 1;
    private static final int SETUP_DATA_CALL_COMPLETE               = 1;
    private static final int DEACTIVATE_DATA_ALL_COMPLETE           = 2;
    private static final int DEACTIVATE_DATA_CALL_COMPLETE          = 2;
    private static final int SET_INITIAL_ATTACH_APN_COMPLETE        = 3;
    private static final int SET_INITIAL_ATTACH_APN_COMPLETE        = 3;
    private static final int SET_DATA_PROFILE_COMPLETE              = 4;
    private static final int SET_DATA_PROFILE_COMPLETE              = 4;
    private static final int REQUEST_DATA_CALL_LIST_COMPLETE        = 5;
    private static final int REQUEST_DATA_CALL_LIST_COMPLETE        = 5;
@@ -87,9 +88,12 @@ public class CellularDataService extends DataService {
                                    : RESULT_SUCCESS,
                                    : RESULT_SUCCESS,
                                    response);
                                    response);
                            break;
                            break;
                        case DEACTIVATE_DATA_ALL_COMPLETE:
                        case DEACTIVATE_DATA_CALL_COMPLETE:
                            int error = (int) ar.result;
                            callback.onDeactivateDataCallComplete(ar.exception != null
                            callback.onDeactivateDataCallComplete(ar.exception != null
                                    ? DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE
                                    ? DataServiceCallback.RESULT_ERROR_ILLEGAL_STATE
                                    : error == RadioError.RADIO_NOT_AVAILABLE
                                            ? DataServiceCallback.RESULT_ERROR_RADIO_NOT_AVAILABLE
                                            : RESULT_SUCCESS);
                                            : RESULT_SUCCESS);
                            break;
                            break;
                        case SET_INITIAL_ATTACH_APN_COMPLETE:
                        case SET_INITIAL_ATTACH_APN_COMPLETE:
@@ -189,7 +193,7 @@ public class CellularDataService extends DataService {
            // Only obtain the message when the caller wants a callback. If the caller doesn't care
            // Only obtain the message when the caller wants a callback. If the caller doesn't care
            // the request completed or results, then no need to pass the message down.
            // the request completed or results, then no need to pass the message down.
            if (callback != null) {
            if (callback != null) {
                message = Message.obtain(mHandler, DEACTIVATE_DATA_ALL_COMPLETE);
                message = Message.obtain(mHandler, DEACTIVATE_DATA_CALL_COMPLETE);
                mCallbackMap.put(message, callback);
                mCallbackMap.put(message, callback);
            }
            }


+47 −12
Original line number Original line Diff line number Diff line
@@ -123,9 +123,9 @@ import java.util.stream.Collectors;
 * {@link ConnectedState}. When the data network is about to be disconnected, it first enters
 * {@link ConnectedState}. When the data network is about to be disconnected, it first enters
 * {@link DisconnectingState} when performing graceful tear down or when sending the data
 * {@link DisconnectingState} when performing graceful tear down or when sending the data
 * deactivation request. At the end, it enters {@link DisconnectedState} when {@link DataService}
 * deactivation request. At the end, it enters {@link DisconnectedState} when {@link DataService}
 * notifies data disconnected. Note that a unsolicited disconnected event from {@link DataService}
 * notifies data disconnected. Note that an unsolicited disconnected event from {@link DataService}
 * can immediately move data network transited from {@link ConnectedState} to
 * or a RADIO_NOT_AVAILABLE response can immediately move data network from {@link ConnectedState}
 * {@link DisconnectedState}. {@link DisconnectedState} is the final state of a data network.
 * to {@link DisconnectedState}. {@link DisconnectedState} is the final state of a data network.
 *
 *
 * State machine diagram:
 * State machine diagram:
 *
 *
@@ -158,7 +158,7 @@ public class DataNetwork extends StateMachine {
    private static final int EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE = 5;
    private static final int EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE = 5;


    /** Event for setup data network response. */
    /** Event for setup data network response. */
    private static final int EVENT_SETUP_DATA_CALL_RESPONSE = 6;
    private static final int EVENT_SETUP_DATA_NETWORK_RESPONSE = 6;


    /** Event for tearing down data network. */
    /** Event for tearing down data network. */
    private static final int EVENT_TEAR_DOWN_NETWORK = 7;
    private static final int EVENT_TEAR_DOWN_NETWORK = 7;
@@ -196,6 +196,9 @@ public class DataNetwork extends StateMachine {
    /** Event for carrier privileged UIDs changed. */
    /** Event for carrier privileged UIDs changed. */
    private static final int EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED = 18;
    private static final int EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED = 18;


    /** Event for deactivate data network response. */
    private static final int EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE = 19;

    /** The default MTU for IPv4 network. */
    /** The default MTU for IPv4 network. */
    private static final int DEFAULT_MTU_V4 = 1280;
    private static final int DEFAULT_MTU_V4 = 1280;


@@ -739,8 +742,7 @@ public class DataNetwork extends StateMachine {


        for (TelephonyNetworkRequest networkRequest : networkRequestList) {
        for (TelephonyNetworkRequest networkRequest : networkRequestList) {
            networkRequest.setAttachedNetwork(DataNetwork.this);
            networkRequest.setAttachedNetwork(DataNetwork.this);
            networkRequest.setState(
            networkRequest.setState(TelephonyNetworkRequest.REQUEST_STATE_SATISFIED);
                    TelephonyNetworkRequest.REQUEST_STATE_SATISFIED);
        }
        }


        addState(mDefaultState);
        addState(mDefaultState);
@@ -960,7 +962,7 @@ public class DataNetwork extends StateMachine {
                    }
                    }
                    setupData();
                    setupData();
                    break;
                    break;
                case EVENT_SETUP_DATA_CALL_RESPONSE:
                case EVENT_SETUP_DATA_NETWORK_RESPONSE:
                    int resultCode = msg.arg1;
                    int resultCode = msg.arg1;
                    DataCallResponse dataCallResponse =
                    DataCallResponse dataCallResponse =
                            msg.getData().getParcelable(DataServiceManager.DATA_CALL_RESPONSE);
                            msg.getData().getParcelable(DataServiceManager.DATA_CALL_RESPONSE);
@@ -1071,6 +1073,10 @@ public class DataNetwork extends StateMachine {
                    ar = (AsyncResult) msg.obj;
                    ar = (AsyncResult) msg.obj;
                    onPcoDataReceived((PcoData) ar.result);
                    onPcoDataReceived((PcoData) ar.result);
                    break;
                    break;
                case EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE:
                    int resultCode = msg.arg1;
                    onDeactivateResponse(resultCode);
                    break;
                default:
                default:
                    return NOT_HANDLED;
                    return NOT_HANDLED;
            }
            }
@@ -1179,8 +1185,16 @@ public class DataNetwork extends StateMachine {
        @Override
        @Override
        public boolean processMessage(Message msg) {
        public boolean processMessage(Message msg) {
            logv("event=" + eventToString(msg.what));
            logv("event=" + eventToString(msg.what));
            switch (msg.what) {
                case EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE:
                    int resultCode = msg.arg1;
                    onDeactivateResponse(resultCode);
                    break;
                default:
                    return NOT_HANDLED;
                    return NOT_HANDLED;
            }
            }
            return HANDLED;
        }
    }
    }


    /**
    /**
@@ -1680,7 +1694,7 @@ public class DataNetwork extends StateMachine {
                .setupDataCall(accessNetwork, mDataProfile, isModemRoaming, allowRoaming,
                .setupDataCall(accessNetwork, mDataProfile, isModemRoaming, allowRoaming,
                        DataService.REQUEST_REASON_NORMAL, null, mPduSessionId, null,
                        DataService.REQUEST_REASON_NORMAL, null, mPduSessionId, null,
                        trafficDescriptor, matchAllRuleAllowed,
                        trafficDescriptor, matchAllRuleAllowed,
                        obtainMessage(EVENT_SETUP_DATA_CALL_RESPONSE));
                        obtainMessage(EVENT_SETUP_DATA_NETWORK_RESPONSE));


        int apnTypeBitmask = mDataProfile.getApnSetting() != null
        int apnTypeBitmask = mDataProfile.getApnSetting() != null
                ? mDataProfile.getApnSetting().getApnTypeBitmask() : ApnSetting.TYPE_NONE;
                ? mDataProfile.getApnSetting().getApnTypeBitmask() : ApnSetting.TYPE_NONE;
@@ -1933,6 +1947,23 @@ public class DataNetwork extends StateMachine {
                mFailCause);
                mFailCause);
    }
    }


    /**
     * Called when receiving deactivate data network response from the data service.
     *
     * @param resultCode The result code.
     */
    private void onDeactivateResponse(@DataServiceCallback.ResultCode int resultCode) {
        logl("onDeactivateResponse: resultCode="
                + DataServiceCallback.resultCodeToString(resultCode));
        if (resultCode == DataServiceCallback.RESULT_ERROR_RADIO_NOT_AVAILABLE) {
            log("Remove network since deactivate request returned RADIO_NOT_AVAILABLE.");
            mDataNetworkCallback.invokeFromExecutor(
                    () -> mDataNetworkCallback.onDisconnected(
                            DataNetwork.this, DataFailCause.RADIO_NOT_AVAILABLE));
            transitionTo(mDisconnectedState);
        }
    }

    /**
    /**
     * Tear down the data network immediately.
     * Tear down the data network immediately.
     *
     *
@@ -1958,7 +1989,8 @@ public class DataNetwork extends StateMachine {


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


            // Clean up on the source transport.
            // Clean up on the source transport.
            mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport),
            mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport),
                    DataService.REQUEST_REASON_HANDOVER, null);
                    DataService.REQUEST_REASON_HANDOVER,
                    obtainMessage(EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE));
            // Switch the transport to the target.
            // Switch the transport to the target.
            mTransport = DataUtils.getTargetTransport(mTransport);
            mTransport = DataUtils.getTargetTransport(mTransport);
            // Update the logging tag
            // Update the logging tag
@@ -2645,7 +2678,7 @@ public class DataNetwork extends StateMachine {
                return "EVENT_DETACH_NETWORK_REQUEST";
                return "EVENT_DETACH_NETWORK_REQUEST";
            case EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE:
            case EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE:
                return "EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE";
                return "EVENT_ALLOCATE_PDU_SESSION_ID_RESPONSE";
            case EVENT_SETUP_DATA_CALL_RESPONSE:
            case EVENT_SETUP_DATA_NETWORK_RESPONSE:
                return "EVENT_SETUP_DATA_NETWORK_RESPONSE";
                return "EVENT_SETUP_DATA_NETWORK_RESPONSE";
            case EVENT_TEAR_DOWN_NETWORK:
            case EVENT_TEAR_DOWN_NETWORK:
                return "EVENT_TEAR_DOWN_NETWORK";
                return "EVENT_TEAR_DOWN_NETWORK";
@@ -2671,6 +2704,8 @@ public class DataNetwork extends StateMachine {
                return "EVENT_PCO_DATA_RECEIVED";
                return "EVENT_PCO_DATA_RECEIVED";
            case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED:
            case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED:
                return "EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED";
                return "EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED";
            case EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE:
                return "EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE";
            default:
            default:
                return "Unknown(" + event + ")";
                return "Unknown(" + event + ")";
        }
        }
+2 −1
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.internal.telephony.test;
package com.android.internal.telephony.test;


import android.compat.annotation.UnsupportedAppUsage;
import android.compat.annotation.UnsupportedAppUsage;
import android.hardware.radio.RadioError;
import android.hardware.radio.V1_0.DataRegStateResult;
import android.hardware.radio.V1_0.DataRegStateResult;
import android.hardware.radio.V1_0.SetupDataCallResult;
import android.hardware.radio.V1_0.SetupDataCallResult;
import android.hardware.radio.V1_0.VoiceRegStateResult;
import android.hardware.radio.V1_0.VoiceRegStateResult;
@@ -1239,7 +1240,7 @@ public class SimulatedCommands extends BaseCommands
    @Override
    @Override
    public void deactivateDataCall(int cid, int reason, Message result) {
    public void deactivateDataCall(int cid, int reason, Message result) {
        SimulatedCommandsVerifier.getInstance().deactivateDataCall(cid, reason, result);
        SimulatedCommandsVerifier.getInstance().deactivateDataCall(cid, reason, result);
        resultSuccess(result, null);
        resultSuccess(result, RadioError.NONE);
    }
    }


    @Override
    @Override
Loading