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 : BindUtil::Operation op);
123 : void DeletePendingList(uint16_t xid);
124 : void ClearPendingList();
125 : void PendingListViewDelete(const VirtualDnsConfig *config);
126 : bool CheckZoneDelete(ZoneList &zones, PendingList &pend);
127 : void PendingListZoneDelete(const Subnet &subnet,
128 : const VirtualDnsConfig *config);
129 : /* Pending Record List transmitted to named */
130 : void StartPendingTimer(int);
131 : void CancelPendingTimer();
132 : bool PendingTimerExpiry();
133 :
134 : void CancelEndofConfigTimer();
135 : bool EndofConfigTimerExpiry();
136 :
137 : void NotifyAllDnsRecords(const VirtualDnsConfig *config,
138 : DnsConfig::DnsConfigEvent ev);
139 : void NotifyReverseDnsRecords(const VirtualDnsConfig *config,
140 : DnsConfig::DnsConfigEvent ev, bool notify);
141 : inline uint16_t GetTransId();
142 : void ResetTransId(uint16_t);
143 : inline bool CheckName(std::string rec_name, std::string name);
144 :
145 : std::mutex mutex_;
146 : BindStatus bind_status_;
147 : DnsConfigManager config_mgr_;
148 : ConfigClientManager *config_client_manager_;
149 : static uint16_t g_trans_id_;
150 : PendingListMap pending_map_;
151 : DeportedPendingListMap dp_pending_map_;
152 : Timer *pending_timer_;
153 : Timer *end_of_config_check_timer_;
154 : bool end_of_config_;
155 : uint32_t record_send_count_;
156 : uint16_t named_max_retransmissions_;
157 : uint16_t named_retransmission_interval_;
158 : uint16_t named_lo_watermark_;
159 : uint16_t named_hi_watermark_;
160 : bool named_send_throttled_;
161 : WorkQueue<uint16_t> pending_done_queue_;
162 : IndexAllocator idx_;
163 :
164 : DISALLOW_COPY_AND_ASSIGN(DnsManager);
165 : };
166 :
167 : #endif // __dns_manager_h__
|