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

Commit 0c71415f authored by Chiachang Wang's avatar Chiachang Wang Committed by android-build-merger
Browse files

Merge "Fix idle timer rule leakage" am: 9367b9ea

am: 38acbcda

Change-Id: I51ab9c7e58853ab93b09f1ca9e0c461134157c7d
parents 755c78a8 38acbcda
Loading
Loading
Loading
Loading
+15 −2
Original line number Original line Diff line number Diff line
@@ -1879,6 +1879,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
        }
        }
    }
    }


    /**
     * Update data activity tracking when network state is updated.
     */
    private void updateDataActivityTracking(NetworkAgentInfo newNetwork,
            NetworkAgentInfo oldNetwork) {
        if (newNetwork != null) {
            setupDataActivityTracking(newNetwork);
        }
        if (oldNetwork != null) {
            removeDataActivityTracking(oldNetwork);
        }
    }
    /**
    /**
     * Reads the network specific MTU size from resources.
     * Reads the network specific MTU size from resources.
     * and set it on it's iface.
     * and set it on it's iface.
@@ -2561,7 +2573,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
        }
        }
        nai.clearLingerState();
        nai.clearLingerState();
        if (nai.isSatisfyingRequest(mDefaultRequest.requestId)) {
        if (nai.isSatisfyingRequest(mDefaultRequest.requestId)) {
            removeDataActivityTracking(nai);
            updateDataActivityTracking(null /* newNetwork */, nai);
            notifyLockdownVpn(nai);
            notifyLockdownVpn(nai);
            ensureNetworkTransitionWakelock(nai.name());
            ensureNetworkTransitionWakelock(nai.name());
        }
        }
@@ -5091,7 +5103,7 @@ public class ConnectivityService extends IConnectivityManager.Stub


    private void makeDefault(NetworkAgentInfo newNetwork) {
    private void makeDefault(NetworkAgentInfo newNetwork) {
        if (DBG) log("Switching to new default network: " + newNetwork);
        if (DBG) log("Switching to new default network: " + newNetwork);
        setupDataActivityTracking(newNetwork);

        try {
        try {
            mNetd.setDefaultNetId(newNetwork.network.netId);
            mNetd.setDefaultNetId(newNetwork.network.netId);
        } catch (Exception e) {
        } catch (Exception e) {
@@ -5266,6 +5278,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            }
            }
        }
        }
        if (isNewDefault) {
        if (isNewDefault) {
            updateDataActivityTracking(newNetwork, oldDefaultNetwork);
            // Notify system services that this network is up.
            // Notify system services that this network is up.
            makeDefault(newNetwork);
            makeDefault(newNetwork);
            // Log 0 -> X and Y -> X default network transitions, where X is the new default.
            // Log 0 -> X and Y -> X default network transitions, where X is the new default.
+74 −0
Original line number Original line Diff line number Diff line
@@ -4536,4 +4536,78 @@ public class ConnectivityServiceTest {
        mCellNetworkAgent.disconnect();
        mCellNetworkAgent.disconnect();
        mCm.unregisterNetworkCallback(networkCallback);
        mCm.unregisterNetworkCallback(networkCallback);
    }
    }

    @Test
    public void testDataActivityTracking() throws RemoteException {
        final TestNetworkCallback networkCallback = new TestNetworkCallback();
        final NetworkRequest networkRequest = new NetworkRequest.Builder()
                .addCapability(NET_CAPABILITY_INTERNET)
                .build();
        mCm.registerNetworkCallback(networkRequest, networkCallback);

        mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
        final LinkProperties cellLp = new LinkProperties();
        cellLp.setInterfaceName(MOBILE_IFNAME);
        mCellNetworkAgent.sendLinkProperties(cellLp);
        reset(mNetworkManagementService);
        mCellNetworkAgent.connect(true);
        networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        verify(mNetworkManagementService, times(1)).addIdleTimer(eq(MOBILE_IFNAME), anyInt(),
                eq(ConnectivityManager.TYPE_MOBILE));

        mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
        final LinkProperties wifiLp = new LinkProperties();
        wifiLp.setInterfaceName(WIFI_IFNAME);
        mWiFiNetworkAgent.sendLinkProperties(wifiLp);

        // Network switch
        reset(mNetworkManagementService);
        mWiFiNetworkAgent.connect(true);
        networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
        networkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent);
        networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
        verify(mNetworkManagementService, times(1)).addIdleTimer(eq(WIFI_IFNAME), anyInt(),
                eq(ConnectivityManager.TYPE_WIFI));
        verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(MOBILE_IFNAME));

        // Disconnect wifi and switch back to cell
        reset(mNetworkManagementService);
        mWiFiNetworkAgent.disconnect();
        networkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
        assertNoCallbacks(networkCallback);
        verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME));
        verify(mNetworkManagementService, times(1)).addIdleTimer(eq(MOBILE_IFNAME), anyInt(),
                eq(ConnectivityManager.TYPE_MOBILE));

        // reconnect wifi
        mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
        wifiLp.setInterfaceName(WIFI_IFNAME);
        mWiFiNetworkAgent.sendLinkProperties(wifiLp);
        mWiFiNetworkAgent.connect(true);
        networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
        networkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent);
        networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);

        // Disconnect cell
        reset(mNetworkManagementService);
        mCellNetworkAgent.disconnect();
        networkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent);
        // LOST callback is triggered earlier than removing idle timer. Broadcast should also be
        // sent as network being switched. Ensure rule removal for cell will not be triggered
        // unexpectedly before network being removed.
        waitForIdle();
        verify(mNetworkManagementService, times(0)).removeIdleTimer(eq(MOBILE_IFNAME));
        verify(mNetworkManagementService, times(1)).removeNetwork(
                eq(mCellNetworkAgent.getNetwork().netId));

        // Disconnect wifi
        ConditionVariable cv = waitForConnectivityBroadcasts(1);
        reset(mNetworkManagementService);
        mWiFiNetworkAgent.disconnect();
        waitFor(cv);
        verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME));

        // Clean up
        mCm.unregisterNetworkCallback(networkCallback);
    }
}
}