Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit abc867b9 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN
Browse files

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
Change-Id: Ib5810dc3b589ffddc06507fb8be3066e09063a3c
parent 2f187305
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
}
+35 −3
Original line number Diff line number Diff line
@@ -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;
    }

    /**