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

Commit 3583bfd8 authored by Jack Yu's avatar Jack Yu Committed by android-build-merger
Browse files

Merge "Fixed a race condition for IWLAN handover" am: 33986d9c

am: d8946a58

Change-Id: I102ddc08be15d920cf00e39a25b7b823429685ea
parents 5b81df2b d8946a58
Loading
Loading
Loading
Loading
+56 −16
Original line number Diff line number Diff line
@@ -140,6 +140,8 @@ public class DataConnection extends StateMachine {

    private String[] mPcscfAddr;

    private final String mTagSuffix;

    /**
     * Used internally for saving connecting parameters.
     */
@@ -325,9 +327,9 @@ public class DataConnection extends StateMachine {
        String transportType = (dataServiceManager.getTransportType() == TransportType.WWAN)
                ? "C"   // Cellular
                : "I";  // IWLAN
        DataConnection dc = new DataConnection(phone,
                "DC-" + transportType + "-" + mInstanceNumber.incrementAndGet(), id, dct,
                dataServiceManager, failBringUpAll, dcc);
        DataConnection dc = new DataConnection(phone, transportType + "-"
                + mInstanceNumber.incrementAndGet(), id, dct, dataServiceManager, failBringUpAll,
                dcc);
        dc.start();
        if (DBG) dc.log("Made " + dc.getName());
        return dc;
@@ -504,10 +506,11 @@ public class DataConnection extends StateMachine {
    }

    //***** Constructor (NOTE: uses dcc.getHandler() as its Handler)
    private DataConnection(Phone phone, String name, int id,
    private DataConnection(Phone phone, String tagSuffix, int id,
                           DcTracker dct, DataServiceManager dataServiceManager,
                           DcTesterFailBringUpAll failBringUpAll, DcController dcc) {
        super(name, dcc.getHandler());
        super("DC-" + tagSuffix, dcc.getHandler());
        mTagSuffix = tagSuffix;
        setLogRecSize(300);
        setLogOnlyTransitions(true);
        if (DBG) log("DataConnection created");
@@ -1876,6 +1879,8 @@ public class DataConnection extends StateMachine {
                if (dc != null) {
                    mNetworkAgent = dc.getNetworkAgent();
                    if (mNetworkAgent != null) {
                        mNetworkAgent.setTransportType(mDataServiceManager.getTransportType());
                        log("Transfer the network agent from " + dc.getName() + " successfully.");
                        mNetworkAgent.sendNetworkCapabilities(getNetworkCapabilities());
                        mNetworkAgent.sendLinkProperties(mLinkProperties);
                    } else {
@@ -1887,8 +1892,8 @@ public class DataConnection extends StateMachine {
            } else {
                mScore = calculateScore();
                mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(),
                        "DcNetworkAgent", mNetworkInfo, getNetworkCapabilities(), mLinkProperties,
                        mScore, misc);
                        "DcNetworkAgent" + mTagSuffix, mNetworkInfo, getNetworkCapabilities(),
                        mLinkProperties, mScore, misc);
            }
            if (mDataServiceManager.getTransportType() == TransportType.WWAN) {
                mPhone.mCi.registerForNattKeepaliveStatus(
@@ -1920,14 +1925,7 @@ public class DataConnection extends StateMachine {
                mPhone.mCi.unregisterForLceInfo(getHandler());
            }
            if (mNetworkAgent != null) {
                // We do not want to update the network info if this is a handover. For all other
                // cases we need to update connectivity service with the latest network info.
                //
                // For handover, the network agent is transferred to the other data connection.
                if (mDisconnectParams == null
                        || mDisconnectParams.mReleaseType != DcTracker.RELEASE_TYPE_HANDOVER) {
                mNetworkAgent.sendNetworkInfo(mNetworkInfo);
                }
                mNetworkAgent = null;
            }
        }
@@ -2328,6 +2326,8 @@ public class DataConnection extends StateMachine {

    private class DcNetworkAgent extends NetworkAgent {

        private final AtomicInteger mTransportType;

        private NetworkCapabilities mNetworkCapabilities;

        public final DcKeepaliveTracker keepaliveTracker = new DcKeepaliveTracker();
@@ -2337,6 +2337,11 @@ public class DataConnection extends StateMachine {
            super(l, c, TAG, ni, nc, lp, score, misc);
            mNetCapsLocalLog.log("New network agent created. capabilities=" + nc);
            mNetworkCapabilities = nc;
            mTransportType = new AtomicInteger(mDataServiceManager.getTransportType());
        }

        public void setTransportType(int transportType) {
            mTransportType.set(transportType);
        }

        @Override
@@ -2380,6 +2385,11 @@ public class DataConnection extends StateMachine {

        @Override
        public void sendNetworkCapabilities(NetworkCapabilities networkCapabilities) {
            if (mTransportType.get() != mDataServiceManager.getTransportType()) {
                log("sendNetworkCapabilities: Data connection has been handover to transport "
                        + TransportType.toString(mTransportType.get()));
                return;
            }
            if (!networkCapabilities.equals(mNetworkCapabilities)) {
                String logStr = "Changed from " + mNetworkCapabilities + " to "
                        + networkCapabilities + ", Data RAT="
@@ -2392,6 +2402,36 @@ public class DataConnection extends StateMachine {
            super.sendNetworkCapabilities(networkCapabilities);
        }

        @Override
        public void sendLinkProperties(LinkProperties linkProperties) {
            if (mTransportType.get() != mDataServiceManager.getTransportType()) {
                log("sendLinkProperties: Data connection has been handover to transport "
                        + TransportType.toString(mTransportType.get()));
                return;
            }
            super.sendLinkProperties(linkProperties);
        }

        @Override
        public void sendNetworkScore(int score) {
            if (mTransportType.get() != mDataServiceManager.getTransportType()) {
                log("sendNetworkScore: Data connection has been handover to transport "
                        + TransportType.toString(mTransportType.get()));
                return;
            }
            super.sendNetworkScore(score);
        }

        @Override
        public void sendNetworkInfo(NetworkInfo networkInfo) {
            if (mTransportType.get() != mDataServiceManager.getTransportType()) {
                log("sendNetworkScore: Data connection has been handover to transport "
                        + TransportType.toString(mTransportType.get()));
                return;
            }
            super.sendNetworkInfo(networkInfo);
        }

        @Override
        protected void startSocketKeepalive(Message msg) {
            if (msg.obj instanceof NattKeepalivePacketData) {
@@ -2592,7 +2632,7 @@ public class DataConnection extends StateMachine {
     */
    public void tearDownAll(String reason, @ReleaseNetworkType int releaseType,
                            Message onCompletedMsg) {
        if (DBG) log("tearDownAll: reason=" + reason + " onCompletedMsg=" + onCompletedMsg);
        if (DBG) log("tearDownAll: reason=" + reason + ", releaseType=" + releaseType);
        sendMessage(DataConnection.EVENT_DISCONNECT_ALL,
                new DisconnectParams(null, reason, releaseType, onCompletedMsg));
    }
+8 −5
Original line number Diff line number Diff line
@@ -60,13 +60,14 @@ import java.util.concurrent.ConcurrentHashMap;
 * Cellular data service, IWLAN data service).
 */
public class DataServiceManager {
    private static final String TAG = DataServiceManager.class.getSimpleName();
    private static final boolean DBG = false;
    private static final boolean DBG = true;

    static final String DATA_CALL_RESPONSE = "data_call_response";

    private final Phone mPhone;

    private final String mTag;

    private final CarrierConfigManager mCarrierConfigManager;
    private final AppOpsManager mAppOps;
    private final IPackageManager mPackageManager;
@@ -228,9 +229,11 @@ public class DataServiceManager {
     * @param phone The phone object
     * @param transportType The transport type. Must be a
     *        {@link AccessNetworkConstants.TransportType}.
     * @param tagSuffix Logging tag suffix
     */
    public DataServiceManager(Phone phone, int transportType) {
    public DataServiceManager(Phone phone, int transportType, String tagSuffix) {
        mPhone = phone;
        mTag = "DSM" + tagSuffix;
        mTransportType = transportType;
        mBound = false;
        mCarrierConfigManager = (CarrierConfigManager) phone.getContext().getSystemService(
@@ -580,11 +583,11 @@ public class DataServiceManager {
    }

    private void log(String s) {
        Rlog.d(TAG, s);
        Rlog.d(mTag, s);
    }

    private void loge(String s) {
        Rlog.e(TAG, s);
        Rlog.e(mTag, s);
    }

}
+3 −3
Original line number Diff line number Diff line
@@ -121,9 +121,9 @@ public class DcController extends StateMachine {
    }

    public static DcController makeDcc(Phone phone, DcTracker dct,
                                       DataServiceManager dataServiceManager, Handler handler) {
        DcController dcc = new DcController("Dcc", phone, dct, dataServiceManager, handler);
        return dcc;
                                       DataServiceManager dataServiceManager, Handler handler,
                                       String tagSuffix) {
        return new DcController("Dcc" + tagSuffix, phone, dct, dataServiceManager, handler);
    }

    void dispose() {
+17 −13
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.data.ApnSetting;
import android.telephony.data.ApnSetting.ApnType;
import android.telephony.data.DataProfile;
import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils;
@@ -671,14 +672,14 @@ public class DcTracker extends Handler {
                .createForSubscriptionId(phone.getSubId());
        // The 'C' in tag indicates cellular, and 'I' indicates IWLAN. This is to distinguish
        // between two DcTrackers, one for each.
        String tag = "DCT-" + ((transportType == TransportType.WWAN) ? "C" : "I");
        String tagSuffix = "-" + ((transportType == TransportType.WWAN) ? "C" : "I");
        if (mTelephonyManager.getPhoneCount() > 1) {
            tag += "-" + mPhone.getPhoneId();
            tagSuffix += "-" + mPhone.getPhoneId();
        }
        mLogTag = tag;
        mLogTag = "DCT" + tagSuffix;

        mTransportType = transportType;
        mDataServiceManager = new DataServiceManager(phone, transportType);
        mDataServiceManager = new DataServiceManager(phone, transportType, tagSuffix);

        mResolver = mPhone.getContext().getContentResolver();
        mUiccController = UiccController.getInstance();
@@ -711,7 +712,7 @@ public class DcTracker extends Handler {
        HandlerThread dcHandlerThread = new HandlerThread("DcHandlerThread");
        dcHandlerThread.start();
        Handler dcHandler = new Handler(dcHandlerThread.getLooper());
        mDcc = DcController.makeDcc(mPhone, this, mDataServiceManager, dcHandler);
        mDcc = DcController.makeDcc(mPhone, this, mDataServiceManager, dcHandler, tagSuffix);
        mDcTesterFailBringUpAll = new DcTesterFailBringUpAll(mPhone, dcHandler);

        mDataConnectionTracker = this;
@@ -2282,7 +2283,7 @@ public class DcTracker extends Handler {
    }

    private void addRequestNetworkCompleteMsg(Message onCompleteMsg,
                                              @ApnSetting.ApnType int apnType) {
                                              @ApnType int apnType) {
        if (onCompleteMsg != null) {
            List<Message> messageList = mRequestNetworkCompletionMsgs.get(apnType);
            if (messageList == null) messageList = new ArrayList<>();
@@ -2302,13 +2303,13 @@ public class DcTracker extends Handler {
        message.sendToTarget();
    }

    public void enableApn(@ApnSetting.ApnType int apnType, @RequestNetworkType int requestType,
    public void enableApn(@ApnType int apnType, @RequestNetworkType int requestType,
                          Message onCompleteMsg) {
        sendMessage(obtainMessage(DctConstants.EVENT_ENABLE_APN, apnType, requestType,
                onCompleteMsg));
    }

    private void onEnableApn(@ApnSetting.ApnType int apnType, @RequestNetworkType int requestType,
    private void onEnableApn(@ApnType int apnType, @RequestNetworkType int requestType,
                             Message onCompleteMsg) {
        ApnContext apnContext = mApnContextsByType.get(apnType);
        if (apnContext == null) {
@@ -2382,11 +2383,11 @@ public class DcTracker extends Handler {
        }
    }

    public void disableApn(@ApnSetting.ApnType int apnType, @ReleaseNetworkType int releaseType) {
    public void disableApn(@ApnType int apnType, @ReleaseNetworkType int releaseType) {
        sendMessage(obtainMessage(DctConstants.EVENT_DISABLE_APN, apnType, releaseType));
    }

    private void onDisableApn(@ApnSetting.ApnType int apnType,
    private void onDisableApn(@ApnType int apnType,
                              @ReleaseNetworkType int releaseType) {
        ApnContext apnContext = mApnContextsByType.get(apnType);
        if (apnContext == null) {
@@ -2674,7 +2675,7 @@ public class DcTracker extends Handler {
        }
    }

    private void completeConnection(ApnContext apnContext) {
    private void completeConnection(ApnContext apnContext, @RequestNetworkType int type) {

        if (DBG) log("completeConnection: successful, notify the world apnContext=" + apnContext);

@@ -2701,7 +2702,10 @@ public class DcTracker extends Handler {
                    mProvisioningSpinner));
        }

        // Notify data is connected except for handover case.
        if (type != REQUEST_TYPE_HANDOVER) {
            mPhone.notifyDataConnection(apnContext.getApnType());
        }
        startNetStatPoll();
        startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
    }
@@ -2805,7 +2809,7 @@ public class DcTracker extends Handler {
                    // Complete the connection normally notifying the world we're connected.
                    // We do this if this isn't a special provisioning apn or if we've been
                    // told its time to provision.
                    completeConnection(apnContext);
                    completeConnection(apnContext, requestType);
                } else {
                    // This is a provisioning APN that we're reporting as connected. Later
                    // when the user desires to upgrade this to a "default" connection,
+2 −2
Original line number Diff line number Diff line
@@ -254,8 +254,8 @@ public class DataConnectionTest extends TelephonyTest {
        public void onLooperPrepared() {
            Handler h = new Handler();

            DataServiceManager manager = new DataServiceManager(mPhone, TransportType.WWAN);
            mDcc = DcController.makeDcc(mPhone, mDcTracker, manager, h);
            DataServiceManager manager = new DataServiceManager(mPhone, TransportType.WWAN, "");
            mDcc = DcController.makeDcc(mPhone, mDcTracker, manager, h, "");
            mDcc.start();
            mDc = DataConnection.makeDataConnection(mPhone, 0, mDcTracker, manager,
                    mDcTesterFailBringUpAll, mDcc);
Loading