]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/dnstap.cc
auth: switch circleci mssql image
[thirdparty/pdns.git] / pdns / dnstap.cc
CommitLineData
82a91ddf
CH
1#include "config.h"
2#include "gettime.hh"
3#include "dnstap.hh"
4
522253b0 5DnstapMessage::DnstapMessage(const std::string& identity, const ComboAddress* requestor, const ComboAddress* responder, bool isTCP, const char* packet, const size_t len, const struct timespec* queryTime, const struct timespec* responseTime)
82a91ddf
CH
6{
7#ifdef HAVE_PROTOBUF
8 const struct dnsheader* dh = reinterpret_cast<const struct dnsheader*>(packet);
9
10 proto_message.set_identity(identity);
11 proto_message.set_version(PACKAGE_STRING);
12 proto_message.set_type(dnstap::Dnstap::MESSAGE);
13
14 dnstap::Message* message = proto_message.mutable_message();
15
522253b0 16 message->set_type(!dh->qr ? dnstap::Message_Type_CLIENT_QUERY : dnstap::Message_Type_CLIENT_RESPONSE);
ebd67986 17 message->set_socket_protocol(isTCP ? dnstap::TCP : dnstap::UDP);
82a91ddf 18
ebd67986
OM
19 if (requestor != nullptr) {
20 message->set_socket_family(requestor->sin4.sin_family == AF_INET ? dnstap::INET : dnstap::INET6);
21 if (requestor->sin4.sin_family == AF_INET) {
22 message->set_query_address(&requestor->sin4.sin_addr.s_addr, sizeof(requestor->sin4.sin_addr.s_addr));
23 } else if (requestor->sin4.sin_family == AF_INET6) {
24 message->set_query_address(&requestor->sin6.sin6_addr.s6_addr, sizeof(requestor->sin6.sin6_addr.s6_addr));
25 }
26 message->set_query_port(ntohs(requestor->sin4.sin_port));
82a91ddf 27 }
ebd67986
OM
28 if (responder != nullptr) {
29 message->set_socket_family(responder->sin4.sin_family == AF_INET ? dnstap::INET : dnstap::INET6);
30 if (responder->sin4.sin_family == AF_INET) {
31 message->set_response_address(&responder->sin4.sin_addr.s_addr, sizeof(responder->sin4.sin_addr.s_addr));
32 } else if (responder->sin4.sin_family == AF_INET6) {
33 message->set_response_address(&responder->sin6.sin6_addr.s6_addr, sizeof(responder->sin6.sin6_addr.s6_addr));
34 }
35 message->set_response_port(ntohs(responder->sin4.sin_port));
82a91ddf 36 }
82a91ddf
CH
37 if (queryTime != nullptr) {
38 message->set_query_time_sec(queryTime->tv_sec);
ebd67986 39 message->set_query_time_nsec(queryTime->tv_nsec);
82a91ddf
CH
40 }
41 if (responseTime != nullptr) {
42 message->set_response_time_sec(responseTime->tv_sec);
ebd67986 43 message->set_response_time_nsec(responseTime->tv_nsec);
82a91ddf
CH
44 }
45
46 if (!dh->qr) {
47 message->set_query_message(packet, len);
48 } else {
49 message->set_response_message(packet, len);
50 }
51#endif /* HAVE_PROTOBUF */
52}
53
54void DnstapMessage::serialize(std::string& data) const
55{
56#ifdef HAVE_PROTOBUF
57 proto_message.SerializeToString(&data);
58#endif /* HAVE_PROTOBUF */
59}
60
61std::string DnstapMessage::toDebugString() const
62{
63 return
64#ifdef HAVE_PROTOBUF
65 proto_message.DebugString();
66#else
67 "";
68#endif /* HAVE_PROTOBUF */
69}
70
71void DnstapMessage::setExtra(const std::string& extra)
72{
73#ifdef HAVE_PROTOBUF
74 proto_message.set_extra(extra);
75#endif /* HAVE_PROTOBUF */
76}