Kea 3.3.3
ncr_msg.h
Go to the documentation of this file.
1// Copyright (C) 2013-2026 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#ifndef NCR_MSG_H
8#define NCR_MSG_H
9
14
15#include <cc/data.h>
16#include <dhcp/duid.h>
17#include <dhcp/hwaddr.h>
18#include <dns/name.h>
19#include <dns/time_utils.h>
21#include <util/buffer.h>
22
23#include <cstdint>
24#include <string>
25
26#include <boost/algorithm/string/case_conv.hpp>
27
28#include <time.h>
29
30namespace isc {
31namespace dhcp_ddns {
32
35public:
36 NcrMessageError(const char* file, size_t line, const char* what) :
37 isc::Exception(file, line, what) { }
38};
39
43public:
44 DhcidRdataComputeError(const char* file, size_t line, const char* what) :
45 isc::Exception(file, line, what) { }
46};
47
49enum NameChangeType : uint16_t {
52};
53
61
63enum NameChangeFormat : uint16_t {
65};
66
67// DDNS Conflict resolution modes
74
84extern NameChangeFormat stringToNcrFormat(const std::string& fmt_str);
85
92extern std::string ncrFormatToString(NameChangeFormat format);
93
104ConflictResolutionMode StringToConflictResolutionMode(const std::string& mode_str);
105
113
117class D2Dhcid {
118public:
120 D2Dhcid();
121
131 D2Dhcid(const std::string& data);
132
138 D2Dhcid(const isc::dhcp::HWAddrPtr& hwaddr,
139 const std::vector<uint8_t>& wire_fqdn);
140
146 D2Dhcid(const std::vector<uint8_t>& clientid_data,
147 const std::vector<uint8_t>& wire_fqdn);
148
154 D2Dhcid(const isc::dhcp::DUID& duid,
155 const std::vector<uint8_t>& wire_fqdn);
156
160 std::string toStr() const;
161
170 void fromStr(const std::string& data);
171
176 void fromClientId(const std::vector<uint8_t>& clientid_data,
177 const std::vector<uint8_t>& wire_fqdn);
178
187 void fromDUID(const isc::dhcp::DUID& duid,
188 const std::vector<uint8_t>& wire_fqdn);
189
194 void fromHWAddr(const isc::dhcp::HWAddrPtr& hwaddr,
195 const std::vector<uint8_t>& wire_fqdn);
196
200 const std::vector<uint8_t>& getBytes() const {
201 return (bytes_);
202 }
203
205 bool operator==(const D2Dhcid& other) const {
206 return (this->bytes_ == other.bytes_);
207 }
208
210 bool operator!=(const D2Dhcid& other) const {
211 return (this->bytes_ != other.bytes_);
212 }
213
215 bool operator<(const D2Dhcid& other) const {
216 return (this->bytes_ < other.bytes_);
217 }
218
219private:
220
232 void createDigest(const uint8_t identifier_type,
233 const std::vector<uint8_t>& identifier_data,
234 const std::vector<uint8_t>& wire_fqdn);
235
237 std::vector<uint8_t> bytes_;
238};
239
240std::ostream&
241operator<<(std::ostream& os, const D2Dhcid& dhcid);
242
243class NameChangeRequest;
245typedef boost::shared_ptr<NameChangeRequest> NameChangeRequestPtr;
246
248typedef std::map<std::string, isc::data::ConstElementPtr> ElementMap;
249
259public:
270
288 NameChangeRequest(const NameChangeType change_type,
289 const bool forward_change, const bool reverse_change,
290 const std::string& fqdn, const std::string& ip_address,
291 const D2Dhcid& dhcid,
292 const uint32_t lease_length,
294 conflict_resolution_mode = CHECK_WITH_DHCID);
295
318 isc::util::InputBuffer& buffer);
319
338 void toFormat(const NameChangeFormat format,
339 isc::util::OutputBuffer& buffer) const;
340
426 static NameChangeRequestPtr fromJSON(const std::string& json);
427
467
472 std::string toJSON() const;
473
492 void validateContent();
493
496 /// @return the change type
498 return (change_type_);
499 }
500
504 void setChangeType(const NameChangeType value);
505
513
516 /// @return a true if the forward change flag is true.
517 bool isForwardChange() const {
518 return (forward_change_);
519 }
520
525 void setForwardChange(const bool value);
526
535
538 /// @return a true if the reverse change flag is true.
539 bool isReverseChange() const {
540 return (reverse_change_);
541 }
542
547 void setReverseChange(const bool value);
548
557
560 /// @return a string containing the FQDN
561 const std::string& getFqdn() const {
562 return (fqdn_);
563 }
564
567 /// @return a string containing the FQDN lower-cased
568 std::string getFqdnLower() const {
569 return (boost::algorithm::to_lower_copy(fqdn_));
570 }
571
575 void setFqdn(const std::string& value);
576
584
587 /// @return a string containing the IP address
588 std::string getIpAddress() const {
589 return (ip_io_address_.toText());
590 }
592 const asiolink::IOAddress& getIOAddress() const {
593 return (ip_io_address_);
594 }
595
598 /// @return a asiolink::IOAddress containing the IP address
599 const asiolink::IOAddress& getIpIoAddress() const {
600 return (ip_io_address_);
601 }
602
605 /// @return boolean true if the lease address family is AF_INET.
606 bool isV4 () const {
607 return (ip_io_address_.isV4());
608 }
609
612 /// @return boolean true if the lease address family is AF_INET6.
613 bool isV6 () const {
614 return (ip_io_address_.isV6());
615 }
616
620 void setIpAddress(const std::string& value);
621
625 void setIpAddress(const asiolink::IOAddress& value);
626
634
637 /// @return a reference to the request's D2Dhcid
638 const D2Dhcid& getDhcid() const {
639 return (dhcid_);
640 }
641
650 void setDhcid(const std::string& value);
651
660
670 /// @return a string with the request's request ID (currently DHCID)
671 std::string getRequestId() const {
672 return (dhcid_.toStr());
673 }
674
677 /// @return an integer containing the lease length
678 uint32_t getLeaseLength() const {
679 return (lease_length_);
680 }
681
685 void setLeaseLength(const uint32_t value);
686
694
697 /// @return a true if the conflict resolution is enabled.
699 return (conflict_resolution_mode_);
700 }
701
707
715
728
731 /// @return the request status as a NameChangeStatus
733 return (status_);
734 }
735
738 /// @return NameChangeRequestPtr to the next NCR or an empty pointer.
740 return (next_ncr_);
741 }
742
743 /// @brief Fetches the next NCR (if one)
744 void setNextNcr(NameChangeRequestPtr next_ncr) {
745 next_ncr_ = next_ncr;
746 }
747
751 void setStatus(const NameChangeStatus value);
752
762 isc::data::ConstElementPtr getElement(const std::string& name,
763 const ElementMap& element_map) const;
764
769 std::string toText() const;
770
771 bool operator == (const NameChangeRequest& b) const;
772 bool operator != (const NameChangeRequest& b) const;
773
774private:
776 NameChangeType change_type_;
777
779 bool forward_change_;
780
782 bool reverse_change_;
783
788 std::string fqdn_;
789
796 asiolink::IOAddress ip_io_address_;
797
801 D2Dhcid dhcid_;
802
804 uint32_t lease_length_;
805
807 ConflictResolutionMode conflict_resolution_mode_;
808
810 NameChangeStatus status_;
811
813 NameChangeRequestPtr next_ncr_;
814};
815
816} // namespace dhcp_ddns
817} // namespace isc
818
819#endif
This is a base class for exceptions thrown from the DNS library module.
Exception(const char *file, size_t line, const char *what)
Constructor for a given type for exceptions with file name and file line number.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Holds DUID (DHCPv6 Unique Identifier).
Definition duid.h:142
Container class for handling the DHCID value within a NameChangeRequest.
Definition ncr_msg.h:117
bool operator<(const D2Dhcid &other) const
Compares two D2Dhcids lexically.
Definition ncr_msg.h:215
void fromHWAddr(const isc::dhcp::HWAddrPtr &hwaddr, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the HW address and FQDN.
Definition ncr_msg.cc:167
bool operator==(const D2Dhcid &other) const
Compares two D2Dhcids for equality.
Definition ncr_msg.h:205
bool operator!=(const D2Dhcid &other) const
Compares two D2Dhcids for inequality.
Definition ncr_msg.h:210
void fromDUID(const isc::dhcp::DUID &duid, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the DUID and FQDN.
Definition ncr_msg.cc:186
const std::vector< uint8_t > & getBytes() const
Returns a reference to the DHCID byte vector.
Definition ncr_msg.h:200
D2Dhcid()
Default constructor.
Definition ncr_msg.cc:98
void fromClientId(const std::vector< uint8_t > &clientid_data, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the Client Identifier.
Definition ncr_msg.cc:136
void fromStr(const std::string &data)
Sets the DHCID value based on the given string.
Definition ncr_msg.cc:121
std::string toStr() const
Returns the DHCID value as a string of hexadecimal digits.
Definition ncr_msg.cc:131
DhcidRdataComputeError(const char *file, size_t line, const char *what)
Definition ncr_msg.h:44
Represents a DHCP-DDNS client request.
Definition ncr_msg.h:258
bool operator==(const NameChangeRequest &b) const
Definition ncr_msg.cc:727
bool operator!=(const NameChangeRequest &b) const
Definition ncr_msg.cc:739
void setStatus(const NameChangeStatus value)
Sets the request status to the given value.
Definition ncr_msg.cc:686
bool isV6() const
Returns true if the lease address is a IPv6 lease.
Definition ncr_msg.h:612
const std::string & getFqdn() const
Fetches the request FQDN.
Definition ncr_msg.h:560
void setChangeType(const NameChangeType value)
Sets the change type to the given value.
Definition ncr_msg.cc:508
std::string toText() const
Returns a text rendition of the contents of the request.
Definition ncr_msg.cc:691
uint32_t getLeaseLength() const
Fetches the request lease length.
Definition ncr_msg.h:677
const asiolink::IOAddress & getIpIoAddress() const
Fetches the request IP address as an IOAddress.
Definition ncr_msg.h:598
void setIpAddress(const std::string &value)
Sets the IP address to the given value.
Definition ncr_msg.cc:594
void translateUseConflictResolution(isc::data::ConstElementPtr element)
Sets the conflict resolution mode based on the value of the given boolean Element.
Definition ncr_msg.cc:656
const D2Dhcid & getDhcid() const
Fetches the request DHCID.
Definition ncr_msg.h:637
NameChangeRequestPtr getNextNcr() const
Fetches the next NCR (if one).
Definition ncr_msg.h:738
void setDhcid(const std::string &value)
Sets the DHCID based on the given string value.
Definition ncr_msg.cc:615
std::string toJSON() const
Instance method for marshalling the contents of the request into a string of JSON text.
Definition ncr_msg.cc:443
ConflictResolutionMode getConflictResolutionMode() const
Fetches the conflict resolution mode.
Definition ncr_msg.h:697
std::string getIpAddress() const
Fetches the request IP address string.
Definition ncr_msg.h:587
void setFqdn(const std::string &value)
Sets the FQDN to the given value.
Definition ncr_msg.cc:582
void setReverseChange(const bool value)
Sets the reverse change flag to the given value.
Definition ncr_msg.cc:556
void setNextNcr(NameChangeRequestPtr next_ncr)
Fetches the next NCR (if one).
Definition ncr_msg.h:743
void setLeaseLength(const uint32_t value)
Sets the lease length to the given value.
Definition ncr_msg.cc:625
const asiolink::IOAddress & getIOAddress() const
Definition ncr_msg.h:591
void toFormat(const NameChangeFormat format, isc::util::OutputBuffer &buffer) const
Instance method for marshalling the contents of the request into the given buffer in the given format...
Definition ncr_msg.cc:334
NameChangeRequest()
Default Constructor.
Definition ncr_msg.cc:257
NameChangeType getChangeType() const
Fetches the request change type.
Definition ncr_msg.h:496
static NameChangeRequestPtr fromJSON(const std::string &json)
Static method for creating a NameChangeRequest from a string containing a JSON rendition of a request...
Definition ncr_msg.cc:358
void setForwardChange(const bool value)
Sets the forward change flag to the given value.
Definition ncr_msg.cc:535
isc::data::ConstElementPtr getElement(const std::string &name, const ElementMap &element_map) const
Given a name, finds and returns an element from a map of elements.
Definition ncr_msg.cc:493
void setConflictResolutionMode(const ConflictResolutionMode value)
Sets the conflict resolution mode to the given value.
Definition ncr_msg.cc:668
std::string getRequestId() const
Fetches the request ID.
Definition ncr_msg.h:670
bool isForwardChange() const
Checks forward change flag.
Definition ncr_msg.h:516
NameChangeStatus getStatus() const
Fetches the request status.
Definition ncr_msg.h:731
bool isV4() const
Returns true if the lease address is a IPv4 lease.
Definition ncr_msg.h:605
static NameChangeRequestPtr fromFormat(const NameChangeFormat format, isc::util::InputBuffer &buffer)
Static method for creating a NameChangeRequest from a buffer containing a marshalled request in a giv...
Definition ncr_msg.cc:287
void validateContent()
Validates the content of a populated request.
Definition ncr_msg.cc:472
bool isReverseChange() const
Checks reverse change flag.
Definition ncr_msg.h:538
std::string getFqdnLower() const
Fetches the request FQDN lower-cased.
Definition ncr_msg.h:567
NcrMessageError(const char *file, size_t line, const char *what)
Definition ncr_msg.h:36
The InputBuffer class is a buffer abstraction for manipulating read-only data.
Definition buffer.h:81
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
Definition buffer.h:355
boost::shared_ptr< const Element > ConstElementPtr
Definition data.h:30
NameChangeFormat
Defines the list of data wire formats supported.
Definition ncr_msg.h:63
NameChangeStatus
Defines the runtime processing status values for requests.
Definition ncr_msg.h:55
NameChangeType
Defines the types of DNS updates that can be requested.
Definition ncr_msg.h:49
@ NO_CHECK_WITHOUT_DHCID
Definition ncr_msg.h:72
@ CHECK_EXISTS_WITH_DHCID
Definition ncr_msg.h:71
@ NO_CHECK_WITH_DHCID
Definition ncr_msg.h:70
std::map< std::string, isc::data::ConstElementPtr > ElementMap
Defines a map of Elements, keyed by their string name.
Definition ncr_msg.h:248
std::ostream & operator<<(std::ostream &os, const D2Dhcid &dhcid)
Definition ncr_msg.cc:251
NameChangeFormat stringToNcrFormat(const std::string &fmt_str)
Function which converts labels to NameChangeFormat enum values.
Definition ncr_msg.cc:24
ConflictResolutionMode StringToConflictResolutionMode(const std::string &mode_str)
Function which converts string to ConflictResolutionMode enum values.
Definition ncr_msg.cc:42
std::string ConflictResolutionModeToString(const ConflictResolutionMode &mode)
Function which converts ConflictResolutionMode enums to text labels.
Definition ncr_msg.cc:63
boost::shared_ptr< NameChangeRequest > NameChangeRequestPtr
Defines a pointer to a NameChangeRequest.
Definition ncr_msg.h:245
std::string ncrFormatToString(NameChangeFormat format)
Function which converts NameChangeFormat enums to text labels.
Definition ncr_msg.cc:32
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
Definition hwaddr.h:166
Defines the logger used by the top-level component of kea-lfc.