Merge "Create TestApi for simulating a Data Stall on ConnectivityService." am: e743a30aa7 am: b36fa34041

Change-Id: I17839cd271d984f76c203889293cc51375bb8bcb
This commit is contained in:
Cody Kesting
2020-05-12 17:27:09 +00:00
committed by Automerger Merge Worker
3 changed files with 65 additions and 9 deletions

View File

@@ -48,6 +48,7 @@ import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.Process; import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ResultReceiver; import android.os.ResultReceiver;
@@ -4734,4 +4735,28 @@ public class ConnectivityManager {
Log.d(TAG, "StackLog:" + sb.toString()); Log.d(TAG, "StackLog:" + sb.toString());
} }
} }
/**
* Simulates a Data Stall for the specified Network.
*
* <p>The caller must be the owner of the specified Network.
*
* @param detectionMethod The detection method used to identify the Data Stall.
* @param timestampMillis The timestamp at which the stall 'occurred', in milliseconds.
* @param network The Network for which a Data Stall is being simluated.
* @param extras The PersistableBundle of extras included in the Data Stall notification.
* @throws SecurityException if the caller is not the owner of the given network.
* @hide
*/
@TestApi
@RequiresPermission(anyOf = {android.Manifest.permission.MANAGE_TEST_NETWORKS,
android.Manifest.permission.NETWORK_STACK})
public void simulateDataStall(int detectionMethod, long timestampMillis,
@NonNull Network network, @NonNull PersistableBundle extras) {
try {
mService.simulateDataStall(detectionMethod, timestampMillis, network, extras);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
}
} }

View File

@@ -18,6 +18,7 @@ package android.net;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.net.ConnectionInfo; import android.net.ConnectionInfo;
import android.net.ConnectivityDiagnosticsManager;
import android.net.IConnectivityDiagnosticsCallback; import android.net.IConnectivityDiagnosticsCallback;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.net.Network; import android.net.Network;
@@ -33,6 +34,7 @@ import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.os.Messenger; import android.os.Messenger;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.ResultReceiver; import android.os.ResultReceiver;
import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.LegacyVpnInfo;
@@ -228,4 +230,7 @@ interface IConnectivityManager
void unregisterConnectivityDiagnosticsCallback(in IConnectivityDiagnosticsCallback callback); void unregisterConnectivityDiagnosticsCallback(in IConnectivityDiagnosticsCallback callback);
IBinder startOrGetTestNetworkService(); IBinder startOrGetTestNetworkService();
void simulateDataStall(int detectionMethod, long timestampMillis, in Network network,
in PersistableBundle extras);
} }

View File

@@ -3088,10 +3088,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void notifyDataStallSuspected(DataStallReportParcelable p) { public void notifyDataStallSuspected(DataStallReportParcelable p) {
final Message msg = mConnectivityDiagnosticsHandler.obtainMessage(
ConnectivityDiagnosticsHandler.EVENT_DATA_STALL_SUSPECTED,
p.detectionMethod, mNetId, p.timestampMillis);
final PersistableBundle extras = new PersistableBundle(); final PersistableBundle extras = new PersistableBundle();
switch (p.detectionMethod) { switch (p.detectionMethod) {
case DETECTION_METHOD_DNS_EVENTS: case DETECTION_METHOD_DNS_EVENTS:
@@ -3106,12 +3102,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
log("Unknown data stall detection method, ignoring: " + p.detectionMethod); log("Unknown data stall detection method, ignoring: " + p.detectionMethod);
return; return;
} }
msg.setData(new Bundle(extras));
// NetworkStateTrackerHandler currently doesn't take any actions based on data proxyDataStallToConnectivityDiagnosticsHandler(
// stalls so send the message directly to ConnectivityDiagnosticsHandler and avoid p.detectionMethod, mNetId, p.timestampMillis, extras);
// the cost of going through two handlers.
mConnectivityDiagnosticsHandler.sendMessage(msg);
} }
@Override @Override
@@ -3125,6 +3118,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
private void proxyDataStallToConnectivityDiagnosticsHandler(int detectionMethod, int netId,
long timestampMillis, @NonNull PersistableBundle extras) {
final Message msg = mConnectivityDiagnosticsHandler.obtainMessage(
ConnectivityDiagnosticsHandler.EVENT_DATA_STALL_SUSPECTED,
detectionMethod, netId, timestampMillis);
msg.setData(new Bundle(extras));
// NetworkStateTrackerHandler currently doesn't take any actions based on data
// stalls so send the message directly to ConnectivityDiagnosticsHandler and avoid
// the cost of going through two handlers.
mConnectivityDiagnosticsHandler.sendMessage(msg);
}
private boolean networkRequiresPrivateDnsValidation(NetworkAgentInfo nai) { private boolean networkRequiresPrivateDnsValidation(NetworkAgentInfo nai) {
return isPrivateDnsValidationRequired(nai.networkCapabilities); return isPrivateDnsValidationRequired(nai.networkCapabilities);
} }
@@ -8167,4 +8173,24 @@ public class ConnectivityService extends IConnectivityManager.Stub
0, 0,
callback)); callback));
} }
@Override
public void simulateDataStall(int detectionMethod, long timestampMillis,
@NonNull Network network, @NonNull PersistableBundle extras) {
enforceAnyPermissionOf(android.Manifest.permission.MANAGE_TEST_NETWORKS,
android.Manifest.permission.NETWORK_STACK);
final NetworkCapabilities nc = getNetworkCapabilitiesInternal(network);
if (!nc.hasTransport(TRANSPORT_TEST)) {
throw new SecurityException("Data Stall simluation is only possible for test networks");
}
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
if (nai == null || nai.creatorUid != Binder.getCallingUid()) {
throw new SecurityException("Data Stall simulation is only possible for network "
+ "creators");
}
proxyDataStallToConnectivityDiagnosticsHandler(
detectionMethod, network.netId, timestampMillis, extras);
}
} }