Kea  1.9.9-git
ncr_generator.cc
Go to the documentation of this file.
1 // Copyright (C) 2015-2020 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #include <config.h>
8 
10 #include <dhcpsrv/cfgmgr.h>
11 #include <dhcpsrv/dhcpsrv_log.h>
12 #include <dhcpsrv/d2_client_mgr.h>
13 #include <dhcpsrv/ncr_generator.h>
14 #include <stdint.h>
15 #include <vector>
16 
17 using namespace isc;
18 using namespace isc::dhcp;
19 using namespace isc::dhcp_ddns;
20 
21 namespace {
22 
38 template<typename LeasePtrType, typename IdentifierType>
39 void queueNCRCommon(const NameChangeType& chg_type, const LeasePtrType& lease,
40  const IdentifierType& identifier, const std::string& label,
41  const bool use_conflict_resolution = true) {
42 
43  // Check if there is a need for update.
44  if (lease->hostname_.empty() || (!lease->fqdn_fwd_ && !lease->fqdn_rev_)
48  .arg(label)
49  .arg(lease->addr_.toText());
50 
51  return;
52  }
53 
54  try {
55  // Create DHCID
56  std::vector<uint8_t> hostname_wire;
57  OptionDataTypeUtil::writeFqdn(lease->hostname_, hostname_wire, true);
58  D2Dhcid dhcid = D2Dhcid(identifier, hostname_wire);
59 
60  // Calculate the TTL based on lease life time.
61  uint32_t ttl = calculateDdnsTtl(lease->valid_lft_);
62 
63  // Create name change request.
65  (new NameChangeRequest(chg_type, lease->fqdn_fwd_, lease->fqdn_rev_,
66  lease->hostname_, lease->addr_.toText(),
67  dhcid, lease->cltt_ + ttl,
68  ttl, use_conflict_resolution));
69 
71  .arg(label)
72  .arg(chg_type == CHG_ADD ? "add" : "remove")
73  .arg(ncr->toText());
74 
75  // Send name change request.
77 
78  } catch (const std::exception& ex) {
80  .arg(label)
81  .arg(chg_type == CHG_ADD ? "add" : "remove")
82  .arg(lease->addr_.toText())
83  .arg(ex.what());
84  }
85 }
86 
87 } // end of anonymous namespace
88 
89 namespace isc {
90 namespace dhcp {
91 
92 void queueNCR(const NameChangeType& chg_type, const Lease4Ptr& lease) {
93  if (lease) {
94  // Figure out from the lease's subnet if we should use conflict resolution.
95  // If there's no subnet, something hinky is going on so we'll set it true.
96  bool use_cr = true;
98  ->getCfgSubnets4()->getSubnet(lease->subnet_id_);
99  if (subnet) {
100  // We should always have subnet.
101  use_cr = subnet->getDdnsUseConflictResolution();
102  }
103 
104  // Client id takes precedence over HW address.
105  if (lease->client_id_) {
106  queueNCRCommon(chg_type, lease, lease->client_id_->getClientId(),
107  Pkt4::makeLabel(lease->hwaddr_, lease->client_id_), use_cr);
108 
109  } else {
110  // Client id is not specified for the lease. Use HW address
111  // instead.
112  queueNCRCommon(chg_type, lease, lease->hwaddr_,
113  Pkt4::makeLabel(lease->hwaddr_, lease->client_id_), use_cr);
114  }
115  }
116 }
117 
118 void queueNCR(const NameChangeType& chg_type, const Lease6Ptr& lease) {
119  // DUID is required to generate NCR.
120  if (lease && (lease->type_ != Lease::TYPE_PD) && lease->duid_) {
121  // Figure out from the lease's subnet if we should use conflict resolution.
122  // If there's no subnet, something hinky is going on so we'll set it true.
123  bool use_cr = true;
125  ->getCfgSubnets6()->getSubnet(lease->subnet_id_);
126  if (subnet) {
127  // We should always have subnet.
128  use_cr = subnet->getDdnsUseConflictResolution();
129  }
130 
131  queueNCRCommon(chg_type, lease, *(lease->duid_),
132  Pkt6::makeLabel(lease->duid_, lease->hwaddr_), use_cr);
133  }
134 }
135 
136 uint32_t calculateDdnsTtl(uint32_t lease_lft) {
137  // Per RFC 4702 DDNS RR TTL should be given by:
138  // ((lease life time / 3) < 10 minutes) ? 10 minutes : (lease life time / 3)
139  if (lease_lft < 1800) {
140  return (600);
141  }
142 
143  return (lease_lft / 3);
144 }
145 
146 }
147 }
uint32_t calculateDdnsTtl(uint32_t lease_lft)
Calculates TTL for a DNS resource record based on lease life time.
const int DHCPSRV_DBG_TRACE_DETAIL_DATA
Additional information.
Definition: dhcpsrv_log.h:43
static std::string makeLabel(const HWAddrPtr &hwaddr, const ClientIdPtr &client_id, const uint32_t transid)
Returns text representation of the given packet identifiers.
Definition: pkt4.cc:394
NameChangeType
Defines the types of DNS updates that can be requested.
Definition: ncr_msg.h:46
static CfgMgr & instance()
returns a single instance of Configuration Manager
Definition: cfgmgr.cc:25
boost::shared_ptr< Subnet4 > Subnet4Ptr
A pointer to a Subnet4 object.
Definition: subnet.h:522
static void writeFqdn(const std::string &fqdn, std::vector< uint8_t > &buf, const bool downcase=false)
Append FQDN into a buffer.
const isc::log::MessageID DHCPSRV_QUEUE_NCR_FAILED
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
Definition: macros.h:32
the lease contains IPv6 prefix (for prefix delegation)
Definition: lease.h:53
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
Definition: cfgmgr.cc:161
boost::shared_ptr< NameChangeRequest > NameChangeRequestPtr
Defines a pointer to a NameChangeRequest.
Definition: ncr_msg.h:212
void sendRequest(dhcp_ddns::NameChangeRequestPtr &ncr)
Send the given NameChangeRequests to kea-dhcp-ddns.
void queueNCR(const NameChangeType &chg_type, const Lease4Ptr &lease)
Creates name change request from the DHCPv4 lease.
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Definition: lease.h:283
const int DHCPSRV_DBG_TRACE_DETAIL
Additional information.
Definition: dhcpsrv_log.h:38
bool ddnsEnabled()
Convenience method for checking if DHCP-DDNS is enabled.
Defines the logger used by the top-level component of kea-dhcp-ddns.
static std::string makeLabel(const DuidPtr duid, const uint32_t transid, const HWAddrPtr &hwaddr)
Returns text representation of the given packet identifiers.
Definition: pkt6.cc:585
Container class for handling the DHCID value within a NameChangeRequest.
Definition: ncr_msg.h:86
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
Definition: macros.h:14
const isc::log::MessageID DHCPSRV_QUEUE_NCR
D2ClientMgr & getD2ClientMgr()
Fetches the DHCP-DDNS manager.
Definition: cfgmgr.cc:66
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
Definition: dhcpsrv_log.h:56
boost::shared_ptr< Subnet6 > Subnet6Ptr
A pointer to a Subnet6 object.
Definition: subnet.h:670
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
Definition: lease.h:492
Represents a DHCP-DDNS client request.
Definition: ncr_msg.h:227
Defines the D2ClientMgr class.
const isc::log::MessageID DHCPSRV_QUEUE_NCR_SKIP