Merge "Tell the factory it is already serving a request."

This commit is contained in:
Chalard Jean
2019-03-13 02:07:29 +00:00
committed by Gerrit Code Review
9 changed files with 304 additions and 107 deletions

View File

@@ -3158,11 +3158,11 @@ public class ConnectivityManager {
}
}
/** {@hide} */
/** {@hide} - returns the factory serial number */
@UnsupportedAppUsage
public void registerNetworkFactory(Messenger messenger, String name) {
public int registerNetworkFactory(Messenger messenger, String name) {
try {
mService.registerNetworkFactory(messenger, name);
return mService.registerNetworkFactory(messenger, name);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -3178,6 +3178,10 @@ public class ConnectivityManager {
}
}
// TODO : remove this method. It is a stopgap measure to help sheperding a number
// of dependent changes that would conflict throughout the automerger graph. Having this
// temporarily helps with the process of going through with all these dependent changes across
// the entire tree.
/**
* @hide
* Register a NetworkAgent with ConnectivityService.
@@ -3185,8 +3189,20 @@ public class ConnectivityManager {
*/
public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
NetworkCapabilities nc, int score, NetworkMisc misc) {
return registerNetworkAgent(messenger, ni, lp, nc, score, misc,
NetworkFactory.SerialNumber.NONE);
}
/**
* @hide
* Register a NetworkAgent with ConnectivityService.
* @return NetID corresponding to NetworkAgent.
*/
public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
NetworkCapabilities nc, int score, NetworkMisc misc, int factorySerialNumber) {
try {
return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc);
return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc,
factorySerialNumber);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}

View File

@@ -150,14 +150,14 @@ interface IConnectivityManager
void setAirplaneMode(boolean enable);
void registerNetworkFactory(in Messenger messenger, in String name);
int registerNetworkFactory(in Messenger messenger, in String name);
boolean requestBandwidthUpdate(in Network network);
void unregisterNetworkFactory(in Messenger messenger);
int registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp,
in NetworkCapabilities nc, int score, in NetworkMisc misc);
in NetworkCapabilities nc, int score, in NetworkMisc misc, in int factorySerialNumber);
NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities,
in Messenger messenger, int timeoutSec, in IBinder binder, int legacy);

View File

@@ -57,6 +57,7 @@ public abstract class NetworkAgent extends Handler {
private static final long BW_REFRESH_MIN_WIN_MS = 500;
private boolean mPollLceScheduled = false;
private AtomicBoolean mPollLcePending = new AtomicBoolean(false);
public final int mFactorySerialNumber;
private static final int BASE = Protocol.BASE_NETWORK_AGENT;
@@ -212,16 +213,31 @@ public abstract class NetworkAgent extends Handler {
*/
public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 15;
// TODO : remove these two constructors. They are a stopgap measure to help sheperding a number
// of dependent changes that would conflict throughout the automerger graph. Having these
// temporarily helps with the process of going through with all these dependent changes across
// the entire tree.
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score) {
this(looper, context, logTag, ni, nc, lp, score, null);
this(looper, context, logTag, ni, nc, lp, score, null, NetworkFactory.SerialNumber.NONE);
}
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
this(looper, context, logTag, ni, nc, lp, score, misc, NetworkFactory.SerialNumber.NONE);
}
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
NetworkCapabilities nc, LinkProperties lp, int score, int factorySerialNumber) {
this(looper, context, logTag, ni, nc, lp, score, null, factorySerialNumber);
}
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc,
int factorySerialNumber) {
super(looper);
LOG_TAG = logTag;
mContext = context;
mFactorySerialNumber = factorySerialNumber;
if (ni == null || nc == null || lp == null) {
throw new IllegalArgumentException();
}
@@ -230,7 +246,8 @@ public abstract class NetworkAgent extends Handler {
ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
Context.CONNECTIVITY_SERVICE);
netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni),
new LinkProperties(lp), new NetworkCapabilities(nc), score, misc);
new LinkProperties(lp), new NetworkCapabilities(nc), score, misc,
factorySerialNumber);
}
@Override

View File

