diff options
author | Remi NGUYEN VAN <reminv@google.com> | 2020-05-29 22:09:13 +0000 |
---|---|---|
committer | Remi NGUYEN VAN <reminv@google.com> | 2020-06-01 01:56:45 +0000 |
commit | d44616a143669a0c940c92a717da3c602ba54525 (patch) | |
tree | 792217ee0fcf0df9ea0793ea36d51a01ff273f42 | |
parent | e443dd652fbbdfc95c7138ea4fe25a37fe242351 (diff) |
Validate test wifi/eth/bluetooth/mobile networks
While not all test networks created by TestNetworkManager should be
validated (because they can be used in self-contained tests that should
not see unexpected traffic, such as data usage tests), allowing
NetworkMonitor to validate test networks that intend to replicate actual
network management on the device is valuable for proper testing.
This change considers that a network that has both TRANSPORT_TEST and
another major transport type (wifi, ethernet, bluetooth, mobile) is
attempting to replicate actual network management on the device: this is
currently the case with EthernetManager#setIncludeTestInterfaces. In
such cases, have the system perform validation even if the network does
not have CAPABILITY_INTERNET.
Because TRANSPORT_TEST networks do not have CAPABILITY_INTERNET (as
expected from the network agent and enforced by ConnectivityService),
they still cannot become default networks, even if they gain
CAPABILITY_VALIDATED.
Bug: 156319532
Test: atest NetworkStackTests FrameworksNetTests CaptivePortalApiTest
Original-Change: https://android-review.googlesource.com/1317682
Merged-In: Ib5810dc3b589ffddc06507fb8be3066e09063a3c
Change-Id: Ib5810dc3b589ffddc06507fb8be3066e09063a3c
-rw-r--r-- | apishim/31/com/android/networkstack/apishim/ConstantsShim.java | 1 | ||||
-rw-r--r-- | common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java | 38 |
2 files changed, 36 insertions, 3 deletions
diff --git a/apishim/31/com/android/networkstack/apishim/ConstantsShim.java b/apishim/31/com/android/networkstack/apishim/ConstantsShim.java index 4bafe4c..0184845 100644 --- a/apishim/31/com/android/networkstack/apishim/ConstantsShim.java +++ b/apishim/31/com/android/networkstack/apishim/ConstantsShim.java @@ -31,6 +31,7 @@ public class ConstantsShim extends com.android.networkstack.apishim.api30.Consta @VisibleForTesting public static final int VERSION = 31; + // When removing this shim, the version in NetworkMonitorUtils should be removed too. // TODO: add TRANSPORT_TEST to system API in API 31 (it is only a test API as of R) public static final int TRANSPORT_TEST = 7; } diff --git a/common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java b/common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java index 8983d00..981a576 100644 --- a/common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java +++ b/common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java @@ -20,11 +20,21 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN; import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED; +import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH; +import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; +import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET; +import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import android.net.NetworkCapabilities; /** @hide */ public class NetworkMonitorUtils { + // This class is used by both NetworkMonitor and ConnectivityService, so it cannot use + // NetworkStack shims, but at the same time cannot use non-system APIs. + // TRANSPORT_TEST is test API as of R (so it is enforced to always be 7 and can't be changed), + // and it is being added as a system API in S. + // TODO: use NetworkCapabilities.TRANSPORT_TEST once NetworkStack builds against API 31. + private static final int TRANSPORT_TEST = 7; // Network conditions broadcast constants public static final String ACTION_NETWORK_CONDITIONS_MEASURED = @@ -47,11 +57,33 @@ public class NetworkMonitorUtils { * @param nc Network capabilities of the network to test. */ public static boolean isPrivateDnsValidationRequired(NetworkCapabilities nc) { + if (nc == null) return false; + // TODO: Consider requiring validation for DUN networks. - return nc != null - && nc.hasCapability(NET_CAPABILITY_INTERNET) + if (nc.hasCapability(NET_CAPABILITY_INTERNET) && nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED) - && nc.hasCapability(NET_CAPABILITY_TRUSTED); + && nc.hasCapability(NET_CAPABILITY_TRUSTED)) { + // Real networks + return true; + } + + // TODO: once TRANSPORT_TEST is @SystemApi in S and S SDK is stable (so constant shims can + // be replaced with the SDK constant that will be inlined), replace isTestNetwork with + // hasTransport(TRANSPORT_TEST) + + // Test networks that also have one of the major transport types are attempting to replicate + // that transport on a test interface (for example, test ethernet networks with + // EthernetManager#setIncludeTestInterfaces). Run validation on them for realistic tests. + // See also comments on EthernetManager#setIncludeTestInterfaces and on TestNetworkManager. + if (nc.hasTransport(TRANSPORT_TEST) && nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED) && ( + nc.hasTransport(TRANSPORT_WIFI) + || nc.hasTransport(TRANSPORT_CELLULAR) + || nc.hasTransport(TRANSPORT_BLUETOOTH) + || nc.hasTransport(TRANSPORT_ETHERNET))) { + return true; + } + + return false; } /** |