Avoid reusing a currently active NetID.
There are only a limited number (65526) of NetIDs so the chance for reusing
one exists. Reusing a currently active NetID will cause problems like netd
failures and overwriting entries in mNetworkForNetId.
bug:16815182
Change-Id: Ib75302beae3179c3f3b90c345cf4d2cf5f4ad2be
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 67c01e5..8354137 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -756,10 +756,20 @@
return mNextNetworkRequestId++;
}
- private synchronized int nextNetId() {
- int netId = mNextNetId;
- if (++mNextNetId > MAX_NET_ID) mNextNetId = MIN_NET_ID;
- return netId;
+ private void assignNextNetId(NetworkAgentInfo nai) {
+ synchronized (mNetworkForNetId) {
+ for (int i = MIN_NET_ID; i <= MAX_NET_ID; i++) {
+ int netId = mNextNetId;
+ if (++mNextNetId > MAX_NET_ID) mNextNetId = MIN_NET_ID;
+ // Make sure NetID unused. http://b/16815182
+ if (mNetworkForNetId.get(netId) == null) {
+ nai.network = new Network(netId);
+ mNetworkForNetId.put(netId, nai);
+ return;
+ }
+ }
+ }
+ throw new IllegalStateException("No free netIds");
}
private int getConnectivityChangeDelay() {
@@ -4104,7 +4114,7 @@
int currentScore, NetworkMisc networkMisc) {
enforceConnectivityInternalPermission();
- NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), nextNetId(),
+ NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
new NetworkInfo(networkInfo), new LinkProperties(linkProperties),
new NetworkCapabilities(networkCapabilities), currentScore, mContext, mTrackerHandler,
networkMisc);
@@ -4118,9 +4128,7 @@
private void handleRegisterNetworkAgent(NetworkAgentInfo na) {
if (VDBG) log("Got NetworkAgent Messenger");
mNetworkAgentInfos.put(na.messenger, na);
- synchronized (mNetworkForNetId) {
- mNetworkForNetId.put(na.network.netId, na);
- }
+ assignNextNetId(na);
na.asyncChannel.connect(mContext, mTrackerHandler, na.messenger);
NetworkInfo networkInfo = na.networkInfo;
na.networkInfo = null;
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index 4eb2ef1..5a97aee 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -40,7 +40,7 @@
*/
public class NetworkAgentInfo {
public NetworkInfo networkInfo;
- public final Network network;
+ public Network network;
public LinkProperties linkProperties;
public NetworkCapabilities networkCapabilities;
public int currentScore;
@@ -55,12 +55,12 @@
public final Messenger messenger;
public final AsyncChannel asyncChannel;
- public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, int netId, NetworkInfo info,
+ public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, NetworkInfo info,
LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
NetworkMisc misc) {
this.messenger = messenger;
asyncChannel = ac;
- network = new Network(netId);
+ network = null;
networkInfo = info;
linkProperties = lp;
networkCapabilities = nc;
@@ -87,6 +87,7 @@
public String name() {
return "NetworkAgentInfo [" + networkInfo.getTypeName() + " (" +
- networkInfo.getSubtypeName() + ") - " + network.toString() + "]";
+ networkInfo.getSubtypeName() + ") - " +
+ (network == null ? "null" : network.toString()) + "]";
}
}