summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server/net/NetworkStatsService.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com/android/server/net/NetworkStatsService.java')
-rw-r--r--services/java/com/android/server/net/NetworkStatsService.java56
1 files changed, 40 insertions, 16 deletions
diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java
index 8db2839..161c393 100644
--- a/services/java/com/android/server/net/NetworkStatsService.java
+++ b/services/java/com/android/server/net/NetworkStatsService.java
@@ -18,8 +18,8 @@ package com.android.server.net;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.DUMP;
+import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
import static android.Manifest.permission.SHUTDOWN;
-import static android.Manifest.permission.UPDATE_DEVICE_STATS;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.UID_ALL;
@@ -86,7 +86,7 @@ import libcore.io.IoUtils;
* other system services.
*/
public class NetworkStatsService extends INetworkStatsService.Stub {
- private static final String TAG = "NetworkStatsService";
+ private static final String TAG = "NetworkStats";
private static final boolean LOGD = true;
/** File header magic number: "ANET" */
@@ -178,20 +178,25 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mSummaryFile = new AtomicFile(new File(systemDir, "netstats.bin"));
}
+ public void bindConnectivityManager(IConnectivityManager connManager) {
+ mConnManager = checkNotNull(connManager, "missing IConnectivityManager");
+ }
+
public void systemReady() {
synchronized (mStatsLock) {
// read historical stats from disk
readStatsLocked();
}
- // watch other system services that claim interfaces
+ // watch for network interfaces to be claimed
final IntentFilter ifaceFilter = new IntentFilter();
ifaceFilter.addAction(CONNECTIVITY_ACTION);
mContext.registerReceiver(mIfaceReceiver, ifaceFilter, CONNECTIVITY_INTERNAL, mHandler);
// listen for periodic polling events
+ // TODO: switch to stronger internal permission
final IntentFilter pollFilter = new IntentFilter(ACTION_NETWORK_STATS_POLL);
- mContext.registerReceiver(mPollReceiver, pollFilter, UPDATE_DEVICE_STATS, mHandler);
+ mContext.registerReceiver(mPollReceiver, pollFilter, READ_NETWORK_USAGE_HISTORY, mHandler);
// persist stats during clean shutdown
final IntentFilter shutdownFilter = new IntentFilter(Intent.ACTION_SHUTDOWN);
@@ -204,10 +209,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
}
}
- public void bindConnectivityManager(IConnectivityManager connManager) {
- mConnManager = checkNotNull(connManager, "missing IConnectivityManager");
- }
-
private void shutdownLocked() {
mContext.unregisterReceiver(mIfaceReceiver);
mContext.unregisterReceiver(mPollReceiver);
@@ -237,8 +238,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
@Override
public NetworkStatsHistory getHistoryForNetwork(int networkTemplate) {
- // TODO: create relaxed permission for reading stats
- mContext.enforceCallingOrSelfPermission(UPDATE_DEVICE_STATS, TAG);
+ mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
synchronized (mStatsLock) {
// combine all interfaces that match template
@@ -257,17 +257,41 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
@Override
public NetworkStatsHistory getHistoryForUid(int uid, int networkTemplate) {
- // TODO: create relaxed permission for reading stats
- mContext.enforceCallingOrSelfPermission(UPDATE_DEVICE_STATS, TAG);
+ mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
// TODO: return history for requested uid
return null;
}
@Override
+ public NetworkStats getSummaryForNetwork(
+ long start, long end, int networkTemplate, String subscriberId) {
+ mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
+
+ synchronized (mStatsLock) {
+ long rx = 0;
+ long tx = 0;
+ long[] networkTotal = new long[2];
+
+ // combine total from all interfaces that match template
+ for (InterfaceIdentity ident : mSummaryStats.keySet()) {
+ final NetworkStatsHistory history = mSummaryStats.get(ident);
+ if (ident.matchesTemplate(networkTemplate, subscriberId)) {
+ networkTotal = history.getTotalData(start, end, networkTotal);
+ rx += networkTotal[0];
+ tx += networkTotal[1];
+ }
+ }
+
+ final NetworkStats.Builder stats = new NetworkStats.Builder(end - start, 1);
+ stats.addEntry(IFACE_ALL, UID_ALL, tx, tx);
+ return stats.build();
+ }
+ }
+
+ @Override
public NetworkStats getSummaryForAllUid(long start, long end, int networkTemplate) {
- // TODO: create relaxed permission for reading stats
- mContext.enforceCallingOrSelfPermission(UPDATE_DEVICE_STATS, TAG);
+ mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
// TODO: apply networktemplate once granular uid stats are stored.
@@ -275,11 +299,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
final int size = mDetailStats.size();
final NetworkStats.Builder stats = new NetworkStats.Builder(end - start, size);
- final long[] total = new long[2];
+ long[] total = new long[2];
for (int i = 0; i < size; i++) {
final int uid = mDetailStats.keyAt(i);
final NetworkStatsHistory history = mDetailStats.valueAt(i);
- history.getTotalData(start, end, total);
+ total = history.getTotalData(start, end, total);
stats.addEntry(IFACE_ALL, uid, total[0], total[1]);
}
return stats.build();