]>
Commit | Line | Data |
---|---|---|
82a91ddf CH |
1 | #include "config.h" |
2 | #include "gettime.hh" | |
3 | #include "dnstap.hh" | |
4 | ||
522253b0 | 5 | DnstapMessage::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 | ||
54 | void DnstapMessage::serialize(std::string& data) const | |
55 | { | |
56 | #ifdef HAVE_PROTOBUF | |
57 | proto_message.SerializeToString(&data); | |
58 | #endif /* HAVE_PROTOBUF */ | |
59 | } | |
60 | ||
61 | std::string DnstapMessage::toDebugString() const | |
62 | { | |
63 | return | |
64 | #ifdef HAVE_PROTOBUF | |
65 | proto_message.DebugString(); | |
66 | #else | |
67 | ""; | |
68 | #endif /* HAVE_PROTOBUF */ | |
69 | } | |
70 | ||
71 | void DnstapMessage::setExtra(const std::string& extra) | |
72 | { | |
73 | #ifdef HAVE_PROTOBUF | |
74 | proto_message.set_extra(extra); | |
75 | #endif /* HAVE_PROTOBUF */ | |
76 | } |