From 2225648d47a5936a42cfb644641709afc96552f8 Mon Sep 17 00:00:00 2001 From: Cody Kesting Date: Mon, 3 May 2021 15:18:08 -0700 Subject: [PATCH 1/2] Notify policy listeners when VCN subIds change. This CL updates VcnManagementService to notify policy listeners when the subIds for any VCN instances change. This is necessary to ensure that NetworkFactories properly update their Networks in the event that a Network comes up under an existing VCN are properly marked as VCN-managed. Bug: 187112989 Test: atest FrameworksVcnTests CtsVcnTestCases Change-Id: Iecab1226119c8fd876131c381647267f18339db2 --- .../android/server/VcnManagementService.java | 20 +++++++++++++++ .../server/VcnManagementServiceTest.java | 25 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index 45eb77453dbd9..29c26e0158034 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -87,6 +87,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -431,6 +432,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { public void onNewSnapshot(@NonNull TelephonySubscriptionSnapshot snapshot) { // Startup VCN instances synchronized (mLock) { + final TelephonySubscriptionSnapshot oldSnapshot = mLastSnapshot; mLastSnapshot = snapshot; // Start any VCN instances as necessary @@ -478,10 +480,28 @@ public class VcnManagementService extends IVcnManagementService.Stub { entry.getValue().updateSubscriptionSnapshot(mLastSnapshot); } } + + final Map> oldSubGrpMappings = + getSubGroupToSubIdMappings(oldSnapshot); + final Map> currSubGrpMappings = + getSubGroupToSubIdMappings(mLastSnapshot); + if (!currSubGrpMappings.equals(oldSubGrpMappings)) { + notifyAllPolicyListenersLocked(); + } } } } + @GuardedBy("mLock") + private Map> getSubGroupToSubIdMappings( + @NonNull TelephonySubscriptionSnapshot snapshot) { + final Map> subGrpMappings = new ArrayMap<>(); + for (ParcelUuid subGrp : mVcns.keySet()) { + subGrpMappings.put(subGrp, snapshot.getAllSubIdsInGroup(subGrp)); + } + return subGrpMappings; + } + @GuardedBy("mLock") private void stopVcnLocked(@NonNull ParcelUuid uuidToTeardown) { final Vcn vcnToTeardown = mVcns.remove(uuidToTeardown); diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java index aa4b5f8e208fc..9ecd82ff6bcbb 100644 --- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java +++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java @@ -77,6 +77,7 @@ import android.os.test.TestLooper; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.util.ArraySet; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -98,6 +99,7 @@ import java.io.FileNotFoundException; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; @@ -326,6 +328,17 @@ public class VcnManagementServiceTest { return subIdToGroupMap.get(invocation.getArgument(0)); }).when(snapshot).getGroupForSubId(anyInt()); + doAnswer(invocation -> { + final ParcelUuid subGrp = invocation.getArgument(0); + final Set subIds = new ArraySet<>(); + for (Entry entry : subIdToGroupMap.entrySet()) { + if (entry.getValue().equals(subGrp)) { + subIds.add(entry.getKey()); + } + } + return subIds; + }).when(snapshot).getAllSubIdsInGroup(any()); + final TelephonySubscriptionTrackerCallback cb = getTelephonySubscriptionTrackerCallback(); cb.onNewSnapshot(snapshot); @@ -914,6 +927,18 @@ public class VcnManagementServiceTest { verify(mMockPolicyListener).onPolicyChanged(); } + @Test + public void testVcnSubIdChangeUpdatesPolicyListener() throws Exception { + startAndGetVcnInstance(TEST_UUID_2); + mVcnMgmtSvc.addVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); + + triggerSubscriptionTrackerCbAndGetSnapshot( + Collections.singleton(TEST_UUID_2), + Collections.singletonMap(TEST_SUBSCRIPTION_ID, TEST_UUID_2)); + + verify(mMockPolicyListener).onPolicyChanged(); + } + private void triggerVcnSafeMode( @NonNull ParcelUuid subGroup, @NonNull TelephonySubscriptionSnapshot snapshot, From 5b021003ac33c2555c3b155c38d3b9419acc3c1a Mon Sep 17 00:00:00 2001 From: Cody Kesting Date: Tue, 4 May 2021 16:54:45 -0700 Subject: [PATCH 2/2] Set NOT_VCN_MANAGED capability for Networks in VcnMgmtSvc. This CL updates VcnManagementService to set the NOT_VCN_MANAGED bit for Networks that are not VCN-managed. This ensures that Networks correctly regain the NOT_VCN_MANAGED bit after leaving a VCN. Bug: Test: atest FrameworksVcnTests CtsVcnTestCases Change-Id: I01ffdde246e602296673675add58c47c92b15994 --- services/core/java/com/android/server/VcnManagementService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index 29c26e0158034..471d2af2784f4 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -835,6 +835,8 @@ public class VcnManagementService extends IVcnManagementService.Stub { if (isVcnManagedNetwork) { ncBuilder.removeCapability( NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); + } else { + ncBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); } if (isRestrictedCarrierWifi) {