]>
Commit | Line | Data |
---|---|---|
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 |
10 | namespace DnstapBaseFields |
11 | { | |
12 | enum : 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 |
22 | namespace DnstapMessageTypes |
23 | { | |
24 | enum : protozero::pbf_tag_type | |
25 | { | |
26 | message = 1 | |
27 | }; | |
fb4e9fa4 RG |
28 | } |
29 | ||
db86777f CHB |
30 | namespace DnstapSocketFamilyTypes |
31 | { | |
32 | enum : protozero::pbf_tag_type | |
33 | { | |
34 | inet = 1, | |
35 | inet6 = 2 | |
36 | }; | |
fb4e9fa4 RG |
37 | } |
38 | ||
db86777f CHB |
39 | namespace DnstapMessageFields |
40 | { | |
41 | enum : 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 |
60 | std::string&& DnstapMessage::getBuffer() |
61 | { | |
62 | return std::move(d_buffer); | |
63 | } | |
64 | ||
65 | DnstapMessage::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 | ||
139 | void 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 */ |