OpenSDN source code
dns_proto.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_proto_hpp
6 #define vnsw_agent_dns_proto_hpp
7 
8 #include "pkt/proto.h"
9 #include "services/dns_handler.h"
10 #include "vnc_cfg_types.h"
11 
12 class VmInterface;
13 class IFMapNode;
14 
15 class DnsProto : public Proto {
16 
17  static const Ip4Address ip4_unspec_;
18  static const Ip6Address ip6_unspec_;
19 
20 public:
21  static const uint32_t kDnsDefaultTtl = 84600;
22  static const uint32_t kDnsDefaultSlistInterval =
23  10 * 60 * 1000; //10 minutes
24 
34  };
35 
36  struct DnsIpc : InterTaskMsg {
37  DnsIpc(uint8_t *msg, std::size_t len, uint16_t id,
39  : InterTaskMsg(cmd), resp(msg), length(len), xid(id), handler(h) {}
40 
41  virtual ~DnsIpc() {
42  if (resp)
43  delete [] resp;
44  if (handler)
45  delete handler;
46  }
47 
48  uint8_t *resp;
49  std::size_t length;
50  uint16_t xid;
52  };
53 
55  DnsUpdateIpc(const VmInterface *vm, const std::string &nvdns,
56  const std::string &ovdns, const std::string &dom,
57  uint32_t ttl_value, bool is_floating)
59  itf(vm), floatingIp(is_floating), ttl(ttl_value),
60  new_vdns(nvdns), old_vdns(ovdns), new_domain(dom) {}
61 
63  const VmInterface *vm, bool floating)
64  : InterTaskMsg(DNS_NONE), xmpp_data(data), itf(vm),
65  floatingIp(floating), ttl(0) {
70  }
71 
72  virtual ~DnsUpdateIpc() {
73  if (xmpp_data)
74  delete xmpp_data;
75  }
76 
78  const VmInterface *itf;
79  bool floatingIp;
80  uint32_t ttl;
81  std::string new_vdns;
82  std::string old_vdns;
83  std::string new_domain;
84  };
85 
86  struct UpdateCompare {
87  bool operator() (DnsUpdateIpc *const &lhs, DnsUpdateIpc *const &rhs) const {
88  if (!lhs || !rhs)
89  return lhs < rhs;
90  if (lhs->itf != rhs->itf)
91  return lhs->itf < rhs->itf;
92  if (lhs->floatingIp != rhs->floatingIp)
93  return lhs->floatingIp < rhs->floatingIp;
95  return tmp(lhs->xmpp_data, rhs->xmpp_data);
96  }
97  };
98 
102 
104  };
105 
106  struct DnsStats {
107  DnsStats() { Reset(); }
108  void Reset() {
110  }
111 
112  uint32_t requests;
113  uint32_t resolved;
114  uint32_t retransmit_reqs;
115  uint32_t unsupported;
116  uint32_t fail;
117  uint32_t drop;
118  };
119 
120  struct DnsFipEntry {
121  DnsFipEntry(const VnEntry *vn, const IpAddress &fip,
122  const VmInterface *itf);
123  virtual ~DnsFipEntry();
124  bool IsLess(const DnsFipEntry *rhs) const;
125  const VnEntry *vn_;
128  std::string vdns_name_;
129  std::string fip_name_;
130  };
131 
132  typedef boost::shared_ptr<DnsFipEntry> DnsFipEntryPtr;
133 
135  public:
136  bool operator()(const DnsFipEntryPtr &lhs, const DnsFipEntryPtr &rhs) const;
137  };
138  typedef std::set<DnsFipEntryPtr, DnsFipEntryCmp> DnsFipSet;
139  typedef std::map<uint32_t, DnsHandler *> DnsBindQueryMap;
140  typedef std::pair<uint32_t, DnsHandler *> DnsBindQueryPair;
141  typedef std::set<DnsHandler::QueryKey> DnsVmRequestSet;
142  typedef std::set<DnsUpdateIpc *, UpdateCompare> DnsUpdateSet;
143  typedef std::map<uint32_t, std::string> IpVdnsMap;
144  typedef std::pair<uint32_t, std::string> IpVdnsPair;
145  typedef std::map<const VmInterface *, IpVdnsMap> VmDataMap;
146  typedef std::pair<const VmInterface *, IpVdnsMap> VmDataPair;
147  // Map of transaction id and BindServer Index
148  typedef std::map<uint32_t, int16_t> DnsBindQueryIndexMap;
149  typedef std::pair<uint32_t, int16_t> DnsBindQueryIndexPair;
150  typedef std::vector<IpAddress> DefaultServerList;
151 
152  void ConfigInit();
153  void Shutdown();
154  void IoShutdown();
155  DnsProto(Agent *agent, boost::asio::io_context &io);
156  virtual ~DnsProto();
157  ProtoHandler *AllocProtoHandler(boost::shared_ptr<PktInfo> info,
158  boost::asio::io_context &io);
159  bool SendUpdateDnsEntry(const VmInterface *vmitf, const std::string &name,
160  const Ip4Address &ip, uint32_t plen,
161  const Ip6Address &ip6, uint32_t plen6,
162  const std::string &vdns_name,
163  const autogen::VirtualDnsType &vdns_type,
164  bool is_floating, bool is_delete);
165  bool UpdateFloatingIp(const VmInterface *vmitf, const VnEntry *vn,
166  const IpAddress &ip, bool is_deleted);
167  void IpamNotify(IFMapNode *node);
168  void VdnsNotify(IFMapNode *node);
169  uint16_t GetTransId();
170 
171  void SendDnsIpc(uint8_t *pkt, std::size_t length);
172  void SendDnsIpc(InterTaskMessage cmd, uint16_t xid,
173  uint8_t *msg, DnsHandler *handler);
175  const VmInterface *vm, bool floating);
176  void SendDnsUpdateIpc(const VmInterface *vm, const std::string &new_vdns,
177  const std::string &old_vdns,
178  const std::string &new_dom,
179  uint32_t ttl, bool is_floating);
180  void SendDnsUpdateIpc(AgentDnsXmppChannel *channel);
181 
182  const DnsUpdateSet &update_set() const { return update_set_; }
183  void AddUpdateRequest(DnsUpdateIpc *ipc) { update_set_.insert(ipc); }
184  void DelUpdateRequest(DnsUpdateIpc *ipc) { update_set_.erase(ipc); }
186  DnsUpdateSet::iterator it = update_set_.find(ipc);
187  if (it != update_set_.end())
188  return *it;
189  return NULL;
190  }
191 
192  void AddDnsQuery(uint16_t xid, DnsHandler *handler);
193  void DelDnsQuery(uint16_t xid);
194  void DelDnsQueryHandler(DnsHandler *handler);
195  bool IsDnsQueryInProgress(uint16_t xid);
196  bool IsDnsHandlerInUse(DnsHandler *handler);
197  DnsHandler *GetDnsQueryHandler(uint16_t xid);
198  bool BuildDefaultServerList();
201 
202  void AddDnsQueryIndex(uint16_t xid, int16_t srv_idx);
203  void DelDnsQueryIndex(uint16_t xid);
204  int16_t GetDnsQueryServerIndex(uint16_t xid);
205 
209 
210  uint32_t timeout() const { return timeout_; }
211  void set_timeout(uint32_t timeout) { timeout_ = timeout; }
212  uint32_t max_retries() const { return max_retries_; }
213  void set_max_retries(uint32_t retries) { max_retries_ = retries; }
214 
219  void IncrStatsFail() { stats_.fail++; }
220  void IncrStatsDrop() { stats_.drop++; }
221  const DnsStats &GetStats() const { return stats_; }
222  void ClearStats() { stats_.Reset(); }
223  const VmDataMap& all_vms() const { return all_vms_; }
224  const DnsFipSet& fip_list() const { return fip_list_; }
225 
226 private:
227  void InterfaceNotify(DBEntryBase *entry);
228  void VnNotify(DBEntryBase *entry);
229  void VrfNotify(DBEntryBase *entry);
230  void ProcessNotify(std::string name, bool is_deleted, bool is_ipam);
231  void CheckForUpdate(IpVdnsMap &ipvdns, const VmInterface *vmitf,
232  const VnEntry *vn, const Ip4Address &ip,
233  const Ip6Address &ip6, std::string &vdns_name,
234  const autogen::VirtualDnsType &vdns_type);
235  void CheckForFipUpdate(DnsFipEntry *entry, std::string &vdns_name,
236  const autogen::VirtualDnsType &vdns_type);
237  bool UpdateDnsEntry(const VmInterface *vmitf, const VnEntry *vn,
238  const std::string &vm_name,
239  const std::string &vdns_name,
240  const Ip4Address &ip,
241  const Ip6Address &ip6,
242  bool is_floating, bool is_deleted);
243  bool MoveVDnsEntry(const VmInterface *vmitf,
244  std::string &new_vdns_name,
245  std::string &old_vdns_name,
246  const autogen::VirtualDnsType &vdns_type,
247  bool is_floating);
248  bool GetVdnsData(const VnEntry *vn, const Ip4Address &v4_addr,
249  const Ip6Address &v6_addr, std::string &vdns_name,
250  autogen::VirtualDnsType &vdns_type);
251  bool GetFipName(const VmInterface *vmitf,
252  const autogen::VirtualDnsType &vdns_type,
253  const IpAddress &ip, std::string &fip_name) const;
254 
255  uint16_t xid_;
262  uint32_t timeout_; // milli seconds
263  uint32_t max_retries_;
265 
271 
273 };
274 
275 #endif // vnsw_agent_dns_proto_hpp
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
boost::asio::ip::address IpAddress
Definition: address.h:13
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
Definition: agent.h:360
int ListenerId
Definition: db_table.h:62
bool operator()(const DnsFipEntryPtr &lhs, const DnsFipEntryPtr &rhs) const
Definition: dns_proto.cc:750
std::pair< uint32_t, int16_t > DnsBindQueryIndexPair
Definition: dns_proto.h:149
void DelDnsQuery(uint16_t xid)
Definition: dns_proto.cc:678
void IncrStatsDrop()
Definition: dns_proto.h:220
const DnsFipSet & fip_list() const
Definition: dns_proto.h:224
DefaultServerList GetDefaultServerList()
Definition: dns_proto.cc:118
void InterfaceNotify(DBEntryBase *entry)
Definition: dns_proto.cc:127
DnsStats stats_
Definition: dns_proto.h:261
bool SendUpdateDnsEntry(const VmInterface *vmitf, const std::string &name, const Ip4Address &ip, uint32_t plen, const Ip6Address &ip6, uint32_t plen6, const std::string &vdns_name, const autogen::VirtualDnsType &vdns_type, bool is_floating, bool is_delete)
Definition: dns_proto.cc:375
void CheckForFipUpdate(DnsFipEntry *entry, std::string &vdns_name, const autogen::VirtualDnsType &vdns_type)
Definition: dns_proto.cc:345
DBTableBase::ListenerId vrf_table_listener_id_
Definition: dns_proto.h:270
DISALLOW_COPY_AND_ASSIGN(DnsProto)
void AddDnsQueryIndex(uint16_t xid, int16_t srv_idx)
Definition: dns_proto.cc:714
DnsFipSet fip_list_
Definition: dns_proto.h:267
void IncrStatsReq()
Definition: dns_proto.h:215
InterTaskMessage
Definition: dns_proto.h:25
@ DNS_NONE
Definition: dns_proto.h:26
@ DNS_BIND_RESPONSE
Definition: dns_proto.h:28
@ DNS_DEFAULT_RESPONSE
Definition: dns_proto.h:27
@ DNS_XMPP_SEND_UPDATE
Definition: dns_proto.h:30
@ DNS_XMPP_MODIFY_VDNS
Definition: dns_proto.h:33
@ DNS_TIMER_EXPIRED
Definition: dns_proto.h:29
@ DNS_XMPP_UPDATE_RESPONSE
Definition: dns_proto.h:32
@ DNS_XMPP_SEND_UPDATE_ALL
Definition: dns_proto.h:31
bool UpdateDnsEntry(const VmInterface *vmitf, const VnEntry *vn, const std::string &vm_name, const std::string &vdns_name, const Ip4Address &ip, const Ip6Address &ip6, bool is_floating, bool is_deleted)
Definition: dns_proto.cc:508
DBTableBase::ListenerId lid_
Definition: dns_proto.h:268
DefaultServerList BuildDefaultServerListImpl()
static const uint32_t kDnsDefaultTtl
Definition: dns_proto.h:21
void ClearStats()
Definition: dns_proto.h:222
uint16_t GetTransId()
Definition: dns_proto.cc:637
std::map< uint32_t, DnsHandler * > DnsBindQueryMap
Definition: dns_proto.h:139
void IncrStatsFail()
Definition: dns_proto.h:219
void IncrStatsUnsupp()
Definition: dns_proto.h:218
bool IsDnsQueryInProgress(uint16_t xid)
Definition: dns_proto.cc:682
void SendDnsIpc(uint8_t *pkt, std::size_t length)
Definition: dns_proto.cc:641
const DnsUpdateSet & update_set() const
Definition: dns_proto.h:182
void IncrStatsRetransmitReq()
Definition: dns_proto.h:216
void VdnsNotify(IFMapNode *node)
Definition: dns_proto.cc:274
const VmDataMap & all_vms() const
Definition: dns_proto.h:223
void set_timeout(uint32_t timeout)
Definition: dns_proto.h:211
DnsHandler * GetDnsQueryHandler(uint16_t xid)
Definition: dns_proto.cc:707
std::pair< uint32_t, DnsHandler * > DnsBindQueryPair
Definition: dns_proto.h:140
uint32_t max_retries_
Definition: dns_proto.h:263
void ConfigInit()
Definition: dns_proto.cc:41
bool BuildDefaultServerList()
Definition: dns_proto.cc:113
void IncrStatsRes()
Definition: dns_proto.h:217
std::map< const VmInterface *, IpVdnsMap > VmDataMap
Definition: dns_proto.h:145
void SendDnsUpdateIpc(DnsUpdateData *data, DnsAgentXmpp::XmppType type, const VmInterface *vm, bool floating)
Definition: dns_proto.cc:652
void AddVmRequest(DnsHandler::QueryKey *key)
Definition: dns_proto.cc:730
ProtoHandler * AllocProtoHandler(boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
Definition: dns_proto.cc:122
std::set< DnsUpdateIpc *, UpdateCompare > DnsUpdateSet
Definition: dns_proto.h:142
void DelDnsQueryIndex(uint16_t xid)
Definition: dns_proto.cc:718
void set_max_retries(uint32_t retries)
Definition: dns_proto.h:213
bool GetFipName(const VmInterface *vmitf, const autogen::VirtualDnsType &vdns_type, const IpAddress &ip, std::string &fip_name) const
Definition: dns_proto.cc:609
void AddUpdateRequest(DnsUpdateIpc *ipc)
Definition: dns_proto.h:183
uint16_t xid_
Definition: dns_proto.h:255
std::map< uint32_t, std::string > IpVdnsMap
Definition: dns_proto.h:143
bool MoveVDnsEntry(const VmInterface *vmitf, std::string &new_vdns_name, std::string &old_vdns_name, const autogen::VirtualDnsType &vdns_type, bool is_floating)
Definition: dns_proto.cc:571
virtual ~DnsProto()
Definition: dns_proto.cc:100
bool IsDnsHandlerInUse(DnsHandler *handler)
Definition: dns_proto.cc:686
DnsVmRequestSet curr_vm_requests_
Definition: dns_proto.h:258
void VnNotify(DBEntryBase *entry)
Definition: dns_proto.cc:186
uint32_t max_retries() const
Definition: dns_proto.h:212
uint32_t timeout() const
Definition: dns_proto.h:210
DnsUpdateSet update_set_
Definition: dns_proto.h:256
std::set< DnsFipEntryPtr, DnsFipEntryCmp > DnsFipSet
Definition: dns_proto.h:138
const DnsStats & GetStats() const
Definition: dns_proto.h:221
static const Ip4Address ip4_unspec_
Definition: dns_proto.h:17
std::map< uint32_t, int16_t > DnsBindQueryIndexMap
Definition: dns_proto.h:148
DnsBindQueryIndexMap dns_query_index_map_
Definition: dns_proto.h:259
void ProcessNotify(std::string name, bool is_deleted, bool is_ipam)
Definition: dns_proto.cc:287
bool GetVdnsData(const VnEntry *vn, const Ip4Address &v4_addr, const Ip6Address &v6_addr, std::string &vdns_name, autogen::VirtualDnsType &vdns_type)
Definition: dns_proto.cc:588
bool IsVmRequestDuplicate(DnsHandler::QueryKey *key)
Definition: dns_proto.cc:738
void AddDnsQuery(uint16_t xid, DnsHandler *handler)
Definition: dns_proto.cc:674
DnsBindQueryMap dns_query_map_
Definition: dns_proto.h:257
std::set< DnsHandler::QueryKey > DnsVmRequestSet
Definition: dns_proto.h:141
void DelUpdateRequest(DnsUpdateIpc *ipc)
Definition: dns_proto.h:184
void IpamNotify(IFMapNode *node)
Definition: dns_proto.cc:267
DBTableBase::ListenerId Vnlid_
Definition: dns_proto.h:269
void CheckForUpdate(IpVdnsMap &ipvdns, const VmInterface *vmitf, const VnEntry *vn, const Ip4Address &ip, const Ip6Address &ip6, std::string &vdns_name, const autogen::VirtualDnsType &vdns_type)
Definition: dns_proto.cc:321
std::pair< uint32_t, std::string > IpVdnsPair
Definition: dns_proto.h:144
bool UpdateFloatingIp(const VmInterface *vmitf, const VnEntry *vn, const IpAddress &ip, bool is_deleted)
Definition: dns_proto.cc:466
boost::shared_ptr< DnsFipEntry > DnsFipEntryPtr
Definition: dns_proto.h:132
DnsProto(Agent *agent, boost::asio::io_context &io)
Definition: dns_proto.cc:66
DefaultServerList def_server_list_
Definition: dns_proto.h:260
int16_t GetDnsQueryServerIndex(uint16_t xid)
Definition: dns_proto.cc:722
Timer * default_slist_timer_
Definition: dns_proto.h:264
static const Ip6Address ip6_unspec_
Definition: dns_proto.h:18
void VrfNotify(DBEntryBase *entry)
Definition: dns_proto.cc:246
std::pair< const VmInterface *, IpVdnsMap > VmDataPair
Definition: dns_proto.h:146
VmDataMap all_vms_
Definition: dns_proto.h:266
std::vector< IpAddress > DefaultServerList
Definition: dns_proto.h:150
uint32_t timeout_
Definition: dns_proto.h:262
void IoShutdown()
Definition: dns_proto.cc:25
void DelDnsQueryHandler(DnsHandler *handler)
Definition: dns_proto.cc:696
static const uint32_t kDnsDefaultSlistInterval
Definition: dns_proto.h:22
void DelVmRequest(DnsHandler::QueryKey *key)
Definition: dns_proto.cc:734
DnsUpdateIpc * FindUpdateRequest(DnsUpdateIpc *ipc)
Definition: dns_proto.h:185
void Shutdown()
Definition: dns_proto.cc:103
Definition: timer.h:54
Definition: vn.h:151
uint8_t type
Definition: load_balance.h:2
Definition: io_utils.cc:11
const VnEntry * vn_
Definition: dns_proto.h:125
bool IsLess(const DnsFipEntry *rhs) const
Definition: dns_proto.cc:755
virtual ~DnsFipEntry()
Definition: dns_proto.cc:747
IpAddress floating_ip_
Definition: dns_proto.h:126
const VmInterface * interface_
Definition: dns_proto.h:127
std::string fip_name_
Definition: dns_proto.h:129
DnsFipEntry(const VnEntry *vn, const IpAddress &fip, const VmInterface *itf)
Definition: dns_proto.cc:742
std::string vdns_name_
Definition: dns_proto.h:128
uint16_t xid
Definition: dns_proto.h:50
DnsIpc(uint8_t *msg, std::size_t len, uint16_t id, DnsHandler *h, InterTaskMessage cmd)
Definition: dns_proto.h:37
virtual ~DnsIpc()
Definition: dns_proto.h:41
std::size_t length
Definition: dns_proto.h:49
DnsHandler * handler
Definition: dns_proto.h:51
uint8_t * resp
Definition: dns_proto.h:48
uint32_t unsupported
Definition: dns_proto.h:115
uint32_t requests
Definition: dns_proto.h:112
uint32_t retransmit_reqs
Definition: dns_proto.h:114
uint32_t resolved
Definition: dns_proto.h:113
DnsUpdateAllIpc(AgentDnsXmppChannel *ch)
Definition: dns_proto.h:100
AgentDnsXmppChannel * channel
Definition: dns_proto.h:103
DnsUpdateIpc(DnsAgentXmpp::XmppType type, DnsUpdateData *data, const VmInterface *vm, bool floating)
Definition: dns_proto.h:62
std::string new_domain
Definition: dns_proto.h:83
DnsUpdateIpc(const VmInterface *vm, const std::string &nvdns, const std::string &ovdns, const std::string &dom, uint32_t ttl_value, bool is_floating)
Definition: dns_proto.h:55
const VmInterface * itf
Definition: dns_proto.h:78
virtual ~DnsUpdateIpc()
Definition: dns_proto.h:72
std::string old_vdns
Definition: dns_proto.h:82
DnsUpdateData * xmpp_data
Definition: dns_proto.h:77
std::string new_vdns
Definition: dns_proto.h:81
bool operator()(DnsUpdateIpc *const &lhs, DnsUpdateIpc *const &rhs) const
Definition: dns_proto.h:87
uint16_t cmd
Definition: pkt_handler.h:68