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

Commit c8b9a742 authored by Paul Jensen's avatar Paul Jensen
Browse files

Send updated NetworkAgent score to NetworkFactories when validated.

Previously the score was not sent out causing other NetworkFactories
to have the lower unvalidated score and to repeatedly try to bring
up a new Network only to have it torn down.
Also, avoid logging an error when tearing down a network with only
listening requests.

bug:17726566
Change-Id: I82ff7c9bd5ec962f62a50ad0042c278622953969
parent 4b9b2be8
Loading
Loading
Loading
Loading
+39 −26
Original line number Original line Diff line number Diff line
@@ -1785,6 +1785,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
        return false;
        return false;
    }
    }


    private boolean isRequest(NetworkRequest request) {
        return mNetworkRequests.get(request).isRequest;
    }

    // must be stateless - things change under us.
    // must be stateless - things change under us.
    private class NetworkStateTrackerHandler extends Handler {
    private class NetworkStateTrackerHandler extends Handler {
        public NetworkStateTrackerHandler(Looper looper) {
        public NetworkStateTrackerHandler(Looper looper) {
@@ -1901,8 +1905,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                        if (valid) {
                        if (valid) {
                            if (DBG) log("Validated " + nai.name());
                            if (DBG) log("Validated " + nai.name());
                            final boolean previouslyValidated = nai.validated;
                            final boolean previouslyValidated = nai.validated;
                            final int previousScore = nai.getCurrentScore();
                            nai.validated = true;
                            nai.validated = true;
                            rematchNetworkAndRequests(nai, !previouslyValidated);
                            rematchNetworkAndRequests(nai, !previouslyValidated);
                            // If score has changed, rebroadcast to NetworkFactories. b/17726566
                            if (nai.getCurrentScore() != previousScore) {
                                sendUpdatedScoreToFactories(nai);
                            }
                        }
                        }
                        updateInetCondition(nai, valid);
                        updateInetCondition(nai, valid);
                        // Let the NetworkAgent know the state of its network
                        // Let the NetworkAgent know the state of its network
@@ -2196,7 +2205,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                        boolean keep = nai.isVPN();
                        boolean keep = nai.isVPN();
                        for (int i = 0; i < nai.networkRequests.size() && !keep; i++) {
                        for (int i = 0; i < nai.networkRequests.size() && !keep; i++) {
                            NetworkRequest r = nai.networkRequests.valueAt(i);
                            NetworkRequest r = nai.networkRequests.valueAt(i);
                            if (mNetworkRequests.get(r).isRequest) keep = true;
                            if (isRequest(r)) keep = true;
                        }
                        }
                        if (!keep) {
                        if (!keep) {
                            if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
                            if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
@@ -2480,6 +2489,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
        if (nai == null) return;
        if (nai == null) return;
        if (DBG) log("reportBadNetwork(" + nai.name() + ") by " + uid);
        if (DBG) log("reportBadNetwork(" + nai.name() + ") by " + uid);
        synchronized (nai) {
        synchronized (nai) {
            // Validating an uncreated network could result in a call to rematchNetworkAndRequests()
            // which isn't meant to work on uncreated networks.
            if (!nai.created) return;

            if (isNetworkBlocked(nai, uid)) return;
            if (isNetworkBlocked(nai, uid)) return;


            nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
            nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
@@ -3685,6 +3698,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
        }
        }
    }
    }


    private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) {
        for (int i = 0; i < nai.networkRequests.size(); i++) {
            NetworkRequest nr = nai.networkRequests.valueAt(i);
            // Don't send listening requests to factories. b/17393458
            if (!isRequest(nr)) continue;
            sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
        }
    }

    private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
    private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
        if (VDBG) log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
        if (VDBG) log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
        for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
        for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
@@ -3739,22 +3761,24 @@ public class ConnectivityService extends IConnectivityManager.Stub {
        }
        }
    }
    }


    private void handleLingerComplete(NetworkAgentInfo oldNetwork) {
    private void teardownUnneededNetwork(NetworkAgentInfo nai) {
        if (oldNetwork == null) {
        for (int i = 0; i < nai.networkRequests.size(); i++) {
            loge("Unknown NetworkAgentInfo in handleLingerComplete");
            NetworkRequest nr = nai.networkRequests.valueAt(i);
            return;
        }
        if (DBG) {
            log("handleLingerComplete for " + oldNetwork.name());
            for (int i = 0; i < oldNetwork.networkRequests.size(); i++) {
                NetworkRequest nr = oldNetwork.networkRequests.valueAt(i);
            // Ignore listening requests.
            // Ignore listening requests.
                if (mNetworkRequests.get(nr).isRequest == false) continue;
            if (!isRequest(nr)) continue;
            loge("Dead network still had at least " + nr);
            loge("Dead network still had at least " + nr);
            break;
            break;
        }
        }
        nai.asyncChannel.disconnect();
    }
    }
        oldNetwork.asyncChannel.disconnect();

    private void handleLingerComplete(NetworkAgentInfo oldNetwork) {
        if (oldNetwork == null) {
            loge("Unknown NetworkAgentInfo in handleLingerComplete");
            return;
        }
        if (DBG) log("handleLingerComplete for " + oldNetwork.name());
        teardownUnneededNetwork(oldNetwork);
    }
    }


    private void makeDefault(NetworkAgentInfo newNetwork) {
    private void makeDefault(NetworkAgentInfo newNetwork) {
@@ -3891,7 +3915,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
            for (int i = 0; i < nai.networkRequests.size() && teardown; i++) {
            for (int i = 0; i < nai.networkRequests.size() && teardown; i++) {
                NetworkRequest nr = nai.networkRequests.valueAt(i);
                NetworkRequest nr = nai.networkRequests.valueAt(i);
                try {
                try {
                if (mNetworkRequests.get(nr).isRequest) {
                if (isRequest(nr)) {
                    teardown = false;
                    teardown = false;
                }
                }
                } catch (Exception e) {
                } catch (Exception e) {
@@ -3954,14 +3978,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
            // the lingering process so communication on that network is given time to wrap up.
            // the lingering process so communication on that network is given time to wrap up.
            // TODO: Could teardown unvalidated networks when their NetworkCapabilities
            // TODO: Could teardown unvalidated networks when their NetworkCapabilities
            // satisfy no NetworkRequests.
            // satisfy no NetworkRequests.
            if (DBG && newNetwork.networkRequests.size() != 0) {
                loge("tearing down network with live requests:");
                for (int i=0; i < newNetwork.networkRequests.size(); i++) {
                    loge("  " + newNetwork.networkRequests.valueAt(i));
                }
            }
            if (DBG) log("Validated network turns out to be unwanted.  Tear it down.");
            if (DBG) log("Validated network turns out to be unwanted.  Tear it down.");
            newNetwork.asyncChannel.disconnect();
            teardownUnneededNetwork(newNetwork);
        }
        }
    }
    }


@@ -4090,12 +4108,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {


        if (nai.created) rematchAllNetworksAndRequests(nai, oldScore);
        if (nai.created) rematchAllNetworksAndRequests(nai, oldScore);


        for (int i = 0; i < nai.networkRequests.size(); i++) {
        sendUpdatedScoreToFactories(nai);
            NetworkRequest nr = nai.networkRequests.valueAt(i);
            // Don't send listening requests to factories. b/17393458
            if (mNetworkRequests.get(nr).isRequest == false) continue;
            sendUpdatedScoreToFactories(nr, score);
        }
    }
    }


    // notify only this one new request of the current state
    // notify only this one new request of the current state