Skip to content

Commit c8b9a74

Browse files
committed
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
1 parent 4b9b2be commit c8b9a74

1 file changed

Lines changed: 39 additions & 26 deletions

File tree

services/core/java/com/android/server/ConnectivityService.java

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1785,6 +1785,10 @@ private boolean isLiveNetworkAgent(NetworkAgentInfo nai, String msg) {
17851785
return false;
17861786
}
17871787

1788+
private boolean isRequest(NetworkRequest request) {
1789+
return mNetworkRequests.get(request).isRequest;
1790+
}
1791+
17881792
// must be stateless - things change under us.
17891793
private class NetworkStateTrackerHandler extends Handler {
17901794
public NetworkStateTrackerHandler(Looper looper) {
@@ -1901,8 +1905,13 @@ public void handleMessage(Message msg) {
19011905
if (valid) {
19021906
if (DBG) log("Validated " + nai.name());
19031907
final boolean previouslyValidated = nai.validated;
1908+
final int previousScore = nai.getCurrentScore();
19041909
nai.validated = true;
19051910
rematchNetworkAndRequests(nai, !previouslyValidated);
1911+
// If score has changed, rebroadcast to NetworkFactories. b/17726566
1912+
if (nai.getCurrentScore() != previousScore) {
1913+
sendUpdatedScoreToFactories(nai);
1914+
}
19061915
}
19071916
updateInetCondition(nai, valid);
19081917
// Let the NetworkAgent know the state of its network
@@ -2196,7 +2205,7 @@ private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid)
21962205
boolean keep = nai.isVPN();
21972206
for (int i = 0; i < nai.networkRequests.size() && !keep; i++) {
21982207
NetworkRequest r = nai.networkRequests.valueAt(i);
2199-
if (mNetworkRequests.get(r).isRequest) keep = true;
2208+
if (isRequest(r)) keep = true;
22002209
}
22012210
if (!keep) {
22022211
if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
@@ -2480,6 +2489,10 @@ public void reportBadNetwork(Network network) {
24802489
if (nai == null) return;
24812490
if (DBG) log("reportBadNetwork(" + nai.name() + ") by " + uid);
24822491
synchronized (nai) {
2492+
// Validating an uncreated network could result in a call to rematchNetworkAndRequests()
2493+
// which isn't meant to work on uncreated networks.
2494+
if (!nai.created) return;
2495+
24832496
if (isNetworkBlocked(nai, uid)) return;
24842497

24852498
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
@@ -3685,6 +3698,15 @@ private void updateCapabilities(NetworkAgentInfo networkAgent,
36853698
}
36863699
}
36873700

3701+
private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) {
3702+
for (int i = 0; i < nai.networkRequests.size(); i++) {
3703+
NetworkRequest nr = nai.networkRequests.valueAt(i);
3704+
// Don't send listening requests to factories. b/17393458
3705+
if (!isRequest(nr)) continue;
3706+
sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
3707+
}
3708+
}
3709+
36883710
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
36893711
if (VDBG) log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
36903712
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
@@ -3739,22 +3761,24 @@ private void callCallbackForRequest(NetworkRequestInfo nri,
37393761
}
37403762
}
37413763

3764+
private void teardownUnneededNetwork(NetworkAgentInfo nai) {
3765+
for (int i = 0; i < nai.networkRequests.size(); i++) {
3766+
NetworkRequest nr = nai.networkRequests.valueAt(i);
3767+
// Ignore listening requests.
3768+
if (!isRequest(nr)) continue;
3769+
loge("Dead network still had at least " + nr);
3770+
break;
3771+
}
3772+
nai.asyncChannel.disconnect();
3773+
}
3774+
37423775
private void handleLingerComplete(NetworkAgentInfo oldNetwork) {
37433776
if (oldNetwork == null) {
37443777
loge("Unknown NetworkAgentInfo in handleLingerComplete");
37453778
return;
37463779
}
3747-
if (DBG) {
3748-
log("handleLingerComplete for " + oldNetwork.name());
3749-
for (int i = 0; i < oldNetwork.networkRequests.size(); i++) {
3750-
NetworkRequest nr = oldNetwork.networkRequests.valueAt(i);
3751-
// Ignore listening requests.
3752-
if (mNetworkRequests.get(nr).isRequest == false) continue;
3753-
loge("Dead network still had at least " + nr);
3754-
break;
3755-
}
3756-
}
3757-
oldNetwork.asyncChannel.disconnect();
3780+
if (DBG) log("handleLingerComplete for " + oldNetwork.name());
3781+
teardownUnneededNetwork(oldNetwork);
37583782
}
37593783

37603784
private void makeDefault(NetworkAgentInfo newNetwork) {
@@ -3891,7 +3915,7 @@ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nasc
38913915
for (int i = 0; i < nai.networkRequests.size() && teardown; i++) {
38923916
NetworkRequest nr = nai.networkRequests.valueAt(i);
38933917
try {
3894-
if (mNetworkRequests.get(nr).isRequest) {
3918+
if (isRequest(nr)) {
38953919
teardown = false;
38963920
}
38973921
} catch (Exception e) {
@@ -3954,14 +3978,8 @@ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nasc
39543978
// the lingering process so communication on that network is given time to wrap up.
39553979
// TODO: Could teardown unvalidated networks when their NetworkCapabilities
39563980
// satisfy no NetworkRequests.
3957-
if (DBG && newNetwork.networkRequests.size() != 0) {
3958-
loge("tearing down network with live requests:");
3959-
for (int i=0; i < newNetwork.networkRequests.size(); i++) {
3960-
loge(" " + newNetwork.networkRequests.valueAt(i));
3961-
}
3962-
}
39633981
if (DBG) log("Validated network turns out to be unwanted. Tear it down.");
3964-
newNetwork.asyncChannel.disconnect();
3982+
teardownUnneededNetwork(newNetwork);
39653983
}
39663984
}
39673985

@@ -4090,12 +4108,7 @@ private void updateNetworkScore(NetworkAgentInfo nai, int score) {
40904108

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

4093-
for (int i = 0; i < nai.networkRequests.size(); i++) {
4094-
NetworkRequest nr = nai.networkRequests.valueAt(i);
4095-
// Don't send listening requests to factories. b/17393458
4096-
if (mNetworkRequests.get(nr).isRequest == false) continue;
4097-
sendUpdatedScoreToFactories(nr, score);
4098-
}
4111+
sendUpdatedScoreToFactories(nai);
40994112
}
41004113

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

0 commit comments

Comments
 (0)