]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Merge pull request #11565 from rgacogne/ddist-fix-ebpf-qnames
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 21 Apr 2022 08:41:42 +0000 (10:41 +0200)
committerGitHub <noreply@github.com>
Thu, 21 Apr 2022 08:41:42 +0000 (10:41 +0200)
dnsdist: Fix wrong eBPF values (qtype, counter) being inserted for qnames

1  2 
pdns/bpf-filter.cc

diff --combined pdns/bpf-filter.cc
index 5e85cbcda3fe5cba0db9043854d68b8a862adca0,877f5f8a46ba459aa7d11872ea8334edff32badb..2323a05f1ee839a65a5cfa7d853ac22562543c44
@@@ -313,8 -313,7 +313,8 @@@ static FDWrapper loadProgram(const stru
  }
  
  
 -BPFFilter::BPFFilter(const BPFFilter::MapConfiguration& v4, const BPFFilter::MapConfiguration& v6, const BPFFilter::MapConfiguration& qnames, BPFFilter::MapFormat format, bool external): d_mapFormat(format), d_external(external)
 +BPFFilter::BPFFilter(std::unordered_map<std::string, MapConfiguration>& configs, BPFFilter::MapFormat format, bool external) :
 +  d_mapFormat(format), d_external(external)
  {
    if (d_mapFormat != BPFFilter::MapFormat::Legacy && !d_external) {
      throw std::runtime_error("Unsupported eBPF map format, the current internal implemenation only supports the legacy format");
  
    auto maps = d_maps.lock();
  
 -  maps->d_v4 = BPFFilter::Map(v4, d_mapFormat);
 -  maps->d_v6 = BPFFilter::Map(v6, d_mapFormat);
 -  maps->d_qnames = BPFFilter::Map(qnames, d_mapFormat);
 +  maps->d_v4 = BPFFilter::Map(configs["ipv4"], d_mapFormat);
 +  maps->d_v6 = BPFFilter::Map(configs["ipv6"], d_mapFormat);
 +  maps->d_qnames = BPFFilter::Map(configs["qnames"], d_mapFormat);
    if (!external) {
      BPFFilter::MapConfiguration filters;
      filters.d_maxItems = 1;
@@@ -504,12 -503,11 +504,11 @@@ void BPFFilter::block(const DNSName& qn
        throw std::runtime_error("Table full when trying to block " + qname.toLogString());
      }
  
-     int res = bpf_lookup_elem(map.d_fd.getHandle(), &key, &value);
+     int res = bpf_lookup_elem(map.d_fd.getHandle(), &key, value);
      if (res != -1) {
        throw std::runtime_error("Trying to block an already blocked qname: " + qname.toLogString());
      }
-     res = bpf_update_elem(map.d_fd.getHandle(), &key, &value, BPF_NOEXIST);
+     res = bpf_update_elem(map.d_fd.getHandle(), &key, value, BPF_NOEXIST);
      if (res == 0) {
        ++map.d_count;
      }
@@@ -687,7 -685,7 +686,7 @@@ uint64_t BPFFilter::getHits(const Combo
  
  #else
  
 -BPFFilter::BPFFilter(const BPFFilter::MapConfiguration&, const BPFFilter::MapConfiguration&, const BPFFilter::MapConfiguration&, BPFFilter::MapFormat, bool)
 +BPFFilter::BPFFilter(std::unordered_map<std::string, MapConfiguration>& configs, BPFFilter::MapFormat format, bool external)
  {
  }