dns_random.hh lua-pdns.hh lua-recursor.hh namespaces.hh \
recpacketcache.hh base32.hh cachecleaner.hh json.hh version.hh \
ws-recursor.hh ws-api.hh secpoll-recursor.hh \
-responsestats.hh webserver.hh dnsname.hh"
+responsestats.hh webserver.hh dnsname.hh dnspacket.hh ednssubnet.hh"
CFILES="syncres.cc iputils.cc misc.cc unix_utility.cc qtype.cc \
logger.cc arguments.cc lwres.cc pdns_recursor.cc lua-iputils.cc \
* `signatures`: Number of DNSSEC signatures created
* `sys-msec`: Number of CPU miliseconds sent in system time
* `tcp-answers`: Number of answers sent out over TCP
-* `tcp-questions`: Number of questions received over TCP
+* `tcp-answers-bytes`: Total number of answer bytes sent over TCP (since 4.0.0)
+* `tcp-queries`: Number of questions received over TCP
+* `tcp4-answers`: Number of answers sent out over TCPv4
+* `tcp4-queries`: Number of questions received over TCPv4
+* `tcp6-answers`: Number of answers sent out over TCPv6
+* `tcp6-queries`: Number of questions received over TCPv6
* `timedout-questions`: Amount of packets that were dropped because they had to wait too long internally
* `udp-answers`: Number of answers sent out over UDP
-* `udp-queries`: Number of questions received over UDP
* `udp-answers-bytes`: Total number of answer bytes sent over UDP
+* `udp-queries`: Number of questions received over UDP
* `udp-do-queries`: Number of queries received with the DO (DNSSEC OK) bit set
* `udp-in-errors`: Number of packets, received faster than the OS could process them
* `udp-noport-errors`: Number of UDP packets where an ICMP response was received that the remote port was not listening
rcpgenerator.cc \
receiver.cc \
resolver.cc resolver.hh \
- responsestats.cc responsestats.hh \
+ responsestats.cc responsestats.hh responsestats-auth.cc \
rfc2136handler.cc \
secpoll-auth.cc secpoll-auth.hh \
serialtweaker.cc \
S.declare("signatures", "Number of DNSSEC signatures made");
S.declare("tcp-queries","Number of TCP queries received");
S.declare("tcp-answers","Number of answers sent out over TCP");
+ S.declare("tcp-answers-bytes","Total size of answers sent out over TCP");
S.declare("tcp4-queries","Number of IPv4 TCP queries received");
S.declare("tcp4-answers","Number of IPv4 answers sent out over TCP");
L<<Logger::Critical<<"PDNS is deaf and mute! Not listening on any interfaces"<<endl;
}
-ResponseStats g_rs;
-
void UDPNameserver::send(DNSPacket *p)
{
- const string& buffer=p->getString();
- static AtomicCounter &numanswered=*S.getPointer("udp-answers");
- static AtomicCounter &numanswered4=*S.getPointer("udp4-answers");
- static AtomicCounter &numanswered6=*S.getPointer("udp6-answers");
- static AtomicCounter &bytesanswered=*S.getPointer("udp-answers-bytes");
-
- g_rs.submitResponse(p->qtype.getCode(), buffer.length(), true);
+ string buffer=p->getString();
+ g_rs.submitResponse(*p, true);
struct msghdr msgh;
struct iovec iov;
char cbuf[256];
- /* Query statistics */
- if(p->d.aa) {
- if (p->d.rcode==RCode::NXDomain)
- S.ringAccount("nxdomain-queries",p->qdomain.toString()+"/"+p->qtype.getName());
- } else if (p->isEmpty()) {
- S.ringAccount("unauth-queries",p->qdomain.toString()+"/"+p->qtype.getName());
- S.ringAccount("remotes-unauth",p->d_remote);
- }
-
- /* Count responses (total/v4/v6) and byte counts */
- numanswered++;
- bytesanswered+=buffer.length();
- if(p->d_remote.sin4.sin_family==AF_INET)
- numanswered4++;
- else
- numanswered6++;
-
fillMSGHdr(&msgh, &iov, cbuf, 0, (char*)buffer.c_str(), buffer.length(), &p->d_remote);
if(p->d_anyLocal) {
}
}
-ResponseStats g_rs;
-
static string makeLoginfo(DNSComboWriter* dc)
try
{
--- /dev/null
+#include "responsestats.hh"
+#include "dnspacket.hh"
+#include "statbag.hh"
+
+extern StatBag S;
+/**
+ * Function that creates all the stats
+ * when udpOrTCP is true, it is udp
+ */
+void ResponseStats::submitResponse(DNSPacket &p, bool udpOrTCP) {
+ const string& buf=p.getString();
+ static AtomicCounter &udpnumanswered=*S.getPointer("udp-answers");
+ static AtomicCounter &udpnumanswered4=*S.getPointer("udp4-answers");
+ static AtomicCounter &udpnumanswered6=*S.getPointer("udp6-answers");
+ static AtomicCounter &udpbytesanswered=*S.getPointer("udp-answers-bytes");
+ static AtomicCounter &tcpnumanswered=*S.getPointer("tcp-answers");
+ static AtomicCounter &tcpnumanswered4=*S.getPointer("tcp4-answers");
+ static AtomicCounter &tcpnumanswered6=*S.getPointer("tcp6-answers");
+ static AtomicCounter &tcpbytesanswered=*S.getPointer("tcp-answers-bytes");
+
+ if(p.d.aa) {
+ if (p.d.rcode==RCode::NXDomain)
+ S.ringAccount("nxdomain-queries",p.qdomain.toString()+"/"+p.qtype.getName());
+ } else if (p.isEmpty()) {
+ S.ringAccount("unauth-queries",p.qdomain.toString()+"/"+p.qtype.getName());
+ S.ringAccount("remotes-unauth",p.d_remote);
+ }
+
+ if (udpOrTCP) { // udp
+ udpnumanswered++;
+ udpbytesanswered+=buf.length();
+ if(p.d_remote.sin4.sin_family==AF_INET)
+ udpnumanswered4++;
+ else
+ udpnumanswered6++;
+ } else { //tcp
+ tcpnumanswered++;
+ tcpbytesanswered+=buf.length();
+ if(p.d_remote.sin4.sin_family==AF_INET)
+ tcpnumanswered4++;
+ else
+ tcpnumanswered6++;
+ }
+
+ submitResponse(p.qtype.getCode(), buf.length(), udpOrTCP);
+}
d_sizecounters.push_back(make_pair(std::numeric_limits<uint16_t>::max(),0));
}
+ResponseStats g_rs = ResponseStats();
+
static bool pcomp(const pair<uint16_t, uint64_t>&a , const pair<uint16_t, uint64_t>&b)
{
return a.first < b.first;
-#ifndef PDNS_RESPONSESTATS_HH
-#define PDNS_RESPONSESTATS_HH
+#pragma once
#include "misc.hh"
+#include "dnspacket.hh"
class ResponseStats
{
public:
ResponseStats();
+ void submitResponse(DNSPacket &p, bool udpOrTCP);
void submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP);
map<uint16_t, uint64_t> getQTypeResponseCounts();
map<uint16_t, uint64_t> getSizeResponseCounts();
sizecounters_t d_sizecounters;
};
-#endif
+extern ResponseStats g_rs;
void TCPNameserver::sendPacket(shared_ptr<DNSPacket> p, int outsock)
{
-
- /* Query statistics */
- if(p->qtype.getCode()!=QType::AXFR && p->qtype.getCode()!=QType::IXFR) {
- if(p->d.aa) {
- if(p->d.rcode==RCode::NXDomain)
- S.ringAccount("nxdomain-queries",p->qdomain.toString()+"/"+p->qtype.getName());
- } else if(p->isEmpty()) {
- S.ringAccount("unauth-queries",p->qdomain.toString()+"/"+p->qtype.getName());
- S.ringAccount("remotes-unauth",p->d_remote);
- }
- }
+ g_rs.submitResponse(*p, false);
uint16_t len=htons(p->getString().length());
string buffer((const char*)&len, 2);
if(LPE) LPE->police(&(*packet), &(*cached), true);
sendPacket(cached, fd); // presigned, don't do it again
- incTCPAnswerCount(remote);
-
continue;
}
if(logDNSQueries)
if(!reply) // unable to write an answer?
break;
-
- incTCPAnswerCount(remote);
+
sendPacket(reply, fd);
}
}