Merge changes I177ec607,I68f364b4,Ib3b9f52c,If040d61e
* changes: nits removing extra space, change method name, etc maybeLogBlockedStatusChanged multilayer requests Update getSignalStrengthThresholds for multilayer Update to unneeded for multilayered requests
This commit is contained in:
@@ -1380,8 +1380,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final String action = blocked ? "BLOCKED" : "UNBLOCKED";
|
final String action = blocked ? "BLOCKED" : "UNBLOCKED";
|
||||||
|
final NetworkRequest satisfiedRequest = nri.getSatisfiedRequest();
|
||||||
|
final int requestId = satisfiedRequest != null
|
||||||
|
? satisfiedRequest.requestId : nri.mRequests.get(0).requestId;
|
||||||
mNetworkInfoBlockingLogs.log(String.format(
|
mNetworkInfoBlockingLogs.log(String.format(
|
||||||
"%s %d(%d) on netId %d", action, nri.mUid, nri.request.requestId, net.getNetId()));
|
"%s %d(%d) on netId %d", action, nri.mUid, requestId, net.getNetId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2705,7 +2708,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
* Return an array of all current NetworkRequest sorted by request id.
|
* Return an array of all current NetworkRequest sorted by request id.
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
protected NetworkRequestInfo[] requestsSortedById() {
|
NetworkRequestInfo[] requestsSortedById() {
|
||||||
NetworkRequestInfo[] requests = new NetworkRequestInfo[0];
|
NetworkRequestInfo[] requests = new NetworkRequestInfo[0];
|
||||||
requests = mNetworkRequests.values().toArray(requests);
|
requests = mNetworkRequests.values().toArray(requests);
|
||||||
// Sort the array based off the NRI containing the min requestId in its requests.
|
// Sort the array based off the NRI containing the min requestId in its requests.
|
||||||
@@ -3555,15 +3558,42 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
|
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
|
||||||
if (reason == UnneededFor.LINGER && nri.request.isBackgroundRequest()) {
|
if (reason == UnneededFor.LINGER
|
||||||
|
&& !nri.isMultilayerRequest()
|
||||||
|
&& nri.mRequests.get(0).isBackgroundRequest()) {
|
||||||
// Background requests don't affect lingering.
|
// Background requests don't affect lingering.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isNetworkPotentialSatisfier(nai, nri)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isNetworkPotentialSatisfier(
|
||||||
|
@NonNull final NetworkAgentInfo candidate, @NonNull final NetworkRequestInfo nri) {
|
||||||
|
// listen requests won't keep up a network satisfying it. If this is not a multilayer
|
||||||
|
// request, we can return immediately. For multilayer requests, we have to check to see if
|
||||||
|
// any of the multilayer requests may have a potential satisfier.
|
||||||
|
if (!nri.isMultilayerRequest() && nri.mRequests.get(0).isListen()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (final NetworkRequest req : nri.mRequests) {
|
||||||
|
// As non-multilayer listen requests have already returned, the below would only happen
|
||||||
|
// for a multilayer request therefore continue to the next request if available.
|
||||||
|
if (req.isListen()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// If this Network is already the highest scoring Network for a request, or if
|
// If this Network is already the highest scoring Network for a request, or if
|
||||||
// there is hope for it to become one if it validated, then it is needed.
|
// there is hope for it to become one if it validated, then it is needed.
|
||||||
if (nri.request.isRequest() && nai.satisfies(nri.request) &&
|
if (candidate.satisfies(req)) {
|
||||||
(nai.isSatisfyingRequest(nri.request.requestId) ||
|
// As soon as a network is found that satisfies a request, return. Specifically for
|
||||||
|
// multilayer requests, returning as soon as a NetworkAgentInfo satisfies a request
|
||||||
|
// is important so as to not evaluate lower priority requests further in
|
||||||
|
// nri.mRequests.
|
||||||
|
final boolean isNetworkNeeded = candidate.isSatisfyingRequest(req.requestId)
|
||||||
// Note that this catches two important cases:
|
// Note that this catches two important cases:
|
||||||
// 1. Unvalidated cellular will not be reaped when unvalidated WiFi
|
// 1. Unvalidated cellular will not be reaped when unvalidated WiFi
|
||||||
// is currently satisfying the request. This is desirable when
|
// is currently satisfying the request. This is desirable when
|
||||||
@@ -3571,13 +3601,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
// 2. Unvalidated WiFi will not be reaped when validated cellular
|
// 2. Unvalidated WiFi will not be reaped when validated cellular
|
||||||
// is currently satisfying the request. This is desirable when
|
// is currently satisfying the request. This is desirable when
|
||||||
// WiFi ends up validating and out scoring cellular.
|
// WiFi ends up validating and out scoring cellular.
|
||||||
nri.mSatisfier.getCurrentScore()
|
|| nri.mSatisfier.getCurrentScore()
|
||||||
< nai.getCurrentScoreAsValidated())) {
|
< candidate.getCurrentScoreAsValidated();
|
||||||
|
return isNetworkNeeded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private NetworkRequestInfo getNriForAppRequest(
|
private NetworkRequestInfo getNriForAppRequest(
|
||||||
NetworkRequest request, int callingUid, String requestedOperation) {
|
NetworkRequest request, int callingUid, String requestedOperation) {
|
||||||
@@ -5464,6 +5495,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
this(r, null);
|
this(r, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isMultilayerRequest() {
|
||||||
|
return mRequests.size() > 1;
|
||||||
|
}
|
||||||
|
|
||||||
private List<NetworkRequest> initializeRequests(NetworkRequest r) {
|
private List<NetworkRequest> initializeRequests(NetworkRequest r) {
|
||||||
final ArrayList<NetworkRequest> tempRequests = new ArrayList<>();
|
final ArrayList<NetworkRequest> tempRequests = new ArrayList<>();
|
||||||
tempRequests.add(new NetworkRequest(r));
|
tempRequests.add(new NetworkRequest(r));
|
||||||
@@ -5505,7 +5540,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
public void binderDied() {
|
public void binderDied() {
|
||||||
log("ConnectivityService NetworkRequestInfo binderDied(" +
|
log("ConnectivityService NetworkRequestInfo binderDied(" +
|
||||||
mRequests + ", " + mBinder + ")");
|
mRequests + ", " + mBinder + ")");
|
||||||
releaseNetworkRequest(mRequests);
|
releaseNetworkRequests(mRequests);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -5538,13 +5573,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
mAppOpsManager.checkPackage(callerUid, callerPackageName);
|
mAppOpsManager.checkPackage(callerUid, callerPackageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArrayList<Integer> getSignalStrengthThresholds(NetworkAgentInfo nai) {
|
private ArrayList<Integer> getSignalStrengthThresholds(@NonNull final NetworkAgentInfo nai) {
|
||||||
final SortedSet<Integer> thresholds = new TreeSet<>();
|
final SortedSet<Integer> thresholds = new TreeSet<>();
|
||||||
synchronized (nai) {
|
synchronized (nai) {
|
||||||
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
|
for (final NetworkRequestInfo nri : mNetworkRequests.values()) {
|
||||||
if (nri.request.networkCapabilities.hasSignalStrength() &&
|
for (final NetworkRequest req : nri.mRequests) {
|
||||||
nai.satisfiesImmutableCapabilitiesOf(nri.request)) {
|
if (req.networkCapabilities.hasSignalStrength()
|
||||||
thresholds.add(nri.request.networkCapabilities.getSignalStrength());
|
&& nai.satisfiesImmutableCapabilitiesOf(req)) {
|
||||||
|
thresholds.add(req.networkCapabilities.getSignalStrength());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5831,7 +5868,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
return mNextNetworkProviderId.getAndIncrement();
|
return mNextNetworkProviderId.getAndIncrement();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void releaseNetworkRequest(List<NetworkRequest> networkRequests) {
|
private void releaseNetworkRequests(List<NetworkRequest> networkRequests) {
|
||||||
for (int i = 0; i < networkRequests.size(); i++) {
|
for (int i = 0; i < networkRequests.size(); i++) {
|
||||||
releaseNetworkRequest(networkRequests.get(i));
|
releaseNetworkRequest(networkRequests.get(i));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8109,7 +8109,16 @@ public class ConnectivityServiceTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDumpDoesNotCrash() {
|
public void testDumpDoesNotCrash() {
|
||||||
StringWriter stringWriter = new StringWriter();
|
// Filing a couple requests prior to testing the dump.
|
||||||
|
final TestNetworkCallback genericNetworkCallback = new TestNetworkCallback();
|
||||||
|
final TestNetworkCallback wifiNetworkCallback = new TestNetworkCallback();
|
||||||
|
final NetworkRequest genericRequest = new NetworkRequest.Builder()
|
||||||
|
.clearCapabilities().build();
|
||||||
|
final NetworkRequest wifiRequest = new NetworkRequest.Builder()
|
||||||
|
.addTransportType(TRANSPORT_WIFI).build();
|
||||||
|
mCm.registerNetworkCallback(genericRequest, genericNetworkCallback);
|
||||||
|
mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback);
|
||||||
|
final StringWriter stringWriter = new StringWriter();
|
||||||
|
|
||||||
mService.dump(new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
|
mService.dump(new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
|
||||||
|
|
||||||
@@ -8131,11 +8140,11 @@ public class ConnectivityServiceTest {
|
|||||||
mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback);
|
mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback);
|
||||||
mCm.registerNetworkCallback(cellRequest, cellNetworkCallback);
|
mCm.registerNetworkCallback(cellRequest, cellNetworkCallback);
|
||||||
|
|
||||||
ConnectivityService.NetworkRequestInfo[] nriOutput = mService.requestsSortedById();
|
final ConnectivityService.NetworkRequestInfo[] nriOutput = mService.requestsSortedById();
|
||||||
|
|
||||||
assertTrue(nriOutput.length > 1);
|
assertTrue(nriOutput.length > 1);
|
||||||
for (int i = 0; i < nriOutput.length - 1; i++) {
|
for (int i = 0; i < nriOutput.length - 1; i++) {
|
||||||
boolean isRequestIdInOrder =
|
final boolean isRequestIdInOrder =
|
||||||
nriOutput[i].mRequests.get(0).requestId
|
nriOutput[i].mRequests.get(0).requestId
|
||||||
< nriOutput[i + 1].mRequests.get(0).requestId;
|
< nriOutput[i + 1].mRequests.get(0).requestId;
|
||||||
assertTrue(isRequestIdInOrder);
|
assertTrue(isRequestIdInOrder);
|
||||||
|
|||||||
Reference in New Issue
Block a user