OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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) {
66  if (type == DnsAgentXmpp::Update)
68  else if (type == DnsAgentXmpp::UpdateResponse)
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
uint16_t cmd
Definition: pkt_handler.h:68
VmDataMap all_vms_
Definition: dns_proto.h:266
bool IsLess(const DnsFipEntry *rhs) const
Definition: dns_proto.cc:755
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
void DelVmRequest(DnsHandler::QueryKey *key)
Definition: dns_proto.cc:734
void Shutdown()
Definition: dns_proto.cc:103
DnsUpdateData * xmpp_data
Definition: dns_proto.h:77
DnsIpc(uint8_t *msg, std::size_t len, uint16_t id, DnsHandler *h, InterTaskMessage cmd)
Definition: dns_proto.h:37
void IncrStatsRes()
Definition: dns_proto.h:217
void ConfigInit()
Definition: dns_proto.cc:41
DnsUpdateAllIpc(AgentDnsXmppChannel *ch)
Definition: dns_proto.h:100
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
int16_t GetDnsQueryServerIndex(uint16_t xid)
Definition: dns_proto.cc:722
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 DelDnsQuery(uint16_t xid)
Definition: dns_proto.cc:678
DnsUpdateIpc(DnsAgentXmpp::XmppType type, DnsUpdateData *data, const VmInterface *vm, bool floating)
Definition: dns_proto.h:62
DnsProto(Agent *agent, boost::asio::io_context &io)
Definition: dns_proto.cc:66
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
boost::asio::ip::address IpAddress
Definition: address.h:13
const DnsStats & GetStats() const
Definition: dns_proto.h:221
virtual ~DnsProto()
Definition: dns_proto.cc:100
void VnNotify(DBEntryBase *entry)
Definition: dns_proto.cc:186
int ListenerId
Definition: db_table.h:62
void InterfaceNotify(DBEntryBase *entry)
Definition: dns_proto.cc:127
std::string new_domain
Definition: dns_proto.h:83
void DelUpdateRequest(DnsUpdateIpc *ipc)
Definition: dns_proto.h:184
const VmInterface * itf
Definition: dns_proto.h:78
uint32_t max_retries_
Definition: dns_proto.h:263
void DelDnsQueryIndex(uint16_t xid)
Definition: dns_proto.cc:718
DnsUpdateSet update_set_
Definition: dns_proto.h:256
void IpamNotify(IFMapNode *node)
Definition: dns_proto.cc:267
void DelDnsQueryHandler(DnsHandler *handler)
Definition: dns_proto.cc:696
void set_timeout(uint32_t timeout)
Definition: dns_proto.h:211
std::string fip_name_
Definition: dns_proto.h:129
DBTableBase::ListenerId lid_
Definition: dns_proto.h:268
void IncrStatsRetransmitReq()
Definition: dns_proto.h:216
uint32_t max_retries() const
Definition: dns_proto.h:212
std::pair< uint32_t, std::string > IpVdnsPair
Definition: dns_proto.h:144
DnsFipEntry(const VnEntry *vn, const IpAddress &fip, const VmInterface *itf)
Definition: dns_proto.cc:742
void AddDnsQueryIndex(uint16_t xid, int16_t srv_idx)
Definition: dns_proto.cc:714
DnsVmRequestSet curr_vm_requests_
Definition: dns_proto.h:258
void AddUpdateRequest(DnsUpdateIpc *ipc)
Definition: dns_proto.h:183
uint32_t retransmit_reqs
Definition: dns_proto.h:114
void VrfNotify(DBEntryBase *entry)
Definition: dns_proto.cc:246
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
uint16_t xid_
Definition: dns_proto.h:255
IpAddress floating_ip_
Definition: dns_proto.h:126
const DnsFipSet & fip_list() const
Definition: dns_proto.h:224
const VmInterface * interface_
Definition: dns_proto.h:127
std::string new_vdns
Definition: dns_proto.h:81
bool IsDnsQueryInProgress(uint16_t xid)
Definition: dns_proto.cc:682
uint16_t GetTransId()
Definition: dns_proto.cc:637
virtual ~DnsFipEntry()
Definition: dns_proto.cc:747
std::map< uint32_t, int16_t > DnsBindQueryIndexMap
Definition: dns_proto.h:148
bool IsDnsHandlerInUse(DnsHandler *handler)
Definition: dns_proto.cc:686
ProtoHandler * AllocProtoHandler(boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
Definition: dns_proto.cc:122
bool operator()(DnsUpdateIpc *const &lhs, DnsUpdateIpc *const &rhs) const
Definition: dns_proto.h:87
std::set< DnsUpdateIpc *, UpdateCompare > DnsUpdateSet
Definition: dns_proto.h:142
void SendDnsIpc(uint8_t *pkt, std::size_t length)
Definition: dns_proto.cc:641
uint8_t type
Definition: load_balance.h:109
bool BuildDefaultServerList()
Definition: dns_proto.cc:113
Definition: agent.h:358
void ProcessNotify(std::string name, bool is_deleted, bool is_ipam)
Definition: dns_proto.cc:287
DefaultServerList def_server_list_
Definition: dns_proto.h:260
uint32_t timeout() const
Definition: dns_proto.h:210
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
DBTableBase::ListenerId vrf_table_listener_id_
Definition: dns_proto.h:270
std::pair< uint32_t, int16_t > DnsBindQueryIndexPair
Definition: dns_proto.h:149
void set_max_retries(uint32_t retries)
Definition: dns_proto.h:213
void IncrStatsUnsupp()
Definition: dns_proto.h:218
void AddDnsQuery(uint16_t xid, DnsHandler *handler)
Definition: dns_proto.cc:674
DnsHandler * GetDnsQueryHandler(uint16_t xid)
Definition: dns_proto.cc:707
std::pair< uint32_t, DnsHandler * > DnsBindQueryPair
Definition: dns_proto.h:140
std::pair< const VmInterface *, IpVdnsMap > VmDataPair
Definition: dns_proto.h:146
void IoShutdown()
Definition: dns_proto.cc:25
const VnEntry * vn_
Definition: dns_proto.h:125
bool operator()(const DnsFipEntryPtr &lhs, const DnsFipEntryPtr &rhs) const
Definition: dns_proto.cc:750
DnsFipSet fip_list_
Definition: dns_proto.h:267
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
void AddVmRequest(DnsHandler::QueryKey *key)
Definition: dns_proto.cc:730
void SendDnsUpdateIpc(DnsUpdateData *data, DnsAgentXmpp::XmppType type, const VmInterface *vm, bool floating)
Definition: dns_proto.cc:652
Definition: vn.h:151
DefaultServerList GetDefaultServerList()
Definition: dns_proto.cc:118
virtual ~DnsUpdateIpc()
Definition: dns_proto.h:72
const DnsUpdateSet & update_set() const
Definition: dns_proto.h:182
DefaultServerList BuildDefaultServerListImpl()
virtual ~DnsIpc()
Definition: dns_proto.h:41
static const uint32_t kDnsDefaultTtl
Definition: dns_proto.h:21
void ClearStats()
Definition: dns_proto.h:222
void IncrStatsFail()
Definition: dns_proto.h:219
std::vector< IpAddress > DefaultServerList
Definition: dns_proto.h:150
bool UpdateFloatingIp(const VmInterface *vmitf, const VnEntry *vn, const IpAddress &ip, bool is_deleted)
Definition: dns_proto.cc:466
void IncrStatsReq()
Definition: dns_proto.h:215
static const Ip6Address ip6_unspec_
Definition: dns_proto.h:18
uint32_t resolved
Definition: dns_proto.h:113
const VmDataMap & all_vms() const
Definition: dns_proto.h:223
static const Ip4Address ip4_unspec_
Definition: dns_proto.h:17
uint32_t timeout_
Definition: dns_proto.h:262
uint32_t requests
Definition: dns_proto.h:112
boost::shared_ptr< DnsFipEntry > DnsFipEntryPtr
Definition: dns_proto.h:132
bool GetFipName(const VmInterface *vmitf, const autogen::VirtualDnsType &vdns_type, const IpAddress &ip, std::string &fip_name) const
Definition: dns_proto.cc:609
AgentDnsXmppChannel * channel
Definition: dns_proto.h:103
static const uint32_t kDnsDefaultSlistInterval
Definition: dns_proto.h:22
Timer * default_slist_timer_
Definition: dns_proto.h:264
std::map< uint32_t, DnsHandler * > DnsBindQueryMap
Definition: dns_proto.h:139
uint32_t unsupported
Definition: dns_proto.h:115
uint16_t xid
Definition: dns_proto.h:50
std::string old_vdns
Definition: dns_proto.h:82
Definition: timer.h:54
uint8_t * resp
Definition: dns_proto.h:48
DnsBindQueryMap dns_query_map_
Definition: dns_proto.h:257
void CheckForFipUpdate(DnsFipEntry *entry, std::string &vdns_name, const autogen::VirtualDnsType &vdns_type)
Definition: dns_proto.cc:345
std::map< uint32_t, std::string > IpVdnsMap
Definition: dns_proto.h:143
DnsStats stats_
Definition: dns_proto.h:261
DnsHandler * handler
Definition: dns_proto.h:51
DBTableBase::ListenerId Vnlid_
Definition: dns_proto.h:269
DISALLOW_COPY_AND_ASSIGN(DnsProto)
void IncrStatsDrop()
Definition: dns_proto.h:220
std::map< const VmInterface *, IpVdnsMap > VmDataMap
Definition: dns_proto.h:145
DnsUpdateIpc * FindUpdateRequest(DnsUpdateIpc *ipc)
Definition: dns_proto.h:185
InterTaskMessage
Definition: dns_proto.h:25
std::set< DnsHandler::QueryKey > DnsVmRequestSet
Definition: dns_proto.h:141
std::string vdns_name_
Definition: dns_proto.h:128
DnsBindQueryIndexMap dns_query_index_map_
Definition: dns_proto.h:259
std::size_t length
Definition: dns_proto.h:49
std::set< DnsFipEntryPtr, DnsFipEntryCmp > DnsFipSet
Definition: dns_proto.h:138
bool IsVmRequestDuplicate(DnsHandler::QueryKey *key)
Definition: dns_proto.cc:738
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
void VdnsNotify(IFMapNode *node)
Definition: dns_proto.cc:274