File: dnstap.cc

package info (click to toggle)
dnsdist 1.3.3-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 5,268 kB
  • sloc: cpp: 32,375; sh: 4,338; makefile: 356
file content (76 lines) | stat: -rw-r--r-- 2,582 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "config.h"
#include "gettime.hh"
#include "dnstap.hh"

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)
{
#ifdef HAVE_PROTOBUF
  const struct dnsheader* dh = reinterpret_cast<const struct dnsheader*>(packet);

  proto_message.set_identity(identity);
  proto_message.set_version(PACKAGE_STRING);
  proto_message.set_type(dnstap::Dnstap::MESSAGE);

  dnstap::Message* message = proto_message.mutable_message();

  message->set_type(!dh->qr ? dnstap::Message_Type_CLIENT_QUERY : dnstap::Message_Type_CLIENT_RESPONSE);

  message->set_socket_family(requestor->sin4.sin_family == AF_INET ? dnstap::INET : dnstap::INET6);
  message->set_socket_protocol(isTCP ? dnstap::TCP : dnstap::UDP);

  if (requestor->sin4.sin_family == AF_INET) {
    message->set_query_address(&requestor->sin4.sin_addr.s_addr, sizeof(requestor->sin4.sin_addr.s_addr));
  }
  else if (requestor->sin4.sin_family == AF_INET6) {
    message->set_query_address(&requestor->sin6.sin6_addr.s6_addr, sizeof(requestor->sin6.sin6_addr.s6_addr));
  }
  message->set_query_port(ntohs(requestor->sin4.sin_port));

  if (requestor->sin4.sin_family == AF_INET) {
    message->set_response_address(&responder->sin4.sin_addr.s_addr, sizeof(responder->sin4.sin_addr.s_addr));
  }
  else if (requestor->sin4.sin_family == AF_INET6) {
    message->set_response_address(&responder->sin6.sin6_addr.s6_addr, sizeof(responder->sin6.sin6_addr.s6_addr));
  }
  message->set_response_port(ntohs(responder->sin4.sin_port));

  if (queryTime != nullptr) {
    message->set_query_time_sec(queryTime->tv_sec);
    message->set_query_time_nsec(queryTime->tv_nsec / 1000);
  }
  if (responseTime != nullptr) {
    message->set_response_time_sec(responseTime->tv_sec);
    message->set_response_time_nsec(responseTime->tv_nsec / 1000);
  }

  if (!dh->qr) {
    message->set_query_message(packet, len);
  } else {
    message->set_response_message(packet, len);
  }
#endif /* HAVE_PROTOBUF */
}

void DnstapMessage::serialize(std::string& data) const
{
#ifdef HAVE_PROTOBUF
  proto_message.SerializeToString(&data);
#endif /* HAVE_PROTOBUF */
}

std::string DnstapMessage::toDebugString() const
{
  return
#ifdef HAVE_PROTOBUF
    proto_message.DebugString();
#else
    "";
#endif /* HAVE_PROTOBUF */
}

void DnstapMessage::setExtra(const std::string& extra)
{
#ifdef HAVE_PROTOBUF
  proto_message.set_extra(extra);
#endif /* HAVE_PROTOBUF */
}