diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 2d5141eda9..47971a1dc0 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -93,6 +93,9 @@ import android.security.Credentials; import android.security.KeyStore; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.LocalLog; +import android.util.LocalLog.ReadOnlyLocalLog; +import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -140,6 +143,7 @@ import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -415,6 +419,20 @@ public class ConnectivityService extends IConnectivityManager.Stub // sequence number of NetworkRequests private int mNextNetworkRequestId = 1; + // Array of tracking network validation and results + private static final int MAX_VALIDATION_LOGS = 10; + private final ArrayDeque> mValidationLogs = + new ArrayDeque>(MAX_VALIDATION_LOGS); + + private void addValidationLogs(ReadOnlyLocalLog log, Network network) { + synchronized(mValidationLogs) { + while (mValidationLogs.size() >= MAX_VALIDATION_LOGS) { + mValidationLogs.removeLast(); + } + mValidationLogs.addFirst(new Pair(network, log)); + } + } + /** * Implements support for the legacy "one network per network type" model. * @@ -1716,11 +1734,9 @@ public class ConnectivityService extends IConnectivityManager.Stub return ret; } - private boolean shouldPerformDiagnostics(String[] args) { + private boolean argsContain(String[] args, String target) { for (String arg : args) { - if (arg.equals("--diag")) { - return true; - } + if (arg.equals(target)) return true; } return false; } @@ -1738,7 +1754,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } final List netDiags = new ArrayList(); - if (shouldPerformDiagnostics(args)) { + if (argsContain(args, "--diag")) { final long DIAG_TIME_MS = 5000; for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { // Start gathering diagnostic information. @@ -1825,6 +1841,19 @@ public class ConnectivityService extends IConnectivityManager.Stub } pw.decreaseIndent(); } + + if (argsContain(args, "--short") == false) { + pw.println(); + synchronized (mValidationLogs) { + pw.println("mValidationLogs (most recent first):"); + for (Pair p : mValidationLogs) { + pw.println(p.first); + pw.increaseIndent(); + p.second.dump(fd, pw, args); + pw.decreaseIndent(); + } + } + } } private boolean isLiveNetworkAgent(NetworkAgentInfo nai, String msg) { @@ -3841,6 +3870,7 @@ public class ConnectivityService extends IConnectivityManager.Stub synchronized (this) { nai.networkMonitor.systemReady = mSystemReady; } + addValidationLogs(nai.networkMonitor.getValidationLogs(), nai.network); if (DBG) log("registerNetworkAgent " + nai); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT, nai)); return nai.network.netId;