diff options
| -rw-r--r-- | core/java/android/net/ITestNetworkManager.aidl | 4 | ||||
| -rw-r--r-- | core/java/android/net/TestNetworkManager.java | 22 | ||||
| -rw-r--r-- | services/core/java/com/android/server/TestNetworkService.java | 24 |
3 files changed, 46 insertions, 4 deletions
diff --git a/core/java/android/net/ITestNetworkManager.aidl b/core/java/android/net/ITestNetworkManager.aidl index bab6ae8e7409..d586038ebb89 100644 --- a/core/java/android/net/ITestNetworkManager.aidl +++ b/core/java/android/net/ITestNetworkManager.aidl @@ -17,6 +17,7 @@ package android.net; import android.net.LinkAddress; +import android.net.LinkProperties; import android.net.TestNetworkInterface; import android.os.IBinder; import android.os.ParcelFileDescriptor; @@ -31,7 +32,8 @@ interface ITestNetworkManager TestNetworkInterface createTunInterface(in LinkAddress[] linkAddrs); TestNetworkInterface createTapInterface(); - void setupTestNetwork(in String iface, in IBinder binder); + void setupTestNetwork(in String iface, in LinkProperties lp, in boolean isMetered, + in IBinder binder); void teardownTestNetwork(int netId); } diff --git a/core/java/android/net/TestNetworkManager.java b/core/java/android/net/TestNetworkManager.java index e274005eb9d1..4ac4a69e4b1b 100644 --- a/core/java/android/net/TestNetworkManager.java +++ b/core/java/android/net/TestNetworkManager.java @@ -56,6 +56,26 @@ public class TestNetworkManager { /** * Sets up a capability-limited, testing-only network for a given interface * + * @param lp The LinkProperties for the TestNetworkService to use for this test network. Note + * that the interface name and link addresses will be overwritten, and the passed-in values + * discarded. + * @param isMetered Whether or not the network should be considered metered. + * @param binder A binder object guarding the lifecycle of this test network. + * @hide + */ + public void setupTestNetwork( + @NonNull LinkProperties lp, boolean isMetered, @NonNull IBinder binder) { + Preconditions.checkNotNull(lp, "Invalid LinkProperties"); + try { + mService.setupTestNetwork(lp.getInterfaceName(), lp, isMetered, binder); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Sets up a capability-limited, testing-only network for a given interface + * * @param iface the name of the interface to be used for the Network LinkProperties. * @param binder A binder object guarding the lifecycle of this test network. * @hide @@ -63,7 +83,7 @@ public class TestNetworkManager { @TestApi public void setupTestNetwork(@NonNull String iface, @NonNull IBinder binder) { try { - mService.setupTestNetwork(iface, binder); + mService.setupTestNetwork(iface, null, true, binder); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java index 40bf7bccff72..d19d2ddd7c3c 100644 --- a/services/core/java/com/android/server/TestNetworkService.java +++ b/services/core/java/com/android/server/TestNetworkService.java @@ -19,6 +19,7 @@ package com.android.server; import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.net.ConnectivityManager; import android.net.INetd; @@ -53,6 +54,7 @@ import java.net.Inet6Address; import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.util.ArrayList; import java.util.concurrent.atomic.AtomicInteger; /** @hide */ @@ -226,6 +228,8 @@ class TestNetworkService extends ITestNetworkManager.Stub { @NonNull Looper looper, @NonNull Context context, @NonNull String iface, + @Nullable LinkProperties lp, + boolean isMetered, int callingUid, @NonNull IBinder binder) throws RemoteException, SocketException { @@ -245,9 +249,19 @@ class TestNetworkService extends ITestNetworkManager.Stub { nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED); nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); nc.setNetworkSpecifier(new StringNetworkSpecifier(iface)); + if (!isMetered) { + nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); + } // Build LinkProperties - LinkProperties lp = new LinkProperties(); + if (lp == null) { + lp = new LinkProperties(); + } else { + lp = new LinkProperties(lp); + // Use LinkAddress(es) from the interface itself to minimize how much the caller + // is trusted. + lp.setLinkAddresses(new ArrayList<>()); + } lp.setInterfaceName(iface); // Find the currently assigned addresses, and add them to LinkProperties @@ -284,7 +298,11 @@ class TestNetworkService extends ITestNetworkManager.Stub { * <p>This method provides a Network that is useful only for testing. */ @Override - public void setupTestNetwork(@NonNull String iface, @NonNull IBinder binder) { + public void setupTestNetwork( + @NonNull String iface, + @Nullable LinkProperties lp, + boolean isMetered, + @NonNull IBinder binder) { enforceTestNetworkPermissions(mContext); checkNotNull(iface, "missing Iface"); @@ -315,6 +333,8 @@ class TestNetworkService extends ITestNetworkManager.Stub { mHandler.getLooper(), mContext, iface, + lp, + isMetered, callingUid, binder); |