From 0dbcedeeceb39901ac773e17ac6a1aaada59a726 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 27 Jul 2012 17:35:32 -0700 Subject: [PATCH] API to adjust network stats. Enables system apps to correctly account network usage performed on behalf of another application. Bug: 6695246 Change-Id: I39e243afd57936b6b30157a6ca511a17b6c55c39 --- .../android/net/INetworkStatsService.aidl | 3 ++ core/java/android/net/TrafficStats.java | 28 +++++++++++++++++++ .../server/net/NetworkStatsService.java | 8 ++++++ 3 files changed, 39 insertions(+) diff --git a/core/java/android/net/INetworkStatsService.aidl b/core/java/android/net/INetworkStatsService.aidl index b7b8731855..4d46334fb3 100644 --- a/core/java/android/net/INetworkStatsService.aidl +++ b/core/java/android/net/INetworkStatsService.aidl @@ -45,4 +45,7 @@ interface INetworkStatsService { /** Advise persistance threshold; may be overridden internally. */ void advisePersistThreshold(long thresholdBytes); + /** Adjust recorded network stats. */ + void adjustNetworkStats(int uid, int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, long operationCount); + } diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java index e437d2e347..b66c2fe5cf 100644 --- a/core/java/android/net/TrafficStats.java +++ b/core/java/android/net/TrafficStats.java @@ -88,6 +88,13 @@ public class TrafficStats { */ public static final int TAG_SYSTEM_BACKUP = 0xFFFFFF03; + /** + * Default tag value for cloud messaging traffic. + * + * @hide + */ + public static final int TAG_SYSTEM_CLOUD_MESSAGING = 0xFFFFFF04; + private static INetworkStatsService sStatsService; private synchronized static INetworkStatsService getStatsService() { @@ -246,6 +253,27 @@ public class TrafficStats { } } + /** + * Adjust network statistics for the given UID and tag by the requested + * amount. This can be used to correctly account network usage performed on + * behalf of another application. Values can be negative. + *

+ * Requires that caller holds + * {@link android.Manifest.permission#MODIFY_NETWORK_ACCOUNTING} permission. + * + * @see #setThreadStatsUid(int) + * @hide + */ + public static void adjustNetworkStats(int uid, int tag, long rxBytes, long rxPackets, + long txBytes, long txPackets, long operationCount) { + try { + getStatsService().adjustNetworkStats( + uid, tag, rxBytes, rxPackets, txBytes, txPackets, operationCount); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + /** {@hide} */ public static void closeQuietly(INetworkStatsSession session) { // TODO: move to NetworkStatsService once it exists diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java index ba122ecdf2..373576bd8d 100644 --- a/services/java/com/android/server/net/NetworkStatsService.java +++ b/services/java/com/android/server/net/NetworkStatsService.java @@ -695,6 +695,14 @@ public class NetworkStatsService extends INetworkStatsService.Stub { mGlobalAlertBytes = mSettings.getGlobalAlertBytes(mPersistThreshold); } + @Override + public void adjustNetworkStats(int uid, int tag, long rxBytes, long rxPackets, long txBytes, + long txPackets, long operationCount) { + mContext.enforceCallingOrSelfPermission(MODIFY_NETWORK_ACCOUNTING, TAG); + + // TODO: store adjusted network stats in separate data structure + } + /** * Receiver that watches for {@link IConnectivityManager} to claim network * interfaces. Used to associate {@link TelephonyManager#getSubscriberId()}