From b988890b21252ad524f303c3e8f0bc5dcbab2a13 Mon Sep 17 00:00:00 2001 From: Erik Kline Date: Tue, 5 Apr 2016 13:30:49 +0900 Subject: [PATCH] Don't flush DNS cache on route changes. Since Lollipop, routes are isolated within Networks. Flushing a Network's DNS cache whenever that same Network's routes are updated doesn't provide any benefit. Any system components depending on this behaviour need to uncovered and fixed. Additionally, clean up no-longer-used flushNetworkDnsCache(). This should be replaced, when needed, by a proper binder interface to netd. Change-Id: I34bf79e4839da014d466058a876d754209d0c007 --- .../android/server/ConnectivityService.java | 44 ++++++++----------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index a4d6be53a0..82a36b4958 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -4134,8 +4134,8 @@ public class ConnectivityService extends IConnectivityManager.Stub // } updateTcpBufferSizes(networkAgent); - final boolean flushDns = updateRoutes(newLp, oldLp, netId); - updateDnses(newLp, oldLp, netId, flushDns); + updateRoutes(newLp, oldLp, netId); + updateDnses(newLp, oldLp, netId); updateClat(newLp, oldLp, networkAgent); if (isDefaultNetwork(networkAgent)) { @@ -4238,30 +4238,24 @@ public class ConnectivityService extends IConnectivityManager.Stub return !routeDiff.added.isEmpty() || !routeDiff.removed.isEmpty(); } - private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId, - boolean flush) { - if (oldLp == null || (newLp.isIdenticalDnses(oldLp) == false)) { - Collection dnses = newLp.getDnsServers(); - if (DBG) log("Setting Dns servers for network " + netId + " to " + dnses); - try { - mNetd.setDnsServersForNetwork(netId, NetworkUtils.makeStrings(dnses), - newLp.getDomains()); - } catch (Exception e) { - loge("Exception in setDnsServersForNetwork: " + e); - } - final NetworkAgentInfo defaultNai = getDefaultNetwork(); - if (defaultNai != null && defaultNai.network.netId == netId) { - setDefaultDnsSystemProperties(dnses); - } - flushVmDnsCache(); - } else if (flush) { - try { - mNetd.flushNetworkDnsCache(netId); - } catch (Exception e) { - loge("Exception in flushNetworkDnsCache: " + e); - } - flushVmDnsCache(); + private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId) { + if (oldLp != null && newLp.isIdenticalDnses(oldLp)) { + return; // no updating necessary } + + Collection dnses = newLp.getDnsServers(); + if (DBG) log("Setting Dns servers for network " + netId + " to " + dnses); + try { + mNetd.setDnsServersForNetwork( + netId, NetworkUtils.makeStrings(dnses), newLp.getDomains()); + } catch (Exception e) { + loge("Exception in setDnsServersForNetwork: " + e); + } + final NetworkAgentInfo defaultNai = getDefaultNetwork(); + if (defaultNai != null && defaultNai.network.netId == netId) { + setDefaultDnsSystemProperties(dnses); + } + flushVmDnsCache(); } private void setDefaultDnsSystemProperties(Collection dnses) {