diff --git a/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp b/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp index 2dbe771f1d..a16757b7c4 100644 --- a/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp +++ b/service-t/jni/com_android_server_net_NetworkStatsFactory.cpp @@ -170,23 +170,10 @@ static int statsLinesToNetworkStats(JNIEnv* env, jclass clazz, jobject stats, return 0; } -static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats, jint limitUid, - jobjectArray limitIfacesObj, jint limitTag) { - - std::vector limitIfaces; - if (limitIfacesObj != NULL && env->GetArrayLength(limitIfacesObj) > 0) { - int num = env->GetArrayLength(limitIfacesObj); - for (int i = 0; i < num; i++) { - jstring string = (jstring)env->GetObjectArrayElement(limitIfacesObj, i); - ScopedUtfChars string8(env, string); - if (string8.c_str() != NULL) { - limitIfaces.push_back(std::string(string8.c_str())); - } - } - } +static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats) { std::vector lines; - if (parseBpfNetworkStatsDetail(&lines, limitIfaces, limitTag, limitUid) < 0) + if (parseBpfNetworkStatsDetail(&lines) < 0) return -1; return statsLinesToNetworkStats(env, clazz, stats, lines); @@ -202,8 +189,7 @@ static int readNetworkStatsDev(JNIEnv* env, jclass clazz, jobject stats) { } static const JNINativeMethod gMethods[] = { - { "nativeReadNetworkStatsDetail", - "(Landroid/net/NetworkStats;I[Ljava/lang/String;I)I", + { "nativeReadNetworkStatsDetail", "(Landroid/net/NetworkStats;)I", (void*) readNetworkStatsDetail }, { "nativeReadNetworkStatsDev", "(Landroid/net/NetworkStats;)I", (void*) readNetworkStatsDev }, diff --git a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp index 4fbc5f48d5..cdcb0f850f 100644 --- a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp +++ b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp @@ -110,12 +110,11 @@ stats_line populateStatsEntry(const StatsKey& statsKey, const StatsValue& statsE } int parseBpfNetworkStatsDetailInternal(std::vector* lines, - const std::vector& limitIfaces, int limitTag, - int limitUid, const BpfMap& statsMap, + const BpfMap& statsMap, const BpfMap& ifaceMap) { int64_t unknownIfaceBytesTotal = 0; const auto processDetailUidStats = - [lines, &limitIfaces, &limitTag, &limitUid, &unknownIfaceBytesTotal, &ifaceMap]( + [lines, &unknownIfaceBytesTotal, &ifaceMap]( const StatsKey& key, const BpfMap& statsMap) -> Result { char ifname[IFNAMSIZ]; @@ -123,18 +122,6 @@ int parseBpfNetworkStatsDetailInternal(std::vector* lines, &unknownIfaceBytesTotal)) { return Result(); } - std::string ifnameStr(ifname); - if (limitIfaces.size() > 0 && - std::find(limitIfaces.begin(), limitIfaces.end(), ifnameStr) == limitIfaces.end()) { - // Nothing matched; skip this line. - return Result(); - } - if (limitTag != TAG_ALL && uint32_t(limitTag) != key.tag) { - return Result(); - } - if (limitUid != UID_ALL && uint32_t(limitUid) != key.uid) { - return Result(); - } Result statsEntry = statsMap.readValue(key); if (!statsEntry.ok()) { return base::ResultError(statsEntry.error().message(), statsEntry.error().code()); @@ -162,9 +149,7 @@ int parseBpfNetworkStatsDetailInternal(std::vector* lines, return 0; } -int parseBpfNetworkStatsDetail(std::vector* lines, - const std::vector& limitIfaces, int limitTag, - int limitUid) { +int parseBpfNetworkStatsDetail(std::vector* lines) { static BpfMapRO ifaceIndexNameMap(IFACE_INDEX_NAME_MAP_PATH); static BpfMapRO configurationMap(CONFIGURATION_MAP_PATH); static BpfMap statsMapA(STATS_MAP_A_PATH); @@ -195,8 +180,7 @@ int parseBpfNetworkStatsDetail(std::vector* lines, // TODO: the above comment feels like it may be obsolete / out of date, // since we no longer swap the map via netd binder rpc - though we do // still swap it. - int ret = parseBpfNetworkStatsDetailInternal(lines, limitIfaces, limitTag, limitUid, - *inactiveStatsMap, ifaceIndexNameMap); + int ret = parseBpfNetworkStatsDetailInternal(lines, *inactiveStatsMap, ifaceIndexNameMap); if (ret) { ALOGE("parse detail network stats failed: %s", strerror(errno)); return ret; diff --git a/service-t/native/libs/libnetworkstats/BpfNetworkStatsTest.cpp b/service-t/native/libs/libnetworkstats/BpfNetworkStatsTest.cpp index ff62c0b026..bf42b620a4 100644 --- a/service-t/native/libs/libnetworkstats/BpfNetworkStatsTest.cpp +++ b/service-t/native/libs/libnetworkstats/BpfNetworkStatsTest.cpp @@ -225,18 +225,11 @@ TEST_F(BpfNetworkStatsHelperTest, TestGetUidStatsTotal) { ASSERT_EQ(0, bpfGetUidStatsInternal(TEST_UID2, &result2, mFakeAppUidStatsMap)); expectStatsEqual(value2, result2); std::vector lines; - std::vector ifaces; populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap); populateFakeStats(TEST_UID1, 0, IFACE_INDEX2, TEST_COUNTERSET1, value1, mFakeStatsMap); populateFakeStats(TEST_UID2, 0, IFACE_INDEX3, TEST_COUNTERSET1, value1, mFakeStatsMap); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1, - mFakeStatsMap, mFakeIfaceIndexNameMap)); - ASSERT_EQ((unsigned long)2, lines.size()); - lines.clear(); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2, - mFakeStatsMap, mFakeIfaceIndexNameMap)); - ASSERT_EQ((unsigned long)1, lines.size()); - expectStatsLineEqual(value1, IFACE_NAME3, TEST_UID2, TEST_COUNTERSET1, 0, lines.front()); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); + ASSERT_EQ((unsigned long)3, lines.size()); } TEST_F(BpfNetworkStatsHelperTest, TestGetIfaceStatsInternal) { @@ -297,24 +290,8 @@ TEST_F(BpfNetworkStatsHelperTest, TestGetStatsDetail) { mFakeStatsMap); populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap); std::vector lines; - std::vector ifaces; - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap, - mFakeIfaceIndexNameMap)); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); ASSERT_EQ((unsigned long)4, lines.size()); - lines.clear(); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1, - mFakeStatsMap, mFakeIfaceIndexNameMap)); - ASSERT_EQ((unsigned long)3, lines.size()); - lines.clear(); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1, - mFakeStatsMap, mFakeIfaceIndexNameMap)); - ASSERT_EQ((unsigned long)2, lines.size()); - lines.clear(); - ifaces.push_back(std::string(IFACE_NAME1)); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TEST_TAG, TEST_UID1, - mFakeStatsMap, mFakeIfaceIndexNameMap)); - ASSERT_EQ((unsigned long)1, lines.size()); - expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines.front()); } TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) { @@ -333,24 +310,8 @@ TEST_F(BpfNetworkStatsHelperTest, TestGetStatsWithSkippedIface) { populateFakeStats(TEST_UID1, 0, IFACE_INDEX1, TEST_COUNTERSET1, value1, mFakeStatsMap); populateFakeStats(TEST_UID2, 0, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap); std::vector lines; - std::vector ifaces; - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap, - mFakeIfaceIndexNameMap)); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); ASSERT_EQ((unsigned long)4, lines.size()); - lines.clear(); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1, - mFakeStatsMap, mFakeIfaceIndexNameMap)); - ASSERT_EQ((unsigned long)3, lines.size()); - lines.clear(); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID2, - mFakeStatsMap, mFakeIfaceIndexNameMap)); - ASSERT_EQ((unsigned long)1, lines.size()); - expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID2, TEST_COUNTERSET0, 0, lines.front()); - lines.clear(); - ifaces.push_back(std::string(IFACE_NAME1)); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, TEST_UID1, - mFakeStatsMap, mFakeIfaceIndexNameMap)); - ASSERT_EQ((unsigned long)2, lines.size()); } TEST_F(BpfNetworkStatsHelperTest, TestUnknownIfaceError) { @@ -387,10 +348,8 @@ TEST_F(BpfNetworkStatsHelperTest, TestUnknownIfaceError) { ifname, curKey, &unknownIfaceBytesTotal)); ASSERT_EQ(-1, unknownIfaceBytesTotal); std::vector lines; - std::vector ifaces; // TODO: find a way to test the total of unknown Iface Bytes go above limit. - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap, - mFakeIfaceIndexNameMap)); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); ASSERT_EQ((unsigned long)1, lines.size()); expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, 0, lines.front()); } @@ -458,18 +417,15 @@ TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) { }; std::vector lines; - std::vector ifaces; // Test empty stats. - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap, - mFakeIfaceIndexNameMap)); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); ASSERT_EQ((size_t) 0, lines.size()); lines.clear(); // Test 1 line stats. populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap, - mFakeIfaceIndexNameMap)); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); ASSERT_EQ((size_t) 1, lines.size()); expectStatsLineEqual(value1, IFACE_NAME1, TEST_UID1, TEST_COUNTERSET0, TEST_TAG, lines[0]); lines.clear(); @@ -480,8 +436,7 @@ TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) { populateFakeStats(TEST_UID1, TEST_TAG + 1, IFACE_INDEX1, TEST_COUNTERSET0, value2, mFakeStatsMap); populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX1, TEST_COUNTERSET0, value1, mFakeStatsMap); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap, - mFakeIfaceIndexNameMap)); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); ASSERT_EQ((size_t) 5, lines.size()); lines.clear(); @@ -489,8 +444,7 @@ TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortedAndGrouped) { populateFakeStats(TEST_UID1, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap); populateFakeStats(TEST_UID2, TEST_TAG, IFACE_INDEX3, TEST_COUNTERSET0, value1, mFakeStatsMap); - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap, - mFakeIfaceIndexNameMap)); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); ASSERT_EQ((size_t) 5, lines.size()); // Verify Sorted & Grouped. @@ -547,9 +501,7 @@ TEST_F(BpfNetworkStatsHelperTest, TestGetStatsSortAndOverflow) { // TODO: Mutate counterSet and enlarge TEST_MAP_SIZE if overflow on counterSet is possible. std::vector lines; - std::vector ifaces; - ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, ifaces, TAG_ALL, UID_ALL, mFakeStatsMap, - mFakeIfaceIndexNameMap)); + ASSERT_EQ(0, parseBpfNetworkStatsDetailInternal(&lines, mFakeStatsMap, mFakeIfaceIndexNameMap)); ASSERT_EQ((size_t) 8, lines.size()); // Uid 0 first diff --git a/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h b/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h index 03a1a44d4c..1ffa927636 100644 --- a/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h +++ b/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h @@ -26,7 +26,7 @@ namespace bpf { // TODO: set this to a proper value based on the map size; constexpr int TAG_STATS_MAP_SOFT_LIMIT = 3; constexpr int UID_ALL = -1; -constexpr int TAG_ALL = -1; +//constexpr int TAG_ALL = -1; constexpr int TAG_NONE = 0; constexpr int SET_ALL = -1; constexpr int SET_DEFAULT = 0; @@ -64,8 +64,7 @@ int bpfGetIfaceStatsInternal(const char* iface, Stats* stats, const BpfMap& ifaceNameMap); // For test only int parseBpfNetworkStatsDetailInternal(std::vector* lines, - const std::vector& limitIfaces, int limitTag, - int limitUid, const BpfMap& statsMap, + const BpfMap& statsMap, const BpfMap& ifaceMap); // For test only int cleanStatsMapInternal(const base::unique_fd& cookieTagMap, const base::unique_fd& tagStatsMap); @@ -113,9 +112,7 @@ int parseBpfNetworkStatsDevInternal(std::vector* lines, int bpfGetUidStats(uid_t uid, Stats* stats); int bpfGetIfaceStats(const char* iface, Stats* stats); -int parseBpfNetworkStatsDetail(std::vector* lines, - const std::vector& limitIfaces, int limitTag, - int limitUid); +int parseBpfNetworkStatsDetail(std::vector* lines); int parseBpfNetworkStatsDev(std::vector* lines); void groupNetworkStats(std::vector* lines); diff --git a/service-t/src/com/android/server/net/NetworkStatsFactory.java b/service-t/src/com/android/server/net/NetworkStatsFactory.java index 5952eae56f..5f66f479cb 100644 --- a/service-t/src/com/android/server/net/NetworkStatsFactory.java +++ b/service-t/src/com/android/server/net/NetworkStatsFactory.java @@ -84,12 +84,9 @@ public class NetworkStatsFactory { * are expected to monotonically increase since device boot. */ @NonNull - public NetworkStats getNetworkStatsDetail(int limitUid, @Nullable String[] limitIfaces, - int limitTag) throws IOException { + public NetworkStats getNetworkStatsDetail() throws IOException { final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0); - // TODO: remove both path and useBpfStats arguments. - // The path is never used if useBpfStats is true. - final int ret = nativeReadNetworkStatsDetail(stats, limitUid, limitIfaces, limitTag); + final int ret = nativeReadNetworkStatsDetail(stats); if (ret != 0) { throw new IOException("Failed to parse network stats"); } @@ -213,8 +210,7 @@ public class NetworkStatsFactory { requestSwapActiveStatsMapLocked(); // Stats are always read from the inactive map, so they must be read after the // swap - final NetworkStats stats = mDeps.getNetworkStatsDetail( - UID_ALL, INTERFACES_ALL, TAG_ALL); + final NetworkStats stats = mDeps.getNetworkStatsDetail(); // BPF stats are incremental; fold into mPersistSnapshot. mPersistSnapshot.setElapsedRealtime(stats.getElapsedRealtime()); mPersistSnapshot.combineAllValues(stats); @@ -301,8 +297,7 @@ public class NetworkStatsFactory { * are expected to monotonically increase since device boot. */ @VisibleForTesting - public static native int nativeReadNetworkStatsDetail(NetworkStats stats, int limitUid, - String[] limitIfaces, int limitTag); + public static native int nativeReadNetworkStatsDetail(NetworkStats stats); @VisibleForTesting public static native int nativeReadNetworkStatsDev(NetworkStats stats); diff --git a/tests/unit/java/com/android/server/net/NetworkStatsFactoryTest.java b/tests/unit/java/com/android/server/net/NetworkStatsFactoryTest.java index 04db6d3025..63daebc281 100644 --- a/tests/unit/java/com/android/server/net/NetworkStatsFactoryTest.java +++ b/tests/unit/java/com/android/server/net/NetworkStatsFactoryTest.java @@ -472,8 +472,7 @@ public class NetworkStatsFactoryTest extends NetworkStatsBaseTest { 256L, 16L, 512L, 32L, 0L) .insertEntry(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 64L, 3L, 1024L, 8L, 0L); - doReturn(stats).when(mDeps).getNetworkStatsDetail(anyInt(), any(), - anyInt()); + doReturn(stats).when(mDeps).getNetworkStatsDetail(); final String[] ifaces = new String[]{TEST_IFACE}; final NetworkStats res = mFactory.readNetworkStatsDetail(UID_ALL, ifaces, TAG_ALL); @@ -488,8 +487,7 @@ public class NetworkStatsFactoryTest extends NetworkStatsBaseTest { mFactory.removeUidsLocked(removedUids); // Return empty stats for reading the result of removing uids stats later. - doReturn(buildEmptyStats()).when(mDeps).getNetworkStatsDetail(anyInt(), any(), - anyInt()); + doReturn(buildEmptyStats()).when(mDeps).getNetworkStatsDetail(); final NetworkStats removedUidsStats = mFactory.readNetworkStatsDetail(UID_ALL, ifaces, TAG_ALL); @@ -574,8 +572,7 @@ public class NetworkStatsFactoryTest extends NetworkStatsBaseTest { final NetworkStats statsFromResource = parseNetworkStatsFromGoldenSample(resourceId, 24 /* initialSize */, true /* consumeHeader */, false /* checkActive */, true /* isUidData */); - doReturn(statsFromResource).when(mDeps).getNetworkStatsDetail(anyInt(), any(), - anyInt()); + doReturn(statsFromResource).when(mDeps).getNetworkStatsDetail(); return mFactory.readNetworkStatsDetail(); }