Kea 2.5.5
option4_dnr.h
Go to the documentation of this file.
1// Copyright (C) 2023 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 OPTION4_DNR_H
8#define OPTION4_DNR_H
9
10#include <asiolink/io_address.h>
11#include <dhcp/dhcp4.h>
12#include <dhcp/dhcp6.h>
13#include <dhcp/option.h>
15#include <dns/name.h>
16
17#include <unordered_set>
18
19namespace isc {
20namespace dhcp {
21
24public:
25 InvalidOptionDnrDomainName(const char* file, size_t line, const char* what)
26 : isc::Exception(file, line, what) {
27 }
28};
29
32public:
33 InvalidOptionDnrSvcParams(const char* file, size_t line, const char* what)
34 : isc::Exception(file, line, what) {
35 }
36};
37
51public:
53 typedef std::vector<isc::asiolink::IOAddress> AddressContainer;
54
56 static const uint8_t SERVICE_PRIORITY_SIZE = 2;
57
63 static const std::unordered_set<std::string> FORBIDDEN_SVC_PARAMS;
64
68 explicit DnrInstance(Option::Universe universe);
69
87 uint16_t service_priority,
88 const std::string& adn,
89 const AddressContainer& ip_addresses,
90 const std::string& svc_params);
91
103 DnrInstance(Option::Universe universe, uint16_t service_priority, const std::string& adn);
104
106 virtual ~DnrInstance() = default;
107
111 uint16_t getDnrInstanceDataLength() const {
113 }
114
118 uint16_t getServicePriority() const {
119 return (service_priority_);
120 }
121
125 uint16_t getAdnLength() const {
126 return (adn_length_);
127 }
128
134 std::string getAdnAsText() const;
135
139 std::string getDnrInstanceAsText() const;
140
144 uint16_t getAddrLength() const {
145 return (addr_length_);
146 }
147
151 uint16_t getSvcParamsLength() const {
152 return (svc_params_length_);
153 }
154
164 return (ip_addresses_);
165 }
166
170 const std::string& getSvcParams() const {
171 return (svc_params_);
172 }
173
177 uint8_t getMinimalLength() const {
178 return (minimal_length_);
179 }
180
182 uint8_t getAddrLengthSize() const {
183 return (addr_length_size_);
184 }
185
188 return (dnr_instance_data_length_size_);
189 }
190
192 uint8_t getAdnLengthSize() const {
193 return (adn_length_size_);
194 }
195
199 std::string getLogPrefix() const {
200 return (log_prefix_);
201 }
202
204 bool isAdnOnlyMode() const {
205 return (adn_only_mode_);
206 }
207
219 void setAdn(const std::string& adn);
220
224 void setAdnOnlyMode(bool adn_only_mode) {
225 adn_only_mode_ = adn_only_mode;
226 }
227
236 void packAdn(isc::util::OutputBuffer& buf) const;
237
244 virtual void packAddresses(isc::util::OutputBuffer& buf) const;
245
252 void packSvcParams(isc::util::OutputBuffer& buf) const;
253
264
269
281
293
301
319 void checkSvcParams(bool from_wire_data = true);
320
328 void checkFields();
329
333 void addIpAddress(const asiolink::IOAddress& ip_address);
334
335protected:
338
344 boost::shared_ptr<isc::dns::Name> adn_;
345
350
353
355 uint16_t adn_length_;
356
358 uint16_t addr_length_;
359
367
370
376
381 std::string svc_params_;
382
385 uint16_t dnrInstanceLen() const;
386
387private:
391 uint8_t dnr_instance_data_length_size_;
392
394 uint8_t adn_length_size_;
395
397 uint8_t addr_length_size_;
398
406 uint8_t minimal_length_;
407
409 std::string log_prefix_;
410
414 void initMembers();
415};
416
433class Option4Dnr : public Option {
434public:
436 typedef std::vector<DnrInstance> DnrInstanceContainer;
437
452
460
463 void addDnrInstance(DnrInstance& dnr_instance);
464
468 return (dnr_instances_);
469 }
470
474 OptionPtr clone() const override;
475
489 void pack(util::OutputBuffer& buf, bool check = true) const override;
490
500 void unpack(OptionBufferConstIter begin, OptionBufferConstIter end) override;
501
507 std::string toText(int indent = 0) const override;
508
513 uint16_t len() const override;
514
515protected:
518};
519
521typedef boost::shared_ptr<Option4Dnr> Option4DnrPtr;
522
523} // namespace dhcp
524} // namespace isc
525
526#endif // OPTION4_DNR_H
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Represents DNR Instance which is used both in DHCPv4 and DHCPv6 Encrypted DNS Option.
Definition: option4_dnr.h:50
Option::Universe universe_
Either V4 or V6 Option universe.
Definition: option4_dnr.h:337
std::vector< isc::asiolink::IOAddress > AddressContainer
A Type defined for container holding IP addresses.
Definition: option4_dnr.h:53
std::string getDnrInstanceAsText() const
Returns string representation of the DNR instance.
Definition: option4_dnr.cc:377
void unpackSvcParams(OptionBufferConstIter &begin, OptionBufferConstIter end)
Unpacks Service Parameters from wire data buffer and stores it in svc_params_.
Definition: option4_dnr.cc:467
void setAdnOnlyMode(bool adn_only_mode)
Setter of the adn_only_mode_ field.
Definition: option4_dnr.h:224
uint16_t getAddrLength() const
Getter of the addr_length_.
Definition: option4_dnr.h:144
uint16_t dnr_instance_data_length_
Length of all following data inside this DNR instance in octets.
Definition: option4_dnr.h:349
uint16_t getDnrInstanceDataLength() const
Getter of the dnr_instance_data_length_.
Definition: option4_dnr.h:111
uint8_t getMinimalLength() const
Returns minimal length of the DNR instance data (without headers) in octets.
Definition: option4_dnr.h:177
AddressContainer ip_addresses_
Vector container holding one or more IP addresses.
Definition: option4_dnr.h:366
uint8_t getAdnLengthSize() const
Returns size in octets of ADN Length field.
Definition: option4_dnr.h:192
void unpackDnrInstanceDataLength(OptionBufferConstIter &begin, OptionBufferConstIter end)
Unpacks DNR Instance Data Length from wire data buffer and stores it in dnr_instance_data_length_.
Definition: option4_dnr.cc:411
void packAdn(isc::util::OutputBuffer &buf) const
Writes the ADN FQDN in the wire format into a buffer.
Definition: option4_dnr.cc:159
uint16_t addr_length_
Length of included IP addresses in octets.
Definition: option4_dnr.h:358
virtual void unpackAddresses(OptionBufferConstIter &begin, OptionBufferConstIter end)
Unpacks IP address(es) from wire data and stores it/them in ip_addresses_.
Definition: option4_dnr.cc:429
uint8_t getAddrLengthSize() const
Returns size in octets of Addr Length field.
Definition: option4_dnr.h:182
uint16_t svc_params_length_
Length of Service Parameters field in octets.
Definition: option4_dnr.h:369
void unpackServicePriority(OptionBufferConstIter &begin)
Unpacks Service Priority from wire data buffer and stores it in service_priority_.
Definition: option4_dnr.cc:423
uint16_t service_priority_
The priority of this instance compared to other DNR instances.
Definition: option4_dnr.h:352
void checkSvcParams(bool from_wire_data=true)
Checks SvcParams field if encoded correctly and throws in case of issue found.
Definition: option4_dnr.cc:264
void packSvcParams(isc::util::OutputBuffer &buf) const
Writes the Service Parameters in the wire format into a buffer.
Definition: option4_dnr.cc:186
bool isAdnOnlyMode() const
Returns whether ADN only mode is enabled or disabled.
Definition: option4_dnr.h:204
uint16_t getSvcParamsLength() const
Getter of the svc_params_length_.
Definition: option4_dnr.h:151
virtual void packAddresses(isc::util::OutputBuffer &buf) const
Writes the IP address(es) in the wire format into a buffer.
Definition: option4_dnr.cc:177
std::string getAdnAsText() const
Returns the Authentication domain name in the text format.
Definition: option4_dnr.cc:193
std::string getLogPrefix() const
Returns Log prefix depending on V4/V6 Option universe.
Definition: option4_dnr.h:199
uint16_t getServicePriority() const
Getter of the service_priority_.
Definition: option4_dnr.h:118
const std::string & getSvcParams() const
Getter of the svc_params_ field.
Definition: option4_dnr.h:170
static const std::unordered_set< std::string > FORBIDDEN_SVC_PARAMS
Set of forbidden SvcParams.
Definition: option4_dnr.h:63
void checkFields()
Checks IP address(es) field if data is correct and throws in case of issue found.
Definition: option4_dnr.cc:341
bool adn_only_mode_
Flag stating whether ADN only mode is used or not.
Definition: option4_dnr.h:375
void setAdn(const std::string &adn)
Sets Authentication domain name from given string.
Definition: option4_dnr.cc:198
uint16_t adn_length_
Length of the authentication-domain-name data in octets.
Definition: option4_dnr.h:355
uint16_t dnrInstanceLen() const
Calculates and returns length of DNR Instance data in octets.
Definition: option4_dnr.cc:396
virtual ~DnrInstance()=default
Default destructor.
void addIpAddress(const asiolink::IOAddress &ip_address)
Adds IP address to ip_addresses_ container.
Definition: option4_dnr.cc:406
uint16_t getAdnLength() const
Getter of the adn_length_.
Definition: option4_dnr.h:125
void unpackAdn(OptionBufferConstIter &begin, OptionBufferConstIter end)
Unpacks the ADN from given wire data buffer and stores it in adn_ field.
Definition: option4_dnr.cc:230
static const uint8_t SERVICE_PRIORITY_SIZE
Size in octets of Service Priority field.
Definition: option4_dnr.h:56
uint8_t getDnrInstanceDataLengthSize() const
Returns size in octets of DNR Instance Data Length field.
Definition: option4_dnr.h:187
boost::shared_ptr< isc::dns::Name > adn_
Authentication domain name field of variable length.
Definition: option4_dnr.h:344
std::string svc_params_
Service Parameters (SvcParams) (variable length).
Definition: option4_dnr.h:381
DnrInstance(Option::Universe universe)
Constructor of the empty DNR Instance.
Definition: option4_dnr.cc:122
AddressContainer getAddresses() const
Returns vector with addresses.
Definition: option4_dnr.h:163
Exception thrown when invalid domain name is specified.
Definition: option4_dnr.h:23
InvalidOptionDnrDomainName(const char *file, size_t line, const char *what)
Definition: option4_dnr.h:25
Exception thrown when Service parameters have wrong format.
Definition: option4_dnr.h:31
InvalidOptionDnrSvcParams(const char *file, size_t line, const char *what)
Definition: option4_dnr.h:33
Represents DHCPv4 Encrypted DNS Option (code 162).
Definition: option4_dnr.h:433
std::vector< DnrInstance > DnrInstanceContainer
A Type defined for container holding DNR Instances.
Definition: option4_dnr.h:436
OptionPtr clone() const override
Copies this option and returns a pointer to the copy.
Definition: option4_dnr.cc:25
void addDnrInstance(DnrInstance &dnr_instance)
Adds given DNR instance to Option's DNR Instance container.
Definition: option4_dnr.cc:116
std::string toText(int indent=0) const override
Returns string representation of the option.
Definition: option4_dnr.cc:89
void unpack(OptionBufferConstIter begin, OptionBufferConstIter end) override
Parses received wire data buffer.
Definition: option4_dnr.cc:48
DnrInstanceContainer dnr_instances_
Container holding DNR Instances.
Definition: option4_dnr.h:517
const DnrInstanceContainer & getDnrInstances() const
Getter of the dnr_instances_ field.
Definition: option4_dnr.h:467
uint16_t len() const override
Returns length of the complete option (data length + DHCPv4/DHCPv6 option header)
Definition: option4_dnr.cc:105
void pack(util::OutputBuffer &buf, bool check=true) const override
Writes option in wire-format to a buffer.
Definition: option4_dnr.cc:30
Option4Dnr()
Constructor of the empty Option.
Definition: option4_dnr.h:459
Universe
defines option universe DHCPv4 or DHCPv6
Definition: option.h:83
void check() const
A protected method used for option correctness.
Definition: option.cc:90
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
Definition: buffer.h:294
boost::shared_ptr< Option4Dnr > Option4DnrPtr
A pointer to the OptionDnr4 object.
Definition: option4_dnr.h:521
@ DHO_V4_DNR
Definition: dhcp4.h:218
OptionBuffer::const_iterator OptionBufferConstIter
const_iterator for walking over OptionBuffer
Definition: option.h:30
boost::shared_ptr< Option > OptionPtr
Definition: option.h:37
Defines the logger used by the top-level component of kea-lfc.