diff options
| author | 2021-01-28 15:32:40 +0000 | |
|---|---|---|
| committer | 2021-01-28 15:32:40 +0000 | |
| commit | 784c32ea9cc196cec9372e2456e27d681b1fc044 (patch) | |
| tree | eb1f288f58b226558ae96b8a14ba7994df579c09 | |
| parent | a808239c7983ebe13b9290cb0465911c3ad1e7b6 (diff) | |
| parent | 26c41600a4ed555ee02163449a51b5936b6ac227 (diff) | |
Merge "[VCN01] Add NOT_VCN_MANAGED capability" am: ce07556044 am: 6373b3b084 am: 8062b53a7c am: 26c41600a4
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1549897
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: Iacb5534f6481bc37c5a607600382e6373c507a80
3 files changed, 82 insertions, 33 deletions
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 0a895b98f9fd..3843b9ab93c2 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -204,6 +204,7 @@ public final class NetworkCapabilities implements Parcelable {              NET_CAPABILITY_TEMPORARILY_NOT_METERED,              NET_CAPABILITY_OEM_PRIVATE,              NET_CAPABILITY_VEHICLE_INTERNAL, +            NET_CAPABILITY_NOT_VCN_MANAGED,      })      public @interface NetCapability { } @@ -399,8 +400,16 @@ public final class NetworkCapabilities implements Parcelable {      @SystemApi      public static final int NET_CAPABILITY_VEHICLE_INTERNAL = 27; +    /** +     * Indicates that this network is not managed by a Virtual Carrier Network (VCN). +     * +     * TODO(b/177299683): Add additional clarifying javadoc. +     * @hide +     */ +    public static final int NET_CAPABILITY_NOT_VCN_MANAGED = 28; +      private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS; -    private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_VEHICLE_INTERNAL; +    private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_NOT_VCN_MANAGED;      /**       * Network capabilities that are expected to be mutable, i.e., can change while a particular @@ -417,7 +426,8 @@ public final class NetworkCapabilities implements Parcelable {              | (1 << NET_CAPABILITY_NOT_CONGESTED)              | (1 << NET_CAPABILITY_NOT_SUSPENDED)              | (1 << NET_CAPABILITY_PARTIAL_CONNECTIVITY) -            | (1 << NET_CAPABILITY_TEMPORARILY_NOT_METERED); +            | (1 << NET_CAPABILITY_TEMPORARILY_NOT_METERED) +            | (1 << NET_CAPABILITY_NOT_VCN_MANAGED);      /**       * Network capabilities that are not allowed in NetworkRequests. This exists because the @@ -426,16 +436,21 @@ public final class NetworkCapabilities implements Parcelable {       * can get into a cycle where the NetworkFactory endlessly churns out NetworkAgents that then       * get immediately torn down because they do not have the requested capability.       */ +    // Note that as a historical exception, the TRUSTED and NOT_VCN_MANAGED capabilities +    // are mutable but requestable. Factories are responsible for not getting +    // in an infinite loop about these.      private static final long NON_REQUESTABLE_CAPABILITIES = -            MUTABLE_CAPABILITIES & ~(1 << NET_CAPABILITY_TRUSTED); +            MUTABLE_CAPABILITIES +            & ~(1 << NET_CAPABILITY_TRUSTED) +            & ~(1 << NET_CAPABILITY_NOT_VCN_MANAGED);      /**       * Capabilities that are set by default when the object is constructed.       */      private static final long DEFAULT_CAPABILITIES = -            (1 << NET_CAPABILITY_NOT_RESTRICTED) | -            (1 << NET_CAPABILITY_TRUSTED) | -            (1 << NET_CAPABILITY_NOT_VPN); +            (1 << NET_CAPABILITY_NOT_RESTRICTED) +            | (1 << NET_CAPABILITY_TRUSTED) +            | (1 << NET_CAPABILITY_NOT_VPN);      /**       * Capabilities that suggest that a network is restricted. @@ -495,7 +510,8 @@ public final class NetworkCapabilities implements Parcelable {              | (1 << NET_CAPABILITY_NOT_VPN)              | (1 << NET_CAPABILITY_NOT_ROAMING)              | (1 << NET_CAPABILITY_NOT_CONGESTED) -            | (1 << NET_CAPABILITY_NOT_SUSPENDED); +            | (1 << NET_CAPABILITY_NOT_SUSPENDED) +            | (1 << NET_CAPABILITY_NOT_VCN_MANAGED);      /**       * Adds the given capability to this {@code NetworkCapability} instance. @@ -1982,6 +1998,7 @@ public final class NetworkCapabilities implements Parcelable {              case NET_CAPABILITY_TEMPORARILY_NOT_METERED:    return "TEMPORARILY_NOT_METERED";              case NET_CAPABILITY_OEM_PRIVATE:          return "OEM_PRIVATE";              case NET_CAPABILITY_VEHICLE_INTERNAL:     return "NET_CAPABILITY_VEHICLE_INTERNAL"; +            case NET_CAPABILITY_NOT_VCN_MANAGED:      return "NOT_VCN_MANAGED";              default:                                  return Integer.toString(capability);          }      } diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java index e8687e57a07b..a08d066513c7 100644 --- a/services/core/java/com/android/server/TestNetworkService.java +++ b/services/core/java/com/android/server/TestNetworkService.java @@ -242,6 +242,7 @@ class TestNetworkService extends ITestNetworkManager.Stub {          nc.addTransportType(NetworkCapabilities.TRANSPORT_TEST);          nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);          nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); +        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);          nc.setNetworkSpecifier(new StringNetworkSpecifier(iface));          nc.setAdministratorUids(administratorUids);          if (!isMetered) { diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 88aab56bbafe..137543a8147c 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -64,6 +64,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;  import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;  import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;  import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED; +import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED;  import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;  import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;  import static android.net.NetworkCapabilities.NET_CAPABILITY_RCS; @@ -7326,36 +7327,66 @@ public class ConnectivityServiceTest {          b2.expectBroadcast();      } +    /** +     * Test mutable and requestable network capabilities such as +     * {@link NetworkCapabilities#NET_CAPABILITY_TRUSTED} and +     * {@link NetworkCapabilities#NET_CAPABILITY_NOT_VCN_MANAGED}. Verify that the +     * {@code ConnectivityService} re-assign the networks accordingly. +     */      @Test -    public final void testLoseTrusted() throws Exception { -        final NetworkRequest trustedRequest = new NetworkRequest.Builder() -                .addCapability(NET_CAPABILITY_TRUSTED) -                .build(); -        final TestNetworkCallback trustedCallback = new TestNetworkCallback(); -        mCm.requestNetwork(trustedRequest, trustedCallback); - -        mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); -        mCellNetworkAgent.connect(true); -        trustedCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); -        verify(mMockNetd).networkSetDefault(eq(mCellNetworkAgent.getNetwork().netId)); -        reset(mMockNetd); - -        mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); -        mWiFiNetworkAgent.connect(true); -        trustedCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); -        verify(mMockNetd).networkSetDefault(eq(mWiFiNetworkAgent.getNetwork().netId)); -        reset(mMockNetd); +    public final void testLoseMutableAndRequestableCaps() throws Exception { +        final int[] testCaps = new int [] { +                NET_CAPABILITY_TRUSTED, +                NET_CAPABILITY_NOT_VCN_MANAGED +        }; +        for (final int testCap : testCaps) { +            // Create requests with and without the testing capability. +            final TestNetworkCallback callbackWithCap = new TestNetworkCallback(); +            final TestNetworkCallback callbackWithoutCap = new TestNetworkCallback(); +            mCm.requestNetwork(new NetworkRequest.Builder().addCapability(testCap).build(), +                    callbackWithCap); +            mCm.requestNetwork(new NetworkRequest.Builder().removeCapability(testCap).build(), +                    callbackWithoutCap); + +            // Setup networks with testing capability and verify the default network changes. +            mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); +            mCellNetworkAgent.addCapability(testCap); +            mCellNetworkAgent.connect(true); +            callbackWithCap.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); +            callbackWithoutCap.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); +            verify(mMockNetd).networkSetDefault(eq(mCellNetworkAgent.getNetwork().netId)); +            reset(mMockNetd); -        mWiFiNetworkAgent.removeCapability(NET_CAPABILITY_TRUSTED); -        trustedCallback.expectAvailableCallbacksValidated(mCellNetworkAgent); -        verify(mMockNetd).networkSetDefault(eq(mCellNetworkAgent.getNetwork().netId)); -        reset(mMockNetd); +            mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); +            mWiFiNetworkAgent.addCapability(testCap); +            mWiFiNetworkAgent.connect(true); +            callbackWithCap.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); +            callbackWithoutCap.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); +            verify(mMockNetd).networkSetDefault(eq(mWiFiNetworkAgent.getNetwork().netId)); +            reset(mMockNetd); + +            // Remove the testing capability on wifi, verify the callback and default network +            // changes back to cellular. +            mWiFiNetworkAgent.removeCapability(testCap); +            callbackWithCap.expectAvailableCallbacksValidated(mCellNetworkAgent); +            callbackWithoutCap.expectCapabilitiesWithout(testCap, mWiFiNetworkAgent); +            // TODO: Test default network changes for NOT_VCN_MANAGED once the default request has +            //  it. +            if (testCap == NET_CAPABILITY_TRUSTED) { +                verify(mMockNetd).networkSetDefault(eq(mCellNetworkAgent.getNetwork().netId)); +                reset(mMockNetd); +            } -        mCellNetworkAgent.removeCapability(NET_CAPABILITY_TRUSTED); -        trustedCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); -        verify(mMockNetd).networkClearDefault(); +            mCellNetworkAgent.removeCapability(testCap); +            callbackWithCap.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); +            callbackWithoutCap.assertNoCallback(); +            if (testCap == NET_CAPABILITY_TRUSTED) { +                verify(mMockNetd).networkClearDefault(); +            } -        mCm.unregisterNetworkCallback(trustedCallback); +            mCm.unregisterNetworkCallback(callbackWithCap); +            mCm.unregisterNetworkCallback(callbackWithoutCap); +        }      }      @Test  |