From 80efc3a697aee4324e14ce056d197851926db1a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Wed, 24 Jan 2024 12:35:03 -0800 Subject: [PATCH] BpfNetworkStats: implement bpfRegisterIface() and wire it up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test: TreeHugger atest libnetworkstats_test a_test --iterations=100 NetworkStackIntegrationTests:android.net.NetworkStatsIntegrationTest Bug: 292156770 Signed-off-by: Maciej Żenczykowski Change-Id: I3b1038f6fb306ed8f2d20a73d2f7c36593cbd739 --- .../com_android_server_net_NetworkStatsService.cpp | 4 ++++ .../libs/libnetworkstats/BpfNetworkStats.cpp | 14 ++++++++++++-- .../include/netdbpf/BpfNetworkStats.h | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/service-t/jni/com_android_server_net_NetworkStatsService.cpp b/service-t/jni/com_android_server_net_NetworkStatsService.cpp index 028642fe2c..48ac9938a1 100644 --- a/service-t/jni/com_android_server_net_NetworkStatsService.cpp +++ b/service-t/jni/com_android_server_net_NetworkStatsService.cpp @@ -34,11 +34,15 @@ using android::bpf::bpfGetUidStats; using android::bpf::bpfGetIfaceStats; +using android::bpf::bpfRegisterIface; using android::bpf::NetworkTraceHandler; namespace android { static void nativeRegisterIface(JNIEnv* env, jclass clazz, jstring iface) { + ScopedUtfChars iface8(env, iface); + if (iface8.c_str() == nullptr) return; + bpfRegisterIface(iface8.c_str()); } static jobject statsValueToEntry(JNIEnv* env, StatsValue* stats) { diff --git a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp index ac5b90eace..8a58e56760 100644 --- a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp +++ b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp @@ -40,8 +40,8 @@ namespace bpf { using base::Result; -const BpfMapRO& getIfaceIndexNameMap() { - static BpfMapRO ifaceIndexNameMap(IFACE_INDEX_NAME_MAP_PATH); +BpfMap& getIfaceIndexNameMap() { + static BpfMap ifaceIndexNameMap(IFACE_INDEX_NAME_MAP_PATH); return ifaceIndexNameMap; } @@ -50,6 +50,16 @@ const BpfMapRO& getIfaceStatsMap() { return ifaceStatsMap; } +void bpfRegisterIface(const char* iface) { + if (!iface) return; + if (strlen(iface) >= sizeof(IfaceValue)) return; + uint32_t ifindex = if_nametoindex(iface); + if (!ifindex) return; + IfaceValue ifname = {}; + strlcpy(ifname.name, iface, sizeof(ifname.name)); + getIfaceIndexNameMap().writeValue(ifindex, ifname, BPF_ANY); +} + int bpfGetUidStatsInternal(uid_t uid, StatsValue* stats, const BpfMapRO& appUidStatsMap) { auto statsEntry = appUidStatsMap.readValue(uid); diff --git a/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h b/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h index d2efff5eb1..0f28c1da45 100644 --- a/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h +++ b/service-t/native/libs/libnetworkstats/include/netdbpf/BpfNetworkStats.h @@ -114,6 +114,7 @@ int parseBpfNetworkStatsDevInternal(std::vector& lines, const BpfMapRO& statsMap, const BpfMapRO& ifaceMap); +void bpfRegisterIface(const char* iface); int bpfGetUidStats(uid_t uid, StatsValue* stats); int bpfGetIfaceStats(const char* iface, StatsValue* stats); int bpfGetIfIndexStats(int ifindex, StatsValue* stats);