Fix listening NetworkRequests to listen for all networks.

This is a small change but should fix a number of functional problems:
1. When registering a listening NetworkRequest and when a Network is
   validated, we should always add the listening NetworkRequest to the
   Network's list of NetworkRequests if the Network satisfies the
   NetworkRequest.  Previously in both cases this was only done for
   the highest scoring network.  This enables the listening
   NetworkRequest to listen for all networks, not just the highest
   scoring network.
2. No longer add listening NetworkRequests to mNetworkForRequestId as
   it doesn't make sense as it's a 1:1 mapping but listening
   NetworkRequests to Networks is a many:many mapping.
3. Don't "keep" a Network that's finished validating when only a
   listening NetworkRequest requests it.
4. Don't send updated scores to NetworkFactories from listening
   NetworkRequests.  NetworkFactories and NetworkAgents shouldn't
   concern themselves with listening NetworkRequests.

bug:16680764
Change-Id: Iaba14263227771e4bd84ee4bce488beaef20a8a3
This commit is contained in:
Paul Jensen
2014-08-19 10:31:40 -04:00
parent cbec2b12ca
commit bbfdfb007c

View File

@@ -2089,13 +2089,21 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (newCap.satisfiedByNetworkCapabilities(network.networkCapabilities)) {
if (VDBG) log("apparently satisfied. currentScore=" + network.currentScore);
if ((bestNetwork == null) || bestNetwork.currentScore < network.currentScore) {
if (!nri.isRequest) {
// Not setting bestNetwork here as a listening NetworkRequest may be
// satisfied by multiple Networks. Instead the request is added to
// each satisfying Network and notified about each.
network.addRequest(nri.request);
notifyNetworkCallback(network, nri);
} else {
bestNetwork = network;
}
}
}
}
if (bestNetwork != null) {
if (VDBG) log("using " + bestNetwork.name());
if (nri.isRequest && bestNetwork.networkInfo.isConnected()) {
if (bestNetwork.networkInfo.isConnected()) {
// Cancel any lingering so the linger timeout doesn't teardown this network
// even though we have a request for it.
bestNetwork.networkLingered.clear();
@@ -2105,7 +2113,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mNetworkForRequestId.put(nri.request.requestId, bestNetwork);
notifyNetworkCallback(bestNetwork, nri);
score = bestNetwork.currentScore;
if (nri.isRequest && nri.request.legacyType != TYPE_NONE) {
if (nri.request.legacyType != TYPE_NONE) {
mLegacyTypeTracker.add(nri.request.legacyType, bestNetwork);
}
}
@@ -4386,6 +4394,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (VDBG) log(" checking if request is satisfied: " + nri.request);
if (nri.request.networkCapabilities.satisfiedByNetworkCapabilities(
newNetwork.networkCapabilities)) {
if (!nri.isRequest) {
newNetwork.addRequest(nri.request);
continue;
}
// next check if it's better than any current network we're using for
// this request
if (VDBG) {