Skip to content

Commit a11b5e3

Browse files
JensenPaulAndroid (Google) Code Review
authored andcommitted
Merge "Send updated NetworkAgent score to NetworkFactories when validated." into lmp-dev
2 parents 6eead85 + c8b9a74 commit a11b5e3

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
@@ -1792,6 +1792,10 @@ private boolean isLiveNetworkAgent(NetworkAgentInfo nai, String msg) {
17921792
return false;
17931793
}
17941794

1795+
private boolean isRequest(NetworkRequest request) {
1796+
return mNetworkRequests.get(request).isRequest;
1797+
}
1798+
17951799
// must be stateless - things change under us.
17961800
private class NetworkStateTrackerHandler extends Handler {
17971801
public NetworkStateTrackerHandler(Looper looper) {
@@ -1908,8 +1912,13 @@ public void handleMessage(Message msg) {
19081912
if (valid) {
19091913
if (DBG) log("Validated " + nai.name());
19101914
final boolean previouslyValidated = nai.validated;
1915+
final int previousScore = nai.getCurrentScore();
19111916
nai.validated = true;
19121917
rematchNetworkAndRequests(nai, !previouslyValidated);
1918+
// If score has changed, rebroadcast to NetworkFactories. b/17726566
1919+
if (nai.getCurrentScore() != previousScore) {
1920+
sendUpdatedScoreToFactories(nai);
1921+
}
19131922
}
19141923
updateInetCondition(nai, valid);
19151924
// Let the NetworkAgent know the state of its network
@@ -2203,7 +2212,7 @@ private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid)
22032212
boolean keep = nai.isVPN();
22042213
for (int i = 0; i < nai.networkRequests.size() && !keep; i++) {
22052214
NetworkRequest r = nai.networkRequests.valueAt(i);
2206-
if (mNetworkRequests.get(r).isRequest) keep = true;
2215+
if (isRequest(r)) keep = true;
22072216
}
22082217
if (!keep) {
22092218
if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
@@ -2487,6 +2496,10 @@ public void reportBadNetwork(Network network) {
24872496
if (nai == null) return;
24882497
if (DBG) log("reportBadNetwork(" + nai.name() + ") by " + uid);
24892498
synchronized (nai) {
2499+
// Validating an uncreated network could result in a call to rematchNetworkAndRequests()
2500+
// which isn't meant to work on uncreated networks.
2501+
if (!nai.created) return;
2502+
24902503
if (isNetworkBlocked(nai, uid)) return;
24912504

24922505
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
@@ -3692,6 +3705,15 @@ private void updateCapabilities(NetworkAgentInfo networkAgent,
36923705
}
36933706
}
36943707

3708+
private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) {
3709+
for (int i = 0; i < nai.networkRequests.size(); i++) {
3710+
NetworkRequest nr = nai.networkRequests.valueAt(i);
3711+
// Don't send listening requests to factories. b/17393458
3712+
if (!isRequest(nr)) continue;
3713+
sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
3714+
}
3715+
}
3716+
36953717
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
36963718
if (VDBG) log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
36973719
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
@@ -3746,22 +3768,24 @@ private void callCallbackForRequest(NetworkRequestInfo nri,
37463768
}
37473769
}
37483770

3771+
private void teardownUnneededNetwork(NetworkAgentInfo nai) {
3772+
for (int i = 0; i < nai.networkRequests.size(); i++) {
3773+
NetworkRequest nr = nai.networkRequests.valueAt(i);
3774+
// Ignore listening requests.
3775+
if (!isRequest(nr)) continue;
3776+
loge("Dead network still had at least " + nr);
3777+
break;
3778+
}
3779+
nai.asyncChannel.disconnect();
3780+
}
3781+
37493782
private void handleLingerComplete(NetworkAgentInfo oldNetwork) {
37503783
if (oldNetwork == null) {
37513784
loge("Unknown NetworkAgentInfo in handleLingerComplete");
37523785
return;
37533786
}
3754-
if (DBG) {
3755-
log("handleLingerComplete for " + oldNetwork.name());
3756-
for (int i = 0; i < oldNetwork.networkRequests.size(); i++) {
3757-
NetworkRequest nr = oldNetwork.networkRequests.valueAt(i);
3758-
// Ignore listening requests.
3759-
if (mNetworkRequests.get(nr).isRequest == false) continue;
3760-
loge("Dead network still had at least " + nr);
3761-
break;
3762-
}
3763-
}
3764-
oldNetwork.asyncChannel.disconnect();
3787+
if (DBG) log("handleLingerComplete for " + oldNetwork.name());
3788+
teardownUnneededNetwork(oldNetwork);
37653789
}
37663790

37673791
private void makeDefault(NetworkAgentInfo newNetwork) {
@@ -3898,7 +3922,7 @@ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nasc
38983922
for (int i = 0; i < nai.networkRequests.size() && teardown; i++) {
38993923
NetworkRequest nr = nai.networkRequests.valueAt(i);
39003924
try {
3901-
if (mNetworkRequests.get(nr).isRequest) {
3925+
if (isRequest(nr)) {
39023926
teardown = false;
39033927
}
39043928
} catch (Exception e) {
@@ -3961,14 +3985,8 @@ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nasc
39613985
// the lingering process so communication on that network is given time to wrap up.
39623986
// TODO: Could teardown unvalidated networks when their NetworkCapabilities
39633987
// satisfy no NetworkRequests.
3964-
if (DBG && newNetwork.networkRequests.size() != 0) {
3965-
loge("tearing down network with live requests:");
3966-
for (int i=0; i < newNetwork.networkRequests.size(); i++) {
3967-
loge(" " + newNetwork.networkRequests.valueAt(i));
3968-
}
3969-
}
39703988
if (DBG) log("Validated network turns out to be unwanted. Tear it down.");
3971-
newNetwork.asyncChannel.disconnect();
3989+
teardownUnneededNetwork(newNetwork);
39723990
}
39733991
}
39743992

@@ -4097,12 +4115,7 @@ private void updateNetworkScore(NetworkAgentInfo nai, int score) {
40974115

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

4100-
for (int i = 0; i < nai.networkRequests.size(); i++) {
4101-
NetworkRequest nr = nai.networkRequests.valueAt(i);
4102-
// Don't send listening requests to factories. b/17393458
4103-
if (mNetworkRequests.get(nr).isRequest == false) continue;
4104-
sendUpdatedScoreToFactories(nr, score);
4105-
}
4118+
sendUpdatedScoreToFactories(nai);
41064119
}
41074120

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

0 commit comments

Comments
 (0)