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