diff options
author | Jeff Sharkey <jsharkey@android.com> | 2011-09-01 01:07:31 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2011-09-01 15:23:38 -0700 |
commit | 0fea823673e9cab24bd16a1c80a9bd689fc7a6f9 (patch) | |
tree | 86f58495167f335bd5ea6454cdd45fc597b67524 /services | |
parent | 270bcaa9d1b7e6cef723532692d82bb231ac7137 (diff) | |
download | frameworks_base-0fea823673e9cab24bd16a1c80a9bd689fc7a6f9.zip frameworks_base-0fea823673e9cab24bd16a1c80a9bd689fc7a6f9.tar.gz frameworks_base-0fea823673e9cab24bd16a1c80a9bd689fc7a6f9.tar.bz2 |
Selectively add stats based on iface active state.
Only combine /proc/net/dev and xt_qtaguid stats when iface is marked
as active. When inactive, only return xt_qtaguid stats. When iface
is unknown to xt_qtaguid, always pass through /proc/net/dev stats.
Bug: 5242730
Change-Id: I469fc6abe45309f794afebca814cbb39e4f13af5
Diffstat (limited to 'services')
-rw-r--r-- | services/java/com/android/server/NetworkManagementService.java | 58 | ||||
-rw-r--r-- | services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java | 14 |
2 files changed, 53 insertions, 19 deletions
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index 85d8cece..1497511 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -1033,6 +1033,38 @@ public class NetworkManagementService extends INetworkManagementService.Stub final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6); final NetworkStats.Entry entry = new NetworkStats.Entry(); + final HashSet<String> knownIfaces = Sets.newHashSet(); + final HashSet<String> activeIfaces = Sets.newHashSet(); + + // collect any historical stats and active state + // TODO: migrate to reading from single file + if (mBandwidthControlEnabled) { + for (String iface : fileListWithoutNull(mStatsXtIface)) { + final File ifacePath = new File(mStatsXtIface, iface); + + final long active = readSingleLongFromFile(new File(ifacePath, "active")); + if (active == 1) { + knownIfaces.add(iface); + activeIfaces.add(iface); + } else if (active == 0) { + knownIfaces.add(iface); + } else { + continue; + } + + entry.iface = iface; + entry.uid = UID_ALL; + entry.set = SET_DEFAULT; + entry.tag = TAG_NONE; + entry.rxBytes = readSingleLongFromFile(new File(ifacePath, "rx_bytes")); + entry.rxPackets = readSingleLongFromFile(new File(ifacePath, "rx_packets")); + entry.txBytes = readSingleLongFromFile(new File(ifacePath, "tx_bytes")); + entry.txPackets = readSingleLongFromFile(new File(ifacePath, "tx_packets")); + + stats.addValues(entry); + } + } + final ArrayList<String> values = Lists.newArrayList(); BufferedReader reader = null; @@ -1058,7 +1090,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub entry.txBytes = Long.parseLong(values.get(9)); entry.txPackets = Long.parseLong(values.get(10)); - stats.addValues(entry); + if (activeIfaces.contains(entry.iface)) { + // combine stats when iface is active + stats.combineValues(entry); + } else if (!knownIfaces.contains(entry.iface)) { + // add stats when iface is unknown + stats.addValues(entry); + } } catch (NumberFormatException e) { Slog.w(TAG, "problem parsing stats row '" + line + "': " + e); } @@ -1073,24 +1111,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub IoUtils.closeQuietly(reader); } - // splice in historical stats not reflected in mStatsIface - if (mBandwidthControlEnabled) { - for (String iface : fileListWithoutNull(mStatsXtIface)) { - final File ifacePath = new File(mStatsXtIface, iface); - - entry.iface = iface; - entry.uid = UID_ALL; - entry.set = SET_DEFAULT; - entry.tag = TAG_NONE; - entry.rxBytes = readSingleLongFromFile(new File(ifacePath, "rx_bytes")); - entry.rxPackets = readSingleLongFromFile(new File(ifacePath, "rx_packets")); - entry.txBytes = readSingleLongFromFile(new File(ifacePath, "tx_bytes")); - entry.txPackets = readSingleLongFromFile(new File(ifacePath, "tx_packets")); - - stats.combineValues(entry); - } - } - return stats; } diff --git a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java index ecf78d9..2a25866 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java @@ -106,6 +106,7 @@ public class NetworkManagementServiceTest extends AndroidTestCase { public void testNetworkStatsSummaryDown() throws Exception { stageFile(R.raw.net_dev_typical, new File(mTestProc, "net/dev")); + stageLong(1L, new File(mTestProc, "net/xt_qtaguid/iface_stat/wlan0/active")); stageLong(1024L, new File(mTestProc, "net/xt_qtaguid/iface_stat/wlan0/rx_bytes")); stageLong(128L, new File(mTestProc, "net/xt_qtaguid/iface_stat/wlan0/rx_packets")); stageLong(2048L, new File(mTestProc, "net/xt_qtaguid/iface_stat/wlan0/tx_bytes")); @@ -119,6 +120,7 @@ public class NetworkManagementServiceTest extends AndroidTestCase { public void testNetworkStatsCombined() throws Exception { stageFile(R.raw.net_dev_typical, new File(mTestProc, "net/dev")); + stageLong(1L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/active")); stageLong(10L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/rx_bytes")); stageLong(20L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/rx_packets")); stageLong(30L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/tx_bytes")); @@ -129,6 +131,18 @@ public class NetworkManagementServiceTest extends AndroidTestCase { 2205L + 20L, 489339L + 30L, 2237L + 40L); } + public void testNetworkStatsCombinedInactive() throws Exception { + stageFile(R.raw.net_dev_typical, new File(mTestProc, "net/dev")); + stageLong(0L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/active")); + stageLong(10L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/rx_bytes")); + stageLong(20L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/rx_packets")); + stageLong(30L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/tx_bytes")); + stageLong(40L, new File(mTestProc, "net/xt_qtaguid/iface_stat/rmnet0/tx_packets")); + + final NetworkStats stats = mService.getNetworkStatsSummary(); + assertStatsEntry(stats, "rmnet0", UID_ALL, SET_DEFAULT, TAG_NONE, 10L, 20L, 30L, 40L); + } + public void testKernelTags() throws Exception { assertEquals("0", tagToKernel(0x0)); assertEquals("214748364800", tagToKernel(0x32)); |