else if(conn->state==TCPConnection::GETQUESTION) {
ssize_t bytes=recv(conn->getFD(), &conn->data[conn->bytesread], conn->qlen - conn->bytesread, 0);
if(!bytes || bytes < 0 || bytes > std::numeric_limits<std::uint16_t>::max()) {
- g_log<<Logger::Error<<"TCP client "<< conn->d_remote.toStringWithPort() <<" disconnected while reading question body"<<endl;
+ if(g_logCommonErrors) {
+ g_log<<Logger::Error<<"TCP client "<< conn->d_remote.toStringWithPort() <<" disconnected while reading question body"<<endl;
+ }
t_fdm->removeReadFD(fd);
return;
}
dc->d_uuid = (*t_uuidGenerator)();
}
+ const struct dnsheader* dh = reinterpret_cast<const struct dnsheader*>(&conn->data[0]);
if(t_protobufServer) {
try {
- const struct dnsheader* dh = reinterpret_cast<const struct dnsheader*>(&conn->data[0]);
if (logQuery && !(luaconfsLocal->protobufExportConfig.taggedOnly && dc->d_policyTags.empty())) {
protobufLogQuery(t_protobufServer, luaconfsLocal->protobufMaskV4, luaconfsLocal->protobufMaskV6, dc->d_uuid, dc->d_source, dc->d_destination, dc->d_ednssubnet.source, true, dh->id, conn->qlen, qname, qtype, qclass, dc->d_policyTags, dc->d_requestorId, dc->d_deviceId);
#endif
if(dc->d_mdp.d_header.qr) {
g_stats.ignoredCount++;
- g_log<<Logger::Error<<"Ignoring answer from TCP client "<< dc->getRemote() <<" on server socket!"<<endl;
+ if(g_logCommonErrors) {
+ g_log<<Logger::Error<<"Ignoring answer from TCP client "<< dc->getRemote() <<" on server socket!"<<endl;
+ }
delete dc;
return;
}
if(dc->d_mdp.d_header.opcode) {
g_stats.ignoredCount++;
- g_log<<Logger::Error<<"Ignoring non-query opcode from TCP client "<< dc->getRemote() <<" on server socket!"<<endl;
+ if(g_logCommonErrors) {
+ g_log<<Logger::Error<<"Ignoring non-query opcode from TCP client "<< dc->getRemote() <<" on server socket!"<<endl;
+ }
+ delete dc;
+ return;
+ }
+ else if (dh->qdcount == 0) {
+ g_stats.emptyQueriesCount++;
+ if(g_logCommonErrors) {
+ g_log<<Logger::Error<<"Ignoring empty (qdcount == 0) query from "<< dc->getRemote() <<" on server socket!"<<endl;
+ }
delete dc;
return;
}
g_log<<Logger::Error<<"Ignoring non-query opcode "<<dh->opcode<<" from "<<fromaddr.toString()<<" on server socket!"<<endl;
}
}
+ else if (dh->qdcount == 0) {
+ g_stats.emptyQueriesCount++;
+ if(g_logCommonErrors) {
+ g_log<<Logger::Error<<"Ignoring empty (qdcount == 0) query from "<<fromaddr.toString()<<" on server socket!"<<endl;
+ }
+ }
else {
struct timeval tv={0,0};
HarvestTimestamp(&msgh, &tv);
static const oid policyResultCustomOID[] = { RECURSOR_STATS_OID, 91 };
static const oid queryPipeFullDropsOID[] = { RECURSOR_STATS_OID, 92 };
static const oid truncatedDropsOID[] = { RECURSOR_STATS_OID, 93 };
+static const oid emptyQueriesOID[] = { RECURSOR_STATS_OID, 94 };
static std::unordered_map<oid, std::string> s_statsMap;
registerCounter64Stat("too-old-drops", tooOldDropsOID, OID_LENGTH(tooOldDropsOID));
registerCounter64Stat("query-pipe-full-drops", queryPipeFullDropsOID, OID_LENGTH(queryPipeFullDropsOID));
registerCounter64Stat("truncated-drops", truncatedDropsOID, OID_LENGTH(truncatedDropsOID));
+ registerCounter64Stat("empty-queries", emptyQueriesOID, OID_LENGTH(emptyQueriesOID));
registerCounter64Stat("answers0-1", answers01OID, OID_LENGTH(answers01OID));
registerCounter64Stat("answers1-10", answers110OID, OID_LENGTH(answers110OID));
registerCounter64Stat("answers10-100", answers10100OID, OID_LENGTH(answers10100OID));
addGetStat("no-packet-error", &g_stats.noPacketError);
addGetStat("dlg-only-drops", &SyncRes::s_nodelegated);
addGetStat("ignored-packets", &g_stats.ignoredCount);
+ addGetStat("empty-queries", &g_stats.emptyQueriesCount);
addGetStat("max-mthread-stack", &g_stats.maxMThreadStackUsage);
addGetStat("negcache-entries", boost::bind(getNegCacheSize));