OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bind_util.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __bind_util_h__
6 #define __bind_util_h__
7 
8 #include <iostream>
9 #include <stdint.h>
10 #include <vector>
11 #include <boost/asio.hpp>
12 
13 #include "sandesh/sandesh_trace.h"
14 #include "bind/bind_types.h"
15 #include "bind/xmpp_dns_agent.h"
16 
17 #include "base/address.h"
18 #include "base/address_util.h"
19 
21 #define DNS_BIND_TRACE(obj, arg) \
22 do { \
23  std::ostringstream _str; \
24  _str << arg; \
25  obj::TraceMsg(DnsBindTraceBuf, __FILE__, __LINE__, _str.str()); \
26 } while (false) \
27 
28 #define DNS_SERVER_PORT 53
29 
30 // DNS Class
31 #define DNS_CLASS_IN 1
32 #define DNS_CLASS_ANY 0x00ff
33 #define DNS_CLASS_NONE 0x00fe
34 
35 // DNS record types
36 #define DNS_A_RECORD 1
37 #define DNS_NS_RECORD 2
38 #define DNS_CNAME_RECORD 5
39 #define DNS_TYPE_SOA 6
40 #define DNS_PTR_RECORD 0x0C
41 #define DNS_MX_RECORD 0x0F
42 #define DNS_TXT_RECORD 0x10
43 #define DNS_AAAA_RECORD 0x1C
44 #define DNS_SRV_RECORD 0x21
45 #define DNS_TYPE_ANY 0x00ff
46 
47 // DNS return codes
48 #define DNS_ERR_NO_ERROR 0
49 #define DNS_ERR_FORMAT_ERROR 1
50 #define DNS_ERR_SERVER_FAIL 2
51 #define DNS_ERR_NO_SUCH_NAME 3
52 #define DNS_ERR_NO_IMPLEMENT 4
53 #define DNS_ERR_NOT_AUTH 9
54 
55 enum DnsReq {
58 };
59 
60 enum DnsOpcode {
65 };
66 
67 typedef std::map<std::string, uint16_t> DnsTypeMap;
68 typedef std::map<std::string, uint16_t>::const_iterator DnsTypeIter;
69 typedef std::map<uint16_t, std::string> DnsTypeNumMap;
70 typedef std::map<uint16_t, std::string>::const_iterator DnsTypeNumIter;
71 typedef std::map<uint16_t, std::string> DnsResponseMap;
72 typedef std::map<uint16_t, std::string>::const_iterator DnsResponseIter;
73 
74 struct dns_flags {
75 #if __BYTE_ORDER == __LITTLE_ENDIAN
76  uint8_t rd:1; // recursion desired
77  uint8_t trunc:1; // truncated
78  uint8_t auth:1; // authoritative answer
79  uint8_t op:4; // opcode
80  uint8_t req:1; // request / response
81  uint8_t ret:4; // return code
82  uint8_t cd:1; // checking disabled
83  uint8_t ad:1; // answer authenticated
84  uint8_t res:1; // reserved
85  uint8_t ra:1; // recursion available
86 #elif __BYTE_ORDER == __BIG_ENDIAN
87  uint8_t req:1;
88  uint8_t op:4;
89  uint8_t auth:1;
90  uint8_t trunc:1;
91  uint8_t rd:1;
92  uint8_t ra:1;
93  uint8_t res:1;
94  uint8_t ad:1;
95  uint8_t cd:1;
96  uint8_t ret:4;
97 #else
98 #error "Adjust your <bits/endian.h> defines"
99 #endif
100 };
101 
102 struct dnshdr {
103  uint16_t xid;
105  uint16_t ques_rrcount; // question RR count
106  uint16_t ans_rrcount; // answer RR count
107  uint16_t auth_rrcount; // authority RR count
108  uint16_t add_rrcount; // additional RR count
109 };
110 
111 // Data format in an SOA record
112 struct DnsSOAData {
113  std::string primary_ns; // primary name server
114  std::string mailbox; // responsible authority's mailbox
115  uint16_t ns_plen; // length of the prefix in primary_ns that is unique
116  uint16_t ns_offset; // offset from where rest of primary_ns name exists
117  uint16_t mailbox_plen;
118  uint16_t mailbox_offset;
119  uint32_t serial; // serial number
120  uint32_t refresh; // refresh interval in seconds
121  uint32_t retry; // retry interval in seconds
122  uint32_t expiry; // expiration limit in seconds
123  uint32_t ttl; // minimum ttl in seconds
124 
126  serial(0), refresh(0), retry(0), expiry(0), ttl(0) {}
127  bool operator ==(const DnsSOAData &rhs) const {
128  if (primary_ns == rhs.primary_ns && mailbox == rhs.mailbox &&
129  serial == rhs.serial && refresh == rhs.refresh &&
130  retry == rhs.retry && expiry == rhs.expiry && ttl == rhs.ttl)
131  return true;
132  return false;
133  }
134 };
135 
136 // Data format in an SRV record
137 struct DnsSRVData {
138  uint16_t priority;
139  uint16_t weight;
140  uint16_t port;
141  std::string hostname;
142  uint16_t hn_plen; // length of the prefix in hostname that is unique
143  uint16_t hn_offset; // offset from where rest of hostname name exists
144 
146 };
147 
148 struct DnsItem {
149  uint16_t eclass;
150  uint16_t type;
151  uint32_t ttl;
152  uint16_t priority;
153  uint16_t offset; // offset of the name in the read request from the VM
154  uint16_t name_plen; // length of the prefix in name that is unique
155  uint16_t name_offset; // offset from where rest of name exists
156  uint16_t data_plen; // length of the prefix in data that is unique
157  uint16_t data_offset; // offset from where rest of data exists
158  std::string name;
159  std::string source_name;
160  std::string data;
163 
164  DnsItem() : eclass(1), type(0), ttl(0), priority(0), offset(0),
165  name_plen(0), name_offset(0), data_plen(0), data_offset(0), soa() {}
166 
167  std::string ToString() const;
168 
169  bool operator ==(const DnsItem &rhs) const {
170  if (eclass == rhs.eclass && type == rhs.type &&
171  name == rhs.name && data == rhs.data && soa == rhs.soa && source_name == rhs.source_name)
172  return true;
173  return false;
174  }
175 
176  bool IsDelete() const {
177  if (ttl == 0 && (eclass == DNS_CLASS_ANY || eclass == DNS_CLASS_NONE))
178  return true;
179  return false;
180  }
181 
182  bool MatchDelete(const DnsItem &rhs) const {
183  if ((rhs.eclass == DNS_CLASS_ANY || rhs.eclass == DNS_CLASS_NONE) &&
184  (rhs.type == DNS_TYPE_ANY || type == rhs.type) &&
185  (name == rhs.name) &&
186  (rhs.data.size() == 0 || data == rhs.data) &&
187  (source_name == rhs.source_name))
188  return true;
189  return false;
190  }
191 };
192 
193 typedef std::list<DnsItem> DnsItems;
194 static inline std::string DnsItemsToString(DnsItems &items) {
195  std::string str;
196  for (DnsItems::iterator it = items.begin();
197  !items.empty() && it != items.end(); ++it) {
198  str += (*it).ToString();
199  }
200  return str;
201 }
202 
204  typedef boost::function<void(DnsItem &)> DeleteCallback;
205 
206  std::string virtual_dns;
207  std::string zone;
208  mutable DnsItems items;
209 
211  DnsUpdateData(const std::string &vdns, const std::string &z)
212  : virtual_dns(vdns), zone(z) {}
213 
214  struct Compare {
215  bool operator() (DnsUpdateData *const &lhs, DnsUpdateData *const &rhs) const {
216  if (!lhs || !rhs)
217  return false;
218  if (lhs->virtual_dns != rhs->virtual_dns)
219  return lhs->virtual_dns < rhs->virtual_dns;
220  return lhs->zone < rhs->zone;
221  }
222  };
223 
224  bool AddItem(DnsItem &item, bool replace = false) const {
225  for (DnsItems::iterator it = items.begin(); it != items.end(); ++it) {
226  if (item == *it) {
227  if (replace)
228  *it = item;
229  return false;
230  }
231  }
232  items.push_back(item);
233  return true;
234  }
235 
236  bool DelItem(DnsItem &item) const {
237  bool change = false;
238  for (DnsItems::iterator it = items.begin(); it != items.end();) {
239  if ((*it).MatchDelete(item)) {
240  items.erase(it++);
241  change = true;
242  } else {
243  ++it;
244  }
245  }
246  return change;
247  }
248 };
249 
250 typedef std::vector<std::string> ZoneList;
251 
252 struct Subnet {
254  uint32_t plen;
255  uint8_t flags;
256 
258  DeleteMarked = 1 << 0,
259  };
260 
261  Subnet() : plen(0), flags(0) {}
262  Subnet(std::string addr, uint32_t len) : plen(len), flags(0) {
263  boost::system::error_code ec;
264  prefix = boost::asio::ip::address::from_string(addr, ec);
265  }
266 
267  bool operator< (const Subnet &rhs) const;
268 
270  bool IsDeleted() const { return (flags & DeleteMarked); }
272 
273  void GetReverseZones(ZoneList &zones) const;
274 
275  bool Contains(const IpAddress &addr) const;
276 };
277 
278 typedef std::vector<Subnet> Subnets;
279 
280 class BindUtil {
281 public:
282  enum Operation {
286  };
287 
288  static uint16_t DnsClass(const std::string &cl);
289  static std::string DnsClass(uint16_t cl);
290  static uint16_t DnsType(const std::string &tp);
291  static std::string DnsType(uint16_t tp);
292  static const std::string &DnsResponseCode(uint16_t code);
293  static uint8_t *AddName(uint8_t *ptr, const std::string &addr,
294  uint16_t plen, uint16_t offset, uint16_t &length);
295  static bool ParseDnsQuery(uint8_t *dns, uint16_t dnslen,
296  uint16_t *parsed_length, DnsItems &items);
297  static bool ParseDnsResponse(uint8_t *dns, uint16_t dnslen, uint16_t &xid,
298  dns_flags &flags, DnsItems &ques,
299  DnsItems &ans, DnsItems &auth, DnsItems &add);
300  static bool ParseDnsUpdate(uint8_t *dns, uint16_t dnslen,
301  DnsUpdateData &data);
302  static int BuildDnsQuery(uint8_t *buf, uint16_t xid,
303  const std::string &domain,
304  const DnsItems &items);
305  static int BuildDnsUpdate(uint8_t *buf, Operation op, uint16_t xid,
306  const std::string &domain,
307  const std::string &zone,
308  const DnsItems &items);
309  static uint8_t *AddQuestionSection(uint8_t *ptr, const std::string &name,
310  uint16_t type, uint16_t cl,
311  uint16_t &length);
312  static uint8_t *AddAnswerSection(uint8_t *ptr, const DnsItem &item,
313  uint16_t &length);
314  static uint8_t *AddUpdate(uint8_t *ptr, const DnsItem &item,
315  uint16_t cl, uint32_t ttl, uint16_t &length);
316  static void BuildDnsHeader(dnshdr *dns, uint16_t xid, DnsReq req,
317  DnsOpcode op, bool rd, bool ra, uint8_t ret,
318  uint16_t ques_count);
319 
320  static inline uint16_t DataLength(uint16_t plen, uint16_t offset,
321  uint16_t size) {
322  return (offset ? (plen ? plen + 2 + 1 : 2) : (size ? size + 2 : 1));
323  }
324  static bool IsIP(const std::string &name, IpAddress &addr);
325  static bool IsReverseZone(const std::string &name);
326  static void GetReverseZoneList(const IpAddress &mask, uint32_t plen,
327  ZoneList &zones);
328  // DnsProto::SendUpdateDnsEntry() needs the following two methods...
329  static void GetReverseZone(const Ip4Address &addr, uint32_t plen,
330  std::string &zone);
331  static void GetReverseZone(const Ip6Address &addr, uint32_t plen,
332  std::string &zone);
333  static void GetReverseZone(const IpAddress &addr, uint32_t plen,
334  std::string &zone);
335  static bool GetAddrFromPtrName(std::string &ptr_name, IpAddress &mask);
336  // ...and these two as well.
337  static std::string GetPtrNameFromAddr(const Ip4Address &ip);
338  static std::string GetPtrNameFromAddr(const Ip6Address &ip6);
339  static std::string GetFQDN(const std::string &name, const std::string &domain,
340  const std::string &match);
341  static bool HasSpecialChars(const std::string &name);
342  static void RemoveSpecialChars(std::string &name);
343 private:
344 
345  static inline bool ReadByte(uint8_t *dns, uint16_t dnslen, int *remlen,
346  uint8_t &value) {
347  if (*remlen < 1) {
348  return false;
349  }
350  uint8_t *ptr = dns + (dnslen - *remlen);
351  *remlen -= 1;
352  value = *(uint8_t *) ptr;
353  return true;
354  }
355 
356  static inline bool ReadShort(uint8_t *dns, uint16_t dnslen, int *remlen,
357  uint16_t &value) {
358  if (*remlen < 2) {
359  return false;
360  }
361  uint8_t *ptr = dns + (dnslen - *remlen);
362  *remlen -= 2;
363  value = ntohs(*(uint16_t *) ptr);
364  return true;
365  }
366 
367  static inline bool ReadWord(uint8_t *dns, uint16_t dnslen, int *remlen,
368  uint32_t &value) {
369  if (*remlen < 4) {
370  return false;
371  }
372  uint8_t *ptr = dns + (dnslen - *remlen);
373  *remlen -= 4;
374  value = ntohl(*(uint32_t *) ptr);
375  return true;
376  }
377 
378  static inline uint8_t *WriteByte(uint8_t *ptr, uint8_t value) {
379  *(uint8_t *) ptr = value;
380  ptr += 1;
381 
382  return ptr;
383  }
384 
385  static inline uint8_t *WriteShort(uint8_t *ptr, uint16_t value) {
386  *(uint16_t *) ptr = htons(value);
387  ptr += 2;
388 
389  return ptr;
390  }
391 
392  static inline uint8_t *WriteWord(uint8_t *ptr, uint32_t value) {
393  *(uint32_t *) ptr = htonl(value);
394  ptr += 4;
395 
396  return ptr;
397  }
398  static uint8_t *AddData(uint8_t *ptr, const DnsItem &item,
399  uint16_t &length);
400  static uint8_t *AddAdditionalSection(uint8_t *ptr, const std::string name,
401  uint16_t type, uint16_t cl,
402  uint32_t ttl, const std::string &data,
403  uint16_t &length);
404  static bool ReadName(uint8_t *dns, uint16_t dnslen, int *remlen,
405  std::string &name, uint16_t &plen, uint16_t &offset);
406  static bool ReadData(uint8_t *dns, uint16_t dnslen, int *remlen,
407  DnsItem &item);
408  static bool ReadQuestionEntry(uint8_t *dns, uint16_t dnslen, int *remlen,
409  DnsItem &item);
410  static bool ReadAnswerEntry(uint8_t *dns, uint16_t dnslen, int *remlen,
411  DnsItem &item);
412  static bool IsReverseZoneV4(const std::string &name);
413  static bool IsReverseZoneV6(const std::string &name);
414  static void GetReverseZoneList(const Ip4Address &mask, uint32_t plen,
415  ZoneList &zones);
416  static void GetReverseZoneList(const Ip6Address &mask, uint32_t plen,
417  ZoneList &zones);
418  static bool GetAddrFromPtrName(std::string &ptr_name,
419  Ip4Address &ip);
420  static bool GetAddrFromPtrName(std::string &ptr_name,
421  Ip6Address &ip);
422  static uint8_t GetNibble(const Ip6Address::bytes_type &addr,
423  size_t bit);
424  static std::string BuildIp6ArpaSuffix(const Ip6Address::bytes_type &addr,
425  uint32_t plen);
426 };
427 
428 // Identify the offsets for names in a DNS message
430 public:
431  struct Name {
432  std::string name;
433  uint16_t offset;
434  Name(std::string &n, uint16_t oset) : name(n), offset(oset) {}
435  };
436 
438  virtual ~DnsNameEncoder() {};
439  void AddName(std::string &name, uint16_t curr_msg_offset,
440  uint16_t &name_plen, uint16_t &name_offset);
441 
442 private:
443  bool IsPresent(std::string &name, uint16_t &name_offset);
444 
445  std::vector<Name> names_;
447 };
448 
449 #endif // __bind_util_h__
static uint8_t * AddQuestionSection(uint8_t *ptr, const std::string &name, uint16_t type, uint16_t cl, uint16_t &length)
Definition: bind_util.cc:178
static uint8_t * AddAdditionalSection(uint8_t *ptr, const std::string name, uint16_t type, uint16_t cl, uint32_t ttl, const std::string &data, uint16_t &length)
Definition: bind_util.cc:283
uint8_t res
Definition: bind_util.h:84
std::map< std::string, uint16_t >::const_iterator DnsTypeIter
Definition: bind_util.h:68
std::map< uint16_t, std::string > DnsResponseMap
Definition: bind_util.h:71
DnsReq
Definition: bind_util.h:55
DnsSOAData soa
Definition: bind_util.h:161
Subnet(std::string addr, uint32_t len)
Definition: bind_util.h:262
std::string zone
Definition: bind_util.h:207
bool MatchDelete(const DnsItem &rhs) const
Definition: bind_util.h:182
SandeshTraceBufferPtr DnsBindTraceBuf
bool operator()(DnsUpdateData *const &lhs, DnsUpdateData *const &rhs) const
Definition: bind_util.h:215
#define DNS_CLASS_ANY
Definition: bind_util.h:32
DnsItem()
Definition: bind_util.h:164
std::map< uint16_t, std::string >::const_iterator DnsResponseIter
Definition: bind_util.h:72
bool IsDelete() const
Definition: bind_util.h:176
static int BuildDnsUpdate(uint8_t *buf, Operation op, uint16_t xid, const std::string &domain, const std::string &zone, const DnsItems &items)
Definition: bind_util.cc:653
std::map< std::string, uint16_t > DnsTypeMap
Definition: bind_util.h:67
uint16_t name_plen
Definition: bind_util.h:154
static int BuildDnsQuery(uint8_t *buf, uint16_t xid, const std::string &domain, const DnsItems &items)
Definition: bind_util.cc:628
DnsConfigFlags
Definition: bind_util.h:257
boost::asio::ip::address IpAddress
Definition: address.h:13
uint8_t ra
Definition: bind_util.h:85
uint32_t expiry
Definition: bind_util.h:122
static uint8_t GetNibble(const Ip6Address::bytes_type &addr, size_t bit)
Definition: bind_util.cc:721
std::list< DnsItem > DnsItems
Definition: bind_util.h:193
DISALLOW_COPY_AND_ASSIGN(DnsNameEncoder)
uint16_t ns_offset
Definition: bind_util.h:116
uint8_t auth
Definition: bind_util.h:78
uint16_t priority
Definition: bind_util.h:152
uint16_t ans_rrcount
Definition: bind_util.h:106
std::string name
Definition: bind_util.h:158
uint8_t op
Definition: bind_util.h:79
uint32_t refresh
Definition: bind_util.h:120
uint16_t data_offset
Definition: bind_util.h:157
static uint8_t * AddAnswerSection(uint8_t *ptr, const DnsItem &item, uint16_t &length)
Definition: bind_util.cc:271
void AddName(std::string &name, uint16_t curr_msg_offset, uint16_t &name_plen, uint16_t &name_offset)
Definition: bind_util.cc:1018
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
Name(std::string &n, uint16_t oset)
Definition: bind_util.h:434
uint16_t priority
Definition: bind_util.h:138
uint16_t hn_offset
Definition: bind_util.h:143
std::map< uint16_t, std::string >::const_iterator DnsTypeNumIter
Definition: bind_util.h:70
uint16_t offset
Definition: bind_util.h:153
static const std::string & DnsResponseCode(uint16_t code)
Definition: bind_util.cc:139
void GetReverseZones(ZoneList &zones) const
Definition: bind_util.cc:108
static uint8_t * WriteShort(uint8_t *ptr, uint16_t value)
Definition: bind_util.h:385
static bool ReadQuestionEntry(uint8_t *dns, uint16_t dnslen, int *remlen, DnsItem &item)
Definition: bind_util.cc:422
static uint8_t * WriteWord(uint8_t *ptr, uint32_t value)
Definition: bind_util.h:392
static bool ParseDnsResponse(uint8_t *dns, uint16_t dnslen, uint16_t &xid, dns_flags &flags, DnsItems &ques, DnsItems &ans, DnsItems &auth, DnsItems &add)
Definition: bind_util.cc:476
DnsOpcode
Definition: bind_util.h:60
static std::string GetFQDN(const std::string &name, const std::string &domain, const std::string &match)
Definition: bind_util.cc:991
static uint8_t * AddData(uint8_t *ptr, const DnsItem &item, uint16_t &length)
Definition: bind_util.cc:189
static void RemoveSpecialChars(std::string &name)
Definition: bind_util.cc:1009
static uint8_t * AddUpdate(uint8_t *ptr, const DnsItem &item, uint16_t cl, uint32_t ttl, uint16_t &length)
Definition: bind_util.cc:300
static bool IsReverseZone(const std::string &name)
Definition: bind_util.cc:711
static bool ReadByte(uint8_t *dns, uint16_t dnslen, int *remlen, uint8_t &value)
Definition: bind_util.h:345
#define DNS_TYPE_ANY
Definition: bind_util.h:45
std::string virtual_dns
Definition: bind_util.h:206
void MarkDelete()
Definition: bind_util.h:269
static bool ParseDnsUpdate(uint8_t *dns, uint16_t dnslen, DnsUpdateData &data)
Definition: bind_util.cc:546
uint8_t req
Definition: bind_util.h:80
uint8_t type
Definition: load_balance.h:109
virtual ~DnsNameEncoder()
Definition: bind_util.h:438
static bool ParseDnsQuery(uint8_t *dns, uint16_t dnslen, uint16_t *parsed_length, DnsItems &items)
Definition: bind_util.cc:445
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
static uint8_t * AddName(uint8_t *ptr, const std::string &addr, uint16_t plen, uint16_t offset, uint16_t &length)
Definition: bind_util.cc:146
bool IsDeleted() const
Definition: bind_util.h:270
uint8_t flags
Definition: bind_util.h:255
bool operator==(const DnsItem &rhs) const
Definition: bind_util.h:169
std::string ToString() const
Definition: bind_util.cc:63
uint16_t eclass
Definition: bind_util.h:149
bool operator==(const DnsSOAData &rhs) const
Definition: bind_util.h:127
std::vector< Subnet > Subnets
Definition: bind_util.h:278
dns_flags flags
Definition: bind_util.h:104
std::string source_name
Definition: bind_util.h:159
static uint16_t DataLength(uint16_t plen, uint16_t offset, uint16_t size)
Definition: bind_util.h:320
static bool IsIP(const std::string &name, IpAddress &addr)
Definition: bind_util.cc:715
std::map< uint16_t, std::string > DnsTypeNumMap
Definition: bind_util.h:69
static std::string GetPtrNameFromAddr(const Ip4Address &ip)
Definition: bind_util.cc:959
std::string data
Definition: bind_util.h:160
uint16_t add_rrcount
Definition: bind_util.h:108
bool Contains(const IpAddress &addr) const
Definition: bind_util.cc:98
uint32_t serial
Definition: bind_util.h:119
bool operator<(const Subnet &rhs) const
Definition: bind_util.cc:68
uint16_t auth_rrcount
Definition: bind_util.h:107
uint8_t trunc
Definition: bind_util.h:77
static bool ReadAnswerEntry(uint8_t *dns, uint16_t dnslen, int *remlen, DnsItem &item)
Definition: bind_util.cc:434
#define DNS_CLASS_NONE
Definition: bind_util.h:33
bool AddItem(DnsItem &item, bool replace=false) const
Definition: bind_util.h:224
uint8_t cd
Definition: bind_util.h:82
static uint16_t DnsClass(const std::string &cl)
Definition: bind_util.cc:112
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
static bool IsReverseZoneV4(const std::string &name)
Definition: bind_util.cc:698
uint32_t retry
Definition: bind_util.h:121
static bool GetAddrFromPtrName(std::string &ptr_name, IpAddress &mask)
Definition: bind_util.cc:933
bool DelItem(DnsItem &item) const
Definition: bind_util.h:236
uint16_t mailbox_plen
Definition: bind_util.h:117
std::vector< Name > names_
Definition: bind_util.h:445
uint32_t ttl
Definition: bind_util.h:123
static bool ReadName(uint8_t *dns, uint16_t dnslen, int *remlen, std::string &name, uint16_t &plen, uint16_t &offset)
Definition: bind_util.cc:310
uint16_t weight
Definition: bind_util.h:139
static void BuildDnsHeader(dnshdr *dns, uint16_t xid, DnsReq req, DnsOpcode op, bool rd, bool ra, uint8_t ret, uint16_t ques_count)
Definition: bind_util.cc:608
uint16_t data_plen
Definition: bind_util.h:156
std::string primary_ns
Definition: bind_util.h:113
std::string mailbox
Definition: bind_util.h:114
uint8_t ad
Definition: bind_util.h:83
uint16_t hn_plen
Definition: bind_util.h:142
static bool ReadData(uint8_t *dns, uint16_t dnslen, int *remlen, DnsItem &item)
Definition: bind_util.cc:343
DnsSRVData srv
Definition: bind_util.h:162
std::string hostname
Definition: bind_util.h:141
Subnet()
Definition: bind_util.h:261
uint32_t ttl
Definition: bind_util.h:151
static bool HasSpecialChars(const std::string &name)
Definition: bind_util.cc:999
static uint16_t DnsType(const std::string &tp)
Definition: bind_util.cc:125
static void GetReverseZoneList(const IpAddress &mask, uint32_t plen, ZoneList &zones)
Definition: bind_util.cc:803
uint16_t xid
Definition: bind_util.h:103
uint16_t mailbox_offset
Definition: bind_util.h:118
uint8_t ret
Definition: bind_util.h:81
static bool ReadWord(uint8_t *dns, uint16_t dnslen, int *remlen, uint32_t &value)
Definition: bind_util.h:367
uint8_t rd
Definition: bind_util.h:76
static void GetReverseZone(const Ip4Address &addr, uint32_t plen, std::string &zone)
Definition: bind_util.cc:812
DnsItems items
Definition: bind_util.h:208
uint16_t ques_rrcount
Definition: bind_util.h:105
std::string name
Definition: bind_util.h:432
uint32_t plen
Definition: bind_util.h:254
DnsUpdateData(const std::string &vdns, const std::string &z)
Definition: bind_util.h:211
uint16_t port
Definition: bind_util.h:140
static uint8_t * WriteByte(uint8_t *ptr, uint8_t value)
Definition: bind_util.h:378
uint16_t name_offset
Definition: bind_util.h:155
static std::string DnsItemsToString(DnsItems &items)
Definition: bind_util.h:194
uint16_t ns_plen
Definition: bind_util.h:115
boost::function< void(DnsItem &)> DeleteCallback
Definition: bind_util.h:204
static std::string BuildIp6ArpaSuffix(const Ip6Address::bytes_type &addr, uint32_t plen)
Definition: bind_util.cc:731
void ClearDelete()
Definition: bind_util.h:271
IpAddress prefix
Definition: bind_util.h:253
static bool IsReverseZoneV6(const std::string &name)
Definition: bind_util.cc:705
std::vector< std::string > ZoneList
Definition: bind_util.h:250
bool IsPresent(std::string &name, uint16_t &name_offset)
Definition: bind_util.cc:1039
uint16_t type
Definition: bind_util.h:150
static bool ReadShort(uint8_t *dns, uint16_t dnslen, int *remlen, uint16_t &value)
Definition: bind_util.h:356