Loading services/core/java/com/android/server/VpnManagerService.java +4 −0 Original line number Diff line number Diff line Loading @@ -186,6 +186,10 @@ public class VpnManagerService extends IVpnManager.Stub { synchronized (mVpns) { for (int i = 0; i < mVpns.size(); i++) { pw.println(mVpns.keyAt(i) + ": " + mVpns.valueAt(i).getPackage()); pw.increaseIndent(); mVpns.valueAt(i).dump(pw); pw.decreaseIndent(); pw.println(); } pw.decreaseIndent(); } Loading services/core/java/com/android/server/connectivity/Vpn.java +72 −1 Original line number Diff line number Diff line Loading @@ -127,6 +127,8 @@ import android.system.keystore2.KeyDescriptor; import android.system.keystore2.KeyPermission; import android.text.TextUtils; import android.util.ArraySet; import android.util.IndentingPrintWriter; import android.util.LocalLog; import android.util.Log; import android.util.Range; Loading Loading @@ -296,6 +298,10 @@ public class Vpn { 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 * only applies to {@link VpnService} connections. Loading Loading @@ -841,6 +847,9 @@ public class Vpn { int errorCode, @NonNull final String packageName, @Nullable final String sessionKey, @NonNull final VpnProfileState profileState, @Nullable final Network underlyingNetwork, @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, packageName, sessionKey, profileState, underlyingNetwork, nc, lp); return sendEventToVpnManagerApp(intent, packageName); Loading Loading @@ -1572,6 +1581,7 @@ public class Vpn { ? Arrays.asList(mConfig.underlyingNetworks) : null); mNetworkCapabilities = capsBuilder.build(); logUnderlyNetworkChanges(mNetworkCapabilities.getUnderlyingNetworks()); mNetworkAgent = mDeps.newNetworkAgent(mContext, mLooper, NETWORKTYPE /* logtag */, mNetworkCapabilities, lp, new NetworkScore.Builder().setLegacyInt(VPN_DEFAULT_SCORE).build(), Loading Loading @@ -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) { if (networkAgent != null) { networkAgent.unregister(); Loading Loading @@ -4372,6 +4387,7 @@ public class Vpn { // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from // ConnectivityServiceTest. if (SdkLevel.isAtLeastT()) { mVpnManagerEvents.log(packageName + " stopped"); sendEventToVpnManagerApp(intent, packageName); } } Loading Loading @@ -4539,8 +4555,10 @@ public class Vpn { /** Proxy to allow different testing setups */ // TODO: b/240492694 Remove VpnNetworkAgentWrapper and this method when // NetworkAgent#setUnderlyingNetworks can be un-finalized. private static void doSetUnderlyingNetworks( private void doSetUnderlyingNetworks( @NonNull NetworkAgent agent, @NonNull List<Network> networks) { logUnderlyNetworkChanges(networks); if (agent instanceof VpnNetworkAgentWrapper) { ((VpnNetworkAgentWrapper) agent).doSetUnderlyingNetworks(networks); } else { Loading Loading @@ -4659,4 +4677,57 @@ public class Vpn { static Range<Integer> createUidRangeForUser(int userId) { 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(); } } } Loading
services/core/java/com/android/server/VpnManagerService.java +4 −0 Original line number Diff line number Diff line Loading @@ -186,6 +186,10 @@ public class VpnManagerService extends IVpnManager.Stub { synchronized (mVpns) { for (int i = 0; i < mVpns.size(); i++) { pw.println(mVpns.keyAt(i) + ": " + mVpns.valueAt(i).getPackage()); pw.increaseIndent(); mVpns.valueAt(i).dump(pw); pw.decreaseIndent(); pw.println(); } pw.decreaseIndent(); } Loading
services/core/java/com/android/server/connectivity/Vpn.java +72 −1 Original line number Diff line number Diff line Loading @@ -127,6 +127,8 @@ import android.system.keystore2.KeyDescriptor; import android.system.keystore2.KeyPermission; import android.text.TextUtils; import android.util.ArraySet; import android.util.IndentingPrintWriter; import android.util.LocalLog; import android.util.Log; import android.util.Range; Loading Loading @@ -296,6 +298,10 @@ public class Vpn { 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 * only applies to {@link VpnService} connections. Loading Loading @@ -841,6 +847,9 @@ public class Vpn { int errorCode, @NonNull final String packageName, @Nullable final String sessionKey, @NonNull final VpnProfileState profileState, @Nullable final Network underlyingNetwork, @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, packageName, sessionKey, profileState, underlyingNetwork, nc, lp); return sendEventToVpnManagerApp(intent, packageName); Loading Loading @@ -1572,6 +1581,7 @@ public class Vpn { ? Arrays.asList(mConfig.underlyingNetworks) : null); mNetworkCapabilities = capsBuilder.build(); logUnderlyNetworkChanges(mNetworkCapabilities.getUnderlyingNetworks()); mNetworkAgent = mDeps.newNetworkAgent(mContext, mLooper, NETWORKTYPE /* logtag */, mNetworkCapabilities, lp, new NetworkScore.Builder().setLegacyInt(VPN_DEFAULT_SCORE).build(), Loading Loading @@ -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) { if (networkAgent != null) { networkAgent.unregister(); Loading Loading @@ -4372,6 +4387,7 @@ public class Vpn { // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from // ConnectivityServiceTest. if (SdkLevel.isAtLeastT()) { mVpnManagerEvents.log(packageName + " stopped"); sendEventToVpnManagerApp(intent, packageName); } } Loading Loading @@ -4539,8 +4555,10 @@ public class Vpn { /** Proxy to allow different testing setups */ // TODO: b/240492694 Remove VpnNetworkAgentWrapper and this method when // NetworkAgent#setUnderlyingNetworks can be un-finalized. private static void doSetUnderlyingNetworks( private void doSetUnderlyingNetworks( @NonNull NetworkAgent agent, @NonNull List<Network> networks) { logUnderlyNetworkChanges(networks); if (agent instanceof VpnNetworkAgentWrapper) { ((VpnNetworkAgentWrapper) agent).doSetUnderlyingNetworks(networks); } else { Loading Loading @@ -4659,4 +4677,57 @@ public class Vpn { static Range<Integer> createUidRangeForUser(int userId) { 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(); } } }