dns-proto.h
Go to the documentation of this file.
1 // -*- mode: c++ -*-
2 #ifndef DNS_PROTO_H
3 #define DNS_PROTO_H
4 // Utilities for processing DNS packet contents
5 
6 #include "ares_setup.h"
7 #include "ares.h"
8 // Include ares internal file for DNS protocol constants
9 #include "ares_nameser.h"
10 
11 #include <memory>
12 #include <string>
13 #include <vector>
14 
15 namespace ares {
16 
17 typedef unsigned char byte;
18 
19 std::string HexDump(std::vector<byte> data);
20 std::string HexDump(const byte *data, int len);
21 std::string HexDump(const char *data, int len);
22 
24 std::string RcodeToString(int rcode);
25 std::string RRTypeToString(int rrtype);
26 std::string ClassToString(int qclass);
27 std::string AddressToString(const void* addr, int len);
28 
29 // Convert DNS protocol data to strings.
30 // Note that these functions are not defensive; they assume
31 // a validly formatted input, and so should not be used on
32 // externally-determined inputs.
33 std::string PacketToString(const std::vector<byte>& packet);
34 std::string QuestionToString(const std::vector<byte>& packet,
35  const byte** data, int* len);
36 std::string RRToString(const std::vector<byte>& packet,
37  const byte** data, int* len);
38 
39 
40 // Manipulate DNS protocol data.
41 void PushInt32(std::vector<byte>* data, int value);
42 void PushInt16(std::vector<byte>* data, int value);
43 std::vector<byte> EncodeString(const std::string& name);
44 
45 struct DNSQuestion {
46  DNSQuestion(const std::string& name, int rrtype, int qclass)
47  : name_(name), rrtype_(rrtype), qclass_(qclass) {}
48  DNSQuestion(const std::string& name, int rrtype)
49  : name_(name), rrtype_(rrtype), qclass_(C_IN) {}
50  virtual ~DNSQuestion() {}
51  virtual std::vector<byte> data() const;
53  int rrtype_;
54  int qclass_;
55 };
56 
57 struct DNSRR : public DNSQuestion {
58  DNSRR(const std::string& name, int rrtype, int qclass, int ttl)
59  : DNSQuestion(name, rrtype, qclass), ttl_(ttl) {}
60  DNSRR(const std::string& name, int rrtype, int ttl)
61  : DNSQuestion(name, rrtype), ttl_(ttl) {}
62  virtual ~DNSRR() {}
63  virtual std::vector<byte> data() const = 0;
64  int ttl_;
65 };
66 
67 struct DNSAddressRR : public DNSRR {
68  DNSAddressRR(const std::string& name, int rrtype, int ttl,
69  const byte* addr, int addrlen)
70  : DNSRR(name, rrtype, ttl), addr_(addr, addr + addrlen) {}
71  DNSAddressRR(const std::string& name, int rrtype, int ttl,
72  const std::vector<byte>& addr)
73  : DNSRR(name, rrtype, ttl), addr_(addr) {}
74  virtual std::vector<byte> data() const;
75  std::vector<byte> addr_;
76 };
77 
78 struct DNSARR : public DNSAddressRR {
79  DNSARR(const std::string& name, int ttl, const byte* addr, int addrlen)
80  : DNSAddressRR(name, T_A, ttl, addr, addrlen) {}
81  DNSARR(const std::string& name, int ttl, const std::vector<byte>& addr)
82  : DNSAddressRR(name, T_A, ttl, addr) {}
83 };
84 
85 struct DNSAaaaRR : public DNSAddressRR {
86  DNSAaaaRR(const std::string& name, int ttl, const byte* addr, int addrlen)
87  : DNSAddressRR(name, T_AAAA, ttl, addr, addrlen) {}
88  DNSAaaaRR(const std::string& name, int ttl, const std::vector<byte>& addr)
89  : DNSAddressRR(name, T_AAAA, ttl, addr) {}
90 };
91 
92 struct DNSSingleNameRR : public DNSRR {
93  DNSSingleNameRR(const std::string& name, int rrtype, int ttl,
94  const std::string& other)
95  : DNSRR(name, rrtype, ttl), other_(other) {}
96  virtual std::vector<byte> data() const;
98 };
99 
100 struct DNSCnameRR : public DNSSingleNameRR {
101  DNSCnameRR(const std::string& name, int ttl, const std::string& other)
102  : DNSSingleNameRR(name, T_CNAME, ttl, other) {}
103 };
104 
105 struct DNSNsRR : public DNSSingleNameRR {
106  DNSNsRR(const std::string& name, int ttl, const std::string& other)
107  : DNSSingleNameRR(name, T_NS, ttl, other) {}
108 };
109 
110 struct DNSPtrRR : public DNSSingleNameRR {
111  DNSPtrRR(const std::string& name, int ttl, const std::string& other)
112  : DNSSingleNameRR(name, T_PTR, ttl, other) {}
113 };
114 
115 struct DNSTxtRR : public DNSRR {
116  DNSTxtRR(const std::string& name, int ttl, const std::vector<std::string>& txt)
117  : DNSRR(name, T_TXT, ttl), txt_(txt) {}
118  virtual std::vector<byte> data() const;
119  std::vector<std::string> txt_;
120 };
121 
122 struct DNSMxRR : public DNSRR {
123  DNSMxRR(const std::string& name, int ttl, int pref, const std::string& other)
124  : DNSRR(name, T_MX, ttl), pref_(pref), other_(other) {}
125  virtual std::vector<byte> data() const;
126  int pref_;
128 };
129 
130 struct DNSSrvRR : public DNSRR {
131  DNSSrvRR(const std::string& name, int ttl,
132  int prio, int weight, int port, const std::string& target)
133  : DNSRR(name, T_SRV, ttl), prio_(prio), weight_(weight), port_(port), target_(target) {}
134  virtual std::vector<byte> data() const;
135  int prio_;
136  int weight_;
137  int port_;
139 };
140 
141 struct DNSSoaRR : public DNSRR {
142  DNSSoaRR(const std::string& name, int ttl,
143  const std::string& nsname, const std::string& rname,
144  int serial, int refresh, int retry, int expire, int minimum)
145  : DNSRR(name, T_SOA, ttl), nsname_(nsname), rname_(rname),
146  serial_(serial), refresh_(refresh), retry_(retry),
147  expire_(expire), minimum_(minimum) {}
148  virtual std::vector<byte> data() const;
151  int serial_;
152  int refresh_;
153  int retry_;
154  int expire_;
155  int minimum_;
156 };
157 
158 struct DNSNaptrRR : public DNSRR {
159  DNSNaptrRR(const std::string& name, int ttl,
160  int order, int pref,
161  const std::string& flags,
162  const std::string& service,
163  const std::string& regexp,
164  const std::string& replacement)
165  : DNSRR(name, T_NAPTR, ttl), order_(order), pref_(pref),
166  flags_(flags), service_(service), regexp_(regexp), replacement_(replacement) {}
167  virtual std::vector<byte> data() const;
168  int order_;
169  int pref_;
174 };
175 
176 struct DNSOption {
177  int code_;
178  std::vector<byte> data_;
179 };
180 
181 struct DNSOptRR : public DNSRR {
182  DNSOptRR(int extrcode, int udpsize)
183  : DNSRR("", T_OPT, static_cast<int>(udpsize), extrcode) {}
184  virtual std::vector<byte> data() const;
185  std::vector<DNSOption> opts_;
186 };
187 
188 struct DNSPacket {
191  aa_(false), tc_(false), rd_(false), ra_(false),
192  z_(false), ad_(false), cd_(false), rcode_(NOERROR) {}
193  // Convenience functions that take ownership of given pointers.
195  questions_.push_back(std::unique_ptr<DNSQuestion>(q));
196  return *this;
197  }
199  answers_.push_back(std::unique_ptr<DNSRR>(q));
200  return *this;
201  }
203  auths_.push_back(std::unique_ptr<DNSRR>(q));
204  return *this;
205  }
207  adds_.push_back(std::unique_ptr<DNSRR>(q));
208  return *this;
209  }
210  // Chainable setters.
211  DNSPacket& set_qid(int qid) { qid_ = qid; return *this; }
212  DNSPacket& set_response(bool v = true) { response_ = v; return *this; }
213  DNSPacket& set_aa(bool v = true) { aa_ = v; return *this; }
214  DNSPacket& set_tc(bool v = true) { tc_ = v; return *this; }
215  DNSPacket& set_rd(bool v = true) { rd_ = v; return *this; }
216  DNSPacket& set_ra(bool v = true) { ra_ = v; return *this; }
217  DNSPacket& set_z(bool v = true) { z_ = v; return *this; }
218  DNSPacket& set_ad(bool v = true) { ad_ = v; return *this; }
219  DNSPacket& set_cd(bool v = true) { cd_ = v; return *this; }
220  DNSPacket& set_rcode(int rcode) { rcode_ = rcode; return *this; }
221 
222  // Return the encoded packet.
223  std::vector<byte> data() const;
224 
225  int qid_;
226  bool response_;
227  int opcode_;
228  bool aa_;
229  bool tc_;
230  bool rd_;
231  bool ra_;
232  bool z_;
233  bool ad_;
234  bool cd_;
235  int rcode_;
236  std::vector<std::unique_ptr<DNSQuestion>> questions_;
237  std::vector<std::unique_ptr<DNSRR>> answers_;
238  std::vector<std::unique_ptr<DNSRR>> auths_;
239  std::vector<std::unique_ptr<DNSRR>> adds_;
240 };
241 
242 } // namespace ares
243 
244 #endif
ares::DNSSoaRR::refresh_
int refresh_
Definition: dns-proto.h:152
T_NS
#define T_NS
Definition: ares_nameser.h:313
ares::DNSSoaRR::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:544
ares::DNSOption::data_
std::vector< byte > data_
Definition: dns-proto.h:178
ares::DNSPacket::adds_
std::vector< std::unique_ptr< DNSRR > > adds_
Definition: dns-proto.h:239
ares::DNSPacket
Definition: dns-proto.h:188
ares::DNSPacket::set_tc
DNSPacket & set_tc(bool v=true)
Definition: dns-proto.h:214
T_A
#define T_A
Definition: ares_nameser.h:310
ares::DNSSrvRR::DNSSrvRR
DNSSrvRR(const std::string &name, int ttl, int prio, int weight, int port, const std::string &target)
Definition: dns-proto.h:131
ares::DNSCnameRR::DNSCnameRR
DNSCnameRR(const std::string &name, int ttl, const std::string &other)
Definition: dns-proto.h:101
ares::DNSPacket::set_aa
DNSPacket & set_aa(bool v=true)
Definition: dns-proto.h:213
ares::DNSPacket::ad_
bool ad_
Definition: dns-proto.h:233
ares::DNSPtrRR::DNSPtrRR
DNSPtrRR(const std::string &name, int ttl, const std::string &other)
Definition: dns-proto.h:111
T_SRV
#define T_SRV
Definition: ares_nameser.h:406
ares::DNSQuestion::rrtype_
int rrtype_
Definition: dns-proto.h:53
ares::DNSSrvRR::weight_
int weight_
Definition: dns-proto.h:136
ares::DNSSoaRR::DNSSoaRR
DNSSoaRR(const std::string &name, int ttl, const std::string &nsname, const std::string &rname, int serial, int refresh, int retry, int expire, int minimum)
Definition: dns-proto.h:142
ares::DNSSrvRR::target_
std::string target_
Definition: dns-proto.h:138
false
#define false
Definition: setup_once.h:323
ares.h
ares::DNSPacket::rd_
bool rd_
Definition: dns-proto.h:230
ares::DNSQuestion::~DNSQuestion
virtual ~DNSQuestion()
Definition: dns-proto.h:50
ares::DNSSoaRR::retry_
int retry_
Definition: dns-proto.h:153
ares::DNSRR::~DNSRR
virtual ~DNSRR()
Definition: dns-proto.h:62
ares::DNSQuestion::qclass_
int qclass_
Definition: dns-proto.h:54
ares::DNSQuestion::name_
std::string name_
Definition: dns-proto.h:52
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
ares::DNSARR::DNSARR
DNSARR(const std::string &name, int ttl, const byte *addr, int addrlen)
Definition: dns-proto.h:79
ares::DNSPacket::set_qid
DNSPacket & set_qid(int qid)
Definition: dns-proto.h:211
NOERROR
#define NOERROR
Definition: ares_nameser.h:255
ares::DNSPacket::add_auth
DNSPacket & add_auth(DNSRR *q)
Definition: dns-proto.h:202
ares::HexDump
std::string HexDump(std::vector< byte > data)
Definition: dns-proto.cc:15
ares::DNSAaaaRR
Definition: dns-proto.h:85
status
absl::Status status
Definition: rls.cc:251
ares::DNSPacket::answers_
std::vector< std::unique_ptr< DNSRR > > answers_
Definition: dns-proto.h:237
setup.name
name
Definition: setup.py:542
ares::DNSOption
Definition: dns-proto.h:176
ares::DNSOptRR
Definition: dns-proto.h:181
ares::QuestionToString
std::string QuestionToString(const std::vector< byte > &packet, const byte **data, int *len)
Definition: dns-proto.cc:228
ares::DNSRR::ttl_
int ttl_
Definition: dns-proto.h:64
ares::RRTypeToString
std::string RRTypeToString(int rrtype)
Definition: dns-proto.cc:84
ares::DNSSingleNameRR::DNSSingleNameRR
DNSSingleNameRR(const std::string &name, int rrtype, int ttl, const std::string &other)
Definition: dns-proto.h:93
ares::DNSARR::DNSARR
DNSARR(const std::string &name, int ttl, const std::vector< byte > &addr)
Definition: dns-proto.h:81
ares::DNSSingleNameRR::other_
std::string other_
Definition: dns-proto.h:97
T_TXT
#define T_TXT
Definition: ares_nameser.h:355
ares::DNSRR::DNSRR
DNSRR(const std::string &name, int rrtype, int ttl)
Definition: dns-proto.h:60
ares::DNSPacket::auths_
std::vector< std::unique_ptr< DNSRR > > auths_
Definition: dns-proto.h:238
ares::DNSSingleNameRR::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:491
ares::DNSSoaRR::rname_
std::string rname_
Definition: dns-proto.h:150
ares::DNSMxRR::DNSMxRR
DNSMxRR(const std::string &name, int ttl, int pref, const std::string &other)
Definition: dns-proto.h:123
ares::DNSSoaRR::minimum_
int minimum_
Definition: dns-proto.h:155
ares::DNSAddressRR
Definition: dns-proto.h:67
ares::DNSPacket::add_question
DNSPacket & add_question(DNSQuestion *q)
Definition: dns-proto.h:194
retry
void retry(grpc_end2end_test_config config)
Definition: retry.cc:319
ares::DNSPacket::rcode_
int rcode_
Definition: dns-proto.h:235
ares::DNSRR::data
virtual std::vector< byte > data() const =0
Definition: dns-proto.cc:485
ares::DNSSoaRR::nsname_
std::string nsname_
Definition: dns-proto.h:149
ares::DNSOptRR::DNSOptRR
DNSOptRR(int extrcode, int udpsize)
Definition: dns-proto.h:182
ares::DNSPacket::set_rd
DNSPacket & set_rd(bool v=true)
Definition: dns-proto.h:215
ares::DNSRR::DNSRR
DNSRR(const std::string &name, int rrtype, int qclass, int ttl)
Definition: dns-proto.h:58
ares::DNSSrvRR::port_
int port_
Definition: dns-proto.h:137
ares::DNSPacket::cd_
bool cd_
Definition: dns-proto.h:234
ares::DNSMxRR::pref_
int pref_
Definition: dns-proto.h:126
xds_interop_client.int
int
Definition: xds_interop_client.py:113
ares::AddressToString
std::string AddressToString(const void *vaddr, int len)
Definition: dns-proto.cc:157
ares::DNSNaptrRR::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:575
ares::DNSCnameRR
Definition: dns-proto.h:100
ares::DNSPacket::DNSPacket
DNSPacket()
Definition: dns-proto.h:189
ares::DNSSrvRR::prio_
int prio_
Definition: dns-proto.h:135
O_QUERY
#define O_QUERY
Definition: ares_nameser.h:225
T_SOA
#define T_SOA
Definition: ares_nameser.h:325
ares::DNSAddressRR::DNSAddressRR
DNSAddressRR(const std::string &name, int rrtype, int ttl, const byte *addr, int addrlen)
Definition: dns-proto.h:68
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
ares::PacketToString
std::string PacketToString(const std::vector< byte > &packet)
Definition: dns-proto.cc:181
ares::DNSPacket::set_ra
DNSPacket & set_ra(bool v=true)
Definition: dns-proto.h:216
ares::DNSSoaRR::expire_
int expire_
Definition: dns-proto.h:154
T_CNAME
#define T_CNAME
Definition: ares_nameser.h:322
ares::PushInt32
void PushInt32(std::vector< byte > *data, int value)
Definition: dns-proto.cc:451
ares::DNSPacket::add_additional
DNSPacket & add_additional(DNSRR *q)
Definition: dns-proto.h:206
ares::DNSMxRR::other_
std::string other_
Definition: dns-proto.h:127
ares::DNSSrvRR
Definition: dns-proto.h:130
ares::DNSNaptrRR::service_
std::string service_
Definition: dns-proto.h:171
T_AAAA
#define T_AAAA
Definition: ares_nameser.h:391
ares::DNSNaptrRR::regexp_
std::string regexp_
Definition: dns-proto.h:172
ares::DNSPacket::data
std::vector< byte > data() const
Definition: dns-proto.cc:592
ares::DNSOptRR::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:560
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
ares::DNSNaptrRR::order_
int order_
Definition: dns-proto.h:168
T_NAPTR
#define T_NAPTR
Definition: ares_nameser.h:412
ares::PushInt16
void PushInt16(std::vector< byte > *data, int value)
Definition: dns-proto.cc:458
ares::ClassToString
std::string ClassToString(int qclass)
Definition: dns-proto.cc:146
ares::DNSOptRR::opts_
std::vector< DNSOption > opts_
Definition: dns-proto.h:185
weight
uint32_t weight
Definition: weighted_target.cc:84
ares::DNSTxtRR::txt_
std::vector< std::string > txt_
Definition: dns-proto.h:119
ares::DNSOption::code_
int code_
Definition: dns-proto.h:177
ares::DNSQuestion::DNSQuestion
DNSQuestion(const std::string &name, int rrtype, int qclass)
Definition: dns-proto.h:46
ares::DNSSoaRR
Definition: dns-proto.h:141
ares::DNSSingleNameRR
Definition: dns-proto.h:92
T_OPT
#define T_OPT
Definition: ares_nameser.h:430
ares_setup.h
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
value
const char * value
Definition: hpack_parser_table.cc:165
ares::DNSPacket::add_answer
DNSPacket & add_answer(DNSRR *q)
Definition: dns-proto.h:198
ares::DNSPacket::set_z
DNSPacket & set_z(bool v=true)
Definition: dns-proto.h:217
ares::DNSPacket::z_
bool z_
Definition: dns-proto.h:232
ares::byte
unsigned char byte
Definition: ares-test.h:33
ares::DNSPacket::questions_
std::vector< std::unique_ptr< DNSQuestion > > questions_
Definition: dns-proto.h:236
C_IN
#define C_IN
Definition: ares_nameser.h:292
ares::DNSPacket::set_rcode
DNSPacket & set_rcode(int rcode)
Definition: dns-proto.h:220
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
ares::DNSAaaaRR::DNSAaaaRR
DNSAaaaRR(const std::string &name, int ttl, const byte *addr, int addrlen)
Definition: dns-proto.h:86
ares::DNSPacket::opcode_
int opcode_
Definition: dns-proto.h:227
ares::DNSAddressRR::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:536
ares::DNSNaptrRR::DNSNaptrRR
DNSNaptrRR(const std::string &name, int ttl, int order, int pref, const std::string &flags, const std::string &service, const std::string &regexp, const std::string &replacement)
Definition: dns-proto.h:159
ares::DNSTxtRR::DNSTxtRR
DNSTxtRR(const std::string &name, int ttl, const std::vector< std::string > &txt)
Definition: dns-proto.h:116
ares::DNSPtrRR
Definition: dns-proto.h:110
ares::DNSPacket::set_response
DNSPacket & set_response(bool v=true)
Definition: dns-proto.h:212
ares::DNSNaptrRR::replacement_
std::string replacement_
Definition: dns-proto.h:173
ares::DNSPacket::ra_
bool ra_
Definition: dns-proto.h:231
ares::RcodeToString
std::string RcodeToString(int rcode)
Definition: dns-proto.cc:64
ares::DNSPacket::tc_
bool tc_
Definition: dns-proto.h:229
ares::DNSNsRR::DNSNsRR
DNSNsRR(const std::string &name, int ttl, const std::string &other)
Definition: dns-proto.h:106
ares::DNSMxRR::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:514
ares::DNSSoaRR::serial_
int serial_
Definition: dns-proto.h:151
ares::DNSRR
Definition: dns-proto.h:57
ares::RRToString
std::string RRToString(const std::vector< byte > &packet, const byte **data, int *len)
Definition: dns-proto.cc:264
ares::DNSTxtRR::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:500
ares::DNSARR
Definition: dns-proto.h:78
ares::DNSNsRR
Definition: dns-proto.h:105
ares::StatusToString
std::string StatusToString(int status)
Definition: dns-proto.cc:33
ares::DNSNaptrRR::flags_
std::string flags_
Definition: dns-proto.h:170
ares::DNSAddressRR::addr_
std::vector< byte > addr_
Definition: dns-proto.h:75
ares::DNSPacket::set_cd
DNSPacket & set_cd(bool v=true)
Definition: dns-proto.h:219
ares::DNSMxRR
Definition: dns-proto.h:122
ares::DNSNaptrRR::pref_
int pref_
Definition: dns-proto.h:169
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
ares::DNSAddressRR::DNSAddressRR
DNSAddressRR(const std::string &name, int rrtype, int ttl, const std::vector< byte > &addr)
Definition: dns-proto.h:71
service
__attribute__((deprecated("Please use GRPCProtoMethod."))) @interface ProtoMethod NSString * service
Definition: ProtoMethod.h:25
ares_nameser.h
ares::DNSNaptrRR
Definition: dns-proto.h:158
ares::DNSQuestion::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:476
ares::DNSAaaaRR::DNSAaaaRR
DNSAaaaRR(const std::string &name, int ttl, const std::vector< byte > &addr)
Definition: dns-proto.h:88
ares::EncodeString
std::vector< byte > EncodeString(const std::string &name)
Definition: dns-proto.cc:463
T_PTR
#define T_PTR
Definition: ares_nameser.h:343
ares::DNSSrvRR::data
virtual std::vector< byte > data() const
Definition: dns-proto.cc:524
ares::DNSPacket::qid_
int qid_
Definition: dns-proto.h:225
ares::DNSPacket::aa_
bool aa_
Definition: dns-proto.h:228
ares::DNSTxtRR
Definition: dns-proto.h:115
setup.target
target
Definition: third_party/bloaty/third_party/protobuf/python/setup.py:179
ares::DNSQuestion
Definition: dns-proto.h:45
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
ares::DNSPacket::response_
bool response_
Definition: dns-proto.h:226
ares
Definition: ares-test-ai.h:9
ares::DNSPacket::set_ad
DNSPacket & set_ad(bool v=true)
Definition: dns-proto.h:218
ares::DNSQuestion::DNSQuestion
DNSQuestion(const std::string &name, int rrtype)
Definition: dns-proto.h:48
T_MX
#define T_MX
Definition: ares_nameser.h:352


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:59:12