@@ -34,6 +34,7 @@ import com.android.internal.util.Protocol;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
/**
* A NetworkFactory is an entity that creates NetworkAgent objects.
@@ -51,6 +52,20 @@ import java.util.ArrayList;
* @hide
**/
public class NetworkFactory extends Handler {
/** @hide */
public static class SerialNumber {
// Guard used by no network factory.
public static final int NONE = -1;
// A hardcoded serial number for NetworkAgents representing VPNs. These agents are
// not created by any factory, so they use this constant for clarity instead of NONE.
public static final int VPN = -2;
private static final AtomicInteger sNetworkFactorySerialNumber = new AtomicInteger(1);
/** Returns a unique serial number for a factory. */
public static final int nextSerialNumber() {
return sNetworkFactorySerialNumber.getAndIncrement();
}
}
private static final boolean DBG = true;
private static final boolean VDBG = false;
@@ -66,7 +81,7 @@ public class NetworkFactory extends Handler {
* disregard any that it will never be able to service, for example
* those requiring a different bearer.
* msg.obj = NetworkRequest
* msg.arg1 = score - the score of the any network currently satisfying this
* msg.arg1 = score - the score of the network currently satisfying this
* request. If this bearer knows in advance it cannot
* exceed this score it should not try to connect, holding the request
* for the future.
@@ -76,6 +91,8 @@ public class NetworkFactory extends Handler {
* with the same NetworkRequest but an updated score.
* Also, network conditions may change for this bearer
* allowing for a better score in the future.
* msg.arg2 = the serial number of the factory currently responsible for the
* NetworkAgent handling this request, or SerialNumber.NONE if none.
*/
public static final int CMD_REQUEST_NETWORK = BASE;
@@ -118,6 +135,7 @@ public class NetworkFactory extends Handler {
private int mRefCount = 0;
private Messenger mMessenger = null;
private int mSerialNumber;
@UnsupportedAppUsage
public NetworkFactory(Looper looper, Context context, String logTag,
@@ -132,7 +150,8 @@ public class NetworkFactory extends Handler {
if (DBG) log("Registering NetworkFactory");
if (mMessenger == null) {
mMessenger = new Messenger(this);
ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger, LOG_TAG);
mSerialNumber = ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger,
LOG_TAG);
}
}
@@ -178,7 +197,7 @@ public class NetworkFactory extends Handler {
break;
}
case CMD_REQUEST_NETWORK: {
handleAddRequest((NetworkRequest)msg.obj, msg.arg1);
handleAddRequest((NetworkRequest) msg.obj, msg.arg1, msg.arg2);
break;
}
case CMD_CANCEL_REQUEST: {
@@ -200,11 +219,13 @@ public class NetworkFactory extends Handler {
public final NetworkRequest request;
public int score;
public boolean requested; // do we have a request outstanding, limited by score
public int factorySerialNumber;
public NetworkRequestInfo(NetworkRequest request, int score) {
NetworkRequestInfo(NetworkRequest request, int score, int factorySerialNumber) {
this.request = request;
this.score = score;
this.requested = false;
this.factorySerialNumber = factorySerialNumber;
}
@Override
@@ -213,16 +234,51 @@ public class NetworkFactory extends Handler {
}
}
/**
* Add a NetworkRequest that the bearer may want to attempt to satisfy.
* @see #CMD_REQUEST_NETWORK
*
* @param request the request to handle.
* @param score the score of the NetworkAgent currently satisfying this request.
* @param servingFactorySerialNumber the serial number of the NetworkFactory that
* created the NetworkAgent currently satisfying this request.
*/
// TODO : remove this method. It is a stopgap measure to help sheperding a number
// of dependent changes that would conflict throughout the automerger graph. Having this
// temporarily helps with the process of going through with all these dependent changes across
// the entire tree.
@VisibleForTesting
protected void handleAddRequest(NetworkRequest request, int score) {
handleAddRequest(request, score, SerialNumber.NONE);
}
/**
* Add a NetworkRequest that the bearer may want to attempt to satisfy.
* @see #CMD_REQUEST_NETWORK
*
* @param request the request to handle.
* @param score the score of the NetworkAgent currently satisfying this request.
* @param servingFactorySerialNumber the serial number of the NetworkFactory that
* created the NetworkAgent currently satisfying this request.
*/
@VisibleForTesting
protected void handleAddRequest(NetworkRequest request, int score,
int servingFactorySerialNumber) {
NetworkRequestInfo n = mNetworkRequests.get(request.requestId);
if (n == null) {
if (DBG) log("got request " + request + " with score " + score);
n = new NetworkRequestInfo(request, score);
if (DBG) {
log("got request " + request + " with score " + score
+ " and serial " + servingFactorySerialNumber);
}
n = new NetworkRequestInfo(request, score, servingFactorySerialNumber);
mNetworkRequests.put(n.request.requestId, n);
} else {
if (VDBG) log("new score " + score + " for exisiting request " + request);
if (VDBG) {
log("new score " + score + " for exisiting request " + request
+ " with serial " + servingFactorySerialNumber);
}
n.score = score;
n.factorySerialNumber = servingFactorySerialNumber;
}
if (VDBG) log(" my score=" + mScore + ", my filter=" + mCapabilityFilter);
@@ -272,16 +328,19 @@ public class NetworkFactory extends Handler {
}
private void evalRequest(NetworkRequestInfo n) {
if (VDBG) log("evalRequest");
if (n.requested == false && n.score < mScore &&
n.request.networkCapabilities.satisfiedByNetworkCapabilities(
mCapabilityFilter) && acceptRequest(n.request, n.score)) {
if (VDBG) {
log("evalRequest");
log(" n.requests = " + n.requested);
log(" n.score = " + n.score);
log(" mScore = " + mScore);
log(" n.factorySerialNumber = " + n.factorySerialNumber);
log(" mSerialNumber = " + mSerialNumber);
}
if (shouldNeedNetworkFor(n)) {
if (VDBG) log(" needNetworkFor");
needNetworkFor(n.request, n.score);
n.requested = true;
} else if (n.requested == true &&
(n.score > mScore || n.request.networkCapabilities.satisfiedByNetworkCapabilities(
mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) {
} else if (shouldReleaseNetworkFor(n)) {
if (VDBG) log(" releaseNetworkFor");
releaseNetworkFor(n.request);
n.requested = false;
@@ -290,10 +349,39 @@ public class NetworkFactory extends Handler {
}
}
private boolean shouldNeedNetworkFor(NetworkRequestInfo n) {
// If this request is already tracked, it doesn't qualify for need
return !n.requested
// If the score of this request is higher or equal to that of this factory and some
// other factory is responsible for it, then this factory should not track the request
// because it has no hope of satisfying it.
&& (n.score < mScore || n.factorySerialNumber == mSerialNumber)
// If this factory can't satisfy the capability needs of this request, then it
// should not be tracked.
&& n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter)
// Finally if the concrete implementation of the factory rejects the request, then
// don't track it.
&& acceptRequest(n.request, n.score);
}
private boolean shouldReleaseNetworkFor(NetworkRequestInfo n) {
// Don't release a request that's not tracked.
return n.requested
// The request should be released if it can't be satisfied by this factory. That
// means either of the following conditions are met :
// - Its score is too high to be satisfied by this factory and it's not already
// assigned to the factory
// - This factory can't satisfy the capability needs of the request
// - The concrete implementation of the factory rejects the request
&& ((n.score > mScore && n.factorySerialNumber != mSerialNumber)
|| !n.request.networkCapabilities.satisfiedByNetworkCapabilities(
mCapabilityFilter)
|| !acceptRequest(n.request, n.score));
}
private void evalRequests() {
for (int i = 0; i < mNetworkRequests.size(); i++) {
NetworkRequestInfo n = mNetworkRequests.valueAt(i);
evalRequest(n);
}
}
@@ -342,16 +430,6 @@ public class NetworkFactory extends Handler {
if (--mRefCount == 0) stopNetwork();
}
public void addNetworkRequest(NetworkRequest networkRequest, int score) {
sendMessage(obtainMessage(CMD_REQUEST_NETWORK,
new NetworkRequestInfo(networkRequest, score)));
}
public void removeNetworkRequest(NetworkRequest networkRequest) {
sendMessage(obtainMessage(CMD_CANCEL_REQUEST, networkRequest));
}
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public void setScoreFilter(int score) {
sendMessage(obtainMessage(CMD_SET_SCORE, score, 0));
@@ -366,6 +444,10 @@ public class NetworkFactory extends Handler {
return mNetworkRequests.size();
}
public int getSerialNumber() {
return mSerialNumber;
}
protected void log(String s) {
Log.d(LOG_TAG, s);
}
@@ -383,10 +465,11 @@ public class NetworkFactory extends Handler {
@Override
public String toString() {
StringBuilder sb = new StringBuilder("{").append(LOG_TAG).append(" - ScoreFilter=").
append(mScore).append(", Filter=").append(mCapabilityFilter).append(", requests=").
append(mNetworkRequests.size()).append(", refCount=").append(mRefCount).
append("}");
StringBuilder sb = new StringBuilder("{").append(LOG_TAG).append(" - mSerialNumber=")
.append(mSerialNumber).append(", ScoreFilter=")
.append(mScore).append(", Filter=").append(mCapabilityFilter).append(", requests=")
.append(mNetworkRequests.size()).append(", refCount=").append(mRefCount)
.append("}");
return sb.toString();
}
}