Merge "Add "track default" type to NetworkRequestInfo" into nyc-dev am: 3e4c79e4

am: 6d54e91

* commit '6d54e91479d185030cd167d292441d7bd9321c9f':
  Add "track default" type to NetworkRequestInfo
This commit is contained in:
Erik Kline
2016-03-24 04:29:45 +00:00
committed by android-build-merger

View File

@@ -630,7 +630,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mDefaultRequest = createInternetRequestForTransport(-1); mDefaultRequest = createInternetRequestForTransport(-1);
NetworkRequestInfo defaultNRI = new NetworkRequestInfo(null, mDefaultRequest, NetworkRequestInfo defaultNRI = new NetworkRequestInfo(null, mDefaultRequest,
new Binder(), NetworkRequestInfo.REQUEST); new Binder(), NetworkRequestType.REQUEST);
mNetworkRequests.put(mDefaultRequest, defaultNRI); mNetworkRequests.put(mDefaultRequest, defaultNRI);
mNetworkRequestInfoLogs.log("REGISTER " + defaultNRI); mNetworkRequestInfoLogs.log("REGISTER " + defaultNRI);
@@ -806,7 +806,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (enable) { if (enable) {
handleRegisterNetworkRequest(new NetworkRequestInfo( handleRegisterNetworkRequest(new NetworkRequestInfo(
null, mDefaultMobileDataRequest, new Binder(), NetworkRequestInfo.REQUEST)); null, mDefaultMobileDataRequest, new Binder(), NetworkRequestType.REQUEST));
} else { } else {
handleReleaseNetworkRequest(mDefaultMobileDataRequest, Process.SYSTEM_UID); handleReleaseNetworkRequest(mDefaultMobileDataRequest, Process.SYSTEM_UID);
} }
@@ -1948,7 +1948,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
private boolean isRequest(NetworkRequest request) { private boolean isRequest(NetworkRequest request) {
return mNetworkRequests.get(request).isRequest; return mNetworkRequests.get(request).isRequest();
} }
// must be stateless - things change under us. // must be stateless - things change under us.
@@ -2167,7 +2167,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (VDBG) log("NetworkFactory connected"); if (VDBG) log("NetworkFactory connected");
// A network factory has connected. Send it all current NetworkRequests. // A network factory has connected. Send it all current NetworkRequests.
for (NetworkRequestInfo nri : mNetworkRequests.values()) { for (NetworkRequestInfo nri : mNetworkRequests.values()) {
if (nri.isRequest == false) continue; if (!nri.isRequest()) continue;
NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId); NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK,
(nai != null ? nai.getCurrentScore() : 0), 0, nri.request); (nai != null ? nai.getCurrentScore() : 0), 0, nri.request);
@@ -2304,7 +2304,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void handleRegisterNetworkRequest(NetworkRequestInfo nri) { private void handleRegisterNetworkRequest(NetworkRequestInfo nri) {
mNetworkRequests.put(nri.request, nri); mNetworkRequests.put(nri.request, nri);
mNetworkRequestInfoLogs.log("REGISTER " + nri); mNetworkRequestInfoLogs.log("REGISTER " + nri);
if (!nri.isRequest) { if (!nri.isRequest()) {
for (NetworkAgentInfo network : mNetworkAgentInfos.values()) { for (NetworkAgentInfo network : mNetworkAgentInfos.values()) {
if (nri.request.networkCapabilities.hasSignalStrength() && if (nri.request.networkCapabilities.hasSignalStrength() &&
network.satisfiesImmutableCapabilitiesOf(nri.request)) { network.satisfiesImmutableCapabilitiesOf(nri.request)) {
@@ -2313,7 +2313,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
rematchAllNetworksAndRequests(null, 0); rematchAllNetworksAndRequests(null, 0);
if (nri.isRequest && mNetworkForRequestId.get(nri.request.requestId) == null) { if (nri.isRequest() && mNetworkForRequestId.get(nri.request.requestId) == null) {
sendUpdatedScoreToFactories(nri.request, 0); sendUpdatedScoreToFactories(nri.request, 0);
} }
} }
@@ -2334,7 +2334,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
for (NetworkRequestInfo nri : mNetworkRequests.values()) { for (NetworkRequestInfo nri : mNetworkRequests.values()) {
// 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.isRequest && nai.satisfies(nri.request) && if (nri.isRequest() && nai.satisfies(nri.request) &&
(nai.networkRequests.get(nri.request.requestId) != null || (nai.networkRequests.get(nri.request.requestId) != null ||
// 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
@@ -2362,7 +2362,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
nri.unlinkDeathRecipient(); nri.unlinkDeathRecipient();
mNetworkRequests.remove(request); mNetworkRequests.remove(request);
mNetworkRequestInfoLogs.log("RELEASE " + nri); mNetworkRequestInfoLogs.log("RELEASE " + nri);
if (nri.isRequest) { if (nri.isRequest()) {
// Find all networks that are satisfying this request and remove the request // Find all networks that are satisfying this request and remove the request
// from their request lists. // from their request lists.
// TODO - it's my understanding that for a request there is only a single // TODO - it's my understanding that for a request there is only a single
@@ -3738,14 +3738,37 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
/**
* A NetworkRequest as registered by an application can be one of three
* types:
*
* - "listen", for which the framework will issue callbacks about any
* and all networks that match the specified NetworkCapabilities,
*
* - "request", capable of causing a specific network to be created
* first (e.g. a telephony DUN request), the framework will issue
* callbacks about the single, highest scoring current network
* (if any) that matches the specified NetworkCapabilities, or
*
* - "track the default network", a hybrid of the two designed such
* that the framework will issue callbacks for the single, highest
* scoring current network (if any) that matches the capabilities of
* the default Internet request (mDefaultRequest), but which cannot
* cause the framework to either create or retain the existence of
* any specific network.
*
*/
private static enum NetworkRequestType {
LISTEN,
TRACK_DEFAULT,
REQUEST
};
/** /**
* Tracks info about the requester. * Tracks info about the requester.
* Also used to notice when the calling process dies so we can self-expire * Also used to notice when the calling process dies so we can self-expire
*/ */
private class NetworkRequestInfo implements IBinder.DeathRecipient { private class NetworkRequestInfo implements IBinder.DeathRecipient {
static final boolean REQUEST = true;
static final boolean LISTEN = false;
final NetworkRequest request; final NetworkRequest request;
final PendingIntent mPendingIntent; final PendingIntent mPendingIntent;
boolean mPendingIntentSent; boolean mPendingIntentSent;
@@ -3753,26 +3776,26 @@ public class ConnectivityService extends IConnectivityManager.Stub
final int mPid; final int mPid;
final int mUid; final int mUid;
final Messenger messenger; final Messenger messenger;
final boolean isRequest; private final NetworkRequestType mType;
NetworkRequestInfo(NetworkRequest r, PendingIntent pi, boolean isRequest) { NetworkRequestInfo(NetworkRequest r, PendingIntent pi, NetworkRequestType type) {
request = r; request = r;
mPendingIntent = pi; mPendingIntent = pi;
messenger = null; messenger = null;
mBinder = null; mBinder = null;
mPid = getCallingPid(); mPid = getCallingPid();
mUid = getCallingUid(); mUid = getCallingUid();
this.isRequest = isRequest; mType = type;
} }
NetworkRequestInfo(Messenger m, NetworkRequest r, IBinder binder, boolean isRequest) { NetworkRequestInfo(Messenger m, NetworkRequest r, IBinder binder, NetworkRequestType type) {
super(); super();
messenger = m; messenger = m;
request = r; request = r;
mBinder = binder; mBinder = binder;
mPid = getCallingPid(); mPid = getCallingPid();
mUid = getCallingUid(); mUid = getCallingUid();
this.isRequest = isRequest; mType = type;
mPendingIntent = null; mPendingIntent = null;
try { try {
@@ -3782,6 +3805,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
private String typeString() {
switch (mType) {
case LISTEN: return "Listen";
case REQUEST: return "Request";
case TRACK_DEFAULT: return "Track default";
default:
return "unknown type";
}
}
void unlinkDeathRecipient() { void unlinkDeathRecipient() {
if (mBinder != null) { if (mBinder != null) {
mBinder.unlinkToDeath(this, 0); mBinder.unlinkToDeath(this, 0);
@@ -3794,8 +3827,27 @@ public class ConnectivityService extends IConnectivityManager.Stub
releaseNetworkRequest(request); releaseNetworkRequest(request);
} }
/**
* Returns true iff. the contained NetworkRequest is one that:
*
* - should be associated with at most one satisfying network
* at a time;
*
* - should cause a network to be kept up if it is the only network
* which can satisfy the NetworkReqeust.
*
* For full detail of how isRequest() is used for pairing Networks with
* NetworkRequests read rematchNetworkAndRequests().
*
* TODO: Rename to something more properly descriptive.
*/
public boolean isRequest() {
return (mType == NetworkRequestType.TRACK_DEFAULT) ||
(mType == NetworkRequestType.REQUEST);
}
public String toString() { public String toString() {
return (isRequest ? "Request" : "Listen") + return typeString() +
" from uid/pid:" + mUid + "/" + mPid + " from uid/pid:" + mUid + "/" + mPid +
" for " + request + " for " + request +
(mPendingIntent == null ? "" : " to trigger " + mPendingIntent); (mPendingIntent == null ? "" : " to trigger " + mPendingIntent);
@@ -3848,10 +3900,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public NetworkRequest requestNetwork(NetworkCapabilities networkCapabilities, public NetworkRequest requestNetwork(NetworkCapabilities networkCapabilities,
Messenger messenger, int timeoutMs, IBinder binder, int legacyType) { Messenger messenger, int timeoutMs, IBinder binder, int legacyType) {
final NetworkRequestType type = (networkCapabilities == null)
? NetworkRequestType.TRACK_DEFAULT
: NetworkRequestType.REQUEST;
// If the requested networkCapabilities is null, take them instead from // If the requested networkCapabilities is null, take them instead from
// the default network request. This allows callers to keep track of // the default network request. This allows callers to keep track of
// the system default network. // the system default network.
if (networkCapabilities == null) { if (type == NetworkRequestType.TRACK_DEFAULT) {
networkCapabilities = new NetworkCapabilities(mDefaultRequest.networkCapabilities); networkCapabilities = new NetworkCapabilities(mDefaultRequest.networkCapabilities);
enforceAccessPermission(); enforceAccessPermission();
} else { } else {
@@ -3873,8 +3928,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType, NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType,
nextNetworkRequestId()); nextNetworkRequestId());
NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder, NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder, type);
NetworkRequestInfo.REQUEST);
if (DBG) log("requestNetwork for " + nri); if (DBG) log("requestNetwork for " + nri);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST, nri)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST, nri));
@@ -3939,7 +3993,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE, NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE,
nextNetworkRequestId()); nextNetworkRequestId());
NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation, NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation,
NetworkRequestInfo.REQUEST); NetworkRequestType.REQUEST);
if (DBG) log("pendingRequest for " + nri); if (DBG) log("pendingRequest for " + nri);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT, mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT,
nri)); nri));
@@ -3991,7 +4045,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest networkRequest = new NetworkRequest( NetworkRequest networkRequest = new NetworkRequest(
new NetworkCapabilities(networkCapabilities), TYPE_NONE, nextNetworkRequestId()); new NetworkCapabilities(networkCapabilities), TYPE_NONE, nextNetworkRequestId());
NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder, NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder,
NetworkRequestInfo.LISTEN); NetworkRequestType.LISTEN);
if (DBG) log("listenForNetwork for " + nri); if (DBG) log("listenForNetwork for " + nri);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_LISTENER, nri)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_LISTENER, nri));
@@ -4009,7 +4063,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest networkRequest = new NetworkRequest( NetworkRequest networkRequest = new NetworkRequest(
new NetworkCapabilities(networkCapabilities), TYPE_NONE, nextNetworkRequestId()); new NetworkCapabilities(networkCapabilities), TYPE_NONE, nextNetworkRequestId());
NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation, NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation,
NetworkRequestInfo.LISTEN); NetworkRequestType.LISTEN);
if (DBG) log("pendingListenForNetwork for " + nri); if (DBG) log("pendingListenForNetwork for " + nri);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_LISTENER, nri)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_LISTENER, nri));
@@ -4526,7 +4580,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// check if it satisfies the NetworkCapabilities // check if it satisfies the NetworkCapabilities
if (VDBG) log(" checking if request is satisfied: " + nri.request); if (VDBG) log(" checking if request is satisfied: " + nri.request);
if (satisfies) { if (satisfies) {
if (!nri.isRequest) { if (!nri.isRequest()) {
// This is not a request, it's a callback listener. // This is not a request, it's a callback listener.
// Add it to newNetwork regardless of score. // Add it to newNetwork regardless of score.
if (newNetwork.addRequest(nri.request)) addedRequests.add(nri); if (newNetwork.addRequest(nri.request)) addedRequests.add(nri);
@@ -4586,7 +4640,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mNetworkForRequestId.remove(nri.request.requestId); mNetworkForRequestId.remove(nri.request.requestId);
sendUpdatedScoreToFactories(nri.request, 0); sendUpdatedScoreToFactories(nri.request, 0);
} else { } else {
if (nri.isRequest == true) { if (nri.isRequest()) {
Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " + Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " +
newNetwork.name() + newNetwork.name() +
" without updating mNetworkForRequestId or factories!"); " without updating mNetworkForRequestId or factories!");