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

Commit 9cfa02b6 authored by Jack Yu's avatar Jack Yu
Browse files

Removed network requests from all transports

When handover is ongoing, a network request temporarily
exists in both DcTrackers. In that case, if a network request is
released by connectivity service, it should be removed from all
DcTrackers.

Fix: 193448216
Test: atest DcTrackerTest; atest TelephonyNetworkFactoryTest
Merged-In: Ie02d3efde9e9ffc470f2f5120298a9981a69846d
Change-Id: Ie02d3efde9e9ffc470f2f5120298a9981a69846d
parent be447bc8
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -430,9 +430,7 @@ public class ApnContext {

    public void releaseNetwork(NetworkRequest networkRequest, @ReleaseNetworkType int type) {
        synchronized (mRefCountLock) {
            if (mNetworkRequests.contains(networkRequest) == false) {
                logl("releaseNetwork can't find this request (" + networkRequest + ")");
            } else {
            if (mNetworkRequests.contains(networkRequest)) {
                mNetworkRequests.remove(networkRequest);
                if (mDataConnection != null) {
                    // New network request added. Should re-evaluate properties of
+10 −8
Original line number Diff line number Diff line
@@ -338,8 +338,16 @@ public class TelephonyNetworkFactory extends NetworkFactory {
        logl("onReleaseNetworkFor " + networkRequest + " applied " + applied);

        if (applied) {
            int transport = getTransportTypeFromNetworkRequest(networkRequest);
            releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_NORMAL, transport);
            // Most of the time, the network request only exists in one of the DcTracker, but in the
            // middle of handover, the network request temporarily exists in both DcTrackers. If
            // connectivity service releases the network request while handover is ongoing, we need
            // to remove network requests from both DcTrackers.
            // Note that this part will be refactored in T, where we won't even have DcTracker at
            // all.
            releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_NORMAL,
                    AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
            releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_NORMAL,
                    AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
        }
    }

@@ -442,12 +450,6 @@ public class TelephonyNetworkFactory extends NetworkFactory {
            if (mNetworkRequests.containsKey(networkRequest)) {
                // Update it with the target transport.
                mNetworkRequests.put(networkRequest, targetTransport);
            } else {
                log("Network request was released before handover is completed. Now"
                        + " we need to release this network request. "
                        + networkRequest);
                releaseNetworkInternal(networkRequest, DcTracker.RELEASE_TYPE_NORMAL,
                        targetTransport);
            }
        } else {
            // If handover fails and requires to fallback, the context of target transport needs to
+0 −11
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import android.net.NetworkProvider;
import android.net.NetworkRequest;
import android.net.TelephonyNetworkSpecifier;
import android.os.AsyncResult;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -465,16 +464,6 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
        mTelephonyNetworkFactoryUT.releaseNetworkFor(mmsNetworkRequest);
        processAllMessages();

        Message msg = mNetworkRequestMessageMap.get(mmsNetworkRequest);

        Bundle bundle = msg.getData();
        bundle.putParcelable("extra_network_request", mmsNetworkRequest);
        bundle.putBoolean("extra_success", true);
        bundle.putInt("extra_transport_type", AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
        bundle.putBoolean("extra_handover_failure_fallback", false);
        h.sendMessage(msg);
        processAllMessages();

        // Ensure the release is called one more time after the normal release
        verify(mDcTracker, times(2)).releaseNetwork(any(), eq(1));
    }