Merge "Support connecting to networks with misconfigured subnet masks." into lmp-mr1-dev
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 61a7073..944f1c0 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -907,7 +907,10 @@
// network is blocked; clone and override state
info = new NetworkInfo(info);
info.setDetailedState(DetailedState.BLOCKED, null, null);
- if (DBG) log("returning Blocked NetworkInfo");
+ if (DBG) {
+ log("returning Blocked NetworkInfo for ifname=" +
+ lp.getInterfaceName() + ", uid=" + uid);
+ }
}
if (info != null && mLockdownTracker != null) {
info = mLockdownTracker.augmentNetworkInfo(info);
@@ -2324,6 +2327,9 @@
if (nri.isRequest) {
// Find all networks that are satisfying this request and remove the request
// from their request lists.
+ // TODO - it's my understanding that for a request there is only a single
+ // network satisfying it, so this loop is wasteful
+ boolean wasKept = false;
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
if (nai.networkRequests.get(nri.request.requestId) != null) {
nai.networkRequests.remove(nri.request.requestId);
@@ -2335,19 +2341,39 @@
if (unneeded(nai)) {
if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
teardownUnneededNetwork(nai);
+ } else {
+ // suspect there should only be one pass through here
+ // but if any were kept do the check below
+ wasKept |= true;
}
}
}
+ NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
+ if (nai != null) {
+ mNetworkForRequestId.remove(nri.request.requestId);
+ }
// Maintain the illusion. When this request arrived, we might have pretended
// that a network connected to serve it, even though the network was already
// connected. Now that this request has gone away, we might have to pretend
// that the network disconnected. LegacyTypeTracker will generate that
// phantom disconnect for this type.
- NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
- if (nai != null) {
- mNetworkForRequestId.remove(nri.request.requestId);
- if (nri.request.legacyType != TYPE_NONE) {
+ if (nri.request.legacyType != TYPE_NONE && nai != null) {
+ boolean doRemove = true;
+ if (wasKept) {
+ // check if any of the remaining requests for this network are for the
+ // same legacy type - if so, don't remove the nai
+ for (int i = 0; i < nai.networkRequests.size(); i++) {
+ NetworkRequest otherRequest = nai.networkRequests.valueAt(i);
+ if (otherRequest.legacyType == nri.request.legacyType &&
+ isRequest(otherRequest)) {
+ if (DBG) log(" still have other legacy request - leaving");
+ doRemove = false;
+ }
+ }
+ }
+
+ if (doRemove) {
mLegacyTypeTracker.remove(nri.request.legacyType, nai);
}
}