From: Otto Moerbeek Date: Tue, 19 Nov 2024 10:02:18 +0000 (+0100) Subject: headerFlags and ednsVersion are already in network order, add test X-Git-Tag: rec-5.2.0-beta1~4^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2011fbba6fbab963438a832221c516b13b1c4159;p=thirdparty%2Fpdns.git headerFlags and ednsVersion are already in network order, add test --- diff --git a/contrib/ProtobufLogger.py b/contrib/ProtobufLogger.py index 3538bc3249..4a39f36a36 100644 --- a/contrib/ProtobufLogger.py +++ b/contrib/ProtobufLogger.py @@ -259,11 +259,11 @@ class PDNSPBConnHandler(object): headerFlags = "N/A" if msg.HasField('headerFlags'): - headerFlags = "0x%04X" % msg.headerFlags + headerFlags = "0x%04X" % socket.ntohs(msg.headerFlags) ednsVersion = "N/A" if msg.HasField('ednsVersion'): - ednsVersion = "0x%08X" % msg.ednsVersion + ednsVersion = "0x%08X" % socket.ntohl(msg.ednsVersion) print('[%s] %s of size %d: %s%s%s -> %s%s(%s) id: %d uuid: %s%s ' 'requestorid: %s deviceid: %s devicename: %s serverid: %s nod: %s workerId: %s pcCacheHit: %s outgoingQueries: %s headerFlags: %s ednsVersion: %s' % diff --git a/pdns/recursordist/pdns_recursor.cc b/pdns/recursordist/pdns_recursor.cc index 2291986a58..ef80d2dbcc 100644 --- a/pdns/recursordist/pdns_recursor.cc +++ b/pdns/recursordist/pdns_recursor.cc @@ -2036,7 +2036,7 @@ void getQNameAndSubnet(const std::string& question, DNSName* dnsname, uint16_t* pos += 1; const auto* drh = reinterpret_cast(&question.at(pos)); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) if (ntohs(drh->d_type) == QType::OPT) { - ednsVersion = htonl(drh->d_ttl); + ednsVersion = drh->d_ttl; } pos += sizeof(dnsrecordheader); diff --git a/pdns/recursordist/rec-main.cc b/pdns/recursordist/rec-main.cc index 10d47c3e42..1021325076 100644 --- a/pdns/recursordist/rec-main.cc +++ b/pdns/recursordist/rec-main.cc @@ -562,7 +562,7 @@ void protobufLogQuery(LocalStateHolder& luaconfsLocal, const boo for (const auto& mit : meta) { msg.setMeta(mit.first, mit.second.stringVal, mit.second.intVal); } - msg.setHeaderFlags(htons(*getFlagsFromDNSHeader(&header))); + msg.setHeaderFlags(*getFlagsFromDNSHeader(&header)); if (ednsVersion) { msg.setEDNSVersion(*ednsVersion); } diff --git a/regression-tests.recursor-dnssec/test_Protobuf.py b/regression-tests.recursor-dnssec/test_Protobuf.py index db6828dfb3..432859301e 100644 --- a/regression-tests.recursor-dnssec/test_Protobuf.py +++ b/regression-tests.recursor-dnssec/test_Protobuf.py @@ -199,6 +199,13 @@ class TestRecursorProtobuf(RecursorTest): self.assertTrue(msg.question.HasField('qName')) self.assertEqual(msg.question.qName, qname) + # This method takes wire format values to check + def checkProtobufHeaderFlagsAndEDNSVersion(self, msg, flags, ednsVersion): + self.assertTrue(msg.HasField('headerFlags')) + self.assertEqual(msg.headerFlags, socket.htons(flags)) + self.assertTrue(msg.HasField('ednsVersion')) + self.assertEqual(msg.ednsVersion, socket.htonl(ednsVersion)) + def checkProtobufResponse(self, msg, protocol, response, initiator='127.0.0.1', receivedSize=None, vstate=dnsmessage_pb2.PBDNSMessage.VState.Indeterminate): self.assertEqual(msg.type, dnsmessage_pb2.PBDNSMessage.DNSResponseType) self.checkProtobufBase(msg, protocol, response, initiator, receivedSize=receivedSize) @@ -342,6 +349,8 @@ auth-zones=example=configs/%s/example.zone""" % _confdir # check the protobuf messages corresponding to the UDP query and answer msg = self.getFirstProtobufMessage() self.checkProtobufQuery(msg, dnsmessage_pb2.PBDNSMessage.UDP, query, dns.rdataclass.IN, dns.rdatatype.A, name) + # wire format, RD and CD set in headerflags, plus DO bit in flags part of EDNS Version + self.checkProtobufHeaderFlagsAndEDNSVersion(msg, 0x0110, 0x00008000) # then the response msg = self.getFirstProtobufMessage() self.checkProtobufResponse(msg, dnsmessage_pb2.PBDNSMessage.UDP, res, '127.0.0.1')