diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java index f4e02b3bcb..a95aa850e8 100644 --- a/service-t/src/com/android/server/net/NetworkStatsService.java +++ b/service-t/src/com/android/server/net/NetworkStatsService.java @@ -2715,6 +2715,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { pw.println("BPF map content:"); pw.increaseIndent(); dumpCookieTagMapLocked(pw); + dumpUidCounterSetMapLocked(pw); + dumpAppUidStatsMapLocked(pw); pw.decreaseIndent(); } } @@ -2765,6 +2767,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { private void dumpMapStatus(final IndentingPrintWriter pw) { pw.println("mCookieTagMap: " + getMapStatus(mCookieTagMap, COOKIE_TAG_MAP_PATH)); + pw.println("mUidCounterSetMap: " + + getMapStatus(mUidCounterSetMap, UID_COUNTERSET_MAP_PATH)); + pw.println("mAppUidStatsMap: " + getMapStatus(mAppUidStatsMap, APP_UID_STATS_MAP_PATH)); } @GuardedBy("mStatsLock") @@ -2792,6 +2797,57 @@ public class NetworkStatsService extends INetworkStatsService.Stub { pw.decreaseIndent(); } + @GuardedBy("mStatsLock") + private void dumpUidCounterSetMapLocked(final IndentingPrintWriter pw) { + if (mUidCounterSetMap == null) { + return; + } + pw.println("mUidCounterSetMap:"); + pw.increaseIndent(); + try { + mUidCounterSetMap.forEach((uid, set) -> { + // set could be null if there is a concurrent entry deletion. + // http://b/220084230. + if (set != null) { + pw.println("uid=" + uid.val + " set=" + set.val); + } else { + pw.println("Entry is deleted while dumping, iterating from first entry"); + } + }); + } catch (ErrnoException e) { + pw.println("mUidCounterSetMap dump end with error: " + Os.strerror(e.errno)); + } + pw.decreaseIndent(); + } + + @GuardedBy("mStatsLock") + private void dumpAppUidStatsMapLocked(final IndentingPrintWriter pw) { + if (mAppUidStatsMap == null) { + return; + } + pw.println("mAppUidStatsMap:"); + pw.increaseIndent(); + pw.println("uid rxBytes rxPackets txBytes txPackets"); + try { + mAppUidStatsMap.forEach((key, value) -> { + // value could be null if there is a concurrent entry deletion. + // http://b/220084230. + if (value != null) { + pw.println(key.uid + " " + + value.rxBytes + " " + + value.rxPackets + " " + + value.txBytes + " " + + value.txPackets); + } else { + pw.println("Entry is deleted while dumping, iterating from first entry"); + } + }); + } catch (ErrnoException e) { + pw.println("mAppUidStatsMap dump end with error: " + Os.strerror(e.errno)); + } + pw.decreaseIndent(); + } + private NetworkStats readNetworkStatsSummaryDev() { try { return mStatsFactory.readNetworkStatsSummaryDev(); diff --git a/service/native/TrafficController.cpp b/service/native/TrafficController.cpp index d792579b28..71329ad8b4 100644 --- a/service/native/TrafficController.cpp +++ b/service/native/TrafficController.cpp @@ -612,10 +612,6 @@ void TrafficController::dump(int fd, bool verbose) { ScopedIndent indentPreBpfModule(dw); dw.blankline(); - dw.println("mUidCounterSetMap status: %s", - getMapStatus(mUidCounterSetMap.getMap(), UID_COUNTERSET_MAP_PATH).c_str()); - dw.println("mAppUidStatsMap status: %s", - getMapStatus(mAppUidStatsMap.getMap(), APP_UID_STATS_MAP_PATH).c_str()); dw.println("mStatsMapA status: %s", getMapStatus(mStatsMapA.getMap(), STATS_MAP_A_PATH).c_str()); dw.println("mStatsMapB status: %s", @@ -651,32 +647,6 @@ void TrafficController::dump(int fd, bool verbose) { ScopedIndent indentForMapContent(dw); - // Print UidCounterSetMap content. - dumpBpfMap("mUidCounterSetMap", dw, ""); - const auto printUidInfo = [&dw](const uint32_t& key, const uint8_t& value, - const BpfMap&) { - dw.println("%u %u", key, value); - return base::Result(); - }; - base::Result res = mUidCounterSetMap.iterateWithValue(printUidInfo); - if (!res.ok()) { - dw.println("mUidCounterSetMap print end with error: %s", res.error().message().c_str()); - } - - // Print AppUidStatsMap content. - std::string appUidStatsHeader = StringPrintf("uid rxBytes rxPackets txBytes txPackets"); - dumpBpfMap("mAppUidStatsMap:", dw, appUidStatsHeader); - auto printAppUidStatsInfo = [&dw](const uint32_t& key, const StatsValue& value, - const BpfMap&) { - dw.println("%u %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, key, value.rxBytes, - value.rxPackets, value.txBytes, value.txPackets); - return base::Result(); - }; - res = mAppUidStatsMap.iterateWithValue(printAppUidStatsInfo); - if (!res.ok()) { - dw.println("mAppUidStatsMap print end with error: %s", res.error().message().c_str()); - } - // Print uidStatsMap content. std::string statsHeader = StringPrintf("ifaceIndex ifaceName tag_hex uid_int cnt_set rxBytes" " rxPackets txBytes txPackets"); @@ -693,7 +663,7 @@ void TrafficController::dump(int fd, bool verbose) { value.rxPackets, value.txBytes, value.txPackets); return base::Result(); }; - res = mStatsMapA.iterateWithValue(printStatsInfo); + base::Result res = mStatsMapA.iterateWithValue(printStatsInfo); if (!res.ok()) { dw.println("mStatsMapA print end with error: %s", res.error().message().c_str()); } diff --git a/service/native/TrafficControllerTest.cpp b/service/native/TrafficControllerTest.cpp index d6ed721d29..256a2a0ec4 100644 --- a/service/native/TrafficControllerTest.cpp +++ b/service/native/TrafficControllerTest.cpp @@ -791,11 +791,6 @@ TEST_F(TrafficControllerTest, TestDumpsys) { // ifaceIndex ifaceName tag_hex uid_int cnt_set rxBytes rxPackets txBytes txPackets // 999 test0 0x2a 10086 1 100 1 0 0 std::vector expectedLines = { - "mUidCounterSetMap:", - fmt::format("{} {}", TEST_UID3, TEST_COUNTERSET), - "mAppUidStatsMap::", // TODO@: fix double colon - "uid rxBytes rxPackets txBytes txPackets", - fmt::format("{} {} {} {} {}", TEST_UID, RXBYTES, RXPACKETS, TXBYTES, TXPACKETS), "mStatsMapA", "ifaceIndex ifaceName tag_hex uid_int cnt_set rxBytes rxPackets txBytes txPackets", fmt::format("{} {} {:#x} {} {} {} {} {} {}", @@ -831,8 +826,6 @@ TEST_F(TrafficControllerTest, dumpsysInvalidMaps) { "Read value of map -1 failed: Bad file descriptor"; std::vector expectedLines = { - fmt::format("mUidCounterSetMap {}", kErrIterate), - fmt::format("mAppUidStatsMap {}", kErrIterate), fmt::format("mStatsMapA {}", kErrIterate), fmt::format("mStatsMapB {}", kErrIterate), fmt::format("mIfaceIndexNameMap {}", kErrIterate), diff --git a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java index 168aeefe92..18e074c019 100644 --- a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java @@ -2343,4 +2343,23 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { assertDumpContains(dump, "cookie=2002 tag=0x1 uid=1002"); assertDumpContains(dump, "cookie=3002 tag=0x2 uid=1002"); } + + @Test + public void testDumpUidCounterSetMap() throws ErrnoException { + initBpfMapsWithTagData(UID_BLUE); + + final String dump = getDump(); + assertDumpContains(dump, "mUidCounterSetMap: OK"); + assertDumpContains(dump, "uid=1002 set=1"); + } + + @Test + public void testAppUidStatsMap() throws ErrnoException { + initBpfMapsWithTagData(UID_BLUE); + + final String dump = getDump(); + assertDumpContains(dump, "mAppUidStatsMap: OK"); + assertDumpContains(dump, "uid rxBytes rxPackets txBytes txPackets"); + assertDumpContains(dump, "1002 10000 10 6000 6"); + } }