Merge "Send updated NetworkAgent score to NetworkFactories when validated." into lmp-dev

This commit is contained in:
Paul Jensen
2014-10-03 02:18:11 +00:00
committed by Android (Google) Code Review

View File

@@ -1792,6 +1792,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) {
@@ -1908,8 +1912,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
@@ -2203,7 +2212,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");
@@ -2487,6 +2496,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);
@@ -3692,6 +3705,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()) {
@@ -3746,22 +3768,24 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
} }
private void teardownUnneededNetwork(NetworkAgentInfo nai) {
for (int i = 0; i < nai.networkRequests.size(); i++) {
NetworkRequest nr = nai.networkRequests.valueAt(i);
// Ignore listening requests.
if (!isRequest(nr)) continue;
loge("Dead network still had at least " + nr);
break;
}
nai.asyncChannel.disconnect();
}
private void handleLingerComplete(NetworkAgentInfo oldNetwork) { private void handleLingerComplete(NetworkAgentInfo oldNetwork) {
if (oldNetwork == null) { if (oldNetwork == null) {
loge("Unknown NetworkAgentInfo in handleLingerComplete"); loge("Unknown NetworkAgentInfo in handleLingerComplete");
return; return;
} }
if (DBG) { if (DBG) log("handleLingerComplete for " + oldNetwork.name());
log("handleLingerComplete for " + oldNetwork.name()); teardownUnneededNetwork(oldNetwork);
for (int i = 0; i < oldNetwork.networkRequests.size(); i++) {
NetworkRequest nr = oldNetwork.networkRequests.valueAt(i);
// Ignore listening requests.
if (mNetworkRequests.get(nr).isRequest == false) continue;
loge("Dead network still had at least " + nr);
break;
}
}
oldNetwork.asyncChannel.disconnect();
} }
private void makeDefault(NetworkAgentInfo newNetwork) { private void makeDefault(NetworkAgentInfo newNetwork) {
@@ -3898,7 +3922,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) {
@@ -3961,14 +3985,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);
} }
} }
@@ -4097,12 +4115,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