5 #ifndef __bind_util_h__
6 #define __bind_util_h__
11 #include <boost/asio.hpp>
13 #include "sandesh/sandesh_trace.h"
14 #include "bind/bind_types.h"
21 #define DNS_BIND_TRACE(obj, arg) \
23 std::ostringstream _str; \
25 obj::TraceMsg(DnsBindTraceBuf, __FILE__, __LINE__, _str.str()); \
28 #define DNS_SERVER_PORT 53
31 #define DNS_CLASS_IN 1
32 #define DNS_CLASS_ANY 0x00ff
33 #define DNS_CLASS_NONE 0x00fe
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
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
68 typedef std::map<std::string, uint16_t>::const_iterator
DnsTypeIter;
75 #if __BYTE_ORDER == __LITTLE_ENDIAN
86 #elif __BYTE_ORDER == __BIG_ENDIAN
98 #error "Adjust your <bits/endian.h> defines"
196 for (DnsItems::iterator it = items.begin();
197 !items.empty() && it != items.end(); ++it) {
198 str += (*it).ToString();
225 for (DnsItems::iterator it =
items.begin(); it !=
items.end(); ++it) {
232 items.push_back(item);
238 for (DnsItems::iterator it =
items.begin(); it !=
items.end();) {
239 if ((*it).MatchDelete(item)) {
263 boost::system::error_code ec;
264 prefix = boost::asio::ip::address::from_string(addr, ec);
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);
293 static uint8_t *
AddName(uint8_t *ptr,
const std::string &addr,
294 uint16_t plen, uint16_t offset, uint16_t &length);
296 uint16_t *parsed_length,
DnsItems &items);
303 const std::string &domain,
306 const std::string &domain,
307 const std::string &zone,
310 uint16_t
type, uint16_t cl,
315 uint16_t cl, uint32_t ttl, uint16_t &length);
317 DnsOpcode op,
bool rd,
bool ra, uint8_t ret,
318 uint16_t ques_count);
320 static inline uint16_t
DataLength(uint16_t plen, uint16_t offset,
322 return (offset ? (plen ? plen + 2 + 1 : 2) : (size ? size + 2 : 1));
339 static std::string
GetFQDN(
const std::string &name,
const std::string &domain,
340 const std::string &match);
345 static inline bool ReadByte(uint8_t *dns, uint16_t dnslen,
int *remlen,
350 uint8_t *ptr = dns + (dnslen - *remlen);
352 value = *(uint8_t *) ptr;
356 static inline bool ReadShort(uint8_t *dns, uint16_t dnslen,
int *remlen,
361 uint8_t *ptr = dns + (dnslen - *remlen);
363 value = ntohs(*(uint16_t *) ptr);
367 static inline bool ReadWord(uint8_t *dns, uint16_t dnslen,
int *remlen,
372 uint8_t *ptr = dns + (dnslen - *remlen);
374 value = ntohl(*(uint32_t *) ptr);
378 static inline uint8_t *
WriteByte(uint8_t *ptr, uint8_t value) {
379 *(uint8_t *) ptr = value;
385 static inline uint8_t *
WriteShort(uint8_t *ptr, uint16_t value) {
386 *(uint16_t *) ptr = htons(value);
392 static inline uint8_t *
WriteWord(uint8_t *ptr, uint32_t value) {
393 *(uint32_t *) ptr = htonl(value);
401 uint16_t
type, uint16_t cl,
402 uint32_t ttl,
const std::string &data,
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,
410 static bool ReadAnswerEntry(uint8_t *dns, uint16_t dnslen,
int *remlen,
422 static uint8_t
GetNibble(
const Ip6Address::bytes_type &addr,
439 void AddName(std::string &name, uint16_t curr_msg_offset,
440 uint16_t &name_plen, uint16_t &name_offset);
443 bool IsPresent(std::string &name, uint16_t &name_offset);
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)
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)
std::map< std::string, uint16_t >::const_iterator DnsTypeIter
std::map< uint16_t, std::string > DnsResponseMap
Subnet(std::string addr, uint32_t len)
bool MatchDelete(const DnsItem &rhs) const
SandeshTraceBufferPtr DnsBindTraceBuf
bool operator()(DnsUpdateData *const &lhs, DnsUpdateData *const &rhs) const
std::map< uint16_t, std::string >::const_iterator DnsResponseIter
static int BuildDnsUpdate(uint8_t *buf, Operation op, uint16_t xid, const std::string &domain, const std::string &zone, const DnsItems &items)
std::map< std::string, uint16_t > DnsTypeMap
static int BuildDnsQuery(uint8_t *buf, uint16_t xid, const std::string &domain, const DnsItems &items)
boost::asio::ip::address IpAddress
static uint8_t GetNibble(const Ip6Address::bytes_type &addr, size_t bit)
std::list< DnsItem > DnsItems
DISALLOW_COPY_AND_ASSIGN(DnsNameEncoder)
static uint8_t * AddAnswerSection(uint8_t *ptr, const DnsItem &item, uint16_t &length)
void AddName(std::string &name, uint16_t curr_msg_offset, uint16_t &name_plen, uint16_t &name_offset)
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Name(std::string &n, uint16_t oset)
std::map< uint16_t, std::string >::const_iterator DnsTypeNumIter
static const std::string & DnsResponseCode(uint16_t code)
void GetReverseZones(ZoneList &zones) const
static uint8_t * WriteShort(uint8_t *ptr, uint16_t value)
static bool ReadQuestionEntry(uint8_t *dns, uint16_t dnslen, int *remlen, DnsItem &item)
static uint8_t * WriteWord(uint8_t *ptr, uint32_t value)
static bool ParseDnsResponse(uint8_t *dns, uint16_t dnslen, uint16_t &xid, dns_flags &flags, DnsItems &ques, DnsItems &ans, DnsItems &auth, DnsItems &add)
static std::string GetFQDN(const std::string &name, const std::string &domain, const std::string &match)
static uint8_t * AddData(uint8_t *ptr, const DnsItem &item, uint16_t &length)
static void RemoveSpecialChars(std::string &name)
static uint8_t * AddUpdate(uint8_t *ptr, const DnsItem &item, uint16_t cl, uint32_t ttl, uint16_t &length)
static bool IsReverseZone(const std::string &name)
static bool ReadByte(uint8_t *dns, uint16_t dnslen, int *remlen, uint8_t &value)
static bool ParseDnsUpdate(uint8_t *dns, uint16_t dnslen, DnsUpdateData &data)
virtual ~DnsNameEncoder()
static bool ParseDnsQuery(uint8_t *dns, uint16_t dnslen, uint16_t *parsed_length, DnsItems &items)
boost::asio::ip::address_v6 Ip6Address
static uint8_t * AddName(uint8_t *ptr, const std::string &addr, uint16_t plen, uint16_t offset, uint16_t &length)
bool operator==(const DnsItem &rhs) const
std::string ToString() const
bool operator==(const DnsSOAData &rhs) const
std::vector< Subnet > Subnets
static uint16_t DataLength(uint16_t plen, uint16_t offset, uint16_t size)
static bool IsIP(const std::string &name, IpAddress &addr)
std::map< uint16_t, std::string > DnsTypeNumMap
static std::string GetPtrNameFromAddr(const Ip4Address &ip)
bool Contains(const IpAddress &addr) const
bool operator<(const Subnet &rhs) const
static bool ReadAnswerEntry(uint8_t *dns, uint16_t dnslen, int *remlen, DnsItem &item)
bool AddItem(DnsItem &item, bool replace=false) const
static uint16_t DnsClass(const std::string &cl)
boost::asio::ip::address_v4 Ip4Address
static bool IsReverseZoneV4(const std::string &name)
static bool GetAddrFromPtrName(std::string &ptr_name, IpAddress &mask)
bool DelItem(DnsItem &item) const
std::vector< Name > names_
static bool ReadName(uint8_t *dns, uint16_t dnslen, int *remlen, std::string &name, uint16_t &plen, uint16_t &offset)
static void BuildDnsHeader(dnshdr *dns, uint16_t xid, DnsReq req, DnsOpcode op, bool rd, bool ra, uint8_t ret, uint16_t ques_count)
static bool ReadData(uint8_t *dns, uint16_t dnslen, int *remlen, DnsItem &item)
static bool HasSpecialChars(const std::string &name)
static uint16_t DnsType(const std::string &tp)
static void GetReverseZoneList(const IpAddress &mask, uint32_t plen, ZoneList &zones)
static bool ReadWord(uint8_t *dns, uint16_t dnslen, int *remlen, uint32_t &value)
static void GetReverseZone(const Ip4Address &addr, uint32_t plen, std::string &zone)
DnsUpdateData(const std::string &vdns, const std::string &z)
static uint8_t * WriteByte(uint8_t *ptr, uint8_t value)
static std::string DnsItemsToString(DnsItems &items)
boost::function< void(DnsItem &)> DeleteCallback
static std::string BuildIp6ArpaSuffix(const Ip6Address::bytes_type &addr, uint32_t plen)
static bool IsReverseZoneV6(const std::string &name)
std::vector< std::string > ZoneList
bool IsPresent(std::string &name, uint16_t &name_offset)
static bool ReadShort(uint8_t *dns, uint16_t dnslen, int *remlen, uint16_t &value)