]> granicus.if.org Git - pdns/commitdiff
rec: Export the server ID in protobuf messages
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 28 Sep 2018 14:11:28 +0000 (16:11 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 28 Sep 2018 14:11:28 +0000 (16:11 +0200)
pdns/dnsmessage.proto
pdns/lwres.cc
pdns/pdns_recursor.cc
pdns/protobuf.cc
pdns/protobuf.hh
regression-tests.recursor-dnssec/test_Protobuf.py

index a6ccf509dd43f682efb223230e2c82af43433ab0..12ece21db3cbdab124488744bb6fc0932d80de2e 100644 (file)
@@ -46,7 +46,7 @@ message PBDNSMessage {
   }
   required Type type = 1;
   optional bytes messageId = 2;                 // UUID, shared by the query and the response
-  optional bytes serverIdentity = 3;            // UUID of the server emitting the protobuf message
+  optional bytes serverIdentity = 3;            // ID of the server emitting the protobuf message
   optional SocketFamily socketFamily = 4;
   optional SocketProtocol socketProtocol = 5;
   optional bytes from = 6;                      // DNS requestor (client)
index a0f97902b66e5085da5e17e482358c4d5959448a..21093ea8e57ea6d54c5cf0ee0a2d2d662898dddc 100644 (file)
@@ -56,6 +56,8 @@ static void logOutgoingQuery(std::shared_ptr<RemoteLogger> outgoingLogger, boost
     return;
 
   RecProtoBufMessage message(DNSProtoBufMessage::OutgoingQuery, uuid, nullptr, &ip, domain, type, QClass::IN, qid, doTCP, bytes);
+  message.setServerIdentity(SyncRes::s_serverID);
+
   if (initialRequestId) {
     message.setInitialRequestID(*initialRequestId);
   }
@@ -76,6 +78,7 @@ static void logIncomingResponse(std::shared_ptr<RemoteLogger> outgoingLogger, bo
     return;
 
   RecProtoBufMessage message(DNSProtoBufMessage::IncomingResponse, uuid, nullptr, &ip, domain, type, QClass::IN, qid, doTCP, bytes);
+  message.setServerIdentity(SyncRes::s_serverID);
   if (initialRequestId) {
     message.setInitialRequestID(*initialRequestId);
   }
index 65a8baffe7eb62069b40928e566a7ce9e6174855..1cc480e0480420a85757166112a6cd316f53307b 100644 (file)
@@ -773,6 +773,7 @@ static void protobufLogQuery(const std::shared_ptr<RemoteLogger>& logger, uint8_
   Netmask requestorNM(remote, remote.sin4.sin_family == AF_INET ? maskV4 : maskV6);
   const ComboAddress& requestor = requestorNM.getMaskedNetwork();
   RecProtoBufMessage message(DNSProtoBufMessage::Query, uniqueId, &requestor, &local, qname, qtype, qclass, id, tcp, len);
+  message.setServerIdentity(SyncRes::s_serverID);
   message.setEDNSSubnet(ednssubnet, ednssubnet.isIpv4() ? maskV4 : maskV6);
   message.setRequestorId(requestorId);
   message.setDeviceId(deviceId);
@@ -1010,6 +1011,7 @@ static void startDoResolve(void *p)
       Netmask requestorNM(dc->d_source, dc->d_source.sin4.sin_family == AF_INET ? luaconfsLocal->protobufMaskV4 : luaconfsLocal->protobufMaskV6);
       const ComboAddress& requestor = requestorNM.getMaskedNetwork();
       pbMessage = RecProtoBufMessage(RecProtoBufMessage::Response);
+      pbMessage->setServerIdentity(SyncRes::s_serverID);
       pbMessage->update(dc->d_uuid, &requestor, &dc->d_destination, dc->d_tcp, dc->d_mdp.d_header.id);
       pbMessage->setEDNSSubnet(dc->d_ednssubnet.source, dc->d_ednssubnet.source.isIpv4() ? luaconfsLocal->protobufMaskV4 : luaconfsLocal->protobufMaskV6);
       pbMessage->setQuestion(dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_mdp.d_qclass);
@@ -2030,6 +2032,7 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr
 #ifdef HAVE_PROTOBUF
     if(t_protobufServer) {
       pbMessage = RecProtoBufMessage(DNSProtoBufMessage::DNSProtoBufMessageType::Response);
+      pbMessage->setServerIdentity(SyncRes::s_serverID);
       if (logQuery && !(luaconfsLocal->protobufExportConfig.taggedOnly && policyTags.empty())) {
         protobufLogQuery(t_protobufServer, luaconfsLocal->protobufMaskV4, luaconfsLocal->protobufMaskV6, uniqueId, source, destination, ednssubnet.source, false, dh->id, question.size(), qname, qtype, qclass, policyTags, requestorId, deviceId);
       }
index 60dc3ada31bfa43ffe4f73e8672e08a9b01762f0..a726e2c599ef6954482eb012795151ce91c184dd 100644 (file)
@@ -242,6 +242,13 @@ void DNSProtoBufMessage::setDeviceId(const std::string& deviceId)
 #endif /* HAVE_PROTOBUF */
 }
 
+void DNSProtoBufMessage::setServerIdentity(const std::string& serverId)
+{
+#ifdef HAVE_PROTOBUF
+  d_message.set_serveridentity(serverId);
+#endif /* HAVE_PROTOBUF */
+}
+
 void DNSProtoBufMessage::setResponder(const std::string& responder)
 {
 #ifdef HAVE_PROTOBUF
index 0fab8fa3acf2c1b078139189f0f825e9a162b5dc..42491bc87f2fa20a7f026b486ae00129eda9b785 100644 (file)
@@ -70,6 +70,7 @@ public:
   void setResponder(const ComboAddress& responder);
   void setRequestorId(const std::string& requestorId);
   void setDeviceId(const std::string& deviceId);
+  void setServerIdentity(const std::string& serverId);
   std::string toDebugString() const;
   void addTag(const std::string& strValue);
   void addRR(const DNSName& qame, uint16_t utype, uint16_t uClass, uint32_t uTTl, const std::string& strBlob);
index 3a7bc317754aad2714e1aa316e03f52a9b716a2b..3f86caf804308365974d140e7e6407f3cadb0355 100644 (file)
@@ -106,6 +106,7 @@ class TestRecursorProtobuf(RecursorTest):
         self.assertTrue(msg.HasField('socketProtocol'))
         self.assertEquals(msg.socketProtocol, protocol)
         self.assertTrue(msg.HasField('messageId'))
+        self.assertTrue(msg.HasField('serverIdentity'))
         self.assertTrue(msg.HasField('id'))
         self.assertEquals(msg.id, query.id)
         self.assertTrue(msg.HasField('inBytes'))
@@ -126,6 +127,7 @@ class TestRecursorProtobuf(RecursorTest):
         self.assertTrue(msg.HasField('socketProtocol'))
         self.assertEquals(msg.socketProtocol, protocol)
         self.assertTrue(msg.HasField('messageId'))
+        self.assertTrue(msg.HasField('serverIdentity'))
         self.assertTrue(msg.HasField('id'))
         self.assertNotEquals(msg.id, query.id)
         self.assertTrue(msg.HasField('inBytes'))