Tell the factory it is already serving a request.
This is a cherry-pick of ag/607226 that has been rebased on top of four years of changes and with comments addressed. Gives each factory a serial number and propagates it to every NetworkAgent so when a score comes back indicating a request is being handled the factory can account for it properly. Without this, a new request that's already handled by a network offered by a factory will not cause an increment of the factorys ref count. Concretely this results in issues like the RAT icon not being displayed in spite of the network actually being up and usable. This will be ported to AOSP as soon as possible, but immediately some master-only WiFi tests need to be adjusted with this change which would not let me submit to AOSP. Bug: 18637384 Bug: 29030667 Test: manual Test: atest frameworks/opt/telephony/tests/telephonytests Test: atest frameworks-net Test: atest CtsNetTestCases CtsHostsideNetworkTests Change-Id: I597ac588f76dd507512ff02868fd1310b7e63f7e Merged-In: I597ac588f76dd507512ff02868fd1310b7e63f7e
This commit is contained in:
@@ -84,6 +84,7 @@ import android.net.Network;
|
||||
import android.net.NetworkAgent;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkConfig;
|
||||
import android.net.NetworkFactory;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.NetworkInfo.DetailedState;
|
||||
import android.net.NetworkMisc;
|
||||
@@ -2892,8 +2893,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
|
||||
if (nri.request.isListen()) continue;
|
||||
NetworkAgentInfo nai = getNetworkForRequest(nri.request.requestId);
|
||||
ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK,
|
||||
(nai != null ? nai.getCurrentScore() : 0), 0, nri.request);
|
||||
final int score;
|
||||
final int serial;
|
||||
if (nai != null) {
|
||||
score = nai.getCurrentScore();
|
||||
serial = nai.factorySerialNumber;
|
||||
} else {
|
||||
score = 0;
|
||||
serial = NetworkFactory.SerialNumber.NONE;
|
||||
}
|
||||
ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, serial,
|
||||
nri.request);
|
||||
}
|
||||
} else {
|
||||
loge("Error connecting NetworkFactory");
|
||||
@@ -2991,7 +3001,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
NetworkAgentInfo currentNetwork = getNetworkForRequest(request.requestId);
|
||||
if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) {
|
||||
clearNetworkForRequest(request.requestId);
|
||||
sendUpdatedScoreToFactories(request, 0);
|
||||
sendUpdatedScoreToFactories(request, null);
|
||||
}
|
||||
}
|
||||
nai.clearLingerState();
|
||||
@@ -3068,7 +3078,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
rematchAllNetworksAndRequests(null, 0);
|
||||
if (nri.request.isRequest() && getNetworkForRequest(nri.request.requestId) == null) {
|
||||
sendUpdatedScoreToFactories(nri.request, 0);
|
||||
sendUpdatedScoreToFactories(nri.request, null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4843,11 +4853,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
public final String name;
|
||||
public final Messenger messenger;
|
||||
public final AsyncChannel asyncChannel;
|
||||
public final int factorySerialNumber;
|
||||
|
||||
public NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel) {
|
||||
NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel,
|
||||
int factorySerialNumber) {
|
||||
this.name = name;
|
||||
this.messenger = messenger;
|
||||
this.asyncChannel = asyncChannel;
|
||||
this.factorySerialNumber = factorySerialNumber;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5208,10 +5221,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerNetworkFactory(Messenger messenger, String name) {
|
||||
public int registerNetworkFactory(Messenger messenger, String name) {
|
||||
enforceConnectivityInternalPermission();
|
||||
NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel());
|
||||
NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(),
|
||||
NetworkFactory.SerialNumber.nextSerialNumber());
|
||||
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
|
||||
return nfi.factorySerialNumber;
|
||||
}
|
||||
|
||||
private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) {
|
||||
@@ -5316,9 +5331,35 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
return nri.request.requestId == mDefaultRequest.requestId;
|
||||
}
|
||||
|
||||
// TODO : remove this method. It's a stopgap measure to help sheperding a number of dependent
|
||||
// changes that would conflict throughout the automerger graph. Having this method temporarily
|
||||
// helps with the process of going through with all these dependent changes across the entire
|
||||
// tree.
|
||||
public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
|
||||
LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
|
||||
int currentScore, NetworkMisc networkMisc) {
|
||||
return registerNetworkAgent(messenger, networkInfo, linkProperties, networkCapabilities,
|
||||
currentScore, networkMisc, NetworkFactory.SerialNumber.NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new agent with ConnectivityService to handle a network.
|
||||
*
|
||||
* @param messenger a messenger for ConnectivityService to contact the agent asynchronously.
|
||||
* @param networkInfo the initial info associated with this network. It can be updated later :
|
||||
* see {@link #updateNetworkInfo}.
|
||||
* @param linkProperties the initial link properties of this network. They can be updated
|
||||
* later : see {@link #updateLinkProperties}.
|
||||
* @param networkCapabilities the initial capabilites of this network. They can be updated
|
||||
* later : see {@link #updateNetworkCapabilities}.
|
||||
* @param currentScore the initial score of the network. See
|
||||
* {@link NetworkAgentInfo#getCurrentScore}.
|
||||
* @param networkMisc metadata about the network. This is never updated.
|
||||
* @param factorySerialNumber the serial number of the factory owning this NetworkAgent.
|
||||
*/
|
||||
public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
|
||||
LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
|
||||
int currentScore, NetworkMisc networkMisc, int factorySerialNumber) {
|
||||
enforceConnectivityInternalPermission();
|
||||
|
||||
LinkProperties lp = new LinkProperties(linkProperties);
|
||||
@@ -5328,7 +5369,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
|
||||
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
|
||||
new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore,
|
||||
mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS);
|
||||
mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS,
|
||||
factorySerialNumber);
|
||||
// Make sure the network capabilities reflect what the agent info says.
|
||||
nai.networkCapabilities = mixInCapabilities(nai, nc);
|
||||
final String extraInfo = networkInfo.getExtraInfo();
|
||||
@@ -5755,17 +5797,23 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
NetworkRequest nr = nai.requestAt(i);
|
||||
// Don't send listening requests to factories. b/17393458
|
||||
if (nr.isListen()) continue;
|
||||
sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
|
||||
sendUpdatedScoreToFactories(nr, nai);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
|
||||
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, NetworkAgentInfo nai) {
|
||||
int score = 0;
|
||||
int serial = 0;
|
||||
if (nai != null) {
|
||||
score = nai.getCurrentScore();
|
||||
serial = nai.factorySerialNumber;
|
||||
}
|
||||
if (VDBG || DDBG){
|
||||
log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
|
||||
}
|
||||
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
|
||||
nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0,
|
||||
networkRequest);
|
||||
nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score,
|
||||
serial, networkRequest);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6043,7 +6091,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
// TODO - this could get expensive if we have a lot of requests for this
|
||||
// network. Think about if there is a way to reduce this. Push
|
||||
// netid->request mapping to each factory?
|
||||
sendUpdatedScoreToFactories(nri.request, score);
|
||||
sendUpdatedScoreToFactories(nri.request, newNetwork);
|
||||
if (isDefaultRequest(nri)) {
|
||||
isNewDefault = true;
|
||||
oldDefaultNetwork = currentNetwork;
|
||||
@@ -6067,7 +6115,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
newNetwork.removeRequest(nri.request.requestId);
|
||||
if (currentNetwork == newNetwork) {
|
||||
clearNetworkForRequest(nri.request.requestId);
|
||||
sendUpdatedScoreToFactories(nri.request, 0);
|
||||
sendUpdatedScoreToFactories(nri.request, null);
|
||||
} else {
|
||||
Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " +
|
||||
newNetwork.name() +
|
||||
|
||||
@@ -238,6 +238,8 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
||||
public final Messenger messenger;
|
||||
public final AsyncChannel asyncChannel;
|
||||
|
||||
public final int factorySerialNumber;
|
||||
|
||||
// Used by ConnectivityService to keep track of 464xlat.
|
||||
public final Nat464Xlat clatd;
|
||||
|
||||
@@ -253,7 +255,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
||||
public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
|
||||
LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
|
||||
NetworkMisc misc, ConnectivityService connService, INetd netd,
|
||||
INetworkManagementService nms) {
|
||||
INetworkManagementService nms, int factorySerialNumber) {
|
||||
this.messenger = messenger;
|
||||
asyncChannel = ac;
|
||||
network = net;
|
||||
@@ -266,6 +268,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
||||
mContext = context;
|
||||
mHandler = handler;
|
||||
networkMisc = misc;
|
||||
this.factorySerialNumber = factorySerialNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user