]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - pdns/dnspcap2protobuf.cc
dnsdist: Add HTTPStatusAction to return a specific HTTP response
[thirdparty/pdns.git] / pdns / dnspcap2protobuf.cc
index 87477847f49e7638b7608a4d67908a00cbaec0ec..9d0f19ad75174a14ff1ba3d2ae1423d764809957 100644 (file)
@@ -1,15 +1,37 @@
+/*
+ * 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;
@@ -52,8 +74,7 @@ try {
   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;
@@ -77,17 +98,23 @@ try {
       }
 
       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();
         }
       }
 
@@ -101,8 +128,12 @@ try {
 
       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)
         {