From 5a89f94096186302e1defc2ecd85356ed80cf777 Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Fri, 30 Mar 2018 21:17:42 +0900 Subject: [PATCH] Differentiate depleted and unset multipath quota NetworkPolicyManagerInternalImpl#getSubscriptionOpportunisticQuota would return 0 both for unset and depleted quota, which cannot be interpreted properly by MultipathPolicyTracker (the only caller), to use a fallback policy. Return OPPORTUNISTIC_QUOTA_UNKNOWN (-1) instead for unknown quota. Test: verified with CTS tests in ag/3811166 Bug: b/72631572 Bug: b/72877610 Change-Id: Ic087f7bfa9f10cc376b5ccd68a4685bd5242c586 --- .../connectivity/MultipathPolicyTracker.java | 3 ++- .../net/NetworkPolicyManagerService.java | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java index 296b9ac07b84e..4eb19306b4350 100644 --- a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java +++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java @@ -44,6 +44,7 @@ import android.util.Slog; import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.net.NetworkPolicyManagerInternal; +import com.android.server.net.NetworkPolicyManagerService; import com.android.server.net.NetworkStatsManagerInternal; import java.util.Calendar; @@ -191,7 +192,7 @@ public class MultipathPolicyTracker { .getSubscriptionOpportunisticQuota(this.network, QUOTA_TYPE_MULTIPATH); if (DBG) Slog.d(TAG, "Opportunistic quota from data plan: " + quota + " bytes"); - if (quota == 0) { + if (quota == NetworkPolicyManagerService.OPPORTUNISTIC_QUOTA_UNKNOWN) { // STOPSHIP: replace this with a configurable mechanism. quota = DEFAULT_DAILY_MULTIPATH_QUOTA; if (DBG) Slog.d(TAG, "Setting quota: " + quota + " bytes"); diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 8febecf0150d8..98dee35168fe2 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -274,6 +274,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final boolean LOGD = NetworkPolicyLogger.LOGD; private static final boolean LOGV = NetworkPolicyLogger.LOGV; + /** + * No opportunistic quota could be calculated from user data plan or data settings. + */ + public static final int OPPORTUNISTIC_QUOTA_UNKNOWN = -1; + private static final int VERSION_INIT = 1; private static final int VERSION_ADDED_SNOOZE = 2; private static final int VERSION_ADDED_RESTRICT_BACKGROUND = 3; @@ -1732,12 +1737,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId); if (plan == null) continue; - // By default assume we have no quota - long quotaBytes = 0; - + final long quotaBytes; final long limitBytes = plan.getDataLimitBytes(); if (limitBytes == SubscriptionPlan.BYTES_UNKNOWN) { - // Ignore missing limits + quotaBytes = OPPORTUNISTIC_QUOTA_UNKNOWN; } else if (limitBytes == SubscriptionPlan.BYTES_UNLIMITED) { // Unlimited data; let's use 20MiB/day (600MiB/month) quotaBytes = DataUnit.MEBIBYTES.toBytes(20); @@ -1751,9 +1754,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final long remainingBytes = limitBytes - totalBytes; final long remainingDays = Math.max(1, (end - mClock.millis()) / TimeUnit.DAYS.toMillis(1)); - if (remainingBytes > 0) { - quotaBytes = (remainingBytes / remainingDays) / 10; - } + + quotaBytes = Math.max(0, (remainingBytes / remainingDays) / 10); } mSubscriptionOpportunisticQuota.put(subId, quotaBytes); @@ -4658,7 +4660,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public long getSubscriptionOpportunisticQuota(Network network, int quotaType) { synchronized (mNetworkPoliciesSecondLock) { // TODO: handle splitting quota between use-cases - return mSubscriptionOpportunisticQuota.get(getSubIdLocked(network)); + return mSubscriptionOpportunisticQuota.get(getSubIdLocked(network), + OPPORTUNISTIC_QUOTA_UNKNOWN); } }