Loading services/java/com/android/server/ConnectivityService.java +113 −36 Original line number Diff line number Diff line Loading @@ -155,7 +155,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { private boolean mInetConditionChangeInFlight = false; private int mDefaultConnectionSequence = 0; private Object mDnsLock = new Object(); private int mNumDnsEntries; private boolean mDnsOverridden = false; private boolean mTestMode; private static ConnectivityService sServiceInstance; Loading Loading @@ -244,6 +246,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { private static final int EVENT_SET_DEPENDENCY_MET = MAX_NETWORK_STATE_TRACKER_EVENT + 10; /** * used internally to restore DNS properties back to the * default network */ private static final int EVENT_RESTORE_DNS = MAX_NETWORK_STATE_TRACKER_EVENT + 11; private Handler mHandler; // list of DeathRecipients used to make sure features are turned off when Loading Loading @@ -1890,49 +1899,65 @@ public class ConnectivityService extends IConnectivityManager.Stub { mContext.sendBroadcast(intent); } private void handleDnsConfigurationChange(int netType) { // add default net's dns entries NetworkStateTracker nt = mNetTrackers[netType]; if (nt != null && nt.getNetworkInfo().isConnected() && !nt.isTeardownRequested()) { LinkProperties p = nt.getLinkProperties(); if (p == null) return; Collection<InetAddress> dnses = p.getDnses(); // Caller must grab mDnsLock. private boolean updateDns(String network, Collection<InetAddress> dnses, String domains) { boolean changed = false; if (mNetConfigs[netType].isDefault()) { int j = 1; int last = 0; if (dnses.size() == 0 && mDefaultDns != null) { String dnsString = mDefaultDns.getHostAddress(); if (!dnsString.equals(SystemProperties.get("net.dns1"))) { ++last; String value = mDefaultDns.getHostAddress(); if (!value.equals(SystemProperties.get("net.dns1"))) { if (DBG) { log("no dns provided - using " + dnsString); log("no dns provided for " + network + " - using " + value); } changed = true; SystemProperties.set("net.dns1", dnsString); SystemProperties.set("net.dns1", value); } j++; } else { for (InetAddress dns : dnses) { String dnsString = dns.getHostAddress(); if (!changed && dnsString.equals(SystemProperties.get("net.dns" + j))) { j++; ++last; String key = "net.dns" + last; String value = dns.getHostAddress(); if (!changed && value.equals(SystemProperties.get(key))) { continue; } if (DBG) { log("adding dns " + dns + " for " + nt.getNetworkInfo().getTypeName()); log("adding dns " + value + " for " + network); } changed = true; SystemProperties.set("net.dns" + j++, dnsString); SystemProperties.set(key, value); } } for (int k=j ; k<mNumDnsEntries; k++) { if (changed || !TextUtils.isEmpty(SystemProperties.get("net.dns" + k))) { if (DBG) log("erasing net.dns" + k); for (int i = last + 1; i <= mNumDnsEntries; ++i) { String key = "net.dns" + i; if (DBG) log("erasing " + key); changed = true; SystemProperties.set("net.dns" + k, ""); SystemProperties.set(key, ""); } mNumDnsEntries = last; if (!domains.equals(SystemProperties.get("net.dns.search"))) { SystemProperties.set("net.dns.search", domains); changed = true; } return changed; } private void handleDnsConfigurationChange(int netType) { // add default net's dns entries NetworkStateTracker nt = mNetTrackers[netType]; if (nt != null && nt.getNetworkInfo().isConnected() && !nt.isTeardownRequested()) { LinkProperties p = nt.getLinkProperties(); if (p == null) return; Collection<InetAddress> dnses = p.getDnses(); boolean changed = false; if (mNetConfigs[netType].isDefault()) { String network = nt.getNetworkInfo().getTypeName(); synchronized (mDnsLock) { if (!mDnsOverridden) { changed = updateDns(network, dnses, ""); } } mNumDnsEntries = j; } else { // set per-pid dns for attached secondary nets List pids = mNetRequestersPids[netType]; Loading Loading @@ -2139,6 +2164,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { handleSetDependencyMet(msg.arg2, met); break; } case EVENT_RESTORE_DNS: { if (mActiveDefaultNetwork != -1) { handleDnsConfigurationChange(mActiveDefaultNetwork); } break; } } } } Loading Loading @@ -2586,12 +2618,57 @@ public class ConnectivityService extends IConnectivityManager.Stub { private VpnCallback() { } public synchronized void override(List<String> dnsServers, List<String> searchDomains) { // TODO: override DNS servers and http proxy. public void override(List<String> dnsServers, List<String> searchDomains) { if (dnsServers == null) { restore(); return; } // Convert DNS servers into addresses. List<InetAddress> addresses = new ArrayList<InetAddress>(); for (String address : dnsServers) { // Double check the addresses and remove invalid ones. try { addresses.add(InetAddress.parseNumericAddress(address)); } catch (Exception e) { // ignore } } if (addresses.isEmpty()) { restore(); return; } // Concatenate search domains into a string. StringBuilder buffer = new StringBuilder(); if (searchDomains != null) { for (String domain : searchDomains) { buffer.append(domain).append(' '); } } String domains = buffer.toString().trim(); // Apply DNS changes. boolean changed = false; synchronized (mDnsLock) { changed = updateDns("VPN", addresses, domains); mDnsOverridden = true; } if (changed) { bumpDns(); } // TODO: temporarily remove http proxy? } public synchronized void restore() { // TODO: restore VPN changes. public void restore() { synchronized (mDnsLock) { if (!mDnsOverridden) { return; } mDnsOverridden = false; } mHandler.sendEmptyMessage(EVENT_RESTORE_DNS); } } } Loading
services/java/com/android/server/ConnectivityService.java +113 −36 Original line number Diff line number Diff line Loading @@ -155,7 +155,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { private boolean mInetConditionChangeInFlight = false; private int mDefaultConnectionSequence = 0; private Object mDnsLock = new Object(); private int mNumDnsEntries; private boolean mDnsOverridden = false; private boolean mTestMode; private static ConnectivityService sServiceInstance; Loading Loading @@ -244,6 +246,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { private static final int EVENT_SET_DEPENDENCY_MET = MAX_NETWORK_STATE_TRACKER_EVENT + 10; /** * used internally to restore DNS properties back to the * default network */ private static final int EVENT_RESTORE_DNS = MAX_NETWORK_STATE_TRACKER_EVENT + 11; private Handler mHandler; // list of DeathRecipients used to make sure features are turned off when Loading Loading @@ -1890,49 +1899,65 @@ public class ConnectivityService extends IConnectivityManager.Stub { mContext.sendBroadcast(intent); } private void handleDnsConfigurationChange(int netType) { // add default net's dns entries NetworkStateTracker nt = mNetTrackers[netType]; if (nt != null && nt.getNetworkInfo().isConnected() && !nt.isTeardownRequested()) { LinkProperties p = nt.getLinkProperties(); if (p == null) return; Collection<InetAddress> dnses = p.getDnses(); // Caller must grab mDnsLock. private boolean updateDns(String network, Collection<InetAddress> dnses, String domains) { boolean changed = false; if (mNetConfigs[netType].isDefault()) { int j = 1; int last = 0; if (dnses.size() == 0 && mDefaultDns != null) { String dnsString = mDefaultDns.getHostAddress(); if (!dnsString.equals(SystemProperties.get("net.dns1"))) { ++last; String value = mDefaultDns.getHostAddress(); if (!value.equals(SystemProperties.get("net.dns1"))) { if (DBG) { log("no dns provided - using " + dnsString); log("no dns provided for " + network + " - using " + value); } changed = true; SystemProperties.set("net.dns1", dnsString); SystemProperties.set("net.dns1", value); } j++; } else { for (InetAddress dns : dnses) { String dnsString = dns.getHostAddress(); if (!changed && dnsString.equals(SystemProperties.get("net.dns" + j))) { j++; ++last; String key = "net.dns" + last; String value = dns.getHostAddress(); if (!changed && value.equals(SystemProperties.get(key))) { continue; } if (DBG) { log("adding dns " + dns + " for " + nt.getNetworkInfo().getTypeName()); log("adding dns " + value + " for " + network); } changed = true; SystemProperties.set("net.dns" + j++, dnsString); SystemProperties.set(key, value); } } for (int k=j ; k<mNumDnsEntries; k++) { if (changed || !TextUtils.isEmpty(SystemProperties.get("net.dns" + k))) { if (DBG) log("erasing net.dns" + k); for (int i = last + 1; i <= mNumDnsEntries; ++i) { String key = "net.dns" + i; if (DBG) log("erasing " + key); changed = true; SystemProperties.set("net.dns" + k, ""); SystemProperties.set(key, ""); } mNumDnsEntries = last; if (!domains.equals(SystemProperties.get("net.dns.search"))) { SystemProperties.set("net.dns.search", domains); changed = true; } return changed; } private void handleDnsConfigurationChange(int netType) { // add default net's dns entries NetworkStateTracker nt = mNetTrackers[netType]; if (nt != null && nt.getNetworkInfo().isConnected() && !nt.isTeardownRequested()) { LinkProperties p = nt.getLinkProperties(); if (p == null) return; Collection<InetAddress> dnses = p.getDnses(); boolean changed = false; if (mNetConfigs[netType].isDefault()) { String network = nt.getNetworkInfo().getTypeName(); synchronized (mDnsLock) { if (!mDnsOverridden) { changed = updateDns(network, dnses, ""); } } mNumDnsEntries = j; } else { // set per-pid dns for attached secondary nets List pids = mNetRequestersPids[netType]; Loading Loading @@ -2139,6 +2164,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { handleSetDependencyMet(msg.arg2, met); break; } case EVENT_RESTORE_DNS: { if (mActiveDefaultNetwork != -1) { handleDnsConfigurationChange(mActiveDefaultNetwork); } break; } } } } Loading Loading @@ -2586,12 +2618,57 @@ public class ConnectivityService extends IConnectivityManager.Stub { private VpnCallback() { } public synchronized void override(List<String> dnsServers, List<String> searchDomains) { // TODO: override DNS servers and http proxy. public void override(List<String> dnsServers, List<String> searchDomains) { if (dnsServers == null) { restore(); return; } // Convert DNS servers into addresses. List<InetAddress> addresses = new ArrayList<InetAddress>(); for (String address : dnsServers) { // Double check the addresses and remove invalid ones. try { addresses.add(InetAddress.parseNumericAddress(address)); } catch (Exception e) { // ignore } } if (addresses.isEmpty()) { restore(); return; } // Concatenate search domains into a string. StringBuilder buffer = new StringBuilder(); if (searchDomains != null) { for (String domain : searchDomains) { buffer.append(domain).append(' '); } } String domains = buffer.toString().trim(); // Apply DNS changes. boolean changed = false; synchronized (mDnsLock) { changed = updateDns("VPN", addresses, domains); mDnsOverridden = true; } if (changed) { bumpDns(); } // TODO: temporarily remove http proxy? } public synchronized void restore() { // TODO: restore VPN changes. public void restore() { synchronized (mDnsLock) { if (!mDnsOverridden) { return; } mDnsOverridden = false; } mHandler.sendEmptyMessage(EVENT_RESTORE_DNS); } } }