+2130. [func] piotrek
+ Added support of DHCP Options for the Discovery of
+ Network-designated Resolvers (DNR) as per draft-ietf-add-dnr.
+ Kea can now handle DHCPv4 Option code #162 and DHCPv6 Option
+ code #144.
+ (Gitlab #2536)
+
2129. [func] andrei
New statistics were added to keep track of leases that have their
CLTT increased in memory and their expiration time left unchanged
+----------------------------------------+------+---------------------------+-------------+-------------+
| v4-portparams | 159 | record (uint8, psid) | false | false |
+----------------------------------------+------+---------------------------+-------------+-------------+
+ | v4-dnr | 162 | binary | false | false |
+ +----------------------------------------+------+---------------------------+-------------+-------------+
| option-6rd | 212 | record (uint8, uint8, | true | false |
| | | ipv6-address, | | |
| | | ipv4-address) | | |
+--------------------------+-----------------+-----------------+-----------------+
| ipv6-address-andsf | 143 | ipv6-address | true |
+--------------------------+-----------------+-----------------+-----------------+
+ | v6-dnr | 144 | record (uint16, | false |
+ | | | uint16, binary) | |
+ +--------------------------+-----------------+-----------------+-----------------+
Options marked with (1) have option definitions, but the logic behind
them is not implemented. That means that, technically, Kea knows how to
}
void
-DnrInstance::packAdn(util::OutputBuffer& buf) const {
+DnrInstance::packAdn(OutputBuffer& buf) const {
if (!adn_) {
// This should not happen since Encrypted DNS options are designed
// to always include an authentication domain name.
}
void
-DnrInstance::packAddresses(util::OutputBuffer& buf) const {
+DnrInstance::packAddresses(OutputBuffer& buf) const {
AddressContainer::const_iterator address = ip_addresses_.begin();
while (address != ip_addresses_.end()) {
buf.writeUint32(address->toUint32());
}
void
-DnrInstance::packSvcParams(util::OutputBuffer& buf) const {
+DnrInstance::packSvcParams(OutputBuffer& buf) const {
if (svc_params_length_ > 0) {
buf.writeData(&(*svc_params_.begin()), svc_params_length_);
}
void
DnrInstance::setAdn(const std::string& adn) {
- std::string trimmed_adn = isc::util::str::trim(adn);
+ std::string trimmed_adn = str::trim(adn);
if (trimmed_adn.empty()) {
isc_throw(InvalidOptionDnrDomainName, "Mandatory Authentication Domain Name fully "
"qualified domain-name must not be empty");
void
DnrInstance::checkSvcParams(bool from_wire_data) {
- std::string svc_params = isc::util::str::trim(svc_params_);
+ std::string svc_params = str::trim(svc_params_);
if (svc_params.empty()) {
isc_throw(InvalidOptionDnrSvcParams, "Provided Svc Params field is empty");
}
// SvcParams in presentation format MAY appear in any order, but keys MUST NOT be repeated.
// Let's put all elements of a whitespace-separated list into a vector.
- std::vector<std::string> tokens = isc::util::str::tokens(svc_params, " ");
+ std::vector<std::string> tokens = str::tokens(svc_params, " ");
// Set of keys used to check if a key is not repeated.
std::set<std::string> keys;
// String sanitizer is used to check keys syntax.
- util::str::StringSanitizerPtr sanitizer;
+ str::StringSanitizerPtr sanitizer;
// SvcParamKeys are lower-case alphanumeric strings. Key names
// contain 1-63 characters from the ranges "a"-"z", "0"-"9", and "-".
std::string regex = "[^a-z0-9-]";
- sanitizer.reset(new util::str::StringSanitizer(regex, ""));
+ sanitizer.reset(new str::StringSanitizer(regex, ""));
// The service parameters MUST NOT include
// "ipv4hint" or "ipv6hint" SvcParams as they are superseded by the
// included IP addresses.
// Now let's check each SvcParamKey=SvcParamValue pair.
for (const std::string& token : tokens) {
- std::vector<std::string> key_val = isc::util::str::tokens(token, "=");
+ std::vector<std::string> key_val = str::tokens(token, "=");
if (key_val.size() > 2) {
isc_throw(InvalidOptionDnrSvcParams, "Wrong Svc Params syntax - more than one "
"equals sign found in SvcParamKey=SvcParamValue "
#include <dhcp/option4_dnr.h>
-#include <boost/scoped_ptr.hpp>
#include <gtest/gtest.h>
using namespace isc;
using namespace isc::dhcp;
using namespace isc::asiolink;
-using boost::scoped_ptr;
namespace {
// This test verifies constructor of the empty Option4Dnr class.
TEST(Option4DnrTest, emptyCtor) {
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr()));
ASSERT_TRUE(option);
// with adding ADN-only-mode DNR instance to option's DNR instances.
TEST(Option4DnrTest, oneAdnOnlyModeInstance) {
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr()));
ASSERT_TRUE(option);
// with adding multiple ADN-only-mode DNR instances to option's DNR instances.
TEST(Option4DnrTest, multipleAdnOnlyModeInstances) {
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr()));
ASSERT_TRUE(option);
// 2. All fields included (IP addresses and service params also) DNR instance.
TEST(Option4DnrTest, mixedDnrInstances) {
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr()));
ASSERT_TRUE(option);
// 1. ADN only mode
TEST(Option4DnrTest, packOneAdnOnlyModeInstance) {
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr()));
ASSERT_TRUE(option);
// 3. ADN only mode
TEST(Option4DnrTest, packMultipleAdnOnlyModeInstances) {
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr()));
ASSERT_TRUE(option);
// 2. All fields included (IP addresses and service params also).
TEST(Option4DnrTest, packMixedDnrInstances) {
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr()));
ASSERT_TRUE(option);
};
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())));
ASSERT_TRUE(option);
}
};
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())));
ASSERT_TRUE(option);
};
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())));
ASSERT_TRUE(option);
};
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())));
ASSERT_TRUE(option);
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), OpaqueDataTupleError);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), InvalidOptionDnrDomainName);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), InvalidOptionDnrDomainName);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), OpaqueDataTupleError);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws an exception while doing unpack.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_THROW(option.reset(new Option4Dnr(buf.begin(), buf.end())), InvalidOptionDnrSvcParams);
ASSERT_FALSE(option);
}
// toText method is correctly formatted.
TEST(Option4DnrTest, toText) {
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option4Dnr> option;
+ Option4DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option4Dnr()));
ASSERT_TRUE(option);
#include <dhcp/option6_dnr.h>
-#include <boost/scoped_ptr.hpp>
#include <gtest/gtest.h>
using namespace isc;
using namespace isc::dhcp;
-using boost::scoped_ptr;
namespace {
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())));
ASSERT_TRUE(option);
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws OutOfRange exception.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws InvalidOptionDnrDomainName exception.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), InvalidOptionDnrDomainName);
ASSERT_FALSE(option);
}
// Create option instance. Encrypted DNS options are designed to ALWAYS include
// an authentication domain name, so check that constructor throws
// InvalidOptionDnrDomainName exception.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), InvalidOptionDnrDomainName);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws OpaqueDataTupleError exception.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), OpaqueDataTupleError);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws OutOfRange exception.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
// Create option instance. Check that constructor throws OutOfRange exception.
// If additional data is supplied (i.e. not ADN only mode),
// the option includes at least one valid IP address.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws OutOfRange exception.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())));
ASSERT_TRUE(option);
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws OutOfRange exception.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), OutOfRange);
ASSERT_FALSE(option);
}
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())));
ASSERT_TRUE(option);
OptionBuffer buf(buf_data, buf_data + sizeof(buf_data));
// Create option instance. Check that constructor throws InvalidOptionDnrSvcParams exception.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(buf.begin(), buf.end())), InvalidOptionDnrSvcParams);
ASSERT_FALSE(option);
}
const std::string adn = "myhost.example.com.";
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option6Dnr(service_priority, adn)));
ASSERT_TRUE(option);
const std::string adn; // invalid empty ADN
// Create option instance. Check that constructor throws.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(service_priority, adn)), InvalidOptionDnrDomainName);
ASSERT_FALSE(option);
}
const std::string svc_params = "alpn";
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)));
ASSERT_TRUE(option);
const std::string svc_params = "alpn";
// Create option instance. Check that constructor throws.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)),
OutOfRange);
ASSERT_FALSE(option);
const std::string svc_params = "key123=val1=val2 key234"; // invalid svc param - 2 equal signs
// Create option instance. Check that constructor throws.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)),
InvalidOptionDnrSvcParams);
ASSERT_FALSE(option);
const std::string svc_params = "key123=val1 ipv6hint"; // forbidden svc param key - ipv6hint
// Create option instance. Check that constructor throws.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)),
InvalidOptionDnrSvcParams);
ASSERT_FALSE(option);
const std::string svc_params = "key123=val1 key234 key123"; // svc param key key123 repeated
// Create option instance. Check that constructor throws.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)),
InvalidOptionDnrSvcParams);
ASSERT_FALSE(option);
"veryveryveryveryvlongkey"; // svc param key longer than 63
// Create option instance. Check that constructor throws.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)),
InvalidOptionDnrSvcParams);
ASSERT_FALSE(option);
const std::string svc_params = "alpn=h2 NOT_ALLOWED_CHARS_KEY=123"; // svc param key has forbidden chars
// Create option instance. Check that constructor throws.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)),
InvalidOptionDnrSvcParams);
ASSERT_FALSE(option);
const std::string svc_params = "alpn";
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)));
ASSERT_TRUE(option);
const std::string adn = "myhost.example.com.";
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option6Dnr(service_priority, adn)));
ASSERT_TRUE(option);
const std::string svc_params = "alpn";
// Create option instance. Check that constructor doesn't throw.
- scoped_ptr<Option6Dnr> option;
+ Option6DnrPtr option;
EXPECT_NO_THROW(option.reset(new Option6Dnr(service_priority, adn, addresses, svc_params)));
ASSERT_TRUE(option);