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

Commit 4decf59c authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Stop using VPNs in getActiveNetworkForUidInternal.

After this CL, ConnectivityService no longer needs to grab the
VPN lock and access Vpn objects to determine connectivity state.

Also make a synchronized (mVpns) block smaller.

Bug: 173331190
Test: existing tests in ConnectivityServiceTest
Change-Id: I3297b3ab8e75bdf4902c62dd7e492c3634cfc51f
parent 5b51530d
Loading
Loading
Loading
Loading
+18 −30
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import static android.net.ConnectivityDiagnosticsManager.DataStallReport.KEY_DNS
import static android.net.ConnectivityDiagnosticsManager.DataStallReport.KEY_TCP_METRICS_COLLECTION_PERIOD_MILLIS;
import static android.net.ConnectivityDiagnosticsManager.DataStallReport.KEY_TCP_PACKET_FAIL_RATE;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.NETID_UNSET;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
import static android.net.ConnectivityManager.TYPE_ETHERNET;
import static android.net.ConnectivityManager.TYPE_NONE;
@@ -1444,31 +1443,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
    }

    private Network getActiveNetworkForUidInternal(final int uid, boolean ignoreBlocked) {
        final int user = UserHandle.getUserId(uid);
        int vpnNetId = NETID_UNSET;
        synchronized (mVpns) {
            final Vpn vpn = mVpns.get(user);
            // TODO : now that capabilities contain the UID, the appliesToUid test should
            // be removed as the satisfying test below should be enough.
            if (vpn != null && vpn.appliesToUid(uid)) vpnNetId = vpn.getNetId();
        }
        NetworkAgentInfo nai;
        if (vpnNetId != NETID_UNSET) {
            nai = getNetworkAgentInfoForNetId(vpnNetId);
            if (nai != null) {
                final NetworkCapabilities requiredCaps =
                    createDefaultNetworkCapabilitiesForUid(uid);
                if (requiredCaps.satisfiedByNetworkCapabilities(nai.networkCapabilities)) {
                    return nai.network;
                }
        final NetworkAgentInfo vpnNai = getVpnForUid(uid);
        if (vpnNai != null) {
            final NetworkCapabilities requiredCaps = createDefaultNetworkCapabilitiesForUid(uid);
            if (requiredCaps.satisfiedByNetworkCapabilities(vpnNai.networkCapabilities)) {
                return vpnNai.network;
            }
        }
        nai = getDefaultNetwork();
        if (nai != null && isNetworkWithCapabilitiesBlocked(
                nai.networkCapabilities, uid, ignoreBlocked)) {
            nai = null;

        NetworkAgentInfo nai = getDefaultNetwork();
        if (nai == null || isNetworkWithCapabilitiesBlocked(nai.networkCapabilities, uid,
                ignoreBlocked)) {
            return null;
        }
        return nai != null ? nai.network : null;
        return nai.network;
    }

    // Public because it's used by mLockdownTracker.
@@ -4814,6 +4802,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            if (mLockdownEnabled) {
                return new VpnInfo[0];
            }
        }
        List<VpnInfo> infoList = new ArrayList<>();
        for (NetworkAgentInfo nai : mNetworkAgentInfos) {
            VpnInfo info = createVpnInfo(nai);
@@ -4823,7 +4812,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
        }
        return infoList.toArray(new VpnInfo[infoList.size()]);
    }
    }

    /**
     * @return VPN information for accounting, or null if we can't retrieve all required