OpenSDN source code
dns_mgr.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __dns_manager_h__
6 #define __dns_manager_h__
7 
8 #include <mutex>
9 
10 #include <base/index_allocator.h>
11 #include <mgr/dns_oper.h>
12 #include <bind/named_config.h>
13 #include <cfg/dns_config.h>
14 #include <config_client_manager.h>
15 
16 class DB;
17 class DBGraph;
18 struct VirtualDnsConfig;
20 
21 class DnsManager {
22 public:
23  static const int max_records_per_sandesh = 100;
24  static const int kEndOfConfigCheckTime = 1000; // msec
25  static const uint16_t kMaxRetransmitCount = 6;
26  static const uint16_t kPendingRecordReScheduleTime = 1000; //msec
27  static const uint16_t kNamedLoWaterMark = 8192; //pow(2,13);
28  static const uint16_t kNamedHiWaterMark = 32768; //pow(2,15);
29  static const uint16_t kMaxIndexAllocator = 65535;
30 
31  struct PendingList {
32  uint16_t xid;
33  std::string view;
34  std::string zone;
37  uint32_t retransmit_count;
38 
39  PendingList(uint16_t id, const std::string &v, const std::string &z,
40  const DnsItems &it, BindUtil::Operation o,
41  uint32_t recount = 0) {
42  xid = id;
43  view = v;
44  zone = z;
45  items = it;
46  op = o;
47  retransmit_count = recount;
48  }
49  };
50  typedef std::map<uint16_t, PendingList> PendingListMap;
51  typedef std::pair<uint16_t, PendingList> PendingListPair;
52 
53  typedef std::map<uint16_t, PendingList> DeportedPendingListMap;
54  typedef std::pair<uint16_t, PendingList> DeportedPendingListPair;
55 
56  DnsManager();
57  virtual ~DnsManager();
58  void Initialize(DB *config_db, DBGraph *config_graph,
59  const std::string& named_config_dir,
60  const std::string& named_config_file,
61  const std::string& named_log_file,
62  const std::string& rndc_config_file,
63  const std::string& rndc_secret,
64  const std::string& named_max_cache_size,
65  const uint16_t named_max_retransmissions,
66  const uint16_t named_retransmission_interval);
67  void Shutdown();
68  void DnsView(const DnsConfig *config, DnsConfig::DnsConfigEvent ev);
69  void DnsPtrZone(const Subnet &subnet, const VirtualDnsConfig *vdns,
71  void DnsRecord(const DnsConfig *config, DnsConfig::DnsConfigEvent ev);
72  void HandleUpdateResponse(uint8_t *pkt, std::size_t length);
74  bool SendUpdate(BindUtil::Operation op, const std::string &view,
75  const std::string &zone, DnsItems &items);
76  void SendRetransmit(uint16_t xid, BindUtil::Operation op,
77  const std::string &view, const std::string &zone,
78  DnsItems &items, uint32_t retranmit_count);
79  void UpdateAll();
80  void StartEndofConfigTimer();
82 
83  template <typename ConfigType>
84  void ProcessConfig(IFMapNodeProxy *proxy, const std::string &name,
86  void ProcessAgentUpdate(BindUtil::Operation event, const std::string &name,
87  const std::string &vdns_name, const DnsItem &item);
88  bool IsBindStatusUp() { return bind_status_.IsUp(); }
89 
90  void set_config_manager(ConfigClientManager *config_manager) {
91  config_client_manager_ = config_manager;
92  }
94  bool IsEndOfConfig() {
97  return (true);
98  }
102  void DnsConfigMsgHandler(const std::string &key, const std::string &context) const;
103  void VdnsRecordsMsgHandler(const std::string &key, const std::string &context, bool show_all = false) const;
104  void BindPendingMsgHandler(const std::string &key, const std::string &context) const;
105  void VdnsServersMsgHandler(const std::string &key, const std::string &context) const;
106  void MakeSandeshPageReq(PageReqData *req, VirtualDnsConfig::DataMap &vdns, VirtualDnsConfig::DataMap::iterator vdns_it,
107  VirtualDnsConfig::DataMap::iterator vdns_iter, const std::string &key, const std::string &req_name) const;
108 private:
109  friend class DnsBindTest;
110  friend class DnsManagerTest;
111 
113  const VirtualDnsRecordConfig *config);
114  bool PendingDone(uint16_t xid);
115  bool ResendRecordsinBatch();
116  bool AddPendingList(uint16_t xid, const std::string &view,
117  const std::string &zone, const DnsItems &items,
119  void UpdatePendingList(const std::string &view,
120  const std::string &zone,
121  const DnsItems &items);
122  void DeletePendingList(uint16_t xid);
123  void ClearPendingList();
124  void PendingListViewDelete(const VirtualDnsConfig *config);
125  bool CheckZoneDelete(ZoneList &zones, PendingList &pend);
126  void PendingListZoneDelete(const Subnet &subnet,
127  const VirtualDnsConfig *config);
128  /* Pending Record List transmitted to named */
129  void StartPendingTimer(int);
130  void CancelPendingTimer();
131  bool PendingTimerExpiry();
132 
133  void CancelEndofConfigTimer();
134  bool EndofConfigTimerExpiry();
135 
136  void NotifyAllDnsRecords(const VirtualDnsConfig *config,
138  void NotifyReverseDnsRecords(const VirtualDnsConfig *config,
139  DnsConfig::DnsConfigEvent ev, bool notify);
140  inline uint16_t GetTransId();
141  void ResetTransId(uint16_t);
142  inline bool CheckName(std::string rec_name, std::string name);
143 
144  std::mutex mutex_;
148  static uint16_t g_trans_id_;
162 
164 };
165 
166 #endif // __dns_manager_h__
std::list< DnsItem > DnsItems
Definition: bind_util.h:193
std::vector< std::string > ZoneList
Definition: bind_util.h:250
bool IsUp()
Definition: named_config.h:27
Definition: db.h:24
PendingListMap pending_map_
Definition: dns_mgr.h:149
bool PendingTimerExpiry()
Definition: dns_mgr.cc:638
void PendingListViewDelete(const VirtualDnsConfig *config)
Definition: dns_mgr.cc:589
static const uint16_t kMaxRetransmitCount
Definition: dns_mgr.h:25
uint16_t named_max_retransmissions_
Definition: dns_mgr.h:155
bool named_send_throttled_
Definition: dns_mgr.h:159
void ProcessConfig(IFMapNodeProxy *proxy, const std::string &name, DnsConfigManager::EventType event)
Definition: dns_mgr.cc:98
static const uint16_t kNamedLoWaterMark
Definition: dns_mgr.h:27
void ClearPendingList()
Definition: dns_mgr.cc:584
void Shutdown()
Definition: dns_mgr.cc:91
ConfigClientManager * get_config_manager()
Definition: dns_mgr.h:93
IndexAllocator idx_
Definition: dns_mgr.h:161
static const uint16_t kMaxIndexAllocator
Definition: dns_mgr.h:29
Timer * pending_timer_
Definition: dns_mgr.h:151
ConfigClientManager * config_client_manager_
Definition: dns_mgr.h:147
void UpdatePendingList(const std::string &view, const std::string &zone, const DnsItems &items)
Definition: dns_mgr.cc:553
void StartEndofConfigTimer()
Definition: dns_mgr.cc:759
PendingListMap GetDeportedPendingListMap()
Definition: dns_mgr.h:99
bool IsBindStatusUp()
Definition: dns_mgr.h:88
friend class DnsManagerTest
Definition: dns_mgr.h:110
DnsConfigManager config_mgr_
Definition: dns_mgr.h:146
BindStatus bind_status_
Definition: dns_mgr.h:145
uint16_t named_retransmission_interval_
Definition: dns_mgr.h:156
void MakeSandeshPageReq(PageReqData *req, VirtualDnsConfig::DataMap &vdns, VirtualDnsConfig::DataMap::iterator vdns_it, VirtualDnsConfig::DataMap::iterator vdns_iter, const std::string &key, const std::string &req_name) const
Definition: dns_mgr.cc:797
void DnsConfigMsgHandler(const std::string &key, const std::string &context) const
Definition: dns_mgr.cc:922
void NotifyReverseDnsRecords(const VirtualDnsConfig *config, DnsConfig::DnsConfigEvent ev, bool notify)
Definition: dns_mgr.cc:688
void ResetTransId(uint16_t)
Definition: dns_mgr.cc:715
void PendingListZoneDelete(const Subnet &subnet, const VirtualDnsConfig *config)
Definition: dns_mgr.cc:610
bool CheckName(std::string rec_name, std::string name)
Definition: dns_mgr.cc:719
friend class DnsBindTest
Definition: dns_mgr.h:109
uint16_t named_lo_watermark_
Definition: dns_mgr.h:157
void SendRetransmit(uint16_t xid, BindUtil::Operation op, const std::string &view, const std::string &zone, DnsItems &items, uint32_t retranmit_count)
Definition: dns_mgr.cc:400
std::mutex mutex_
Definition: dns_mgr.h:144
void DnsPtrZone(const Subnet &subnet, const VirtualDnsConfig *vdns, DnsConfig::DnsConfigEvent ev)
Definition: dns_mgr.cc:206
std::map< uint16_t, PendingList > DeportedPendingListMap
Definition: dns_mgr.h:53
void CancelEndofConfigTimer()
Definition: dns_mgr.cc:766
void CancelPendingTimer()
Definition: dns_mgr.cc:634
static const int kEndOfConfigCheckTime
Definition: dns_mgr.h:24
void Initialize(DB *config_db, DBGraph *config_graph, const std::string &named_config_dir, const std::string &named_config_file, const std::string &named_log_file, const std::string &rndc_config_file, const std::string &rndc_secret, const std::string &named_max_cache_size, const uint16_t named_max_retransmissions, const uint16_t named_retransmission_interval)
Definition: dns_mgr.cc:66
bool end_of_config_
Definition: dns_mgr.h:153
bool SendUpdate(BindUtil::Operation op, const std::string &view, const std::string &zone, DnsItems &items)
Definition: dns_mgr.cc:384
void ClearDeportedPendingList()
Definition: dns_mgr.h:100
DnsManager()
Definition: dns_mgr.cc:14
void set_config_manager(ConfigClientManager *config_manager)
Definition: dns_mgr.h:90
static uint16_t g_trans_id_
Definition: dns_mgr.h:148
void StartPendingTimer(int)
Definition: dns_mgr.cc:627
void NotifyAllDnsRecords(const VirtualDnsConfig *config, DnsConfig::DnsConfigEvent ev)
Definition: dns_mgr.cc:669
void VdnsServersMsgHandler(const std::string &key, const std::string &context) const
Definition: dns_mgr.cc:845
static const int max_records_per_sandesh
Definition: dns_mgr.h:23
uint32_t record_send_count_
Definition: dns_mgr.h:154
void DnsView(const DnsConfig *config, DnsConfig::DnsConfigEvent ev)
Definition: dns_mgr.cc:160
std::map< uint16_t, PendingList > PendingListMap
Definition: dns_mgr.h:50
Timer * end_of_config_check_timer_
Definition: dns_mgr.h:152
bool PendingDone(uint16_t xid)
Definition: dns_mgr.cc:476
DnsConfigManager & GetConfigManager()
Definition: dns_mgr.h:73
bool CheckZoneDelete(ZoneList &zones, PendingList &pend)
Definition: dns_mgr.cc:601
bool EndofConfigTimerExpiry()
Definition: dns_mgr.cc:770
uint16_t named_hi_watermark_
Definition: dns_mgr.h:158
void DeletePendingList(uint16_t xid)
Definition: dns_mgr.cc:569
bool ResendRecordsinBatch()
Definition: dns_mgr.cc:481
void NotifyThrottledDnsRecords()
Definition: dns_mgr.cc:642
void UpdateAll()
Definition: dns_mgr.cc:416
WorkQueue< uint16_t > pending_done_queue_
Definition: dns_mgr.h:160
void HandleUpdateResponse(uint8_t *pkt, std::size_t length)
Definition: dns_mgr.cc:458
std::pair< uint16_t, PendingList > PendingListPair
Definition: dns_mgr.h:51
void VdnsRecordsMsgHandler(const std::string &key, const std::string &context, bool show_all=false) const
Definition: dns_mgr.cc:1004
void DnsRecord(const DnsConfig *config, DnsConfig::DnsConfigEvent ev)
Definition: dns_mgr.cc:237
DeportedPendingListMap dp_pending_map_
Definition: dns_mgr.h:150
void ProcessAgentUpdate(BindUtil::Operation event, const std::string &name, const std::string &vdns_name, const DnsItem &item)
Definition: dns_mgr.cc:128
virtual ~DnsManager()
Definition: dns_mgr.cc:83
bool AddPendingList(uint16_t xid, const std::string &view, const std::string &zone, const DnsItems &items, BindUtil::Operation op)
Definition: dns_mgr.cc:532
std::pair< uint16_t, PendingList > DeportedPendingListPair
Definition: dns_mgr.h:54
bool IsEndOfConfig()
Definition: dns_mgr.h:94
static const uint16_t kNamedHiWaterMark
Definition: dns_mgr.h:28
DISALLOW_COPY_AND_ASSIGN(DnsManager)
void BindEventHandler(BindStatus::Event ev)
Definition: dns_mgr.cc:731
void BindPendingMsgHandler(const std::string &key, const std::string &context) const
Definition: dns_mgr.cc:1130
static const uint16_t kPendingRecordReScheduleTime
Definition: dns_mgr.h:26
bool SendRecordUpdate(BindUtil::Operation op, const VirtualDnsRecordConfig *config)
Definition: dns_mgr.cc:281
uint16_t GetTransId()
Definition: dns_mgr.cc:711
Definition: timer.h:57
DnsConfigEvent
Definition: dns_oper.h:31
BindUtil::Operation op
Definition: dns_mgr.h:36
std::string zone
Definition: dns_mgr.h:34
std::string view
Definition: dns_mgr.h:33
PendingList(uint16_t id, const std::string &v, const std::string &z, const DnsItems &it, BindUtil::Operation o, uint32_t recount=0)
Definition: dns_mgr.h:39
uint32_t retransmit_count
Definition: dns_mgr.h:37
std::map< std::string, VirtualDnsConfig * > DataMap
Definition: dns_oper.h:139