From 8a1b7e267875c1b5ce22259a01ce1178c72ee0db Mon Sep 17 00:00:00 2001 From: junyulai Date: Thu, 22 Oct 2020 16:41:47 +0800 Subject: [PATCH] [SP29.1] Simplify logic of calculating and applying data limit This is a no-op refactoring that is needed for accommodating follow-up change to send warning quota to hardware. Test: atest NetworkPolicyManagerServiceTest NetworkStatsServiceTest Bug: 149467454 Bug: 170699770 Bug: 170179169 Merged-In: I073934f3ac4d13b569ea3a295692c76451b7bbfa Change-Id: I073934f3ac4d13b569ea3a295692c76451b7bbfa (cherry-picked from ag/13982165) --- .../net/NetworkPolicyManagerService.java | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index ccece19699f10..f9b07efdd546d 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -2045,39 +2045,34 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final boolean hasWarning = policy.warningBytes != LIMIT_DISABLED; final boolean hasLimit = policy.limitBytes != LIMIT_DISABLED; - if (hasLimit || policy.metered) { - final long quotaBytes; - if (hasLimit && policy.hasCycle()) { - final Pair cycle = NetworkPolicyManager - .cycleIterator(policy).next(); - final long start = cycle.first.toInstant().toEpochMilli(); - final long end = cycle.second.toInstant().toEpochMilli(); - final long totalBytes = getTotalBytes(policy.template, start, end); + long limitBytes = Long.MAX_VALUE; + if (hasLimit && policy.hasCycle()) { + final Pair cycle = NetworkPolicyManager + .cycleIterator(policy).next(); + final long start = cycle.first.toInstant().toEpochMilli(); + final long end = cycle.second.toInstant().toEpochMilli(); + final long totalBytes = getTotalBytes(policy.template, start, end); - if (policy.lastLimitSnooze >= start) { - // snoozing past quota, but we still need to restrict apps, - // so push really high quota. - quotaBytes = Long.MAX_VALUE; - } else { - // remaining "quota" bytes are based on total usage in - // current cycle. kernel doesn't like 0-byte rules, so we - // set 1-byte quota and disable the radio later. - quotaBytes = Math.max(1, policy.limitBytes - totalBytes); - } - } else { - // metered network, but no policy limit; we still need to - // restrict apps, so push really high quota. - quotaBytes = Long.MAX_VALUE; + if (policy.lastLimitSnooze < start) { + // remaining "quota" bytes are based on total usage in + // current cycle. kernel doesn't like 0-byte rules, so we + // set 1-byte quota and disable the radio later. + limitBytes = Math.max(1, policy.limitBytes - totalBytes); } + } + if (hasLimit || policy.metered) { if (matchingIfaces.size() > 1) { // TODO: switch to shared quota once NMS supports Slog.w(TAG, "shared quota unsupported; generating rule for each iface"); } + // Set the interface limit. For interfaces which has no cycle, or metered with + // no policy limit, or snoozed limit notification; we still need to put iptables + // rule hooks to restrict apps for data saver, so push really high quota. for (int j = matchingIfaces.size() - 1; j >= 0; j--) { final String iface = matchingIfaces.valueAt(j); - setInterfaceQuotaAsync(iface, quotaBytes); + setInterfaceQuotaAsync(iface, limitBytes); newMeteredIfaces.add(iface); } }