valueSize = sizeof(QNameValue);
break;
default:
- throw std::runtime_error("Unsupported eBPF map type: " + std::to_string(static_cast<uint8_t>(d_config.d_type)));
+ throw std::runtime_error("Unsupported eBPF map type: " + std::to_string(static_cast<uint8_t>(d_config.d_type)) + " for legacy eBPF, perhaps you are trying to use an external program instead?");
}
}
else {
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);
- maps->d_cidr4 = BPFFilter::Map(configs["cidr4"], d_mapFormat);
- maps->d_cidr6 = BPFFilter::Map(configs["cidr6"], d_mapFormat);
+
+ if (d_mapFormat != BPFFilter::MapFormat::Legacy) {
+ maps->d_cidr4 = BPFFilter::Map(configs["cidr4"], d_mapFormat);
+ maps->d_cidr6 = BPFFilter::Map(configs["cidr6"], d_mapFormat);
+ }
+
if (!external) {
BPFFilter::MapConfiguration filters;
filters.d_maxItems = 1;
CIDR4 key(addr);
auto maps = d_maps.lock();
auto& map = maps->d_cidr4;
+ if (map.d_fd.getHandle() == -1) {
+ throw std::runtime_error("Trying to use an unsupported map type, likely adding a range to a legacy eBPF program");
+ }
if (map.d_count >= map.d_config.d_maxItems) {
throw std::runtime_error("Table full when trying to block " + addr.toString());
}
auto maps = d_maps.lock();
auto& map = maps->d_cidr6;
+ if (map.d_fd.getHandle() == -1) {
+ throw std::runtime_error("Trying to use an unsupported map type, likely adding a range to a legacy eBPF program");
+ }
if (map.d_count >= map.d_config.d_maxItems) {
throw std::runtime_error("Table full when trying to block " + addr.toString());
}
CIDR4 key(addr);
auto maps = d_maps.lock();
auto& map = maps->d_cidr4;
+ if (map.d_fd.getHandle() == -1) {
+ throw std::runtime_error("Trying to use an unsupported map type, likely adding a range to a legacy eBPF program");
+ }
res = bpf_delete_elem(map.d_fd.getHandle(), &key);
if (res == 0) {
--map.d_count;
auto maps = d_maps.lock();
auto& map = maps->d_cidr6;
+ if (map.d_fd.getHandle() == -1) {
+ throw std::runtime_error("Trying to use an unsupported map type, likely adding a range to a legacy eBPF program");
+ }
res = bpf_delete_elem(map.d_fd.getHandle(), &key);
if (res == 0) {
--map.d_count;