+/*
+ * This file is part of PowerDNS or dnsdist.
+ * Copyright -- PowerDNS.COM B.V. and its contributors
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * In addition, for the avoidance of any doubt, permission is granted to
+ * link this program with OpenSSL and to (re)distribute the binaries
+ * produced as the result of such linking.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <boost/uuid/uuid.hpp>
-#include <boost/uuid/uuid_generators.hpp>
#include "iputils.hh"
#include "misc.hh"
+#include "protobuf.hh"
#include "dns.hh"
#include "dnspcap.hh"
#include "dnsparser.hh"
#include "protobuf.hh"
+#include "uuid-utils.hh"
#include "statbag.hh"
StatBag S;
if(argc==4)
ind=atoi(argv[3]);
- std::map<uint16_t,boost::uuids::uuid> ids;
- boost::uuids::random_generator uuidGenerator;
+ std::map<uint16_t,std::pair<boost::uuids::uuid,struct timeval> > ids;
try {
while (pr.getUDPPacket()) {
const dnsheader* dh=(dnsheader*)pr.d_payload;
}
boost::uuids::uuid uniqueId;
+ struct timeval queryTime = { 0, 0 };
+ bool hasQueryTime = false;
if (!dh->qr) {
- uniqueId = uuidGenerator();
- ids[dh->id] = uniqueId;
+ queryTime.tv_sec = pr.d_pheader.ts.tv_sec;
+ queryTime.tv_usec = pr.d_pheader.ts.tv_usec;
+ uniqueId = getUniqueID();
+ ids[dh->id] = std::make_pair(uniqueId, queryTime);
}
else {
const auto& it = ids.find(dh->id);
if (it != ids.end()) {
- uniqueId = it->second;
+ uniqueId = it->second.first;
+ queryTime = it->second.second;
+ hasQueryTime = true;
}
else {
- uniqueId = uuidGenerator();
+ uniqueId = getUniqueID();
}
}
if (dh->qr) {
message.setResponseCode(dh->rcode);
+ if (hasQueryTime) {
+ message.setQueryTime(queryTime.tv_sec, queryTime.tv_usec);
+ }
+
try {
- message.addRRsFromPacket((const char*) dh, pr.d_len);
+ message.addRRsFromPacket((const char*) dh, pr.d_len, true);
}
catch(std::exception& e)
{