}
-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;
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;
}
#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)
{
}