From: Y7n05h Date: Wed, 20 Apr 2022 20:06:48 +0000 (+0800) Subject: add BPF_MAP_TYPE_LPM_TRIE support in getStats() X-Git-Tag: auth-4.8.0-alpha0~66^2~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a57200c65fb9403c45534778b366199aa88664ce;p=thirdparty%2Fpdns.git add BPF_MAP_TYPE_LPM_TRIE support in getStats() Signed-off-by: Y7n05h Signed-off-by: Y7n05h --- diff --git a/pdns/bpf-filter.cc b/pdns/bpf-filter.cc index cc59b8eac3..5ff53527a8 100644 --- a/pdns/bpf-filter.cc +++ b/pdns/bpf-filter.cc @@ -700,6 +700,13 @@ std::vector > BPFFilter::getAddrStats() static_assert(sizeof(v6Addr.sin6_addr.s6_addr) == sizeof(v6Key), "POSIX mandates s6_addr to be an array of 16 uint8_t"); memset(&v6Key, 0, sizeof(v6Key)); + + CIDR4 cidr4[2]; + memset(cidr4, 0, sizeof(cidr4)); + CIDR6 cidr6[2]; + memset(cidr6, 0, sizeof(cidr6)); + + auto maps = d_maps.lock(); { @@ -732,6 +739,32 @@ std::vector > BPFFilter::getAddrStats() } } + { + auto& map =maps->d_cidr4; + int res=bpf_get_next_key(map.d_fd.getHandle(), &cidr4[0], &cidr4[1]); + while (res == 0) { + if (bpf_lookup_elem(map.d_fd.getHandle(), &cidr4[0], &value) == 0) { + v4Addr.sin_addr.s_addr = cidr4[0].addr.s_addr; + result.emplace_back(ComboAddress(&v4Addr), value.counter); + } + + res = bpf_get_next_key(map.d_fd.getHandle(), &cidr4[0], &cidr4[1]); + } + } + + { + auto& map =maps->d_cidr6; + int res=bpf_get_next_key(map.d_fd.getHandle(), &cidr6[0], &cidr6[1]); + while (res == 0) { + if (bpf_lookup_elem(map.d_fd.getHandle(), &cidr6[0], &value) == 0) { + v6Addr.sin6_addr=cidr6[0].addr; + result.emplace_back(ComboAddress(&v6Addr), value.counter); + } + + res = bpf_get_next_key(map.d_fd.getHandle(), &cidr6[0], &cidr6[1]); + } + } + return result; }