OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dns_mgr.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <base/contrail_ports.h>
6 #include <cmn/dns.h>
7 #include <bind/bind_util.h>
8 #include <mgr/dns_mgr.h>
9 #include <mgr/dns_oper.h>
10 #include <bind/bind_resolver.h>
11 #include <bind/named_config.h>
13 
15  : bind_status_(boost::bind(&DnsManager::BindEventHandler, this, _1)),
16  end_of_config_(false),
17  record_send_count_(TaskScheduler::GetInstance()->HardwareThreadCount()),
18  named_max_retransmissions_(kMaxRetransmitCount),
19  named_retransmission_interval_(kPendingRecordReScheduleTime),
20  named_lo_watermark_(kNamedLoWaterMark),
21  named_hi_watermark_(kNamedHiWaterMark),
22  named_send_throttled_(false),
23  pending_done_queue_(TaskScheduler::GetInstance()->GetTaskId("dns::NamedSndRcv"), 0,
24  boost::bind(&DnsManager::PendingDone, this, _1)),
25  idx_(kMaxIndexAllocator) {
26  std::vector<BindResolver::DnsServer> bind_servers;
27  bind_servers.push_back(BindResolver::DnsServer("127.0.0.1",
28  Dns::GetDnsPort()));
29  BindResolver::Init(*Dns::GetEventManager()->io_service(), bind_servers,
32  this, _1, _2), 0);
33 
36  obs.virtual_dns = boost::bind(&DnsManager::ProcessConfig<VirtualDnsConfig>,
37  this, _1, _2, _3);
38  obs.virtual_dns_record =
39  boost::bind(&DnsManager::ProcessConfig<VirtualDnsRecordConfig>,
40  this, _1, _2, _3);
41  obs.ipam = boost::bind(&DnsManager::ProcessConfig<IpamConfig>, this, _1, _2, _3);
42  obs.vnni = boost::bind(&DnsManager::ProcessConfig<VnniConfig>, this, _1, _2, _3);
43  obs.global_qos = boost::bind(&DnsManager::ProcessConfig<GlobalQosConfig>,
44  this, _1, _2, _3);
46 
47  DnsConfig::VdnsCallback = boost::bind(&DnsManager::DnsView, this, _1, _2);
49  _1, _2);
51  _1, _2, _3);
54  "DnsRetransmitTimer",
55  TaskScheduler::GetInstance()->GetTaskId("dns::NamedSndRcv"), 0);
56 
59  "Check_EndofConfig_Timer",
60  TaskScheduler::GetInstance()->GetTaskId("dns::Config"), 0);
61 
62  // PreAllocate index 0 as it cannot be used as transaction id.
63  idx_.AllocIndex();
64 }
65 
66 void DnsManager::Initialize(DB *config_db, DBGraph *config_graph,
67  const std::string& named_config_dir,
68  const std::string& named_config_file,
69  const std::string& named_log_file,
70  const std::string& rndc_config_file,
71  const std::string& rndc_secret,
72  const std::string& named_max_cache_size,
73  const uint16_t named_max_retransmissions,
74  const uint16_t named_retranmission_interval) {
75  NamedConfig::Init(named_config_dir, named_config_file,
76  named_log_file, rndc_config_file, rndc_secret,
77  named_max_cache_size);
78  config_mgr_.Initialize(config_db, config_graph);
79  named_max_retransmissions_ = named_max_retransmissions;
80  named_retransmission_interval_ = named_retranmission_interval;
81 }
82 
89 }
90 
95 }
96 
97 template <typename ConfigType>
99  const std::string &name,
101  IFMapNode *node = proxy->node();
102  ConfigType *config = ConfigType::Find(name);
103  switch (event) {
105  if (!config) {
106  config = new ConfigType(node);
107  }
108  config->OnAdd(node);
109  break;
110 
112  if (config)
113  config->OnChange(node);
114  break;
115 
117  if (config) {
118  config->OnDelete();
119  delete config;
120  }
121  break;
122 
123  default:
124  assert(0);
125  }
126 }
127 
129  const std::string &name,
130  const std::string &vdns_name,
131  const DnsItem &item) {
132  tbb::mutex::scoped_lock lock(mutex_);
134  switch (event) {
136  if (!config) {
137  config = new VirtualDnsRecordConfig(name, vdns_name, item);
138  }
139  config->rec_.source_name = item.source_name;
140  config->OnAdd();
141  break;
142 
144  if (config)
145  config->OnChange(item);
146  break;
147 
149  if (config && (config->rec_.source_name == item.source_name)) {
150  config->OnDelete();
151  delete config;
152  }
153  break;
154 
155  default:
156  assert(0);
157  }
158 }
159 
161 
162  if (!end_of_config_)
163  return;
164 
165  if (!bind_status_.IsUp())
166  return;
167 
168  const VirtualDnsConfig *config = static_cast<const VirtualDnsConfig *>(cfg);
169  DNS_BIND_TRACE(DnsBindTrace, "Virtual DNS <" << config->GetName() <<
170  "> " << DnsConfig::ToEventString(ev));
171  config->ClearNotified();
172  std::string dns_domain = config->GetDomainName();
173  if (dns_domain.empty()) {
174  DNS_BIND_TRACE(DnsBindTrace, "Virtual DNS <" << config->GetName() <<
175  "> doesnt have domain; ignoring event : " <<
177  return;
178  }
179 
181  if (ev == DnsConfig::CFG_ADD) {
182  if (!CheckName(config->GetName(), dns_domain)) {
183  return;
184  }
185  config->MarkNotified();
186  ncfg->AddView(config);
187  } else if (ev == DnsConfig::CFG_CHANGE) {
188  if (CheckName(config->GetName(), dns_domain)) {
189  config->MarkNotified();
190  }
191  ncfg->ChangeView(config);
192  if (dns_domain != config->GetOldDomainName()) {
193  NotifyAllDnsRecords(config, ev);
194  } else if (config->HasReverseResolutionChanged()) {
195  bool reverse_resolution = config->IsReverseResolutionEnabled();
196  // if reverse resolution is enabled now, add the reverse records
197  // if reverse resolution is disabled now, mark them as not notified
198  NotifyReverseDnsRecords(config, ev, reverse_resolution);
199  }
200  } else {
201  ncfg->DelView(config);
202  PendingListViewDelete(config);
203  }
204 }
205 
206 void DnsManager::DnsPtrZone(const Subnet &subnet, const VirtualDnsConfig *vdns,
208 
209  if (!end_of_config_)
210  return;
211 
212  if (!bind_status_.IsUp())
213  return;
214 
215  std::string dns_domain = vdns->GetDomainName();
216  if (dns_domain.empty()) {
217  DNS_BIND_TRACE(DnsBindTrace, "Ptr Zone <" << vdns->GetName() <<
218  "> ; ignoring event: " << DnsConfig::ToEventString(ev) <<
219  " Domain: " << dns_domain << " Reverse Resolution: " <<
220  (vdns->IsReverseResolutionEnabled()? "enabled" :
221  "disabled"));
222  return;
223  }
224 
226  if (ev == DnsConfig::CFG_DELETE) {
227  ncfg->DelZone(subnet, vdns);
228  PendingListZoneDelete(subnet, vdns);
229  } else {
230  ncfg->AddZone(subnet, vdns);
231  }
232  DNS_BIND_TRACE(DnsBindTrace, "Virtual DNS <" << vdns->GetName() << "> " <<
233  subnet.prefix.to_string() << "/" << subnet.plen << " " <<
235 }
236 
238 
239  if (!end_of_config_)
240  return;
241 
242  if (!bind_status_.IsUp())
243  return;
244 
246  return;
247 
248  const VirtualDnsRecordConfig *config =
249  static_cast<const VirtualDnsRecordConfig *>(cfg);
250  config->ClearNotified();
251  const DnsItem &item = config->GetRecord();
252  if (item.name == "" || item.data == "") {
253  DNS_BIND_TRACE(DnsBindError, "Virtual DNS Record <" <<
254  config->GetName() <<
255  "> doesnt have name / data; ignoring event : " <<
257  return;
258  }
259 
260  if (config->GetViewName() == "" || !config->GetVirtualDns()->IsValid()) {
261  return;
262  }
263 
264  switch (ev) {
265  case DnsConfig::CFG_ADD:
268  config->MarkNotified();
269  break;
270 
273  config->ClearNotified();
274  break;
275 
276  default:
277  assert(0);
278  }
279 }
280 
282  const VirtualDnsRecordConfig *config) {
283  DnsItem item = config->GetRecord();
284  const autogen::VirtualDnsType vdns = config->GetVDns();
285 
286  std::string zone;
287  if (item.type == DNS_PTR_RECORD) {
288  if (!vdns.reverse_resolution) {
289  DNS_BIND_TRACE(DnsBindTrace, "Virtual DNS Record <" <<
290  config->GetName() << "> PTR name " << item.name <<
291  " not added - reverse resolution is not enabled");
292  return false;
293  }
294  IpAddress addr;
295  if (BindUtil::IsIP(item.name, addr)) {
296  BindUtil::GetReverseZone(addr, addr.is_v4() ? 32 : 128, item.name);
297  } else {
298  if (!BindUtil::GetAddrFromPtrName(item.name, addr)) {
299  DNS_BIND_TRACE(DnsBindError, "Virtual DNS Record <" <<
300  config->GetName() << "> invalid PTR name " <<
301  item.name << "; ignoring");
302  return false;
303  }
304  }
305  if (!CheckName(config->GetName(), item.data)) {
306  return false;
307  }
308  Subnet net;
309  if (!config->GetVirtualDns()->GetSubnet(addr, net)) {
310  DNS_BIND_TRACE(DnsBindError, "Virtual DNS Record <" <<
311  config->GetName() <<
312  "> doesnt belong to a known subnet; ignoring");
313  return false;
314  }
315  BindUtil::GetReverseZone(addr, net.plen, zone);
316  item.data = BindUtil::GetFQDN(item.data, vdns.domain_name, ".");
317  } else {
318  // Bind allows special chars in CNAME, NS names and in CNAME data
319  if ((item.type == DNS_A_RECORD || item.type == DNS_AAAA_RECORD) &&
320  !CheckName(config->GetName(), item.name)) {
321  return false;
322  }
323  if (BindUtil::IsReverseZone(item.name)) {
324  if (item.type != DNS_NS_RECORD) {
325  DNS_BIND_TRACE(DnsBindError, "Virtual DNS Record <" <<
326  config->GetName() <<
327  "> only PTR and NS records allowed in reverse zone; ignoring");
328  return false;
329  }
330  if (!vdns.reverse_resolution) {
331  DNS_BIND_TRACE(DnsBindTrace, "Virtual DNS Record <" <<
332  config->GetName() << "> NS name " << item.name <<
333  " not added - reverse resolution is not enabled");
334  return false;
335  }
336  IpAddress addr;
337  if (!BindUtil::GetAddrFromPtrName(item.name, addr)) {
338  DNS_BIND_TRACE(DnsBindError, "Virtual DNS Record <" <<
339  config->GetName() << "> invalid reverse name " <<
340  item.name << "; ignoring");
341  return false;
342  }
343  Subnet net;
344  if (!config->GetVirtualDns()->GetSubnet(addr, net)) {
345  DNS_BIND_TRACE(DnsBindError, "Virtual DNS Record <" <<
346  config->GetName() <<
347  "> doesnt belong to a known subnet; ignoring");
348  return false;
349  }
350  BindUtil::GetReverseZone(addr, net.plen, zone);
351  } else {
352  zone = config->GetVDns().domain_name;
353  item.name = BindUtil::GetFQDN(item.name,
354  vdns.domain_name, vdns.domain_name);
355  }
356  if (item.type == DNS_CNAME_RECORD || item.type == DNS_MX_RECORD)
357  item.data = BindUtil::GetFQDN(item.data, vdns.domain_name, ".");
358  // In case of NS record, ensure that there are no special characters in data.
359  // When it is virtual dns name, we could have chars like ':'
360  if (item.type == DNS_NS_RECORD)
362  }
363  /* Fix for CEM-21076
364  * If we have a static DNS record and a VM with the hostname same as the static DNS record
365  * and we delete the VM, then we should not call SendUpdate() after deleting the VM,
366  * because after calling SendUpdate(), DNS queries for the static DNS record will not be resolved
367  */
369  VirtualDnsConfig *virt_dns = config->GetVirtualDns();
370  for (VirtualDnsConfig::VDnsRec::const_iterator it =
371  virt_dns->virtual_dns_records_.begin();
372  it != virt_dns->virtual_dns_records_.end(); ++it) {
373  if (((*it)->rec_.name + "." + virt_dns->GetDomainName() == item.name) && (*it)->src_ == VirtualDnsRecordConfig::Config) {
374  return false;
375  }
376  }
377  }
378  DnsItems items;
379  items.push_back(item);
380  std::string view_name = config->GetViewName();
381  return (SendUpdate(op, view_name, zone, items));
382 }
383 
384 bool DnsManager::SendUpdate(BindUtil::Operation op, const std::string &view,
385  const std::string &zone, DnsItems &items) {
386 
387  if (pending_map_.size() >= named_hi_watermark_) {
388  DNS_OPERATIONAL_LOG(
389  g_vns_constants.CategoryNames.find(Category::DNSAGENT)->second,
390  SandeshLevel::SYS_NOTICE, "Bind named Send Throttled");
391 
392  named_send_throttled_ = true;
393  return false;
394  }
395 
396  uint16_t xid = GetTransId();
397  return (AddPendingList(xid, view, zone, items, op));
398 }
399 
401  const std::string &view,
402  const std::string &zone, DnsItems &items,
403  uint32_t retransmit_count) {
404 
405  uint8_t *pkt = new uint8_t[BindResolver::max_pkt_size];
406  int len = BindUtil::BuildDnsUpdate(pkt, op, xid, view, zone, items);
407  if (BindResolver::Resolver()->DnsSend(pkt, 0, len)) {
408  DNS_BIND_TRACE(DnsBindTrace,
409  "DNS transmit sent for DNS record; xid = " <<
410  xid << "; View = " << view << "; Zone = " << zone << "; " <<
411  DnsItemsToString(items) << " Retry = " <<
412  retransmit_count);
413  }
414 }
415 
417 
418  if (!bind_status_.IsUp()) {
419  return;
420  }
421 
422  if (!end_of_config_) {
423  return;
424  }
425 
426  // Start dumping records to named
427  named_send_throttled_ = false;
428 
430  for (VirtualDnsConfig::DataMap::iterator it = vmap.begin();
431  it != vmap.end(); ++it) {
432  VirtualDnsConfig *vdns = it->second;
433  if (!vdns->GetDomainName().empty() &&
434  CheckName(vdns->GetName(), vdns->GetDomainName())) {
435  vdns->MarkNotified();
436  DNS_BIND_TRACE(DnsBindTrace, "Virtual DNS <" << vdns->GetName() <<
437  "> Add");
438  } else {
439  vdns->ClearNotified();
440  }
441  }
443  ncfg->AddAllViews();
444  for (VirtualDnsConfig::DataMap::iterator it = vmap.begin();
445  it != vmap.end(); ++it) {
446  VirtualDnsConfig *vdns = it->second;
447  if (!vdns->IsNotified())
448  continue;
450  }
451 
452  DNS_OPERATIONAL_LOG(
453  g_vns_constants.CategoryNames.find(Category::DNSAGENT)->second,
454  SandeshLevel::SYS_NOTICE,
455  "Bulk sync has been done (the DB has been synced with named)");
456 }
457 
458 void DnsManager::HandleUpdateResponse(uint8_t *pkt, std::size_t length) {
459  dns_flags flags;
460  uint16_t xid;
461  DnsItems ques, ans, auth, add;
462  if (BindUtil::ParseDnsResponse(pkt, length, xid, flags,
463  ques, ans, auth, add)) {
464  if (flags.ret) {
465  DNS_BIND_TRACE(DnsBindError, "Update failed : " <<
467  "; xid = " << xid);
468  } else {
469  DNS_BIND_TRACE(DnsBindTrace, "Update successful; xid = " << xid);
471  }
472  }
473  delete [] pkt;
474 }
475 
476 bool DnsManager::PendingDone(uint16_t xid) {
477  DeletePendingList(xid);
478  return true;
479 }
480 
482  static uint16_t start_index = 0;
483  uint16_t sent_count = 0;
484 
485  PendingListMap::iterator it;
486  if (start_index == 0) {
487  it = pending_map_.upper_bound(start_index);
488  } else {
489  it = pending_map_.lower_bound(start_index);
490  }
491 
492  for (; it != pending_map_.end() ; ) {
493  if (it->second.retransmit_count > named_max_retransmissions_) {
494  DNS_BIND_TRACE(DnsBindTrace, "DNS records max retransmits reached;"
495  << "no more retransmission; xid = " << it->first);
496 
497  dp_pending_map_.insert(PendingListPair(it->first,
498  PendingList(it->first, it->second.view,
499  it->second.zone, it->second.items,
500  it->second.op,
501  it->second.retransmit_count)));
502  ResetTransId(it->first);
503  pending_map_.erase(it++);
504  } else {
505  sent_count++;
506  it->second.retransmit_count++;
507  SendRetransmit(it->first, it->second.op, it->second.view,
508  it->second.zone, it->second.items,
509  it->second.retransmit_count);
510  it++;
511  }
512  if (sent_count >= record_send_count_) break;
513  }
514 
515  if (it != pending_map_.end()) {
516  start_index = it->first;
518  /* Return true to trigger auto-restart of timer */
519  return true;
520  } else {
521  if (pending_map_.size() == 0) {
522  start_index = 0;
523  return false;
524  }
525  start_index = pending_map_.begin()->first;
527  }
528 
529  return true;
530 }
531 
532 bool DnsManager::AddPendingList(uint16_t xid, const std::string &view,
533  const std::string &zone, const DnsItems &items,
534  BindUtil::Operation op) {
535  // delete earlier entries for the same items
536  UpdatePendingList(view, zone, items);
537 
538  std::pair<PendingListMap::iterator,bool> status;
539  status = pending_map_.insert(PendingListPair(xid, PendingList(xid, view,
540  zone, items, op)));
541  if (status.second == false) {
542  dp_pending_map_.insert(PendingListPair(xid, PendingList(xid, view,
543  zone, items, op)));
544  return true;
545  } else {
547  return true;
548  }
549 }
550 
551 // if there is an update for an item which is already in pending list,
552 // remove it from the pending list
553 void DnsManager::UpdatePendingList(const std::string &view,
554  const std::string &zone,
555  const DnsItems &items) {
556  for (PendingListMap::iterator it = pending_map_.begin();
557  it != pending_map_.end(); ) {
558  if (it->second.view == view &&
559  it->second.zone == zone &&
560  it->second.items == items) {
561  ResetTransId(it->first);
562  pending_map_.erase(it++);
563  } else {
564  it++;
565  }
566  }
567 }
568 
569 void DnsManager::DeletePendingList(uint16_t xid) {
570  ResetTransId(xid);
571  pending_map_.erase(xid);
572  if (pending_map_.size() <= named_lo_watermark_) {
573  if (named_send_throttled_) {
574  DNS_OPERATIONAL_LOG(
575  g_vns_constants.CategoryNames.find(Category::DNSAGENT)->second,
576  SandeshLevel::SYS_NOTICE, "BIND named Send UnThrottled");
577 
578  named_send_throttled_ = false;
580  }
581  }
582 }
583 
585  pending_map_.clear();
586 }
587 
588 // Remove entries from pending list, upon a view delete
590  for (PendingListMap::iterator it = pending_map_.begin();
591  it != pending_map_.end(); ) {
592  if (it->second.view == config->GetViewName()) {
593  ResetTransId(it->first);
594  pending_map_.erase(it++);
595  } else {
596  it++;
597  }
598  }
599 }
600 
602  for (uint32_t i = 0; i < zones.size(); i++) {
603  if (zones[i] == pend.zone)
604  return true;
605  }
606  return false;
607 }
608 
609 // Remove entries from pending list, upon a zone delete
611  const VirtualDnsConfig *config) {
612  ZoneList zones;
613  subnet.GetReverseZones(zones);
614 
615  for (PendingListMap::iterator it = pending_map_.begin();
616  it != pending_map_.end(); ) {
617  if (it->second.view == config->GetViewName() &&
618  CheckZoneDelete(zones, it->second)) {
619  ResetTransId(it->first);
620  pending_map_.erase(it++);
621  } else {
622  it++;
623  }
624  }
625 }
626 
628  if (!pending_timer_->running()) {
629  pending_timer_->Start(msec,
630  boost::bind(&DnsManager::PendingTimerExpiry, this));
631  }
632 }
633 
636 }
637 
639  return ResendRecordsinBatch();
640 }
641 
643 
644  if (!end_of_config_)
645  return;
646 
647  if (!bind_status_.IsUp())
648  return;
649 
651  for (VirtualDnsConfig::DataMap::iterator it = vmap.begin();
652  it != vmap.end(); ++it) {
653  VirtualDnsConfig *vdns = it->second;
654  if (!vdns->IsNotified())
655  continue;
656 
657  for (VirtualDnsConfig::VDnsRec::const_iterator it =
658  vdns->virtual_dns_records_.begin();
659  it != vdns->virtual_dns_records_.end(); ++it) {
660  if ((*it)->IsValid()) {
661  if (!((*it)->IsNotified())) {
663  }
664  }
665  }
666  }
667 }
668 
671 
672  if (!end_of_config_)
673  return;
674 
675  if (!bind_status_.IsUp())
676  return;
677 
678  for (VirtualDnsConfig::VDnsRec::const_iterator it =
679  config->virtual_dns_records_.begin();
680  it != config->virtual_dns_records_.end(); ++it) {
681  // ClearNotified() to all DnsRecords
682  (*it)->ClearNotified();
683  if ((*it)->IsValid())
684  DnsRecord(*it, ev);
685  }
686 }
687 
690  bool notify) {
691 
692  if (!end_of_config_)
693  return;
694 
695  if (!bind_status_.IsUp())
696  return;
697 
698  for (VirtualDnsConfig::VDnsRec::const_iterator it =
699  config->virtual_dns_records_.begin();
700  it != config->virtual_dns_records_.end(); ++it) {
701  DnsItem item = (*it)->GetRecord();
702  if (item.type == DNS_PTR_RECORD) {
703  (*it)->ClearNotified();
704  if ((*it)->IsValid() && notify) {
705  DnsRecord(*it, ev);
706  }
707  }
708  }
709 }
710 
711 inline uint16_t DnsManager::GetTransId() {
712  return (idx_.AllocIndex());
713 }
714 
715 inline void DnsManager::ResetTransId(uint16_t xid) {
716  idx_.FreeIndex(xid);
717 }
718 
719 inline bool DnsManager::CheckName(std::string rec_name, std::string name) {
720  if (BindUtil::HasSpecialChars(name)) {
721  DNS_CONFIGURATION_LOG(
722  g_vns_constants.CategoryNames.find(Category::DNSAGENT)->second,
723  SandeshLevel::SYS_ERR,
724  "Invalid DNS Name - cannot use special characters in DNS name",
725  rec_name, name);
726  return false;
727  }
728  return true;
729 }
730 
732  switch (event) {
733  case BindStatus::Up: {
734 
735  DNS_OPERATIONAL_LOG(
736  g_vns_constants.CategoryNames.find(Category::DNSAGENT)->second,
737  SandeshLevel::SYS_NOTICE, "BIND named up; DNS is operational");
739  UpdateAll();
740  break;
741  }
742 
743  case BindStatus::Down: {
744 
745  DNS_OPERATIONAL_LOG(
746  g_vns_constants.CategoryNames.find(Category::DNSAGENT)->second,
747  SandeshLevel::SYS_NOTICE, "BIND named down; DNS is not operational");
749  ncfg->Reset();
751  break;
752  }
753 
754  default:
755  assert(0);
756  }
757 }
758 
762  boost::bind(&DnsManager::EndofConfigTimerExpiry, this));
763  }
764 }
765 
768 }
769 
771  bool current_config_state = IsEndOfConfig();
772  if ((current_config_state != end_of_config_) && current_config_state) {
773  end_of_config_ = current_config_state;
774  UpdateAll();
775  } else {
776  end_of_config_ = current_config_state;
777  }
778  return true;
779 }
780 
781 void SandeshError(const std::string &msg, const std::string &context) {
782  ErrorResp *resp = new ErrorResp();
783  resp->set_resp(msg);
784  resp->set_context(context);
785  resp->Response();
786 }
787 
788 void ShowVirtualDnsServers::HandleRequest() const {
789  DnsManager *dns_manager = Dns::GetDnsManager();
790  if(dns_manager) {
791  dns_manager->VdnsServersMsgHandler("", context());
792  } else {
793  SandeshError("Invalid Request No DnsManager Object", context());
794  }
795 }
796 
798  VirtualDnsConfig::DataMap::iterator vdns_it,
799  VirtualDnsConfig::DataMap::iterator vdns_iter,
800  const std::string &key, const std::string &req_name) const {
801  // Set table size
802  req->set_table_size(vdns.size());
803 
804  //Next page link
805  if(vdns_iter != vdns.end()) {
806  req->set_next_page(vdns_iter->first + req_name);
807  }
808 
809  // First page link
810  if(vdns.size() != 0) {
811  req->set_first_page((vdns.begin())->first + req_name);
812  }
813 
814  // Set Entries
815  uint16_t start_entry=0, end_entry=0;
816  std::stringstream ss1, ss2;
817  if(vdns.size() != 0) {
818  start_entry = std::distance(vdns.begin(), vdns_it);
819  start_entry++;
820  if(start_entry != vdns.size()) {
821  end_entry = std::distance(vdns.begin(), --vdns_iter);
822  end_entry++;
823  } else {
824  end_entry = start_entry;
825  }
826  }
827  ss1 << start_entry;
828  ss2 << end_entry;
829  req->set_entries(ss1.str() + " - " + ss2.str());
830 
831  // Previous page link
832  if(vdns_it != vdns.begin()) {
833  for (int i=0; i < (DnsManager::max_records_per_sandesh); i++) {
834  vdns_it--;
835  if(vdns_it == vdns.begin())
836  break;
837  }
838  req->set_prev_page(vdns_it->first + req_name);
839  }
840 
841  // Set link to show all entries in a single page
842  req->set_all("AllEntries" + req_name);
843 }
844 
845 void DnsManager::VdnsServersMsgHandler(const std::string &key,
846  const std::string &context) const {
847  VirtualDnsServersResponse *resp;
848  uint16_t count = 0;
849  uint16_t sandesh_msg_limit = DnsManager::max_records_per_sandesh;
851  VirtualDnsConfig::DataMap::iterator vdns_it, vdns_iter;
852  std::vector<VirtualDnsServersSandesh> vdns_list_sandesh;
853  if(key == "AllEntries") {
854  sandesh_msg_limit = vdns.size();
855  vdns_it = vdns.begin();
856  } else if(key != "") {
857  vdns_it = vdns.lower_bound(key);
858  } else {
859  vdns_it = vdns.begin();
860  }
861 
862  for (vdns_iter= vdns_it; vdns_iter != vdns.end(); ++vdns_iter) {
863 
864  if (count++ == sandesh_msg_limit) {
865  break;
866  }
867  VirtualDnsConfig *vdns_config = vdns_iter->second;
868  VirtualDnsServersSandesh vdns_sandesh;
869  VirtualDnsTraceData vdns_trace_data;
870  vdns_config->VirtualDnsTrace(vdns_trace_data);
871 
872  std::vector<std::string> net_list_sandesh;
873  for (VirtualDnsConfig::IpamList::iterator ipam_iter =
874  vdns_config->ipams_.begin();
875  ipam_iter != vdns_config->ipams_.end(); ++ipam_iter) {
876  IpamConfig *ipam = *ipam_iter;
877  const IpamConfig::VnniList &vnni = ipam->GetVnniList();
878  for (IpamConfig::VnniList::iterator vnni_it = vnni.begin();
879  vnni_it != vnni.end(); ++vnni_it) {
880  Subnets &subnets = (*vnni_it)->GetSubnets();
881  for (unsigned int i = 0; i < subnets.size(); i++) {
882  std::stringstream str;
883  str << subnets[i].prefix.to_string();
884  str << "/";
885  str << subnets[i].plen;
886  net_list_sandesh.push_back(str.str());
887  }
888  }
889  }
890 
891  vdns_sandesh.set_virtual_dns(vdns_trace_data);
892  vdns_sandesh.set_records(vdns_config->GetName());
893  vdns_sandesh.set_num_records(vdns_config->virtual_dns_records_.size());
894  vdns_sandesh.set_subnets(net_list_sandesh);
895  vdns_list_sandesh.push_back(vdns_sandesh);
896  }
897 
898  resp = new VirtualDnsServersResponse();
899  resp->set_context(context);
900  resp->set_virtual_dns_servers(vdns_list_sandesh);
901  resp->set_more(true);
902  resp->Response();
903 
904  Pagination *page = new Pagination();
905  PageReqData req;
906  MakeSandeshPageReq(&req, vdns, vdns_it, vdns_iter, key, " VdnsServersReq");
907  page->set_context(context);
908  page->set_req(req);
909  page->Response();
910 
911 }
912 
913 void ShowDnsConfig::HandleRequest() const {
914  DnsManager *dns_manager = Dns::GetDnsManager();
915  if(dns_manager) {
916  dns_manager->DnsConfigMsgHandler("", context());
917  } else {
918  SandeshError("Invalid Request No DnsManager Object", context());
919  }
920 }
921 
922 void DnsManager::DnsConfigMsgHandler(const std::string &key,
923  const std::string &context) const {
924  DnsConfigResponse *resp = new DnsConfigResponse();
925  uint16_t count = 0;
926  uint16_t sandesh_msg_limit = DnsManager::max_records_per_sandesh;
928  VirtualDnsConfig::DataMap::iterator vdns_it, vdns_iter;
929  std::vector<VirtualDnsSandesh> vdns_list_sandesh;
930  if(key == "AllEntries") {
931  sandesh_msg_limit = vdns.size();
932  vdns_it = vdns.begin();
933  } else if(key != "") {
934  vdns_it = vdns.lower_bound(key);
935  } else {
936  vdns_it = vdns.begin();
937  }
938 
939  for (vdns_iter = vdns_it; vdns_iter != vdns.end(); ++vdns_iter) {
940  if (count++ == sandesh_msg_limit) {
941  break;
942  }
943  VirtualDnsConfig *vdns_config = vdns_iter->second;
944  VirtualDnsSandesh vdns_sandesh;
945  VirtualDnsTraceData vdns_trace_data;
946  vdns_config->VirtualDnsTrace(vdns_trace_data);
947 
948  std::vector<VirtualDnsRecordTraceData> rec_list_sandesh;
949  for (VirtualDnsConfig::VDnsRec::iterator rec_it =
950  vdns_config->virtual_dns_records_.begin();
951  rec_it != vdns_config->virtual_dns_records_.end(); ++rec_it) {
952  VirtualDnsRecordTraceData rec_trace_data;
953  (*rec_it)->VirtualDnsRecordTrace(rec_trace_data);
954  rec_list_sandesh.push_back(rec_trace_data);
955  }
956 
957  std::vector<std::string> net_list_sandesh;
958  for (VirtualDnsConfig::IpamList::iterator ipam_iter =
959  vdns_config->ipams_.begin();
960  ipam_iter != vdns_config->ipams_.end(); ++ipam_iter) {
961  IpamConfig *ipam = *ipam_iter;
962  const IpamConfig::VnniList &vnni = ipam->GetVnniList();
963  for (IpamConfig::VnniList::iterator vnni_it = vnni.begin();
964  vnni_it != vnni.end(); ++vnni_it) {
965  Subnets &subnets = (*vnni_it)->GetSubnets();
966  for (unsigned int i = 0; i < subnets.size(); i++) {
967  std::stringstream str;
968  str << subnets[i].prefix.to_string();
969  str << "/";
970  str << subnets[i].plen;
971  net_list_sandesh.push_back(str.str());
972  }
973  }
974  }
975 
976  vdns_sandesh.set_virtual_dns(vdns_trace_data);
977  vdns_sandesh.set_records(rec_list_sandesh);
978  vdns_sandesh.set_subnets(net_list_sandesh);
979  vdns_list_sandesh.push_back(vdns_sandesh);
980  }
981 
982  resp->set_context(context);
983  resp->set_virtual_dns(vdns_list_sandesh);
984  resp->set_more(true);
985  resp->Response();
986 
987  Pagination *page = new Pagination();
988  PageReqData req;
989  MakeSandeshPageReq(&req, vdns, vdns_it, vdns_iter, key, " DnsConfigReq");
990  page->set_context(context);
991  page->set_req(req);
992  page->Response();
993 }
994 
995 void ShowVirtualDnsRecords::HandleRequest() const {
996  DnsManager *dns_manager = Dns::GetDnsManager();
997  if(dns_manager) {
998  dns_manager->VdnsRecordsMsgHandler(get_virtual_dns_server(), context());
999  } else {
1000  SandeshError("Invalid Request No DnsManager Object", context());
1001  }
1002 }
1003 
1004 void DnsManager::VdnsRecordsMsgHandler(const std::string &key,
1005  const std::string &context, bool show_all) const {
1006  VirtualDnsRecordsResponse *resp = new VirtualDnsRecordsResponse();
1008 
1009  std::stringstream ss(key);
1010  std::stringstream str;
1011  std::string vdns_server, next_iterator;
1012  VirtualDnsRecordConfig *next_iterator_key = NULL;
1013  std::getline(ss, vdns_server, '@');
1014  std::getline(ss, next_iterator);
1015  uint16_t sandesh_msg_limit = DnsManager::max_records_per_sandesh;
1016  if (!next_iterator.empty()) {
1017  std::stringstream next_iter(next_iterator);
1018  uint64_t value = 0;
1019  next_iter >> value;
1020  next_iterator_key = (VirtualDnsRecordConfig *) value;
1021  }
1022  std::vector<VirtualDnsRecordTraceData> rec_list_sandesh;
1023  VirtualDnsConfig::VDnsRec::iterator rec_it, rec_it1;
1024  VirtualDnsConfig::DataMap::iterator vdns_it = vdns.find(vdns_server);
1025  if (vdns_it != vdns.end()) {
1026  VirtualDnsConfig *vdns_config = vdns_it->second;
1027  uint16_t count = 0;
1028  uint16_t size = vdns_config->virtual_dns_records_.size();
1029  if(show_all) {
1030  rec_it1 = vdns_config->virtual_dns_records_.begin();
1031  sandesh_msg_limit = size;
1032  } else {
1033  rec_it1 = vdns_config->virtual_dns_records_.lower_bound(next_iterator_key);
1034  }
1035  for(rec_it = rec_it1;
1036  rec_it != vdns_config->virtual_dns_records_.end(); ++rec_it) {
1037  VirtualDnsRecordTraceData rec_trace_data;
1038  (*rec_it)->VirtualDnsRecordTrace(rec_trace_data);
1039  rec_list_sandesh.push_back(rec_trace_data);
1040  if (++count == sandesh_msg_limit) {
1041  if (++rec_it == vdns_config->virtual_dns_records_.end())
1042  break;
1043  uint64_t value = (uint64_t)(*rec_it);
1044  str << vdns_server << "@" << value;
1045  break;
1046  }
1047  }
1048 
1049  resp->set_context(context);
1050  resp->set_virtual_dns_server(vdns_server);
1051  resp->set_records(rec_list_sandesh);
1052  resp->set_more(true);
1053  resp->Response();
1054 
1055  Pagination *page = new Pagination();
1056  PageReqData req;
1057 
1058  // Set table size
1059  req.set_table_size(size);
1060 
1061  //Next page link
1062  if(rec_it != vdns_config->virtual_dns_records_.end()) {
1063  req.set_next_page(str.str() + " VdnsRecordsReq");
1064  }
1065 
1066  // First page link
1067  if(size != 0) {
1068  std::stringstream str;
1069  uint64_t value = (uint64_t)(*(vdns_config->virtual_dns_records_.begin()));
1070  str << vdns_server << "@" << value;
1071  req.set_first_page(str.str() + " VdnsRecordsReq");
1072  }
1073 
1074  // Set Entries
1075  int start_entry=0, end_entry=0;
1076  std::stringstream ss1, ss2;
1077  if( size != 0) {
1078  start_entry = std::distance(vdns_config->virtual_dns_records_.begin(), rec_it1);
1079  start_entry++;
1080  if(start_entry != size) {
1081  end_entry = std::distance(vdns_config->virtual_dns_records_.begin(), --rec_it);
1082  end_entry++;
1083  } else {
1084  end_entry = start_entry;
1085  }
1086  }
1087 
1088  ss1 << start_entry;
1089  ss2 << end_entry;
1090  req.set_entries(ss1.str() + " - " + ss2.str());
1091 
1092  // Previous page link
1093  if(rec_it1 != vdns_config->virtual_dns_records_.begin()) {
1094  for (int i=0; i < (sandesh_msg_limit); i++) {
1095  rec_it1--;
1096  if(rec_it1 == vdns_config->virtual_dns_records_.begin())
1097  break;
1098  }
1099  std::stringstream str;
1100  uint64_t value = (uint64_t)(*rec_it1);
1101  str << vdns_server << "@" << value;
1102  req.set_prev_page(str.str() + " VdnsRecordsReq");
1103  }
1104 
1105  // Set link to show all entries in a single page
1106  std::stringstream str;
1107  uint64_t value = 0;
1108  str << vdns_server << "@" << value;
1109  req.set_all(str.str() + " AllEntriesVdnsRecordsReq");
1110 
1111  page->set_context(context);
1112  page->set_req(req);
1113  page->Response();
1114 
1115  } else {
1116  SandeshError("Invalid Request Enter Vdns Server Name", context);
1117  delete resp;
1118  }
1119 }
1120 
1121 void ShowBindPendingList::HandleRequest() const {
1122  DnsManager *dns_manager = Dns::GetDnsManager();
1123  if(dns_manager) {
1124  dns_manager->BindPendingMsgHandler("", context());
1125  } else {
1126  SandeshError("Invalid Request No DnsManager Object", context());
1127  }
1128 }
1129 
1130 void DnsManager::BindPendingMsgHandler(const std::string &key,
1131  const std::string &context) const {
1132  BindPendingListResponse *resp = new BindPendingListResponse();
1133  DnsManager *dns_manager = Dns::GetDnsManager();
1134  if (dns_manager) {
1135  uint16_t count =0;
1136  uint16_t index=0;
1137  stringToInteger(key, index);
1138  uint16_t sandesh_msg_limit = DnsManager::max_records_per_sandesh;
1140  dns_manager->GetDeportedPendingListMap();
1141  uint16_t size = map.size();
1142  std::vector<PendingListEntry> &pending_list =
1143  const_cast<std::vector<PendingListEntry>&>(resp->get_data());
1144  DnsManager::PendingListMap::iterator map_it, map_iter;
1145  if(key == "AllEntries") {
1146  sandesh_msg_limit = size;
1147  map_it = map.begin();
1148  }
1149  else if(key != "") {
1150  map_it = map.lower_bound(index);
1151  }
1152  else {
1153  map_it = map.begin();
1154  }
1155 
1156  for (map_iter = map_it; map_iter!= map.end(); ++map_iter) {
1157  if (count++ == sandesh_msg_limit) {
1158  break;
1159  }
1160  PendingListEntry entry;
1161  entry.set_xid(map_iter->second.xid);
1162  entry.set_view(map_iter->second.view);
1163  entry.set_zone(map_iter->second.zone);
1164  entry.set_retry_count(map_iter->second.retransmit_count);
1165  entry.set_items(DnsItemsToString(map_iter->second.items));
1166 
1167  pending_list.push_back(entry);
1168  }
1169 
1170  resp->set_context(context);
1171  resp->set_more(true);
1172  resp->Response();
1173 
1174  Pagination *page = new Pagination();
1175  PageReqData req;
1176 
1177  // Set table size
1178  req.set_table_size(size);
1179 
1180  //Next page link
1181  if(map_iter != map.end()) {
1182  std::stringstream ss;
1183  ss << map_iter->first;
1184  req.set_next_page(ss.str() + " BindPendingListReq");
1185  }
1186 
1187  // First page link
1188  if(size != 0) {
1189  std::stringstream ss;
1190  ss << map.begin()->first;
1191  req.set_first_page(ss.str()+ " BindPendingListReq");
1192  }
1193 
1194  // Set Entries
1195  int start_entry=0, end_entry=0;
1196  std::stringstream ss1, ss2;
1197  if(size != 0) {
1198  start_entry = std::distance(map.begin(), map_it);
1199  start_entry++;
1200  if(start_entry != size) {
1201  end_entry = std::distance(map.begin(), --map_iter);
1202  end_entry++;
1203  } else {
1204  end_entry = start_entry;
1205  }
1206 
1207  }
1208  ss1 << start_entry;
1209  ss2 << end_entry;
1210  req.set_entries(ss1.str() + " - " + ss2.str());
1211 
1212  // Previous page link
1213  if(map_it != map.begin()) {
1214  for (int i=0; i < (sandesh_msg_limit); i++) {
1215  map_it--;
1216  if(map_it == map.begin())
1217  break;
1218  }
1219  std::stringstream ss;
1220  ss << map_it->first;
1221  req.set_prev_page(ss.str() + " BindPendingListReq");
1222  }
1223 
1224  // Set link to show all entries in a single page
1225  req.set_all("AllEntries BindPendingListReq");
1226 
1227  page->set_context(context);
1228  page->set_req(req);
1229  page->Response();
1230 
1231  } else {
1232  SandeshError("Invalid Request No DnsManager Object ", context);
1233  delete resp;
1234  }
1235 }
1236 
1237 void PageReq::HandleRequest() const {
1238  string req_name, search_key;
1239  vector<string> tokens;
1240  boost::split(tokens, get_key(), boost::is_any_of(" "));
1241  DnsManager *dns_manager = Dns::GetDnsManager();
1242  if(dns_manager && (tokens.size() == 2)) {
1243  search_key = tokens[0];
1244  req_name = tokens[1];
1245  if(req_name == "VdnsServersReq") {
1246  dns_manager->VdnsServersMsgHandler(search_key, context());
1247  } else if(req_name == "DnsConfigReq") {
1248  dns_manager->DnsConfigMsgHandler(search_key, context());
1249  } else if(req_name == "VdnsRecordsReq") {
1250  dns_manager->VdnsRecordsMsgHandler(search_key, context());
1251  } else if(req_name == "AllEntriesVdnsRecordsReq") {
1252  dns_manager->VdnsRecordsMsgHandler(search_key, context(), true);
1253  } else if (req_name == "BindPendingListReq") {
1254  dns_manager->BindPendingMsgHandler(search_key, context());
1255  } else {
1256  SandeshError("Invalid Request", context());
1257  }
1258  } else {
1259  SandeshError("Invalid Request", context());
1260  }
1261 }
1262 
1263 void ShowGlobalQosConfig::HandleRequest() const {
1264  GlobalQosConfigResponse *resp = new GlobalQosConfigResponse();
1266  resp->set_control_dscp(obj->control_dscp_);
1267  resp->set_analytics_dscp(obj->analytics_dscp_);
1268  resp->set_context(context());
1269  resp->set_more(false);
1270  resp->Response();
1271 }
void VirtualDnsTrace(VirtualDnsTraceData &rec)
Definition: dns_oper.cc:433
void NotifyReverseDnsRecords(const VirtualDnsConfig *config, DnsConfig::DnsConfigEvent ev, bool notify)
Definition: dns_mgr.cc:688
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
virtual void AddAllViews()
Definition: named_config.cc:84
void DnsView(const DnsConfig *config, DnsConfig::DnsConfigEvent ev)
Definition: dns_mgr.cc:160
BindStatus bind_status_
Definition: dns_mgr.h:144
std::string zone
Definition: dns_mgr.h:33
bool CheckName(std::string rec_name, std::string name)
Definition: dns_mgr.cc:719
virtual void DelZone(const Subnet &subnet, const VirtualDnsConfig *vdns)
IpamList ipams_
Definition: dns_oper.h:145
#define DNS_BIND_TRACE(obj, arg)
Definition: bind_util.h:21
static ZoneCallback VdnsZoneCallback
Definition: dns_oper.h:65
bool CheckZoneDelete(ZoneList &zones, PendingList &pend)
Definition: dns_mgr.cc:601
void StartPendingTimer(int)
Definition: dns_mgr.cc:627
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
void Shutdown(bool delete_entries=true)
Definition: queue_task.h:152
void OnChange(IFMapNode *node)
Definition: dns_oper.cc:534
#define DNS_A_RECORD
Definition: bind_util.h:36
void ClearPendingList()
Definition: dns_mgr.cc:584
static VirtualDnsRecordConfig * Find(std::string name)
Definition: dns_oper.cc:694
void Shutdown()
Definition: dns_mgr.cc:91
static const uint32_t GetDnsPort()
Definition: dns.h:61
bool named_send_throttled_
Definition: dns_mgr.h:158
void HandleUpdateResponse(uint8_t *pkt, std::size_t length)
Definition: dns_mgr.cc:458
bool IsValid() const
Definition: dns_oper.h:45
uint16_t named_lo_watermark_
Definition: dns_mgr.h:156
virtual void ChangeView(const VirtualDnsConfig *vdns)
Definition: named_config.cc:70
static int BuildDnsUpdate(uint8_t *buf, Operation op, uint16_t xid, const std::string &domain, const std::string &zone, const DnsItems &items)
Definition: bind_util.cc:653
virtual void AddView(const VirtualDnsConfig *vdns)
Definition: named_config.cc:66
DnsConfigManager config_mgr_
Definition: dns_mgr.h:145
#define DNS_PTR_RECORD
Definition: bind_util.h:40
void NotifyThrottledDnsRecords()
Definition: dns_mgr.cc:642
boost::asio::ip::address IpAddress
Definition: address.h:13
bool stringToInteger(const std::string &str, NumberType &num)
Definition: string_util.h:71
std::string GetOldDomainName() const
Definition: dns_oper.h:173
uint16_t named_max_retransmissions_
Definition: dns_mgr.h:154
static Callback VdnsCallback
Definition: dns_oper.h:63
void BindPendingMsgHandler(const std::string &key, const std::string &context) const
Definition: dns_mgr.cc:1130
void DeletePendingList(uint16_t xid)
Definition: dns_mgr.cc:569
uint8_t control_dscp_
Definition: dns_oper.h:239
bool end_of_config_
Definition: dns_mgr.h:152
void ClearDeportedPendingList()
Definition: dns_mgr.h:99
std::string GetViewName() const
Definition: dns_oper.cc:638
VDnsRec virtual_dns_records_
Definition: dns_oper.h:144
bool ResendRecordsinBatch()
Definition: dns_mgr.cc:481
std::list< DnsItem > DnsItems
Definition: bind_util.h:193
void ClearNotified() const
Definition: dns_oper.h:49
PendingListMap pending_map_
Definition: dns_mgr.h:148
static void Init(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)
Definition: named_config.cc:28
virtual void AddZone(const Subnet &subnet, const VirtualDnsConfig *vdns)
Definition: named_config.cc:90
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
PendingListMap GetDeportedPendingListMap()
Definition: dns_mgr.h:98
static const int max_pkt_size
Definition: bind_resolver.h:17
void CancelEndofConfigTimer()
Definition: dns_mgr.cc:766
bool SendRecordUpdate(BindUtil::Operation op, const VirtualDnsRecordConfig *config)
Definition: dns_mgr.cc:281
void StartEndofConfigTimer()
Definition: dns_mgr.cc:759
#define DNS_CNAME_RECORD
Definition: bind_util.h:38
std::string name
Definition: bind_util.h:158
uint16_t GetTransId()
Definition: dns_mgr.cc:711
static void SetDnsConfigManager(DnsConfigManager *cfg)
Definition: dns.h:38
static GlobalQosConfig * Find(const std::string &name)
Definition: dns_oper.cc:726
bool HasReverseResolutionChanged() const
Definition: dns_oper.h:177
std::set< VnniConfig * > VnniList
Definition: dns_oper.h:101
const std::string & GetName() const
Definition: dns_oper.h:57
tbb::mutex mutex_
Definition: dns_mgr.h:143
bool IsReverseResolutionEnabled() const
Definition: dns_oper.h:176
static const std::string & DnsResponseCode(uint16_t code)
Definition: bind_util.cc:139
void GetReverseZones(ZoneList &zones) const
Definition: bind_util.cc:108
IndexAllocator idx_
Definition: dns_mgr.h:160
virtual ~DnsManager()
Definition: dns_mgr.cc:83
uint8_t analytics_dscp_
Definition: dns_oper.h:240
void OnAdd(IFMapNode *node=NULL)
Definition: dns_oper.cc:506
void VdnsServersMsgHandler(const std::string &key, const std::string &context) const
Definition: dns_mgr.cc:845
static bool ParseDnsResponse(uint8_t *dns, uint16_t dnslen, uint16_t &xid, dns_flags &flags, DnsItems &ques, DnsItems &ans, DnsItems &auth, DnsItems &add)
Definition: bind_util.cc:476
static std::string GetFQDN(const std::string &name, const std::string &domain, const std::string &match)
Definition: bind_util.cc:991
static void Shutdown()
Definition: named_config.cc:41
bool PendingTimerExpiry()
Definition: dns_mgr.cc:638
static void RemoveSpecialChars(std::string &name)
Definition: bind_util.cc:1009
void DnsPtrZone(const Subnet &subnet, const VirtualDnsConfig *vdns, DnsConfig::DnsConfigEvent ev)
Definition: dns_mgr.cc:206
Definition: db.h:24
static NamedConfig * GetNamedConfigObject()
Definition: named_config.h:83
static bool IsReverseZone(const std::string &name)
Definition: bind_util.cc:711
void ProcessAgentUpdate(BindUtil::Operation event, const std::string &name, const std::string &vdns_name, const DnsItem &item)
Definition: dns_mgr.cc:128
Timer * pending_timer_
Definition: dns_mgr.h:150
size_t AllocIndex()
void UpdateAll()
Definition: dns_mgr.cc:416
VirtualDnsConfig * GetVirtualDns() const
Definition: dns_oper.h:219
void RegisterObservers(const Observers &obs)
Definition: dns_config.h:98
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
void BindEventHandler(BindStatus::Event ev)
Definition: dns_mgr.cc:731
static TaskScheduler * GetInstance()
Definition: task.cc:547
std::pair< uint16_t, PendingList > PendingListPair
Definition: dns_mgr.h:50
static DnsManager * GetDnsManager()
Definition: dns.h:34
void MarkNotified() const
Definition: dns_oper.h:47
DnsManager()
Definition: dns_mgr.cc:14
void DnsConfigMsgHandler(const std::string &key, const std::string &context) const
Definition: dns_mgr.cc:922
std::vector< Subnet > Subnets
Definition: bind_util.h:278
static BindResolver * Resolver()
Definition: bind_resolver.h:43
virtual void DelView(const VirtualDnsConfig *vdns)
Definition: named_config.cc:80
std::string source_name
Definition: bind_util.h:159
const DnsItem & GetRecord() const
Definition: dns_oper.h:217
std::string GetDomainName() const
Definition: dns_oper.h:172
static bool IsIP(const std::string &name, IpAddress &addr)
Definition: bind_util.cc:715
static const uint16_t ContrailDnsClientUdpPort()
std::string data
Definition: bind_util.h:160
static Callback VdnsRecordCallback
Definition: dns_oper.h:64
bool PendingDone(uint16_t xid)
Definition: dns_mgr.cc:476
void DnsRecord(const DnsConfig *config, DnsConfig::DnsConfigEvent ev)
Definition: dns_mgr.cc:237
bool IsNotified() const
Definition: dns_oper.h:48
static const int kEndOfConfigCheckTime
Definition: dns_mgr.h:23
bool EndofConfigTimerExpiry()
Definition: dns_mgr.cc:770
static DnsConfigManager * GetDnsConfigManager()
Definition: dns.h:37
void FreeIndex(size_t index)
void PendingListViewDelete(const VirtualDnsConfig *config)
Definition: dns_mgr.cc:589
static Timer * CreateTimer(boost::asio::io_context &service, const std::string &name, int task_id=Timer::GetTimerTaskId(), int task_instance=Timer::GetTimerInstanceId(), bool delete_on_completion=false)
Definition: timer.cc:201
bool IsEndOfConfig()
Definition: dns_mgr.h:93
const VnniList & GetVnniList() const
Definition: dns_oper.h:128
std::string GetViewName() const
Definition: dns_oper.cc:454
void VdnsRecordsMsgHandler(const std::string &key, const std::string &context, bool show_all=false) const
Definition: dns_mgr.cc:1004
static void Shutdown()
static const std::string & ToEventString(DnsConfigEvent ev)
Definition: dns_oper.h:67
bool Cancel()
Definition: timer.cc:150
uint16_t named_hi_watermark_
Definition: dns_mgr.h:157
#define DNS_AAAA_RECORD
Definition: bind_util.h:43
bool GetSubnet(const IpAddress &addr, Subnet &subnet) const
Definition: dns_oper.cc:387
void ProcessConfig(IFMapNodeProxy *proxy, const std::string &name, DnsConfigManager::EventType event)
Definition: dns_mgr.cc:98
void UpdatePendingList(const std::string &view, const std::string &zone, const DnsItems &items)
Definition: dns_mgr.cc:553
DeportedPendingListMap dp_pending_map_
Definition: dns_mgr.h:149
static bool GetAddrFromPtrName(std::string &ptr_name, IpAddress &mask)
Definition: bind_util.cc:933
bool SendUpdate(BindUtil::Operation op, const std::string &view, const std::string &zone, DnsItems &items)
Definition: dns_mgr.cc:384
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
Definition: timer.cc:108
static const int max_records_per_sandesh
Definition: dns_mgr.h:22
void ResetTransId(uint16_t)
Definition: dns_mgr.cc:715
IFMapNode * node()
void NotifyAllDnsRecords(const VirtualDnsConfig *config, DnsConfig::DnsConfigEvent ev)
Definition: dns_mgr.cc:669
std::map< std::string, VirtualDnsConfig * > DataMap
Definition: dns_oper.h:139
Timer * end_of_config_check_timer_
Definition: dns_mgr.h:151
#define DNS_MX_RECORD
Definition: bind_util.h:41
void PendingListZoneDelete(const Subnet &subnet, const VirtualDnsConfig *config)
Definition: dns_mgr.cc:610
bool running() const
Definition: timer.h:86
std::map< uint16_t, PendingList > PendingListMap
Definition: dns_mgr.h:49
DnsConfigEvent
Definition: dns_oper.h:31
static bool HasSpecialChars(const std::string &name)
Definition: bind_util.cc:999
autogen::VirtualDnsType GetVDns() const
Definition: dns_oper.cc:628
void Initialize(DB *db, DBGraph *db_graph)
Definition: dns_config.cc:65
static EventManager * GetEventManager()
Definition: dns.h:31
uint32_t record_send_count_
Definition: dns_mgr.h:153
uint8_t ret
Definition: bind_util.h:81
bool Reschedule(int time)
Definition: timer.cc:137
void SandeshError(const std::string &msg, const std::string &context)
Definition: dns_mgr.cc:781
uint16_t named_retransmission_interval_
Definition: dns_mgr.h:155
static void GetReverseZone(const Ip4Address &addr, uint32_t plen, std::string &zone)
Definition: bind_util.cc:812
uint32_t plen
Definition: bind_util.h:254
bool IsUp()
Definition: named_config.h:27
bool Enqueue(QueueEntryT entry)
Definition: queue_task.h:248
static DataMap & GetVirtualDnsMap()
Definition: dns_oper.h:185
static std::string DnsItemsToString(DnsItems &items)
Definition: bind_util.h:194
bool AddPendingList(uint16_t xid, const std::string &view, const std::string &zone, const DnsItems &items, BindUtil::Operation op)
Definition: dns_mgr.cc:532
static void Init(boost::asio::io_context &io, const std::vector< DnsServer > &dns_servers, uint16_t client_port, Callback cb, uint8_t dscp)
IpAddress prefix
Definition: bind_util.h:253
void CancelPendingTimer()
Definition: dns_mgr.cc:634
WorkQueue< uint16_t > pending_done_queue_
Definition: dns_mgr.h:159
std::vector< std::string > ZoneList
Definition: bind_util.h:250
static bool DeleteTimer(Timer *Timer)
Definition: timer.cc:222
#define DNS_NS_RECORD
Definition: bind_util.h:37
uint16_t type
Definition: bind_util.h:150