From 829dfa7cd80faa61b3f63c455f81411571144f82 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Fri, 28 Nov 2014 20:07:46 +0900 Subject: [PATCH] Only use mDefaultDns if the network claims to offer Internet Currently, if a network does not specify DNS servers, we default it to using 8.8.8.8. This was done because the emulator did not specify DNS servers. However, it causes queries to fail slowly, instead of failing fast, on networks that do not have connectivity to 8.8.8.8. Bug: 18327075 Change-Id: I0df13ff4a17ee65e640be96695a3af31b020963a --- .../android/server/ConnectivityService.java | 13 ++++++++++--- .../server/NetworkManagementService.java | 18 +++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 8b3739dff5c97..9f86d9af3a613 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3593,8 +3593,14 @@ public class ConnectivityService extends IConnectivityManager.Stub // updateMtu(lp, null); // } updateTcpBufferSizes(networkAgent); + + // TODO: deprecate and remove mDefaultDns when we can do so safely. + // For now, use it only when the network has Internet access. http://b/18327075 + final boolean useDefaultDns = networkAgent.networkCapabilities.hasCapability( + NetworkCapabilities.NET_CAPABILITY_INTERNET); final boolean flushDns = updateRoutes(newLp, oldLp, netId); - updateDnses(newLp, oldLp, netId, flushDns); + updateDnses(newLp, oldLp, netId, flushDns, useDefaultDns); + updateClat(newLp, oldLp, networkAgent); if (isDefaultNetwork(networkAgent)) handleApplyDefaultProxy(newLp.getHttpProxy()); // TODO - move this check to cover the whole function @@ -3688,10 +3694,11 @@ public class ConnectivityService extends IConnectivityManager.Stub } return !routeDiff.added.isEmpty() || !routeDiff.removed.isEmpty(); } - private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId, boolean flush) { + private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId, + boolean flush, boolean useDefaultDns) { if (oldLp == null || (newLp.isIdenticalDnses(oldLp) == false)) { Collection dnses = newLp.getDnsServers(); - if (dnses.size() == 0 && mDefaultDns != null) { + if (dnses.size() == 0 && mDefaultDns != null && useDefaultDns) { dnses = new ArrayList(); dnses.add(mDefaultDns); if (DBG) { diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index 5fe0d1cada4e9..748018dd1568f 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -1710,14 +1710,18 @@ public class NetworkManagementService extends INetworkManagementService.Stub public void setDnsServersForNetwork(int netId, String[] servers, String domains) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - final Command cmd = new Command("resolver", "setnetdns", netId, - (domains == null ? "" : domains)); - - for (String s : servers) { - InetAddress a = NetworkUtils.numericToInetAddress(s); - if (a.isAnyLocalAddress() == false) { - cmd.appendArg(a.getHostAddress()); + Command cmd; + if (servers.length > 0) { + cmd = new Command("resolver", "setnetdns", netId, + (domains == null ? "" : domains)); + for (String s : servers) { + InetAddress a = NetworkUtils.numericToInetAddress(s); + if (a.isAnyLocalAddress() == false) { + cmd.appendArg(a.getHostAddress()); + } } + } else { + cmd = new Command("resolver", "clearnetdns", netId); } try {