diff options
author | Haoyu Bai <bhy@google.com> | 2012-06-28 15:26:19 -0700 |
---|---|---|
committer | Haoyu Bai <bhy@google.com> | 2012-08-10 15:58:34 -0700 |
commit | 0412423f06ec633203b96f68b51f0720c33a2473 (patch) | |
tree | 9098a9e777823d17100edc8da46e73e7bce4a2cf /services/java/com/android/server/NetworkManagementService.java | |
parent | c47f80f1ae96e3c8b6a750d68cc12dfbbca97254 (diff) |
Setup idletimer for network interface.
Cherry-picked from commit f71ca8a5728e425de61ba794c9653dd0b04f16e3 in
master. DO NOT MERGE
Change-Id: I6101c7ae041b4cc1237ce7a9983753dbdfa301d3
Diffstat (limited to 'services/java/com/android/server/NetworkManagementService.java')
-rw-r--r-- | services/java/com/android/server/NetworkManagementService.java | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index c3f3a5d47fe4..39e518671d9f 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -153,6 +153,21 @@ public class NetworkManagementService extends INetworkManagementService.Stub /** Set of UIDs with active reject rules. */ private SparseBooleanArray mUidRejectOnQuota = new SparseBooleanArray(); + private Object mIdleTimerLock = new Object(); + /** Set of interfaces with active idle timers. */ + private static class IdleTimerParams { + public final int timeout; + public final String label; + public int networkCount; + + IdleTimerParams(int timeout, String label) { + this.timeout = timeout; + this.label = label; + this.networkCount = 1; + } + } + private HashMap<String, IdleTimerParams> mActiveIdleTimers = Maps.newHashMap(); + private volatile boolean mBandwidthControlEnabled; /** @@ -1047,6 +1062,51 @@ public class NetworkManagementService extends INetworkManagementService.Stub } @Override + public void addIdleTimer(String iface, int timeout, String label) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + + if (DBG) Slog.d(TAG, "Adding idletimer"); + + synchronized (mIdleTimerLock) { + IdleTimerParams params = mActiveIdleTimers.get(iface); + if (params != null) { + // the interface already has idletimer, update network count + params.networkCount++; + return; + } + + try { + mConnector.execute("idletimer", "add", iface, Integer.toString(timeout), label); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + mActiveIdleTimers.put(iface, new IdleTimerParams(timeout, label)); + } + } + + @Override + public void removeIdleTimer(String iface) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + + if (DBG) Slog.d(TAG, "Removing idletimer"); + + synchronized (mIdleTimerLock) { + IdleTimerParams params = mActiveIdleTimers.get(iface); + if (params == null || --(params.networkCount) > 0) { + return; + } + + try { + mConnector.execute("idletimer", "remove", iface, + Integer.toString(params.timeout), params.label); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + mActiveIdleTimers.remove(iface); + } + } + + @Override public NetworkStats getNetworkStatsSummaryDev() { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); return mStatsFactory.readNetworkStatsSummaryDev(); |