121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey/* 221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project 321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * 421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * you may not use this file except in compliance with the License. 621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * You may obtain a copy of the License at 721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * 821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * 1021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 1121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 1221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * See the License for the specific language governing permissions and 1421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * limitations under the License. 1521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey */ 1621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 1721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeypackage android.net; 1821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 191b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static com.android.internal.util.Preconditions.checkNotNull; 201b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 2121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.os.Parcel; 2221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.os.Parcelable; 2321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 2441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkeyimport com.android.internal.util.Objects; 2541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 2621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey/** 271b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Policy for networks matching a {@link NetworkTemplate}, including usage cycle 281b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * and limits to be enforced. 2921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * 3021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * @hide 3121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey */ 3221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeypublic class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { 338fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey public static final int CYCLE_NONE = -1; 341b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public static final long WARNING_DISABLED = -1; 351b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public static final long LIMIT_DISABLED = -1; 3641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public static final long SNOOZE_NEVER = -1; 371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 381b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public final NetworkTemplate template; 3922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey public int cycleDay; 409bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public String cycleTimezone; 4122c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey public long warningBytes; 4222c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey public long limitBytes; 430e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public long lastWarningSnooze; 440e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public long lastLimitSnooze; 45f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey public boolean metered; 46837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey public boolean inferred; 4721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 4850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey private static final long DEFAULT_MTU = 1500; 4950e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey 50837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey @Deprecated 519bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, 529bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey long warningBytes, long limitBytes, boolean metered) { 539bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey this(template, cycleDay, cycleTimezone, warningBytes, limitBytes, SNOOZE_NEVER, 54837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey SNOOZE_NEVER, metered, false); 550e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 560e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 579bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, 589bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze, 59837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey boolean metered, boolean inferred) { 601b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey this.template = checkNotNull(template, "missing NetworkTemplate"); 6121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.cycleDay = cycleDay; 629bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey this.cycleTimezone = checkNotNull(cycleTimezone, "missing cycleTimezone"); 6321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.warningBytes = warningBytes; 6421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.limitBytes = limitBytes; 650e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey this.lastWarningSnooze = lastWarningSnooze; 660e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey this.lastLimitSnooze = lastLimitSnooze; 67f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey this.metered = metered; 68837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey this.inferred = inferred; 6921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 7021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 7121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy(Parcel in) { 721b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey template = in.readParcelable(null); 7321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey cycleDay = in.readInt(); 749bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey cycleTimezone = in.readString(); 7521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey warningBytes = in.readLong(); 7621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey limitBytes = in.readLong(); 770e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastWarningSnooze = in.readLong(); 780e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastLimitSnooze = in.readLong(); 79f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey metered = in.readInt() != 0; 80837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey inferred = in.readInt() != 0; 8121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 8221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 839bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 8421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 851b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey dest.writeParcelable(template, flags); 8621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeInt(cycleDay); 879bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey dest.writeString(cycleTimezone); 8821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeLong(warningBytes); 8921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeLong(limitBytes); 900e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey dest.writeLong(lastWarningSnooze); 910e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey dest.writeLong(lastLimitSnooze); 92f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey dest.writeInt(metered ? 1 : 0); 93837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey dest.writeInt(inferred ? 1 : 0); 9421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 9521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 969bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 9721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public int describeContents() { 9821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return 0; 9921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 10021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 10150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey /** 1020e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey * Test if given measurement is over {@link #warningBytes}. 1030e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey */ 1040e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public boolean isOverWarning(long totalBytes) { 1050e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey return warningBytes != WARNING_DISABLED && totalBytes >= warningBytes; 1060e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 1070e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 1080e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey /** 10950e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey * Test if given measurement is near enough to {@link #limitBytes} to be 11050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey * considered over-limit. 11150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey */ 11250e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey public boolean isOverLimit(long totalBytes) { 11350e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey // over-estimate, since kernel will trigger limit once first packet 11450e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey // trips over limit. 11550e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey totalBytes += 2 * DEFAULT_MTU; 11650e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey return limitBytes != LIMIT_DISABLED && totalBytes >= limitBytes; 11750e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey } 11850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey 1190e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey /** 1200e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey * Clear any existing snooze values, setting to {@link #SNOOZE_NEVER}. 1210e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey */ 1220e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public void clearSnooze() { 1230e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastWarningSnooze = SNOOZE_NEVER; 1240e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastLimitSnooze = SNOOZE_NEVER; 1250e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 1260e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 1278fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey /** 1288fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey * Test if this policy has a cycle defined, after which usage should reset. 1298fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey */ 1308fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey public boolean hasCycle() { 1318fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey return cycleDay != CYCLE_NONE; 1328fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } 1338fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey 1349bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 13521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public int compareTo(NetworkPolicy another) { 13622c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey if (another == null || another.limitBytes == LIMIT_DISABLED) { 13722c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey // other value is missing or disabled; we win 13821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return -1; 13922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey } 14022c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey if (limitBytes == LIMIT_DISABLED || another.limitBytes < limitBytes) { 14122c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey // we're disabled or other limit is smaller; they win 14221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return 1; 14321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 14422c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey return 0; 14521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 14621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 14721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey @Override 14841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public int hashCode() { 1499bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey return Objects.hashCode(template, cycleDay, cycleTimezone, warningBytes, limitBytes, 150837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey lastWarningSnooze, lastLimitSnooze, metered, inferred); 15141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 15241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 15341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 15441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public boolean equals(Object obj) { 15541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey if (obj instanceof NetworkPolicy) { 15641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final NetworkPolicy other = (NetworkPolicy) obj; 157f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey return cycleDay == other.cycleDay && warningBytes == other.warningBytes 1580e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && limitBytes == other.limitBytes 1590e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && lastWarningSnooze == other.lastWarningSnooze 1600e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered 161837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey && inferred == other.inferred 1629bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey && Objects.equal(cycleTimezone, other.cycleTimezone) 1630e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && Objects.equal(template, other.template); 16441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 16541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey return false; 16641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 16741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 16841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 16921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public String toString() { 1708fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final StringBuilder builder = new StringBuilder("NetworkPolicy"); 1718fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append("[").append(template).append("]:"); 1728fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(" cycleDay=").append(cycleDay); 1738fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", cycleTimezone=").append(cycleTimezone); 1748fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", warningBytes=").append(warningBytes); 1758fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", limitBytes=").append(limitBytes); 1768fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", lastWarningSnooze=").append(lastWarningSnooze); 1778fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", lastLimitSnooze=").append(lastLimitSnooze); 1788fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", metered=").append(metered); 1798fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", inferred=").append(inferred); 1808fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey return builder.toString(); 18121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 18221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 18321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() { 1849bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 18521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy createFromParcel(Parcel in) { 18621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return new NetworkPolicy(in); 18721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 18821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 1899bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 19021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy[] newArray(int size) { 19121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return new NetworkPolicy[size]; 19221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 19321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey }; 19421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey} 195