Merge "Add dump for Vpn"

This commit is contained in:
Chiachang Wang
2022-11-07 01:51:48 +00:00
committed by Gerrit Code Review
2 changed files with 76 additions and 1 deletions

View File

@@ -186,6 +186,10 @@ public class VpnManagerService extends IVpnManager.Stub {
synchronized (mVpns) { synchronized (mVpns) {
for (int i = 0; i < mVpns.size(); i++) { for (int i = 0; i < mVpns.size(); i++) {
pw.println(mVpns.keyAt(i) + ": " + mVpns.valueAt(i).getPackage()); pw.println(mVpns.keyAt(i) + ": " + mVpns.valueAt(i).getPackage());
pw.increaseIndent();
mVpns.valueAt(i).dump(pw);
pw.decreaseIndent();
pw.println();
} }
pw.decreaseIndent(); pw.decreaseIndent();
} }

View File

@@ -127,6 +127,8 @@ import android.system.keystore2.KeyDescriptor;
import android.system.keystore2.KeyPermission; import android.system.keystore2.KeyPermission;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.IndentingPrintWriter;
import android.util.LocalLog;
import android.util.Log; import android.util.Log;
import android.util.Range; import android.util.Range;
@@ -296,6 +298,10 @@ public class Vpn {
return mVpnProfileStore; return mVpnProfileStore;
} }
private static final int MAX_EVENTS_LOGS = 20;
private final LocalLog mUnderlyNetworkChanges = new LocalLog(MAX_EVENTS_LOGS);
private final LocalLog mVpnManagerEvents = new LocalLog(MAX_EVENTS_LOGS);
/** /**
* Whether to keep the connection active after rebooting, or upgrading or reinstalling. This * Whether to keep the connection active after rebooting, or upgrading or reinstalling. This
* only applies to {@link VpnService} connections. * only applies to {@link VpnService} connections.
@@ -841,6 +847,9 @@ public class Vpn {
int errorCode, @NonNull final String packageName, @Nullable final String sessionKey, int errorCode, @NonNull final String packageName, @Nullable final String sessionKey,
@NonNull final VpnProfileState profileState, @Nullable final Network underlyingNetwork, @NonNull final VpnProfileState profileState, @Nullable final Network underlyingNetwork,
@Nullable final NetworkCapabilities nc, @Nullable final LinkProperties lp) { @Nullable final NetworkCapabilities nc, @Nullable final LinkProperties lp) {
mVpnManagerEvents.log("Event class=" + getVpnManagerEventClassName(errorClass)
+ ", err=" + getVpnManagerEventErrorName(errorCode) + " for " + packageName
+ " on session " + sessionKey);
final Intent intent = buildVpnManagerEventIntent(category, errorClass, errorCode, final Intent intent = buildVpnManagerEventIntent(category, errorClass, errorCode,
packageName, sessionKey, profileState, underlyingNetwork, nc, lp); packageName, sessionKey, profileState, underlyingNetwork, nc, lp);
return sendEventToVpnManagerApp(intent, packageName); return sendEventToVpnManagerApp(intent, packageName);
@@ -1572,6 +1581,7 @@ public class Vpn {
? Arrays.asList(mConfig.underlyingNetworks) : null); ? Arrays.asList(mConfig.underlyingNetworks) : null);
mNetworkCapabilities = capsBuilder.build(); mNetworkCapabilities = capsBuilder.build();
logUnderlyNetworkChanges(mNetworkCapabilities.getUnderlyingNetworks());
mNetworkAgent = mDeps.newNetworkAgent(mContext, mLooper, NETWORKTYPE /* logtag */, mNetworkAgent = mDeps.newNetworkAgent(mContext, mLooper, NETWORKTYPE /* logtag */,
mNetworkCapabilities, lp, mNetworkCapabilities, lp,
new NetworkScore.Builder().setLegacyInt(VPN_DEFAULT_SCORE).build(), new NetworkScore.Builder().setLegacyInt(VPN_DEFAULT_SCORE).build(),
@@ -1599,6 +1609,11 @@ public class Vpn {
} }
} }
private void logUnderlyNetworkChanges(List<Network> networks) {
mUnderlyNetworkChanges.log("Switch to "
+ ((networks != null) ? TextUtils.join(", ", networks) : "null"));
}
private void agentDisconnect(NetworkAgent networkAgent) { private void agentDisconnect(NetworkAgent networkAgent) {
if (networkAgent != null) { if (networkAgent != null) {
networkAgent.unregister(); networkAgent.unregister();
@@ -4372,6 +4387,7 @@ public class Vpn {
// TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from
// ConnectivityServiceTest. // ConnectivityServiceTest.
if (SdkLevel.isAtLeastT()) { if (SdkLevel.isAtLeastT()) {
mVpnManagerEvents.log(packageName + " stopped");
sendEventToVpnManagerApp(intent, packageName); sendEventToVpnManagerApp(intent, packageName);
} }
} }
@@ -4539,8 +4555,10 @@ public class Vpn {
/** Proxy to allow different testing setups */ /** Proxy to allow different testing setups */
// TODO: b/240492694 Remove VpnNetworkAgentWrapper and this method when // TODO: b/240492694 Remove VpnNetworkAgentWrapper and this method when
// NetworkAgent#setUnderlyingNetworks can be un-finalized. // NetworkAgent#setUnderlyingNetworks can be un-finalized.
private static void doSetUnderlyingNetworks( private void doSetUnderlyingNetworks(
@NonNull NetworkAgent agent, @NonNull List<Network> networks) { @NonNull NetworkAgent agent, @NonNull List<Network> networks) {
logUnderlyNetworkChanges(networks);
if (agent instanceof VpnNetworkAgentWrapper) { if (agent instanceof VpnNetworkAgentWrapper) {
((VpnNetworkAgentWrapper) agent).doSetUnderlyingNetworks(networks); ((VpnNetworkAgentWrapper) agent).doSetUnderlyingNetworks(networks);
} else { } else {
@@ -4659,4 +4677,57 @@ public class Vpn {
static Range<Integer> createUidRangeForUser(int userId) { static Range<Integer> createUidRangeForUser(int userId) {
return new Range<Integer>(userId * PER_USER_RANGE, (userId + 1) * PER_USER_RANGE - 1); return new Range<Integer>(userId * PER_USER_RANGE, (userId + 1) * PER_USER_RANGE - 1);
} }
private String getVpnManagerEventClassName(int code) {
switch (code) {
case VpnManager.ERROR_CLASS_NOT_RECOVERABLE:
return "ERROR_CLASS_NOT_RECOVERABLE";
case VpnManager.ERROR_CLASS_RECOVERABLE:
return "ERROR_CLASS_RECOVERABLE";
default:
return "UNKNOWN_CLASS";
}
}
private String getVpnManagerEventErrorName(int code) {
switch (code) {
case VpnManager.ERROR_CODE_NETWORK_UNKNOWN_HOST:
return "ERROR_CODE_NETWORK_UNKNOWN_HOST";
case VpnManager.ERROR_CODE_NETWORK_PROTOCOL_TIMEOUT:
return "ERROR_CODE_NETWORK_PROTOCOL_TIMEOUT";
case VpnManager.ERROR_CODE_NETWORK_IO:
return "ERROR_CODE_NETWORK_IO";
case VpnManager.ERROR_CODE_NETWORK_LOST:
return "ERROR_CODE_NETWORK_LOST";
default:
return "UNKNOWN_ERROR";
}
}
/** Dumps VPN state. */
public void dump(IndentingPrintWriter pw) {
synchronized (Vpn.this) {
pw.println("Active package name: " + mPackage);
pw.println("Active vpn type: " + getActiveVpnType());
pw.println("NetworkCapabilities: " + mNetworkCapabilities);
if (isIkev2VpnRunner()) {
final IkeV2VpnRunner runner = ((IkeV2VpnRunner) mVpnRunner);
pw.println("Token: " + runner.mSessionKey);
pw.println("MOBIKE " + (runner.mMobikeEnabled ? "enabled" : "disabled"));
if (mDataStallSuspected) pw.println("Data stall suspected");
if (runner.mScheduledHandleDataStallFuture != null) {
pw.println("Reset session scheduled");
}
}
pw.println("mUnderlyNetworkChanges (most recent first):");
pw.increaseIndent();
mUnderlyNetworkChanges.reverseDump(pw);
pw.decreaseIndent();
pw.println("mVpnManagerEvent (most recent first):");
pw.increaseIndent();
mVpnManagerEvents.reverseDump(pw);
pw.decreaseIndent();
}
}
} }