From 6259ad2be9533865474dc3498c75aa639b8385b0 Mon Sep 17 00:00:00 2001 From: Benedict Wong Date: Thu, 18 Apr 2019 19:18:43 -0700 Subject: [PATCH] Add configurability of LinkProperties, meteredness for Test Networks This commit adds the ability to pass in LinkProperties and meteredness for additional testing use cases. Bug: ? Test: Compiles. Test utility only. Change-Id: Idf6c3bcae2dea5e61c0418b72b889496919be8ba --- core/java/android/net/TestNetworkManager.java | 22 ++++++++++++++++- .../android/server/TestNetworkService.java | 24 +++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/core/java/android/net/TestNetworkManager.java b/core/java/android/net/TestNetworkManager.java index e274005eb9..4ac4a69e4b 100644 --- a/core/java/android/net/TestNetworkManager.java +++ b/core/java/android/net/TestNetworkManager.java @@ -53,6 +53,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 * @@ -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 40bf7bccff..d19d2ddd7c 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 { *

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);