return pol;
}
- for(const auto& qa : z.qpolAddr) {
- if(qa.first.match(ca)) {
- // cerr<<"Had a hit on the IP address ("<<ca.toString()<<") of the client"<<endl;
- return qa.second;
- }
+ if(auto fnd=z.qpolAddr.lookup(ca)) {
+ // cerr<<"Had a hit on the IP address ("<<ca.toString()<<") of the client"<<endl;
+ return fnd->second;
}
}
continue;
for(const auto& z : d_zones) {
- for(const auto& qa : z.postpolAddr) {
- if(qa.first.match(ca)) {
- // cerr<<"Had a hit on IP address in answer"<<endl;
- return qa.second;
- }
- }
+ if(auto fnd=z.postpolAddr.lookup(ca))
+ return fnd->second;
}
}
return Policy{PolicyKind::NoAction};
{
if((int)d_zones.size() <= zone)
d_zones.resize(zone+1);
-
}
void DNSFilterEngine::addClientTrigger(const Netmask& nm, Policy pol, int zone)
{
assureZones(zone);
- d_zones[zone].qpolAddr.push_back({nm,pol});
+ d_zones[zone].qpolAddr.insert(nm).second=pol;
}
void DNSFilterEngine::addResponseTrigger(const Netmask& nm, Policy pol, int zone)
{
assureZones(zone);
- d_zones[zone].postpolAddr.push_back({nm,pol});
+ d_zones[zone].postpolAddr.insert(nm).second=pol;
}
void DNSFilterEngine::addQNameTrigger(const DNSName& n, Policy pol, int zone)
assureZones(zone);
auto& qpols = d_zones[zone].qpolAddr;
- qpols.erase(remove(qpols.begin(), qpols.end(),pair<Netmask,Policy>(nm,pol)), qpols.end());
+ qpols.erase(nm);
return true;
}
{
assureZones(zone);
auto& postpols = d_zones[zone].postpolAddr;
- postpols.erase(remove(postpols.begin(), postpols.end(),pair<Netmask,Policy>(nm,pol)), postpols.end());
+ postpols.erase(nm);
return true;
}
Verbatim domain names
Wildcard versions (*.domain.com does NOT match domain.com)
Netmasks (IPv4 and IPv6)
-
Finally, triggers are grouped in different zones. The "first" zone that has a match
is consulted. Then within that zone, rules again have precedences.
*/
Policy getProcessingPolicy(const DNSName& qname) const;
Policy getPostPolicy(const vector<DNSRecord>& records) const;
+ size_t size() {
+ return d_zones.size();
+ }
private:
void assureZones(int zone);
struct Zone {
std::map<DNSName, Policy> qpolName;
- std::vector<pair<Netmask, Policy>> qpolAddr;
+ NetmaskTree<Policy> qpolAddr;
std::map<DNSName, Policy> propolName;
- std::vector<pair<Netmask, Policy>> postpolAddr;
+ NetmaskTree<Policy> postpolAddr;
};
vector<Zone> d_zones;