#include "dnsparser.hh"
-ResponseStats::ResponseStats() : d_qtypecounters(new std::atomic<unsigned long>[65536]), d_rcodecounters(new std::atomic<unsigned long>[256])
+static auto sizeBounds()
{
- d_sizecounters.push_back(make_pair(20,0));
- d_sizecounters.push_back(make_pair(40,0));
- d_sizecounters.push_back(make_pair(60,0));
- d_sizecounters.push_back(make_pair(80,0));
- d_sizecounters.push_back(make_pair(100,0));
- d_sizecounters.push_back(make_pair(150,0));
- for(int n=200; n < 65000 ; n+=200)
- d_sizecounters.push_back(make_pair(n,0));
- d_sizecounters.push_back(make_pair(std::numeric_limits<uint16_t>::max(),0));
- for(unsigned int n =0 ; n < 65535; ++n)
+ std::vector<uint64_t> bounds;
+
+ bounds.push_back(20);
+ bounds.push_back(40);
+ bounds.push_back(60);
+ bounds.push_back(80);
+ bounds.push_back(100);
+ bounds.push_back(150);
+ for (uint64_t n = 200; n < 65000; n += 200) {
+ bounds.push_back(n);
+ }
+ return bounds;
+}
+
+ResponseStats::ResponseStats() :
+ d_sizecounters("SizeCounters", sizeBounds())
+{
+ for (unsigned int n = 0; n < 65535; ++n) {
d_qtypecounters[n] = 0;
- for(unsigned int n =0 ; n < 256; ++n)
+ }
+ for (unsigned int n = 0; n < 256; ++n) {
d_rcodecounters[n] = 0;
+ }
}
ResponseStats g_rs;
-static bool pcomp(const pair<uint16_t, uint64_t>&a , const pair<uint16_t, uint64_t>&b)
-{
- return a.first < b.first;
-}
-
-void ResponseStats::submitResponse(uint16_t qtype,uint16_t respsize, uint8_t rcode, bool udpOrTCP)
+void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, uint8_t rcode, bool udpOrTCP)
{
- d_rcodecounters[rcode]++;
- submitResponse(qtype, respsize, udpOrTCP);
+ d_rcodecounters[rcode]++;
+ submitResponse(qtype, respsize, udpOrTCP);
}
-void ResponseStats::submitResponse(uint16_t qtype,uint16_t respsize, bool udpOrTCP)
+void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP)
{
d_qtypecounters[qtype]++;
- pair<uint16_t, uint64_t> s(respsize, 0);
- sizecounters_t::iterator iter = std::upper_bound(d_sizecounters.begin(), d_sizecounters.end(), s, pcomp);
- if(iter!= d_sizecounters.begin())
- --iter;
- iter->second++;
+ d_sizecounters(respsize);
}
map<uint16_t, uint64_t> ResponseStats::getQTypeResponseCounts()
{
map<uint16_t, uint64_t> ret;
uint64_t count;
- for(unsigned int i = 0 ; i < 65535 ; ++i) {
- count= d_qtypecounters[i];
- if(count)
- ret[i]=count;
+ for (unsigned int i = 0; i < 65535; ++i) {
+ count = d_qtypecounters[i];
+ if (count) {
+ ret[i] = count;
+ }
}
return ret;
}
map<uint16_t, uint64_t> ResponseStats::getSizeResponseCounts()
{
map<uint16_t, uint64_t> ret;
- for(const auto & sizecounter : d_sizecounters) {
- ret[sizecounter.first]=sizecounter.second;
+ for (const auto& sizecounter : d_sizecounters.getRawData()) {
+ if (sizecounter.d_count) {
+ ret[sizecounter.d_boundary] = sizecounter.d_count;
+ }
}
return ret;
}
{
map<uint8_t, uint64_t> ret;
uint64_t count;
- for(unsigned int i = 0 ; i < 256 ; ++i) {
- count= d_rcodecounters[i];
- if(count)
- ret[i]=count;
+ for (unsigned int i = 0; i < 256; ++i) {
+ count = d_rcodecounters[i];
+ if (count) {
+ ret[i] = count;
+ }
}
return ret;
}
string ResponseStats::getQTypeReport()
{
- typedef map<uint16_t, uint64_t> qtypenums_t;
- qtypenums_t qtypenums = getQTypeResponseCounts();
+ auto qtypenums = getQTypeResponseCounts();
ostringstream os;
boost::format fmt("%s\t%d\n");
- for(const qtypenums_t::value_type& val : qtypenums) {
- os << (fmt %DNSRecordContent::NumberToType( val.first) % val.second).str();
+ for (const auto& val : qtypenums) {
+ os << (fmt % DNSRecordContent::NumberToType(val.first) % val.second).str();
}
return os.str();
}
*/
#pragma once
-#include <boost/scoped_array.hpp>
+#include <array>
+#include "histogram.hh"
#include "dnspacket.hh"
public:
ResponseStats();
- void submitResponse(DNSPacket &p, bool udpOrTCP, bool last=true);
+ void submitResponse(DNSPacket& p, bool udpOrTCP, bool last = true);
void submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP);
void submitResponse(uint16_t qtype, uint16_t respsize, uint8_t rcode, bool udpOrTCP);
map<uint16_t, uint64_t> getQTypeResponseCounts();
string getQTypeReport();
private:
- boost::scoped_array<std::atomic<unsigned long>> d_qtypecounters;
- boost::scoped_array<std::atomic<unsigned long>> d_rcodecounters;
- typedef vector<pair<uint16_t, uint64_t> > sizecounters_t;
- sizecounters_t d_sizecounters;
+ std::array<std::atomic<uint64_t>, 65535> d_qtypecounters;
+ std::array<std::atomic<uint64_t>, 256> d_rcodecounters;
+ pdns::AtomicHistogram<uint64_t> d_sizecounters;
};
extern ResponseStats g_rs;