NetworkPolicy.java revision 50e7e51d68e3b01c3362fe9ab7b3448132e48b43
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> { 331b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public static final long WARNING_DISABLED = -1; 341b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public static final long LIMIT_DISABLED = -1; 3541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public static final long SNOOZE_NEVER = -1; 361b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public final NetworkTemplate template; 3822c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey public int cycleDay; 3922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey public long warningBytes; 4022c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey public long limitBytes; 4141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public long lastSnooze; 4221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 4350e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey private static final long DEFAULT_MTU = 1500; 4450e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey 4541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public NetworkPolicy(NetworkTemplate template, int cycleDay, long warningBytes, long limitBytes, 4641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey long lastSnooze) { 471b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey this.template = checkNotNull(template, "missing NetworkTemplate"); 4821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.cycleDay = cycleDay; 4921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.warningBytes = warningBytes; 5021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.limitBytes = limitBytes; 5141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey this.lastSnooze = lastSnooze; 5221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 5321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 5421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy(Parcel in) { 551b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey template = in.readParcelable(null); 5621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey cycleDay = in.readInt(); 5721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey warningBytes = in.readLong(); 5821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey limitBytes = in.readLong(); 5941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey lastSnooze = in.readLong(); 6021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 6121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 6221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey /** {@inheritDoc} */ 6321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 641b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey dest.writeParcelable(template, flags); 6521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeInt(cycleDay); 6621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeLong(warningBytes); 6721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeLong(limitBytes); 6841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey dest.writeLong(lastSnooze); 6921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 7021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 7121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey /** {@inheritDoc} */ 7221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public int describeContents() { 7321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return 0; 7421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 7521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 7650e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey /** 7750e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey * Test if given measurement is near enough to {@link #limitBytes} to be 7850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey * considered over-limit. 7950e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey */ 8050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey public boolean isOverLimit(long totalBytes) { 8150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey // over-estimate, since kernel will trigger limit once first packet 8250e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey // trips over limit. 8350e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey totalBytes += 2 * DEFAULT_MTU; 8450e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey return limitBytes != LIMIT_DISABLED && totalBytes >= limitBytes; 8550e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey } 8650e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey 8721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey /** {@inheritDoc} */ 8821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public int compareTo(NetworkPolicy another) { 8922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey if (another == null || another.limitBytes == LIMIT_DISABLED) { 9022c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey // other value is missing or disabled; we win 9121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return -1; 9222c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey } 9322c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey if (limitBytes == LIMIT_DISABLED || another.limitBytes < limitBytes) { 9422c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey // we're disabled or other limit is smaller; they win 9521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return 1; 9621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 9722c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey return 0; 9821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 9921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 10021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey @Override 10141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public int hashCode() { 10241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey return Objects.hashCode(template, cycleDay, warningBytes, limitBytes, lastSnooze); 10341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 10441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 10541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 10641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public boolean equals(Object obj) { 10741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey if (obj instanceof NetworkPolicy) { 10841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final NetworkPolicy other = (NetworkPolicy) obj; 10941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey return Objects.equal(template, other.template) && cycleDay == other.cycleDay 11041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey && warningBytes == other.warningBytes && limitBytes == other.limitBytes 11141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey && lastSnooze == other.lastSnooze; 11241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 11341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey return false; 11441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 11541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 11641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 11721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public String toString() { 1181b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return "NetworkPolicy[" + template + "]: cycleDay=" + cycleDay + ", warningBytes=" 11941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey + warningBytes + ", limitBytes=" + limitBytes + ", lastSnooze=" + lastSnooze; 12021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 12121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 12221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() { 12321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy createFromParcel(Parcel in) { 12421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return new NetworkPolicy(in); 12521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 12621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 12721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy[] newArray(int size) { 12821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return new NetworkPolicy[size]; 12921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 13021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey }; 13121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey} 132