From a57200c65fb9403c45534778b366199aa88664ce Mon Sep 17 00:00:00 2001 From: Y7n05h Date: Thu, 21 Apr 2022 04:06:48 +0800 Subject: [PATCH] add BPF_MAP_TYPE_LPM_TRIE support in getStats() Signed-off-by: Y7n05h Signed-off-by: Y7n05h --- pdns/bpf-filter.cc | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) 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; } -- 2.47.2