Merge "Remove listen requests properly." into lmp-dev

This commit is contained in:
Robert Greenwalt
2014-08-25 23:12:45 +00:00
committed by Android (Google) Code Review

View File

@@ -2167,41 +2167,53 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (DBG) log("releasing NetworkRequest " + request); if (DBG) log("releasing NetworkRequest " + request);
nri.unlinkDeathRecipient(); nri.unlinkDeathRecipient();
mNetworkRequests.remove(request); mNetworkRequests.remove(request);
// tell the network currently servicing this that it's no longer interested
NetworkAgentInfo affectedNetwork = mNetworkForRequestId.get(nri.request.requestId);
if (affectedNetwork != null) {
mNetworkForRequestId.remove(nri.request.requestId);
affectedNetwork.networkRequests.remove(nri.request.requestId);
if (VDBG) {
log(" Removing from current network " + affectedNetwork.name() + ", leaving " +
affectedNetwork.networkRequests.size() + " requests.");
}
if (nri.isRequest && nri.request.legacyType != TYPE_NONE) {
mLegacyTypeTracker.remove(nri.request.legacyType, affectedNetwork);
}
}
if (nri.isRequest) { if (nri.isRequest) {
// Find all networks that are satisfying this request and remove the request
// from their request lists.
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
if (nai.networkRequests.get(nri.request.requestId) != null) {
nai.networkRequests.remove(nri.request.requestId);
if (VDBG) {
log(" Removing from current network " + nai.name() +
", leaving " + nai.networkRequests.size() +
" requests.");
}
// check if has any requests remaining and if not,
// disconnect (unless it's a VPN).
boolean keep = nai.isVPN();
for (int i = 0; i < nai.networkRequests.size() && !keep; i++) {
NetworkRequest r = nai.networkRequests.valueAt(i);
if (mNetworkRequests.get(r).isRequest) keep = true;
}
if (!keep) {
if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
nai.asyncChannel.disconnect();
}
}
}
// Maintain the illusion. When this request arrived, we might have preteneded
// 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
// phatom 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) {
mLegacyTypeTracker.remove(nri.request.legacyType, nai);
}
}
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_CANCEL_REQUEST, nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_CANCEL_REQUEST,
nri.request); nri.request);
} }
} else {
if (affectedNetwork != null) { // listens don't have a singular affectedNetwork. Check all networks to see
// check if this network still has live requests - otherwise, tear down // if this listen request applies and remove it.
// TODO - probably push this to the NF/NA for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
boolean keep = affectedNetwork.isVPN(); nai.networkRequests.remove(nri.request.requestId);
for (int i = 0; i < affectedNetwork.networkRequests.size() && !keep; i++) {
NetworkRequest r = affectedNetwork.networkRequests.valueAt(i);
if (mNetworkRequests.get(r).isRequest) {
keep = true;
}
}
if (keep == false) {
if (DBG) log("no live requests for " + affectedNetwork.name() +
"; disconnecting");
affectedNetwork.asyncChannel.disconnect();
}
} }
} }
callCallbackForRequest(nri, null, ConnectivityManager.CALLBACK_RELEASED); callCallbackForRequest(nri, null, ConnectivityManager.CALLBACK_RELEASED);