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
This commit is contained in:
Erik Kline
2016-04-05 13:30:49 +09:00
parent 49e2db1b10
commit 94887874e3
3 changed files with 19 additions and 40 deletions

View File

@@ -328,11 +328,6 @@ interface INetworkManagementService
*/ */
void setDnsServersForNetwork(int netId, in String[] servers, String domains); void setDnsServersForNetwork(int netId, in String[] servers, String domains);
/**
* Flush the DNS cache associated with the specified network.
*/
void flushNetworkDnsCache(int netId);
void setFirewallEnabled(boolean enabled); void setFirewallEnabled(boolean enabled);
boolean isFirewallEnabled(); boolean isFirewallEnabled();
void setFirewallInterfaceRule(String iface, boolean allow); void setFirewallInterfaceRule(String iface, boolean allow);

View File

@@ -4134,8 +4134,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
// } // }
updateTcpBufferSizes(networkAgent); updateTcpBufferSizes(networkAgent);
final boolean flushDns = updateRoutes(newLp, oldLp, netId); updateRoutes(newLp, oldLp, netId);
updateDnses(newLp, oldLp, netId, flushDns); updateDnses(newLp, oldLp, netId);
updateClat(newLp, oldLp, networkAgent); updateClat(newLp, oldLp, networkAgent);
if (isDefaultNetwork(networkAgent)) { if (isDefaultNetwork(networkAgent)) {
@@ -4238,14 +4238,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
return !routeDiff.added.isEmpty() || !routeDiff.removed.isEmpty(); return !routeDiff.added.isEmpty() || !routeDiff.removed.isEmpty();
} }
private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId, private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId) {
boolean flush) { if (oldLp != null && newLp.isIdenticalDnses(oldLp)) {
if (oldLp == null || (newLp.isIdenticalDnses(oldLp) == false)) { return; // no updating necessary
}
Collection<InetAddress> dnses = newLp.getDnsServers(); Collection<InetAddress> dnses = newLp.getDnsServers();
if (DBG) log("Setting Dns servers for network " + netId + " to " + dnses); if (DBG) log("Setting Dns servers for network " + netId + " to " + dnses);
try { try {
mNetd.setDnsServersForNetwork(netId, NetworkUtils.makeStrings(dnses), mNetd.setDnsServersForNetwork(
newLp.getDomains()); netId, NetworkUtils.makeStrings(dnses), newLp.getDomains());
} catch (Exception e) { } catch (Exception e) {
loge("Exception in setDnsServersForNetwork: " + e); loge("Exception in setDnsServersForNetwork: " + e);
} }
@@ -4254,14 +4256,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
setDefaultDnsSystemProperties(dnses); setDefaultDnsSystemProperties(dnses);
} }
flushVmDnsCache(); flushVmDnsCache();
} else if (flush) {
try {
mNetd.flushNetworkDnsCache(netId);
} catch (Exception e) {
loge("Exception in flushNetworkDnsCache: " + e);
}
flushVmDnsCache();
}
} }
private void setDefaultDnsSystemProperties(Collection<InetAddress> dnses) { private void setDefaultDnsSystemProperties(Collection<InetAddress> dnses) {

View File

@@ -1936,16 +1936,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub
} }
} }
@Override
public void flushNetworkDnsCache(int netId) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
mConnector.execute("resolver", "flushnet", netId);
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
@Override @Override
public void setFirewallEnabled(boolean enabled) { public void setFirewallEnabled(boolean enabled) {
enforceSystemUid(); enforceSystemUid();