]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/sortlist.cc
2 #include "dnsrecords.hh"
9 int SortList::getMaxOrder(const Netmask
& formask
) const
13 auto place
= d_sortlist
.lookup(formask
);
14 if(place
&& place
->first
== formask
) {
15 for(const auto& o
: place
->second
.d_orders
)
16 order
= std::max(order
, o
->second
); // aki, shouldn't this be o.second?
22 void SortList::addEntry(const Netmask
& formask
, const Netmask
& valmask
, int order
)
25 order
=getMaxOrder(formask
);
28 // cout<<"Adding for netmask "<<formask.toString()<<" the order instruction that "<<valmask.toString()<<" is order "<<order<<endl;
29 d_sortlist
.insert(formask
).second
.d_orders
.insert(valmask
).second
=order
;
32 std::unique_ptr
<SortListOrderCmp
> SortList::getOrderCmp(const ComboAddress
& who
)
34 if(!d_sortlist
.match(who
)) {
35 return std::unique_ptr
<SortListOrderCmp
>();
37 auto fnd
= d_sortlist
.lookup(who
);
38 // cerr<<"Returning sort order for "<<who.toString()<<", have "<<fnd->second.d_orders.size()<<" entries"<<endl;
39 return make_unique
<SortListOrderCmp
>(fnd
->second
);
42 bool SortListOrderCmp::operator()(const ComboAddress
& a
, const ComboAddress
& b
) const
44 int aOrder
=std::numeric_limits
<int>::max();
47 if(d_slo
.d_orders
.match(a
))
48 aOrder
= d_slo
.d_orders
.lookup(a
)->second
;
49 if(d_slo
.d_orders
.match(b
))
50 bOrder
= d_slo
.d_orders
.lookup(b
)->second
;
52 return aOrder
< bOrder
;
55 static ComboAddress
getAddr(const DNSRecord
& dr
)
57 if(auto addr
=getRR
<ARecordContent
>(dr
)) {
61 return getRR
<AAAARecordContent
>(dr
)->getCA();
63 bool SortListOrderCmp::operator()(const DNSRecord
& ar
, const DNSRecord
& br
) const
65 if(ar
.d_type
< br
.d_type
)
67 if(ar
.d_type
> br
.d_type
)
70 if(ar
.d_type
!= QType::A
&& ar
.d_type
!= QType::AAAA
)
71 return false; // all other types are equal among themselves
73 int aOrder
=std::numeric_limits
<int>::max();
76 ComboAddress a
=getAddr(ar
), b
=getAddr(br
);
78 if(d_slo
.d_orders
.match(a
))
79 aOrder
= d_slo
.d_orders
.lookup(a
)->second
;
81 // cout<<"Could not find anything for "<<a.toString()<<" in our orders!"<<endl;
83 if(d_slo
.d_orders
.match(b
))
84 bOrder
= d_slo
.d_orders
.lookup(b
)->second
;
86 // cout<<"Could not find anything for "<<b.toString()<<" in our orders!"<<endl;
88 return aOrder
< bOrder
;