Line data Source code
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;
19 : struct VirtualDnsRecordConfig;
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;
35 : DnsItems items;
36 : BindUtil::Operation op;
37 : uint32_t retransmit_count;
38 :
39 41 : PendingList(uint16_t id, const std::string &v, const std::string &z,
40 : const DnsItems &it, BindUtil::Operation o,
41 41 : uint32_t recount = 0) {
42 41 : xid = id;
43 41 : view = v;
44 41 : zone = z;
45 41 : items = it;
46 41 : op = o;
47 41 : retransmit_count = recount;
48 41 : }
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,
70 : DnsConfig::DnsConfigEvent ev);
71 : void DnsRecord(const DnsConfig *config, DnsConfig::DnsConfigEvent ev);
72 : void HandleUpdateResponse(uint8_t *pkt, std::size_t length);
73 : DnsConfigManager &GetConfigManager() { return config_mgr_; }
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();
81 : void BindEventHandler(BindStatus::Event ev);
82 :
83 : template <typename ConfigType>
84 : void ProcessConfig(IFMapNodeProxy *proxy, const std::string &name,
85 : DnsConfigManager::EventType event);
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 : }
93 0 : ConfigClientManager* get_config_manager() { return config_client_manager_; }
94 0 : bool IsEndOfConfig() {
95 0 : if (config_client_manager_)
96 0 : return (config_client_manager_->GetEndOfRibComputed());
97 0 : return (true);
98 : }
99 0 : PendingListMap GetDeportedPendingListMap() { return dp_pending_map_; }
100 0 : void ClearDeportedPendingList() { dp_pending_map_.clear(); }
101 : void NotifyThrottledDnsRecords();
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 :
112 : bool SendRecordUpdate(BindUtil::Operation op,
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,
118 : BindUtil::Operation op);
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,
137 : DnsConfig::DnsConfigEvent ev);
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_;
145 : BindStatus bind_status_;
146 : DnsConfigManager config_mgr_;
147 : ConfigClientManager *config_client_manager_;
148 : static uint16_t g_trans_id_;
149 : PendingListMap pending_map_;
150 : DeportedPendingListMap dp_pending_map_;
151 : Timer *pending_timer_;
152 : Timer *end_of_config_check_timer_;
153 : bool end_of_config_;
154 : uint32_t record_send_count_;
155 : uint16_t named_max_retransmissions_;
156 : uint16_t named_retransmission_interval_;
157 : uint16_t named_lo_watermark_;
158 : uint16_t named_hi_watermark_;
159 : bool named_send_throttled_;
160 : WorkQueue<uint16_t> pending_done_queue_;
161 : IndexAllocator idx_;
162 :
163 : DISALLOW_COPY_AND_ASSIGN(DnsManager);
164 : };
165 :
166 : #endif // __dns_manager_h__
|