OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dns_handler.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef vnsw_agent_dns_handler_hpp
6 #define vnsw_agent_dns_handler_hpp
7 
8 #include "pkt/proto_handler.h"
9 #include "vnc_cfg_types.h"
10 #include "bind/bind_util.h"
11 #include "bind/bind_resolver.h"
12 
13 #define DEFAULT_DNS_TTL 120
14 
15 typedef boost::asio::ip::udp boost_udp;
16 
18 class VmInterface;
19 class Timer;
20 
21 class DnsHandler : public ProtoHandler {
22 public:
23  typedef boost::function<void(const boost::system::error_code&,
24  boost_udp::resolver::iterator)> ResolveHandler;
25  typedef std::vector<boost_udp::resolver *> ResolvList;
26  static const uint32_t max_items_per_xmpp_msg = 20;
27 
28  struct QueryKey {
29  QueryKey(const Interface *i, uint16_t x) : itf(i), xid(x) {}
30  bool operator<(const QueryKey &rhs) const {
31  if (itf != rhs.itf)
32  return itf < rhs.itf;
33  return xid < rhs.xid;
34  }
35 
36  const Interface *itf;
37  uint16_t xid;
38  };
39 
40  enum Action {
44  };
45 
46  DnsHandler(Agent *agent, boost::shared_ptr<PktInfo> info,
47  boost::asio::io_context &io);
48  virtual ~DnsHandler();
49  bool Run();
50  bool TimerExpiry(uint16_t xid);
51  void DefaultDnsResolveHandler(const boost::system::error_code &error,
52  boost_udp::resolver::iterator it,
53  DnsItems::iterator item);
54 
55 private:
56  friend class DnsTest;
57 
58  bool HandleRequest();
59  bool HandleDefaultDnsRequest(const VmInterface *vmitf);
61  bool HandleVirtualDnsRequest(const VmInterface *vmitf);
62  bool ResolveLinkLocalRequest(DnsItems::iterator &item,
63  DnsItems *linklocal_items) const;
65  void BuildDnsResolvers();
67  bool HandleMessage();
69  bool HandleBindResponse();
70  bool HandleUpdateResponse();
71  bool HandleRetryExpiry();
72  bool HandleUpdate();
73  bool HandleModifyVdns();
74  bool UpdateAll();
75  void SendXmppUpdate(AgentDnsXmppChannel *channel, DnsUpdateData *xmpp_data);
76  void ParseQuery();
77  void Resolve(dns_flags flags, const DnsItems &ques, DnsItems &ans,
78  DnsItems &auth, DnsItems &add);
79  void SendDnsResponse();
80  void UpdateQueryNames();
81  void UpdateOffsets(DnsItem &item, bool name_update_required);
82  void UpdateGWAddress(DnsItem &item);
83  void Update(InterTaskMsg *msg);
84  void DelUpdate(InterTaskMsg *msg);
85  void UpdateStats();
86  void GetDomainName(const VmInterface *vm_itf, std::string *domain_name) const;
87  bool GetDomainNameFromDhcp(std::vector<autogen::DhcpOptionType> &options,
88  std::string *domain_name) const;
89  void GetBaseName(const std::string &name, std::string *base) const;
90  std::string DnsItemsToString(DnsItems &items) const;
91  void HandleInvalidBindResponse(DnsHandler *handler, dns_flags flags,
92  const DnsItems &ques, DnsItems &ans,
93  DnsItems &auth, DnsItems &add, uint16_t xid);
94  bool NeedRetryForNextServer(uint16_t code);
95  bool SendToDefaultServer();
97  uint8_t curr_index() { return curr_index_; }
98  uint8_t last_index() { return def_dns_resolvers_.size() - 1; }
99  void IncrCurrIndex() { curr_index_++; }
100 
102  uint8_t *resp_ptr_;
103  uint16_t dns_resp_size_;
104  uint16_t xid_;
108  boost::asio::ip::udp::endpoint ep_;
109  uint32_t retries_;
111  };
112  std::vector<DnsResolverInfo *> dns_resolvers_;
113  std::vector<DnsResolverInfo *> def_dns_resolvers_;
114  std::string ipam_name_;
115  std::string domain_name_;
116  autogen::IpamType ipam_type_;
117  autogen::VirtualDnsType vdns_type_;
122  uint16_t query_name_update_len_; // num bytes added in the query section
123  uint16_t pend_req_;
125  tbb::mutex mutex_;
127  uint8_t curr_index_;
128  bool SendDnsQuery(DnsResolverInfo *resolver, uint16_t xid);
129 
131 };
132 
133 #endif // vnsw_agent_dns_handler_hpp
void UpdateStats()
void BuildDefaultDnsResolvers()
Definition: dns_handler.cc:95
Action action_
Definition: dns_handler.h:105
bool HandleMessage()
Definition: dns_handler.cc:519
DnsItems linklocal_items_
Definition: dns_handler.h:119
void UpdateGWAddress(DnsItem &item)
void GetDomainName(const VmInterface *vm_itf, std::string *domain_name) const
ResolvList resolv_list_
Definition: dns_handler.h:124
uint8_t curr_index()
Definition: dns_handler.h:97
std::string DnsItemsToString(DnsItems &items) const
boost::function< void(const boost::system::error_code &, boost_udp::resolver::iterator)> ResolveHandler
Definition: dns_handler.h:24
void GetBaseName(const std::string &name, std::string *base) const
bool HandleDefaultDnsResponse()
Definition: dns_handler.cc:549
bool HandleRequest()
Definition: dns_handler.cc:127
uint16_t dns_resp_size_
Definition: dns_handler.h:103
bool HandleRetryExpiry()
Definition: dns_handler.cc:687
boost::asio::ip::udp::endpoint ep_
Definition: dns_handler.h:108
void DelUpdate(InterTaskMsg *msg)
void BuildDnsResolvers()
Definition: dns_handler.cc:62
std::list< DnsItem > DnsItems
Definition: bind_util.h:193
bool NeedRetryForNextServer(uint16_t code)
Definition: dns_handler.cc:656
std::vector< DnsResolverInfo * > dns_resolvers_
Definition: dns_handler.h:112
bool SendDnsQuery(DnsResolverInfo *resolver, uint16_t xid)
Definition: dns_handler.cc:399
autogen::VirtualDnsType vdns_type_
Definition: dns_handler.h:117
void SendXmppUpdate(AgentDnsXmppChannel *channel, DnsUpdateData *xmpp_data)
Definition: dns_handler.cc:806
Agent * agent() const
Definition: proto_handler.h:80
void ParseQuery()
bool HandleUpdate()
Definition: dns_handler.cc:726
bool DefaultMethodInUse()
Definition: dns_handler.h:96
DnsHandler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
Definition: dns_handler.cc:20
autogen::IpamType ipam_type_
Definition: dns_handler.h:116
bool operator<(const QueryKey &rhs) const
Definition: dns_handler.h:30
Definition: agent.h:358
std::string domain_name_
Definition: dns_handler.h:115
static Options options
void UpdateOffsets(DnsItem &item, bool name_update_required)
Definition: dns_handler.cc:994
uint16_t pend_req_
Definition: dns_handler.h:123
uint16_t xid_
Definition: dns_handler.h:104
uint16_t query_name_update_len_
Definition: dns_handler.h:122
void SendDnsResponse()
Definition: dns_handler.cc:890
void DefaultDnsSendResponse()
Definition: dns_handler.cc:280
const Interface * itf
Definition: dns_handler.h:36
DnsNameEncoder name_encoder_
Definition: dns_handler.h:120
tbb::mutex mutex_
Definition: dns_handler.h:125
friend class DnsTest
Definition: dns_handler.h:56
void DefaultDnsResolveHandler(const boost::system::error_code &error, boost_udp::resolver::iterator it, DnsItems::iterator item)
bool HandleUpdateResponse()
Definition: dns_handler.cc:719
bool ResolveLinkLocalRequest(DnsItems::iterator &item, DnsItems *linklocal_items) const
Definition: dns_handler.cc:444
void Update(InterTaskMsg *msg)
bool query_name_update_
Definition: dns_handler.h:121
uint8_t * resp_ptr_
Definition: dns_handler.h:102
uint8_t curr_index_
Definition: dns_handler.h:127
bool ResolveAllLinkLocalRequests()
Definition: dns_handler.cc:497
std::vector< DnsResolverInfo * > def_dns_resolvers_
Definition: dns_handler.h:113
bool HandleModifyVdns()
Definition: dns_handler.cc:737
void IncrCurrIndex()
Definition: dns_handler.h:99
virtual ~DnsHandler()
Definition: dns_handler.cc:29
bool Run()
Definition: dns_handler.cc:117
bool GetDomainNameFromDhcp(std::vector< autogen::DhcpOptionType > &options, std::string *domain_name) const
void Resolve(dns_flags flags, const DnsItems &ques, DnsItems &ans, DnsItems &auth, DnsItems &add)
Definition: dns_handler.cc:844
bool UpdateAll()
Definition: dns_handler.cc:792
bool SendToDefaultServer()
Definition: dns_handler.cc:668
bool HandleVirtualDnsRequest(const VmInterface *vmitf)
Definition: dns_handler.cc:296
static const uint32_t max_items_per_xmpp_msg
Definition: dns_handler.h:26
dnshdr * dns_
Definition: dns_handler.h:101
uint8_t last_index()
Definition: dns_handler.h:98
QueryKey * rkey_
Definition: dns_handler.h:106
bool HandleDefaultDnsRequest(const VmInterface *vmitf)
Definition: dns_handler.cc:213
DnsItems items_
Definition: dns_handler.h:118
DISALLOW_COPY_AND_ASSIGN(DnsHandler)
void UpdateQueryNames()
Definition: dns_handler.cc:971
QueryKey(const Interface *i, uint16_t x)
Definition: dns_handler.h:29
bool default_method_
Definition: dns_handler.h:126
Definition: timer.h:54
bool TimerExpiry(uint16_t xid)
std::vector< boost_udp::resolver * > ResolvList
Definition: dns_handler.h:25
bool HandleBindResponse()
Definition: dns_handler.cc:556
boost::asio::ip::udp boost_udp
Definition: dhcp_proto.h:20
void HandleInvalidBindResponse(DnsHandler *handler, dns_flags flags, const DnsItems &ques, DnsItems &ans, DnsItems &auth, DnsItems &add, uint16_t xid)
Definition: dns_handler.cc:637
std::string ipam_name_
Definition: dns_handler.h:114