From d3aec30722086bee13cb646669a0e900d6d11a6d Mon Sep 17 00:00:00 2001 From: Robert Greenwalt Date: Sat, 19 Jan 2013 00:34:07 +0000 Subject: [PATCH] Revert "Second pass tying into dns cache per interface" This reverts commit b101d0116714f68a8a95644dcaf120015a6d3b32 Change-Id: If52dffd5100a6b03275da0eabfa05e24c5ecada9 --- .../android/server/ConnectivityService.java | 159 +++++++++++++----- 1 file changed, 115 insertions(+), 44 deletions(-) diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 2ccde3b655..4cfe5d5253 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -183,7 +183,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { * 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 */ - private List mNetRequestersPids[]; + private List mNetRequestersPids[]; // priority order of the nettrackers // (excluding dynamically set mNetworkPreference) @@ -200,6 +200,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { private int mDefaultConnectionSequence = 0; private Object mDnsLock = new Object(); + private int mNumDnsEntries; private boolean mDnsOverridden = false; private boolean mTestMode; @@ -507,14 +508,15 @@ public class ConnectivityService extends IConnectivityManager.Stub { } } - mNetRequestersPids = - (List [])new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1]; + mNetRequestersPids = new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1]; for (int i : mPriorityList) { - mNetRequestersPids[i] = new ArrayList(); + mNetRequestersPids[i] = new ArrayList(); } mFeatureUsers = new ArrayList(); + mNumDnsEntries = 0; + mTestMode = SystemProperties.get("cm.test.mode").equals("true") && SystemProperties.get("ro.build.type").equals("eng"); @@ -1315,7 +1317,6 @@ public class ConnectivityService extends IConnectivityManager.Stub { Integer currentPid = new Integer(pid); mNetRequestersPids[usedNetworkType].remove(currentPid); reassessPidDns(pid, true); - flushVmDnsCache(); if (mNetRequestersPids[usedNetworkType].size() != 0) { if (VDBG) { log("stopUsingNetworkFeature: net " + networkType + ": " + feature + @@ -1697,8 +1698,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { * in accordance with network preference policies. */ if (!mNetConfigs[prevNetType].isDefault()) { - List pids = mNetRequestersPids[prevNetType]; - for (Integer pid : pids) { + List pids = mNetRequestersPids[prevNetType]; + for (int i = 0; i dnses = p.getDnses(); + writePidDns(dnses, myPid); + if (doBump) { + bumpDns(); + } + return; } - return; } } } // nothing found - delete - try { - mNetd.clearDnsIfaceForPid(pid); - } catch (Exception e) { - Slog.e(TAG, "exception clear interface from pid: " + e); + for (int i = 1; ; i++) { + String prop = "net.dns" + i + "." + myPid; + if (SystemProperties.get(prop).length() == 0) { + if (doBump) { + bumpDns(); + } + return; + } + SystemProperties.set(prop, ""); } } - private void flushVmDnsCache() { + // return true if results in a change + private boolean writePidDns(Collection 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 */ @@ -2465,23 +2501,56 @@ public class ConnectivityService extends IConnectivityManager.Stub { } // Caller must grab mDnsLock. - private void updateDns(String network, String iface, + private boolean updateDns(String network, String iface, Collection dnses, String domains) { + boolean changed = false; int last = 0; if (dnses.size() == 0 && mDefaultDns != null) { - dnses = new ArrayList(); - dnses.add(mDefaultDns); - if (DBG) { - loge("no dns provided for " + network + " - using " + mDefaultDns.getHostAddress()); + ++last; + String value = mDefaultDns.getHostAddress(); + if (!value.equals(SystemProperties.get("net.dns1"))) { + if (DBG) { + 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); } } - - try { - mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses), domains); - mNetd.setDefaultInterfaceForDns(iface); - } catch (Exception e) { - if (DBG) loge("exception setting default dns interface: " + e); + 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 { + mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses), domains); + mNetd.setDefaultInterfaceForDns(iface); + } catch (Exception e) { + if (DBG) loge("exception setting default dns interface: " + e); + } + } + return changed; } private void handleDnsConfigurationChange(int netType) { @@ -2491,11 +2560,12 @@ public class ConnectivityService extends IConnectivityManager.Stub { LinkProperties p = nt.getLinkProperties(); if (p == null) return; Collection dnses = p.getDnses(); + boolean changed = false; if (mNetConfigs[netType].isDefault()) { String network = nt.getNetworkInfo().getTypeName(); synchronized (mDnsLock) { if (!mDnsOverridden) { - updateDns(network, p.getInterfaceName(), dnses, p.getDomains()); + changed = updateDns(network, p.getInterfaceName(), dnses, p.getDomains()); } } } else { @@ -2506,16 +2576,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { if (DBG) loge("exception setting dns servers: " + e); } // set per-pid dns for attached secondary nets - List pids = mNetRequestersPids[netType]; - for (Integer pid : pids) { - try { - mNetd.setDnsIfaceForPid(p.getInterfaceName(), pid); - } catch (Exception e) { - Slog.e(TAG, "exception setting interface for pid: " + e); - } + List pids = mNetRequestersPids[netType]; + for (int y=0; y< pids.size(); y++) { + Integer pid = (Integer)pids.get(y); + changed = writePidDns(dnses, pid.intValue()); } } - flushVmDnsCache(); + if (changed) bumpDns(); } } @@ -2574,7 +2641,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { pw.increaseIndent(); for (int net : mPriorityList) { String pidString = net + ": "; - for (Integer pid : mNetRequestersPids[net]) { + for (Object pid : mNetRequestersPids[net]) { pidString = pidString + pid.toString() + ", "; } pw.println(pidString); @@ -3284,10 +3351,14 @@ public class ConnectivityService extends IConnectivityManager.Stub { String domains = buffer.toString().trim(); // Apply DNS changes. + boolean changed = false; synchronized (mDnsLock) { - updateDns("VPN", "VPN", addresses, domains); + changed = updateDns("VPN", "VPN", addresses, domains); mDnsOverridden = true; } + if (changed) { + bumpDns(); + } // Temporarily disable the default proxy. synchronized (mDefaultProxyLock) {