Revert "Second pass tying into dns cache per interface"

This reverts commit b101d01167

Change-Id: If52dffd5100a6b03275da0eabfa05e24c5ecada9
This commit is contained in:
Robert Greenwalt
2013-01-19 00:34:07 +00:00
committed by Android (Google) Code Review
parent b101d01167
commit d3aec30722

View File

@@ -183,7 +183,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
* A per Net list of the PID's that requested access to the net * A per Net list of the PID's that requested access to the net
* used both as a refcount and for per-PID DNS selection * used both as a refcount and for per-PID DNS selection
*/ */
private List<Integer> mNetRequestersPids[]; private List mNetRequestersPids[];
// priority order of the nettrackers // priority order of the nettrackers
// (excluding dynamically set mNetworkPreference) // (excluding dynamically set mNetworkPreference)
@@ -200,6 +200,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private int mDefaultConnectionSequence = 0; private int mDefaultConnectionSequence = 0;
private Object mDnsLock = new Object(); private Object mDnsLock = new Object();
private int mNumDnsEntries;
private boolean mDnsOverridden = false; private boolean mDnsOverridden = false;
private boolean mTestMode; private boolean mTestMode;
@@ -507,14 +508,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
} }
mNetRequestersPids = mNetRequestersPids = new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1];
(List<Integer> [])new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1];
for (int i : mPriorityList) { for (int i : mPriorityList) {
mNetRequestersPids[i] = new ArrayList<Integer>(); mNetRequestersPids[i] = new ArrayList();
} }
mFeatureUsers = new ArrayList<FeatureUser>(); mFeatureUsers = new ArrayList<FeatureUser>();
mNumDnsEntries = 0;
mTestMode = SystemProperties.get("cm.test.mode").equals("true") mTestMode = SystemProperties.get("cm.test.mode").equals("true")
&& SystemProperties.get("ro.build.type").equals("eng"); && SystemProperties.get("ro.build.type").equals("eng");
@@ -1315,7 +1317,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
Integer currentPid = new Integer(pid); Integer currentPid = new Integer(pid);
mNetRequestersPids[usedNetworkType].remove(currentPid); mNetRequestersPids[usedNetworkType].remove(currentPid);
reassessPidDns(pid, true); reassessPidDns(pid, true);
flushVmDnsCache();
if (mNetRequestersPids[usedNetworkType].size() != 0) { if (mNetRequestersPids[usedNetworkType].size() != 0) {
if (VDBG) { if (VDBG) {
log("stopUsingNetworkFeature: net " + networkType + ": " + feature + log("stopUsingNetworkFeature: net " + networkType + ": " + feature +
@@ -1697,8 +1698,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
* in accordance with network preference policies. * in accordance with network preference policies.
*/ */
if (!mNetConfigs[prevNetType].isDefault()) { if (!mNetConfigs[prevNetType].isDefault()) {
List<Integer> pids = mNetRequestersPids[prevNetType]; List pids = mNetRequestersPids[prevNetType];
for (Integer pid : pids) { for (int i = 0; i<pids.size(); i++) {
Integer pid = (Integer)pids.get(i);
// will remove them because the net's no longer connected // will remove them because the net's no longer connected
// need to do this now as only now do we know the pids and // need to do this now as only now do we know the pids and
// can properly null things that are no longer referenced. // can properly null things that are no longer referenced.
@@ -2248,7 +2250,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
} }
if (resetDns) { if (resetDns) {
flushVmDnsCache();
if (VDBG) log("resetting DNS cache for " + iface); if (VDBG) log("resetting DNS cache for " + iface);
try { try {
mNetd.flushInterfaceDnsCache(iface); mNetd.flushInterfaceDnsCache(iface);
@@ -2415,10 +2416,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
* on the highest priority active net which this process requested. * on the highest priority active net which this process requested.
* If there aren't any, clear it out * If there aren't any, clear it out
*/ */
private void reassessPidDns(int pid, boolean doBump) private void reassessPidDns(int myPid, boolean doBump)
{ {
if (VDBG) log("reassessPidDns for pid " + pid); if (VDBG) log("reassessPidDns for pid " + myPid);
Integer myPid = new Integer(pid);
for(int i : mPriorityList) { for(int i : mPriorityList) {
if (mNetConfigs[i].isDefault()) { if (mNetConfigs[i].isDefault()) {
continue; continue;
@@ -2428,25 +2428,61 @@ public class ConnectivityService extends IConnectivityManager.Stub {
!nt.isTeardownRequested()) { !nt.isTeardownRequested()) {
LinkProperties p = nt.getLinkProperties(); LinkProperties p = nt.getLinkProperties();
if (p == null) continue; if (p == null) continue;
if (mNetRequestersPids[i].contains(myPid)) { List pids = mNetRequestersPids[i];
try { for (int j=0; j<pids.size(); j++) {
mNetd.setDnsIfaceForPid(p.getInterfaceName(), pid); Integer pid = (Integer)pids.get(j);
} catch (Exception e) { if (pid.intValue() == myPid) {
Slog.e(TAG, "exception reasseses pid dns: " + e); Collection<InetAddress> dnses = p.getDnses();
writePidDns(dnses, myPid);
if (doBump) {
bumpDns();
} }
return; return;
} }
} }
} }
}
// nothing found - delete // nothing found - delete
try { for (int i = 1; ; i++) {
mNetd.clearDnsIfaceForPid(pid); String prop = "net.dns" + i + "." + myPid;
} catch (Exception e) { if (SystemProperties.get(prop).length() == 0) {
Slog.e(TAG, "exception clear interface from pid: " + e); if (doBump) {
bumpDns();
}
return;
}
SystemProperties.set(prop, "");
} }
} }
private void flushVmDnsCache() { // return true if results in a change
private boolean writePidDns(Collection <InetAddress> dnses, int pid) {
int j = 1;
boolean changed = false;
for (InetAddress dns : dnses) {
String dnsString = dns.getHostAddress();
if (changed || !dnsString.equals(SystemProperties.get("net.dns" + j + "." + pid))) {
changed = true;
SystemProperties.set("net.dns" + j + "." + pid, dns.getHostAddress());
}
j++;
}
return changed;
}
private void bumpDns() {
/*
* Bump the property that tells the name resolver library to reread
* the DNS server list from the properties.
*/
String propVal = SystemProperties.get("net.dnschange");
int n = 0;
if (propVal.length() != 0) {
try {
n = Integer.parseInt(propVal);
} catch (NumberFormatException e) {}
}
SystemProperties.set("net.dnschange", "" + (n+1));
/* /*
* Tell the VMs to toss their DNS caches * Tell the VMs to toss their DNS caches
*/ */
@@ -2465,17 +2501,48 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
// Caller must grab mDnsLock. // Caller must grab mDnsLock.
private void updateDns(String network, String iface, private boolean updateDns(String network, String iface,
Collection<InetAddress> dnses, String domains) { Collection<InetAddress> dnses, String domains) {
boolean changed = false;
int last = 0; int last = 0;
if (dnses.size() == 0 && mDefaultDns != null) { if (dnses.size() == 0 && mDefaultDns != null) {
dnses = new ArrayList(); ++last;
dnses.add(mDefaultDns); String value = mDefaultDns.getHostAddress();
if (!value.equals(SystemProperties.get("net.dns1"))) {
if (DBG) { if (DBG) {
loge("no dns provided for " + network + " - using " + mDefaultDns.getHostAddress()); loge("no dns provided for " + network + " - using " + value);
} }
changed = true;
SystemProperties.set("net.dns1", value);
}
} else {
for (InetAddress dns : dnses) {
++last;
String key = "net.dns" + last;
String value = dns.getHostAddress();
if (!changed && value.equals(SystemProperties.get(key))) {
continue;
}
if (VDBG) {
log("adding dns " + value + " for " + network);
}
changed = true;
SystemProperties.set(key, value);
}
}
for (int i = last + 1; i <= mNumDnsEntries; ++i) {
String key = "net.dns" + i;
if (VDBG) log("erasing " + key);
changed = true;
SystemProperties.set(key, "");
}
mNumDnsEntries = last;
if (SystemProperties.get("net.dns.search").equals(domains) == false) {
SystemProperties.set("net.dns.search", domains);
changed = true;
} }
if (changed) {
try { try {
mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses), domains); mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses), domains);
mNetd.setDefaultInterfaceForDns(iface); mNetd.setDefaultInterfaceForDns(iface);
@@ -2483,6 +2550,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (DBG) loge("exception setting default dns interface: " + e); if (DBG) loge("exception setting default dns interface: " + e);
} }
} }
return changed;
}
private void handleDnsConfigurationChange(int netType) { private void handleDnsConfigurationChange(int netType) {
// add default net's dns entries // add default net's dns entries
@@ -2491,11 +2560,12 @@ public class ConnectivityService extends IConnectivityManager.Stub {
LinkProperties p = nt.getLinkProperties(); LinkProperties p = nt.getLinkProperties();
if (p == null) return; if (p == null) return;
Collection<InetAddress> dnses = p.getDnses(); Collection<InetAddress> dnses = p.getDnses();
boolean changed = false;
if (mNetConfigs[netType].isDefault()) { if (mNetConfigs[netType].isDefault()) {
String network = nt.getNetworkInfo().getTypeName(); String network = nt.getNetworkInfo().getTypeName();
synchronized (mDnsLock) { synchronized (mDnsLock) {
if (!mDnsOverridden) { if (!mDnsOverridden) {
updateDns(network, p.getInterfaceName(), dnses, p.getDomains()); changed = updateDns(network, p.getInterfaceName(), dnses, p.getDomains());
} }
} }
} else { } else {
@@ -2506,16 +2576,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (DBG) loge("exception setting dns servers: " + e); if (DBG) loge("exception setting dns servers: " + e);
} }
// set per-pid dns for attached secondary nets // set per-pid dns for attached secondary nets
List<Integer> pids = mNetRequestersPids[netType]; List pids = mNetRequestersPids[netType];
for (Integer pid : pids) { for (int y=0; y< pids.size(); y++) {
try { Integer pid = (Integer)pids.get(y);
mNetd.setDnsIfaceForPid(p.getInterfaceName(), pid); changed = writePidDns(dnses, pid.intValue());
} catch (Exception e) {
Slog.e(TAG, "exception setting interface for pid: " + e);
} }
} }
} if (changed) bumpDns();
flushVmDnsCache();
} }
} }
@@ -2574,7 +2641,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
pw.increaseIndent(); pw.increaseIndent();
for (int net : mPriorityList) { for (int net : mPriorityList) {
String pidString = net + ": "; String pidString = net + ": ";
for (Integer pid : mNetRequestersPids[net]) { for (Object pid : mNetRequestersPids[net]) {
pidString = pidString + pid.toString() + ", "; pidString = pidString + pid.toString() + ", ";
} }
pw.println(pidString); pw.println(pidString);
@@ -3284,10 +3351,14 @@ public class ConnectivityService extends IConnectivityManager.Stub {
String domains = buffer.toString().trim(); String domains = buffer.toString().trim();
// Apply DNS changes. // Apply DNS changes.
boolean changed = false;
synchronized (mDnsLock) { synchronized (mDnsLock) {
updateDns("VPN", "VPN", addresses, domains); changed = updateDns("VPN", "VPN", addresses, domains);
mDnsOverridden = true; mDnsOverridden = true;
} }
if (changed) {
bumpDns();
}
// Temporarily disable the default proxy. // Temporarily disable the default proxy.
synchronized (mDefaultProxyLock) { synchronized (mDefaultProxyLock) {