summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIsaac Levy <ilevy@google.com>2011-08-16 16:24:32 -0700
committerIsaac Levy <ilevy@google.com>2011-08-23 14:04:40 -0700
commit79e43f679d6102066ee9eff862912806f53bb0e8 (patch)
treea10d2a2870d38da2a17196065aa78898ecacd718
parent04963769e36a389f96a25712dd0bd0de570b4df8 (diff)
downloadframeworks_base-79e43f679d6102066ee9eff862912806f53bb0e8.zip
frameworks_base-79e43f679d6102066ee9eff862912806f53bb0e8.tar.gz
frameworks_base-79e43f679d6102066ee9eff862912806f53bb0e8.tar.bz2
Added support for multiple DNS servers.
Also increased delay on repeat checks for WWSM. Change-Id: Ic11b1f37a910c483f48e04dadb539b39fe50e622
-rw-r--r--core/java/android/net/DnsPinger.java16
-rw-r--r--wifi/java/android/net/wifi/WifiWatchdogStateMachine.java108
2 files changed, 68 insertions, 56 deletions
diff --git a/core/java/android/net/DnsPinger.java b/core/java/android/net/DnsPinger.java
index 6115fef..3e27b0d 100644
--- a/core/java/android/net/DnsPinger.java
+++ b/core/java/android/net/DnsPinger.java
@@ -67,7 +67,7 @@ public final class DnsPinger extends Handler {
private final Context mContext;
private final int mConnectionType;
private final Handler mTarget;
- private final InetAddress mDefaultDns;
+ private final ArrayList<InetAddress> mDefaultDns;
private String TAG;
private static final int BASE = Protocol.BASE_DNS_PINGER;
@@ -113,7 +113,8 @@ public final class DnsPinger extends Handler {
throw new IllegalArgumentException("Invalid connectionType in constructor: "
+ connectionType);
}
- mDefaultDns = getDefaultDns();
+ mDefaultDns = new ArrayList<InetAddress>();
+ mDefaultDns.add(getDefaultDns());
mEventCounter = 0;
}
@@ -213,17 +214,16 @@ public final class DnsPinger extends Handler {
for (ActivePing activePing : mActivePings)
activePing.socket.close();
mActivePings.clear();
- removeMessages(ACTION_PING_DNS);
break;
}
}
/**
- * @return The first DNS in the link properties of the specified connection
- * type or the default system DNS if the link properties has null
- * dns set. Should not be null.
+ * Returns a list of DNS addresses, coming from either the link properties of the
+ * specified connection or the default system DNS if the link properties has no dnses.
+ * @return a non-empty non-null list
*/
- public InetAddress getDns() {
+ public List<InetAddress> getDnsList() {
LinkProperties curLinkProps = getCurrentLinkProperties();
if (curLinkProps == null) {
Slog.e(TAG, "getCurLinkProperties:: LP for type" + mConnectionType + " is null!");
@@ -236,7 +236,7 @@ public final class DnsPinger extends Handler {
return mDefaultDns;
}
- return dnses.iterator().next();
+ return new ArrayList<InetAddress>(dnses);
}
/**
diff --git a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
index 4dd856f..274edae 100644
--- a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
@@ -46,9 +46,9 @@ import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Set;
/**
* {@link WifiWatchdogStateMachine} monitors the initial connection to a Wi-Fi
@@ -79,7 +79,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
private static final int LOW_SIGNAL_CUTOFF = 1;
private static final long DEFAULT_DNS_CHECK_SHORT_INTERVAL_MS = 2 * 60 * 1000;
- private static final long DEFAULT_DNS_CHECK_LONG_INTERVAL_MS = 10 * 60 * 1000;
+ private static final long DEFAULT_DNS_CHECK_LONG_INTERVAL_MS = 30 * 60 * 1000;
private static final long DEFAULT_WALLED_GARDEN_INTERVAL_MS = 30 * 60 * 1000;
private static final int DEFAULT_MAX_SSID_BLACKLISTS = 7;
@@ -661,26 +661,34 @@ public class WifiWatchdogStateMachine extends StateMachine {
}
class DnsCheckingState extends State {
- int dnsCheckSuccesses = 0;
- int dnsCheckTries = 0;
- String dnsCheckLogStr = "";
- Set<Integer> ids = new HashSet<Integer>();
+ List<InetAddress> mDnsList;
+ int[] dnsCheckSuccesses;
+ String dnsCheckLogStr;
+ String[] dnsResponseStrs;
+ /** Keeps track of active dns pings. Map is from pingID to index in mDnsList */
+ HashMap<Integer, Integer> idDnsMap = new HashMap<Integer, Integer>();
@Override
public void enter() {
- dnsCheckSuccesses = 0;
- dnsCheckTries = 0;
- ids.clear();
- InetAddress dns = mDnsPinger.getDns();
+ mDnsList = mDnsPinger.getDnsList();
+ int numDnses = mDnsList.size();
+ dnsCheckSuccesses = new int[numDnses];
+ dnsResponseStrs = new String[numDnses];
+ for (int i = 0; i < numDnses; i++)
+ dnsResponseStrs[i] = "";
+
if (DBG) {
- Slog.d(WWSM_TAG, "Starting DNS pings at " + SystemClock.elapsedRealtime());
dnsCheckLogStr = String.format("Pinging %s on ssid [%s]: ",
- mDnsPinger.getDns(), mConnectionInfo.getSSID());
+ mDnsList, mConnectionInfo.getSSID());
+ Slog.d(WWSM_TAG, dnsCheckLogStr);
}
+ idDnsMap.clear();
for (int i=0; i < mNumDnsPings; i++) {
- ids.add(mDnsPinger.pingDnsAsync(dns, mDnsPingTimeoutMs,
- DNS_INTRATEST_PING_INTERVAL * i));
+ for (int j = 0; j < numDnses; j++) {
+ idDnsMap.put(mDnsPinger.pingDnsAsync(mDnsList.get(j), mDnsPingTimeoutMs,
+ DNS_INTRATEST_PING_INTERVAL * i), j);
+ }
}
}
@@ -693,27 +701,24 @@ public class WifiWatchdogStateMachine extends StateMachine {
int pingID = msg.arg1;
int pingResponseTime = msg.arg2;
- if (!ids.contains(pingID)) {
+ Integer dnsServerId = idDnsMap.get(pingID);
+ if (dnsServerId == null) {
Slog.w(WWSM_TAG, "Received a Dns response with unknown ID!");
return HANDLED;
}
- ids.remove(pingID);
- dnsCheckTries++;
+
+ idDnsMap.remove(pingID);
if (pingResponseTime >= 0)
- dnsCheckSuccesses++;
+ dnsCheckSuccesses[dnsServerId]++;
if (DBG) {
if (pingResponseTime >= 0) {
- dnsCheckLogStr += "|" + pingResponseTime;
+ dnsResponseStrs[dnsServerId] += "|" + pingResponseTime;
} else {
- dnsCheckLogStr += "|x";
+ dnsResponseStrs[dnsServerId] += "|x";
}
}
- if (VDBG) {
- Slog.v(WWSM_TAG, dnsCheckLogStr);
- }
-
/**
* After a full ping count, if we have more responses than this
* cutoff, the outcome is success; else it is 'failure'.
@@ -723,10 +728,10 @@ public class WifiWatchdogStateMachine extends StateMachine {
* Our final success count will be at least this big, so we're
* guaranteed to succeed.
*/
- if (dnsCheckSuccesses >= mMinDnsResponses) {
+ if (dnsCheckSuccesses[dnsServerId] >= mMinDnsResponses) {
// DNS CHECKS OK, NOW WALLED GARDEN
if (DBG) {
- Slog.d(WWSM_TAG, dnsCheckLogStr + "| SUCCESS");
+ Slog.d(WWSM_TAG, makeLogString() + " SUCCESS");
}
if (!shouldCheckWalledGarden()) {
@@ -748,14 +753,9 @@ public class WifiWatchdogStateMachine extends StateMachine {
return HANDLED;
}
- /**
- * Our final count will be at most the current count plus the
- * remaining pings - we're guaranteed to fail.
- */
- int remainingChecks = mNumDnsPings - dnsCheckTries;
- if (remainingChecks + dnsCheckSuccesses < mMinDnsResponses) {
+ if (idDnsMap.isEmpty()) {
if (DBG) {
- Slog.d(WWSM_TAG, dnsCheckLogStr + "| FAILURE");
+ Slog.d(WWSM_TAG, makeLogString() + " FAILURE");
}
transitionTo(mDnsCheckFailureState);
return HANDLED;
@@ -764,12 +764,18 @@ public class WifiWatchdogStateMachine extends StateMachine {
return HANDLED;
}
+ private String makeLogString() {
+ String logStr = dnsCheckLogStr;
+ for (String respStr : dnsResponseStrs)
+ logStr += " [" + respStr + "]";
+ return logStr;
+ }
+
@Override
public void exit() {
mDnsPinger.cancelPings();
}
-
private boolean shouldCheckWalledGarden() {
if (!mWalledGardenTestEnabled) {
if (VDBG)
@@ -809,7 +815,8 @@ public class WifiWatchdogStateMachine extends StateMachine {
int checkGuard = 0;
Long lastCheckTime = null;
- int curPingID = 0;
+ /** Keeps track of dns pings. Map is from pingID to InetAddress used for ping */
+ HashMap<Integer, InetAddress> pingInfoMap = new HashMap<Integer, InetAddress>();
@Override
public void enter() {
@@ -817,7 +824,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
signalUnstable = false;
checkGuard++;
unstableSignalChecks = false;
- curPingID = 0;
+ pingInfoMap.clear();
triggerSingleDnsCheck();
}
@@ -853,32 +860,37 @@ public class WifiWatchdogStateMachine extends StateMachine {
return HANDLED;
}
lastCheckTime = SystemClock.elapsedRealtime();
- curPingID = mDnsPinger.pingDnsAsync(mDnsPinger.getDns(),
- mDnsPingTimeoutMs, 0);
+ pingInfoMap.clear();
+ for (InetAddress curDns: mDnsPinger.getDnsList()) {
+ pingInfoMap.put(mDnsPinger.pingDnsAsync(curDns, mDnsPingTimeoutMs, 0),
+ curDns);
+ }
return HANDLED;
case DnsPinger.DNS_PING_RESULT:
- if ((short) msg.arg1 != curPingID) {
- if (VDBG) {
- Slog.v(WWSM_TAG, "Received non-matching DnsPing w/ id: " +
- msg.arg1);
- }
+ InetAddress curDnsServer = pingInfoMap.get(msg.arg1);
+ if (curDnsServer == null) {
return HANDLED;
}
+ pingInfoMap.remove(msg.arg1);
int responseTime = msg.arg2;
if (responseTime >= 0) {
if (VDBG) {
- Slog.v(WWSM_TAG, "Ran a single DNS ping. Response time: "
- + responseTime);
+ Slog.v(WWSM_TAG, "Single DNS ping OK. Response time: "
+ + responseTime + " from DNS " + curDnsServer);
}
+ pingInfoMap.clear();
checkGuard++;
unstableSignalChecks = false;
triggerSingleDnsCheck();
} else {
- if (DBG) {
- Slog.d(WWSM_TAG, "Single dns ping failure. Starting full checks.");
+ if (pingInfoMap.isEmpty()) {
+ if (DBG) {
+ Slog.d(WWSM_TAG, "Single dns ping failure. All dns servers failed, "
+ + "starting full checks.");
+ }
+ transitionTo(mDnsCheckingState);
}
- transitionTo(mDnsCheckingState);
}
return HANDLED;
}