diff --git a/bpf/progs/netd.c b/bpf/progs/netd.c index 285a4cd27e..cb5ece74b7 100644 --- a/bpf/progs/netd.c +++ b/bpf/progs/netd.c @@ -82,7 +82,7 @@ DEFINE_BPF_MAP_RW_NETD(lock_hash_test_map, HASH, uint32_t, bool, 1) DEFINE_BPF_SK_STORAGE(sk_storage, SkStorageValue) -/* never actually used from ebpf */ +// never used from eBpf, see cacheSize in service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp DEFINE_BPF_MAP_NO_NETD(iface_index_name_map, HASH, uint32_t, IfaceValue, 1000) // A single-element configuration array, packet tracing is enabled when 'true'. diff --git a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp index 49a65d3839..e314196f1f 100644 --- a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp +++ b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp @@ -50,13 +50,23 @@ const BpfMapRO& getIfaceStatsMap() { return ifaceStatsMap; } +static constexpr unsigned cacheSize = 1024; // see 'iface_index_name_map' bpf map size +static IfaceValue cache[cacheSize]; + +static inline const IfaceValue& updateCache(unsigned i, const IfaceValue &v) { + if (i < cacheSize) cache[i] = v; + return v; +} + Result ifindex2name(const uint32_t ifindex) { + if (ifindex < cacheSize && cache[ifindex].name[0]) return cache[ifindex]; + Result v = getIfaceIndexNameMap().readValue(ifindex); - if (v.ok()) return v; + if (v.ok()) return updateCache(ifindex, v.value()); IfaceValue iv = {}; - if (!if_indextoname(ifindex, iv.name)) return v; + if (!if_indextoname(ifindex, iv.name)) return v; // v is an error getIfaceIndexNameMap().writeValue(ifindex, iv, BPF_ANY); - return iv; + return updateCache(ifindex, iv); } void bpfRegisterIface(const char* iface) { @@ -67,6 +77,7 @@ void bpfRegisterIface(const char* iface) { IfaceValue ifname = {}; strlcpy(ifname.name, iface, sizeof(ifname.name)); getIfaceIndexNameMap().writeValue(ifindex, ifname, BPF_ANY); + updateCache(ifindex, ifname); } int bpfGetUidStatsInternal(uid_t uid, StatsValue* stats,