]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/dnstap.cc
rec: allow exception to proxy protocal usage for specific listen addresses
[thirdparty/pdns.git] / pdns / dnstap.cc
CommitLineData
87f46425 1#include <boost/uuid/uuid.hpp>
82a91ddf
CH
2#include "config.h"
3#include "gettime.hh"
4#include "dnstap.hh"
5
454e9974
RG
6#ifndef DISABLE_PROTOBUF
7
565715ed 8#include <protozero/pbf_writer.hpp>
87f46425 9
db86777f
CHB
10namespace DnstapBaseFields
11{
12enum : protozero::pbf_tag_type
13{
14 identity = 1,
15 version = 2,
16 extra = 3,
17 message = 14,
18 type = 15
19};
fb4e9fa4
RG
20}
21
db86777f
CHB
22namespace DnstapMessageTypes
23{
24enum : protozero::pbf_tag_type
25{
26 message = 1
27};
fb4e9fa4
RG
28}
29
db86777f
CHB
30namespace DnstapSocketFamilyTypes
31{
32enum : protozero::pbf_tag_type
33{
34 inet = 1,
35 inet6 = 2
36};
fb4e9fa4
RG
37}
38
db86777f
CHB
39namespace DnstapMessageFields
40{
41enum : protozero::pbf_tag_type
42{
43 type = 1,
44 socket_family = 2,
45 socket_protocol = 3,
46 query_address = 4,
47 response_address = 5,
48 query_port = 6,
49 response_port = 7,
50 query_time_sec = 8,
51 query_time_nsec = 9,
52 query_message = 10,
53 query_zone = 11,
54 response_time_sec = 12,
55 response_time_nsec = 13,
56 response_message = 14
57};
fb4e9fa4
RG
58}
59
94219a42
CHB
60std::string&& DnstapMessage::getBuffer()
61{
62 return std::move(d_buffer);
63}
64
65DnstapMessage::DnstapMessage(std::string&& buffer, DnstapMessage::MessageType type, const std::string& identity, const ComboAddress* requestor, const ComboAddress* responder, DnstapMessage::ProtocolType protocol, const char* packet, const size_t len, const struct timespec* queryTime, const struct timespec* responseTime, const boost::optional<const DNSName&>& auth) :
269e4dac 66 d_buffer(std::move(buffer))
82a91ddf 67{
87f46425 68 protozero::pbf_writer pbf{d_buffer};
82a91ddf 69
fb4e9fa4
RG
70 pbf.add_bytes(DnstapBaseFields::identity, identity);
71 pbf.add_bytes(DnstapBaseFields::version, PACKAGE_STRING);
72 pbf.add_enum(DnstapBaseFields::type, DnstapMessageTypes::message);
82a91ddf 73
fb4e9fa4 74 protozero::pbf_writer pbf_message{pbf, DnstapBaseFields::message};
82a91ddf 75
94219a42 76 // NOLINTNEXTLINE(bugprone-narrowing-conversions,cppcoreguidelines-narrowing-conversions)
fb4e9fa4 77 pbf_message.add_enum(DnstapMessageFields::type, static_cast<protozero::pbf_tag_type>(type));
94219a42 78 // NOLINTNEXTLINE(bugprone-narrowing-conversions,cppcoreguidelines-narrowing-conversions)
7b9442f4 79 pbf_message.add_enum(DnstapMessageFields::socket_protocol, static_cast<protozero::pbf_tag_type>(protocol));
fb4e9fa4
RG
80
81 if (requestor != nullptr) {
82 pbf_message.add_enum(DnstapMessageFields::socket_family, requestor->sin4.sin_family == AF_INET ? DnstapSocketFamilyTypes::inet : DnstapSocketFamilyTypes::inet6);
83 }
84 else if (responder != nullptr) {
85 pbf_message.add_enum(DnstapMessageFields::socket_family, responder->sin4.sin_family == AF_INET ? DnstapSocketFamilyTypes::inet : DnstapSocketFamilyTypes::inet6);
86 }
82a91ddf 87
ebd67986 88 if (requestor != nullptr) {
ebd67986 89 if (requestor->sin4.sin_family == AF_INET) {
94219a42 90 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
fb4e9fa4 91 pbf_message.add_bytes(DnstapMessageFields::query_address, reinterpret_cast<const char*>(&requestor->sin4.sin_addr.s_addr), sizeof(requestor->sin4.sin_addr.s_addr));
87f46425
RG
92 }
93 else if (requestor->sin4.sin_family == AF_INET6) {
94219a42 94 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
fb4e9fa4 95 pbf_message.add_bytes(DnstapMessageFields::query_address, reinterpret_cast<const char*>(&requestor->sin6.sin6_addr.s6_addr), sizeof(requestor->sin6.sin6_addr.s6_addr));
ebd67986 96 }
fb4e9fa4 97 pbf_message.add_uint32(DnstapMessageFields::query_port, ntohs(requestor->sin4.sin_port));
82a91ddf 98 }
87f46425 99
ebd67986 100 if (responder != nullptr) {
ebd67986 101 if (responder->sin4.sin_family == AF_INET) {
94219a42 102 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
fb4e9fa4 103 pbf_message.add_bytes(DnstapMessageFields::response_address, reinterpret_cast<const char*>(&responder->sin4.sin_addr.s_addr), sizeof(responder->sin4.sin_addr.s_addr));
87f46425
RG
104 }
105 else if (responder->sin4.sin_family == AF_INET6) {
94219a42 106 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
fb4e9fa4 107 pbf_message.add_bytes(DnstapMessageFields::response_address, reinterpret_cast<const char*>(&responder->sin6.sin6_addr.s6_addr), sizeof(responder->sin6.sin6_addr.s6_addr));
ebd67986 108 }
fb4e9fa4 109 pbf_message.add_uint32(DnstapMessageFields::response_port, ntohs(responder->sin4.sin_port));
82a91ddf 110 }
87f46425 111
82a91ddf 112 if (queryTime != nullptr) {
fb4e9fa4
RG
113 pbf_message.add_uint64(DnstapMessageFields::query_time_sec, queryTime->tv_sec);
114 pbf_message.add_fixed32(DnstapMessageFields::query_time_nsec, queryTime->tv_nsec);
82a91ddf 115 }
87f46425 116
82a91ddf 117 if (responseTime != nullptr) {
fb4e9fa4
RG
118 pbf_message.add_uint64(DnstapMessageFields::response_time_sec, responseTime->tv_sec);
119 pbf_message.add_fixed32(DnstapMessageFields::response_time_nsec, responseTime->tv_nsec);
82a91ddf
CH
120 }
121
d7d95852 122 if (packet != nullptr && len >= sizeof(dnsheader)) {
94219a42
CHB
123 const dnsheader_aligned dnsheader(packet);
124 if (!dnsheader->qr) {
d7d95852 125 pbf_message.add_bytes(DnstapMessageFields::query_message, packet, len);
db86777f
CHB
126 }
127 else {
d7d95852
CHB
128 pbf_message.add_bytes(DnstapMessageFields::response_message, packet, len);
129 }
82a91ddf 130 }
82a91ddf 131
87f46425 132 if (auth) {
fb4e9fa4 133 pbf_message.add_bytes(DnstapMessageFields::query_zone, auth->toDNSString());
87f46425 134 }
fb4e9fa4
RG
135
136 pbf_message.commit();
82a91ddf
CH
137}
138
139void DnstapMessage::setExtra(const std::string& extra)
140{
87f46425 141 protozero::pbf_writer pbf{d_buffer};
fb4e9fa4 142 pbf.add_bytes(DnstapBaseFields::extra, extra);
82a91ddf 143}
454e9974
RG
144
145#endif /* DISABLE_PROTOBUF */