diff options
5 files changed, 65 insertions, 84 deletions
diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java index 123c55c27d1c..d7e18573819a 100644 --- a/core/java/android/net/NetworkPolicy.java +++ b/core/java/android/net/NetworkPolicy.java @@ -23,7 +23,6 @@ import static android.net.NetworkTemplate.MATCH_CARRIER; import static android.net.NetworkTemplate.MATCH_ETHERNET; import static android.net.NetworkTemplate.MATCH_MOBILE; import static android.net.NetworkTemplate.MATCH_WIFI; -import static android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT; import android.annotation.NonNull; import android.annotation.Nullable; @@ -45,6 +44,7 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Iterator; import java.util.Objects; +import java.util.Set; /** * Policy for networks matching a {@link NetworkTemplate}, including usage cycle @@ -62,15 +62,16 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { * Initial Version of the NetworkTemplate backup serializer. */ private static final int TEMPLATE_BACKUP_VERSION_1_INIT = 1; + private static final int TEMPLATE_BACKUP_VERSION_2_UNSUPPORTED = 2; /** * Version of the NetworkTemplate backup serializer that added carrier template support. */ - private static final int TEMPLATE_BACKUP_VERSION_2_SUPPORT_CARRIER_TEMPLATE = 2; + private static final int TEMPLATE_BACKUP_VERSION_3_SUPPORT_CARRIER_TEMPLATE = 3; /** * Latest Version of the NetworkTemplate Backup Serializer. */ private static final int TEMPLATE_BACKUP_VERSION_LATEST = - TEMPLATE_BACKUP_VERSION_2_SUPPORT_CARRIER_TEMPLATE; + TEMPLATE_BACKUP_VERSION_3_SUPPORT_CARRIER_TEMPLATE; public static final int CYCLE_NONE = -1; public static final long WARNING_DISABLED = -1; @@ -337,10 +338,9 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { out.writeInt(TEMPLATE_BACKUP_VERSION_LATEST); out.writeInt(template.getMatchRule()); - BackupUtils.writeString(out, template.getSubscriberId()); - BackupUtils.writeString(out, template.getNetworkId()); + BackupUtils.writeString(out, template.getSubscriberIds().iterator().next()); + BackupUtils.writeString(out, template.getWifiNetworkKey()); out.writeInt(template.getMeteredness()); - out.writeInt(template.getSubscriberIdMatchRule()); return baos.toByteArray(); } @@ -349,33 +349,32 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { private static NetworkTemplate getNetworkTemplateFromBackup(DataInputStream in) throws IOException, BackupUtils.BadVersionException { int version = in.readInt(); - if (version < TEMPLATE_BACKUP_VERSION_1_INIT || version > TEMPLATE_BACKUP_VERSION_LATEST) { + if (version < TEMPLATE_BACKUP_VERSION_1_INIT || version > TEMPLATE_BACKUP_VERSION_LATEST + || version == TEMPLATE_BACKUP_VERSION_2_UNSUPPORTED) { throw new BackupUtils.BadVersionException("Unknown Backup Serialization Version"); } int matchRule = in.readInt(); final String subscriberId = BackupUtils.readString(in); - final String networkId = BackupUtils.readString(in); + final String wifiNetworkKey = BackupUtils.readString(in); final int metered; - final int subscriberIdMatchRule; - if (version >= TEMPLATE_BACKUP_VERSION_2_SUPPORT_CARRIER_TEMPLATE) { + if (version >= TEMPLATE_BACKUP_VERSION_3_SUPPORT_CARRIER_TEMPLATE) { metered = in.readInt(); - subscriberIdMatchRule = in.readInt(); } else { // For backward compatibility, fill the missing filters from match rules. - metered = (matchRule == MATCH_MOBILE - || matchRule == NetworkTemplate.MATCH_MOBILE_WILDCARD - || matchRule == MATCH_CARRIER) ? METERED_YES : METERED_ALL; - subscriberIdMatchRule = SUBSCRIBER_ID_MATCH_RULE_EXACT; + metered = (matchRule == MATCH_MOBILE || matchRule == MATCH_CARRIER) + ? METERED_YES : METERED_ALL; } try { - return new NetworkTemplate(matchRule, - subscriberId, new String[]{subscriberId}, - networkId, metered, NetworkStats.ROAMING_ALL, - NetworkStats.DEFAULT_NETWORK_ALL, NetworkTemplate.NETWORK_TYPE_ALL, - NetworkTemplate.OEM_MANAGED_ALL, subscriberIdMatchRule); + final NetworkTemplate.Builder builder = new NetworkTemplate.Builder(matchRule) + .setWifiNetworkKey(wifiNetworkKey) + .setMeteredness(metered); + if (subscriberId != null) { + builder.setSubscriberIds(Set.of(subscriberId)); + } + return builder.build(); } catch (IllegalArgumentException e) { throw new BackupUtils.BadVersionException( "Restored network template contains unknown match rule " + matchRule, e); diff --git a/packages/ConnectivityT/framework-t/src/android/net/NetworkTemplate.java b/packages/ConnectivityT/framework-t/src/android/net/NetworkTemplate.java index d85291318fa4..5da8e259d09d 100644 --- a/packages/ConnectivityT/framework-t/src/android/net/NetworkTemplate.java +++ b/packages/ConnectivityT/framework-t/src/android/net/NetworkTemplate.java @@ -51,6 +51,7 @@ import android.util.ArraySet; import com.android.internal.util.ArrayUtils; import com.android.net.module.util.NetworkIdentityUtils; +import com.android.net.module.util.NetworkStatsUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -114,27 +115,6 @@ public final class NetworkTemplate implements Parcelable { */ public static final int MATCH_CARRIER = 10; - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(prefix = { "SUBSCRIBER_ID_MATCH_RULE_" }, value = { - SUBSCRIBER_ID_MATCH_RULE_EXACT, - SUBSCRIBER_ID_MATCH_RULE_ALL - }) - public @interface SubscriberIdMatchRule{} - /** - * Value of the match rule of the subscriberId to match networks with specific subscriberId. - * - * @hide - */ - public static final int SUBSCRIBER_ID_MATCH_RULE_EXACT = 0; - /** - * Value of the match rule of the subscriberId to match networks with any subscriberId which - * includes null and non-null. - * - * @hide - */ - public static final int SUBSCRIBER_ID_MATCH_RULE_ALL = 1; - // TODO: Remove this and replace all callers with WIFI_NETWORK_KEY_ALL. /** @hide */ public static final String WIFI_NETWORKID_ALL = null; @@ -235,11 +215,11 @@ public final class NetworkTemplate implements Parcelable { if (TextUtils.isEmpty(subscriberId)) { return new NetworkTemplate(MATCH_MOBILE_WILDCARD, null, null, null, metered, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL, - SUBSCRIBER_ID_MATCH_RULE_EXACT); + NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT); } return new NetworkTemplate(MATCH_MOBILE, subscriberId, new String[]{subscriberId}, null, metered, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL, - SUBSCRIBER_ID_MATCH_RULE_EXACT); + NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT); } /** @@ -285,7 +265,7 @@ public final class NetworkTemplate implements Parcelable { new String[] { null } /* matchSubscriberIds */, networkId, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, - SUBSCRIBER_ID_MATCH_RULE_ALL); + NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL); } /** @@ -302,7 +282,7 @@ public final class NetworkTemplate implements Parcelable { return new NetworkTemplate(MATCH_WIFI, subscriberId, new String[] { subscriberId }, networkId, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, - SUBSCRIBER_ID_MATCH_RULE_EXACT); + NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT); } /** @@ -346,7 +326,7 @@ public final class NetworkTemplate implements Parcelable { return new NetworkTemplate(MATCH_CARRIER, subscriberId, new String[] { subscriberId }, null /* networkId */, METERED_YES, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, - SUBSCRIBER_ID_MATCH_RULE_EXACT); + NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT); } private final int mMatchRule; @@ -384,7 +364,7 @@ public final class NetworkTemplate implements Parcelable { case MATCH_MOBILE: case MATCH_CARRIER: // MOBILE and CARRIER templates must always specify a subscriber ID. - if (subscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL) { + if (subscriberIdMatchRule == NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL) { throw new IllegalArgumentException("Invalid SubscriberIdMatchRule " + "on match rule: " + getMatchRuleName(matchRule)); } @@ -411,7 +391,7 @@ public final class NetworkTemplate implements Parcelable { this(matchRule, subscriberId, matchSubscriberIds, networkId, (matchRule == MATCH_MOBILE || matchRule == MATCH_MOBILE_WILDCARD) ? METERED_YES : METERED_ALL , ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, - OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT); + OEM_MANAGED_ALL, NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT); } /** @hide */ @@ -420,7 +400,8 @@ public final class NetworkTemplate implements Parcelable { String networkId, int metered, int roaming, int defaultNetwork, int subType, int oemManaged) { this(matchRule, subscriberId, matchSubscriberIds, networkId, metered, roaming, - defaultNetwork, subType, oemManaged, SUBSCRIBER_ID_MATCH_RULE_EXACT); + defaultNetwork, subType, oemManaged, + NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT); } /** @hide */ @@ -539,9 +520,9 @@ public final class NetworkTemplate implements Parcelable { private static String subscriberIdMatchRuleToString(int rule) { switch (rule) { - case SUBSCRIBER_ID_MATCH_RULE_EXACT: + case NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT: return "EXACT_MATCH"; - case SUBSCRIBER_ID_MATCH_RULE_ALL: + case NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL: return "ALL"; default: return "Unknown rule " + rule; @@ -609,15 +590,6 @@ public final class NetworkTemplate implements Parcelable { } /** - * Get Subscriber Id Match Rule of the template. - * - * @hide - */ - public int getSubscriberIdMatchRule() { - return mSubscriberIdMatchRule; - } - - /** * Get meteredness filter of the template. */ @NetworkStats.Meteredness @@ -730,7 +702,7 @@ public final class NetworkTemplate implements Parcelable { * @hide */ public boolean matchesSubscriberId(@Nullable String subscriberId) { - return mSubscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL + return mSubscriberIdMatchRule == NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL || ArrayUtils.contains(mMatchSubscriberIds, subscriberId); } @@ -1176,7 +1148,8 @@ public final class NetworkTemplate implements Parcelable { public NetworkTemplate build() { assertRequestableParameters(); final int subscriberIdMatchRule = mMatchSubscriberIds.isEmpty() - ? SUBSCRIBER_ID_MATCH_RULE_ALL : SUBSCRIBER_ID_MATCH_RULE_EXACT; + ? NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL + : NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT; return new NetworkTemplate(getWildcardDeducedMatchRule(), mMatchSubscriberIds.isEmpty() ? null : mMatchSubscriberIds.iterator().next(), mMatchSubscriberIds.toArray(new String[0]), diff --git a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java index a56a8ea993f0..72e900bbad18 100644 --- a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java +++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java @@ -25,9 +25,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkPolicy.LIMIT_DISABLED; import static android.net.NetworkPolicy.WARNING_DISABLED; -import static android.net.NetworkTemplate.NETWORK_TYPE_ALL; import static android.net.NetworkTemplate.OEM_MANAGED_ALL; -import static android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT; import static android.provider.Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; @@ -77,6 +75,8 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @@ -224,12 +224,13 @@ public class MultipathPolicyTracker { "Can't get TelephonyManager for subId %d", subId)); } - subscriberId = tele.getSubscriberId(); - mNetworkTemplate = new NetworkTemplate( - NetworkTemplate.MATCH_MOBILE, subscriberId, new String[] { subscriberId }, - null, NetworkStats.METERED_YES, NetworkStats.ROAMING_ALL, - NetworkStats.DEFAULT_NETWORK_NO, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, - SUBSCRIBER_ID_MATCH_RULE_EXACT); + subscriberId = Objects.requireNonNull(tele.getSubscriberId(), + "Null subscriber Id for subId " + subId); + mNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE) + .setSubscriberIds(Set.of(subscriberId)) + .setMeteredness(NetworkStats.METERED_YES) + .setDefaultNetworkStatus(NetworkStats.DEFAULT_NETWORK_NO) + .build(); mUsageCallback = new UsageCallback() { @Override public void onThresholdReached(int networkType, String subscriberId) { diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index dee69e02b371..c315b5c43dea 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -255,6 +255,7 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.StatLogger; import com.android.internal.util.XmlUtils; import com.android.net.module.util.NetworkIdentityUtils; +import com.android.net.module.util.NetworkStatsUtils; import com.android.net.module.util.PermissionUtils; import com.android.server.EventLogTags; import com.android.server.LocalServices; @@ -2388,7 +2389,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { templateMeteredness = readIntAttribute(in, ATTR_TEMPLATE_METERED); } else { - subscriberIdMatchRule = NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT; + subscriberIdMatchRule = + NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT; if (templateType == MATCH_MOBILE) { Log.d(TAG, "Update template match rule from mobile to carrier and" + " force to metered"); @@ -2451,11 +2453,17 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { inferred = false; } - final NetworkTemplate template = new NetworkTemplate(templateType, - subscriberId, new String[] { subscriberId }, - networkId, templateMeteredness, NetworkStats.ROAMING_ALL, - NetworkStats.DEFAULT_NETWORK_ALL, NetworkTemplate.NETWORK_TYPE_ALL, - NetworkTemplate.OEM_MANAGED_ALL, subscriberIdMatchRule); + final NetworkTemplate.Builder builder = + new NetworkTemplate.Builder(templateType) + .setWifiNetworkKey(networkId) + .setMeteredness(templateMeteredness); + if (subscriberIdMatchRule + == NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT) { + final ArraySet<String> ids = new ArraySet<>(); + ids.add(subscriberId); + builder.setSubscriberIds(ids); + } + final NetworkTemplate template = builder.build(); if (NetworkPolicy.isTemplatePersistable(template)) { mNetworkPolicy.put(template, new NetworkPolicy(template, cycleRule, warningBytes, limitBytes, lastWarningSnooze, @@ -2671,8 +2679,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (subscriberId != null) { out.attribute(null, ATTR_SUBSCRIBER_ID, subscriberId); } - writeIntAttribute(out, ATTR_SUBSCRIBER_ID_MATCH_RULE, - template.getSubscriberIdMatchRule()); + final int subscriberIdMatchRule = template.getSubscriberIds().isEmpty() + ? NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL + : NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT; + writeIntAttribute(out, ATTR_SUBSCRIBER_ID_MATCH_RULE, subscriberIdMatchRule); final String networkId = template.getNetworkId(); if (networkId != null) { out.attribute(null, ATTR_NETWORK_ID, networkId); diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index 70641c2938a7..eda05bf3f214 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -1986,9 +1986,8 @@ public class NetworkPolicyManagerServiceTest { assertEquals("Unexpected template match rule in network policies", NetworkTemplate.MATCH_CARRIER, actualPolicy.template.getMatchRule()); - assertEquals("Unexpected subscriberId match rule in network policies", - NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT, - actualPolicy.template.getSubscriberIdMatchRule()); + assertTrue("Unexpected subscriberIds size in network policies", + actualPolicy.template.getSubscriberIds().size() > 0); assertEquals("Unexpected template meteredness in network policies", METERED_YES, actualPolicy.template.getMeteredness()); } @@ -2003,9 +2002,8 @@ public class NetworkPolicyManagerServiceTest { assertEquals("Unexpected template match rule in network policies", NetworkTemplate.MATCH_WIFI, actualPolicy.template.getMatchRule()); - assertEquals("Unexpected subscriberId match rule in network policies", - NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_ALL, - actualPolicy.template.getSubscriberIdMatchRule()); + assertEquals("Unexpected subscriberIds size in network policies", + actualPolicy.template.getSubscriberIds().size(), 0); assertEquals("Unexpected template meteredness in network policies", METERED_NO, actualPolicy.template.getMeteredness()); } |