2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-23 10:27:36 +00:00
kea/src/lib/dhcpsrv/parsers/base_network_parser.cc

317 lines
12 KiB
C++
Raw Normal View History

2020-04-27 10:46:30 +02:00
// Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#include <config.h>
#include <dhcpsrv/triplet.h>
#include <dhcpsrv/parsers/base_network_parser.h>
#include <util/optional.h>
#include <util/strutil.h>
using namespace isc::data;
using namespace isc::util;
namespace isc {
namespace dhcp {
2020-11-17 15:26:10 +02:00
void
2020-11-11 19:06:06 +02:00
BaseNetworkParser::moveReservationMode(ElementPtr config) {
if (!config->contains("reservation-mode")) {
2020-11-17 15:26:10 +02:00
return;
2020-11-11 19:06:06 +02:00
}
if (config->contains("reservations-global") ||
config->contains("reservations-in-subnet") ||
config->contains("reservations-out-of-pool")) {
isc_throw(DhcpConfigError, "invalid use of both 'reservation-mode'"
" and one of 'reservations-global', 'reservations-in-subnet'"
2020-11-11 19:06:06 +02:00
" or 'reservations-out-of-pool' parameters");
}
std::string hr_mode = getString(config, "reservation-mode");
if ((hr_mode == "disabled") || (hr_mode == "off")) {
config->set("reservations-global", Element::create(false));
config->set("reservations-in-subnet", Element::create(false));
} else if (hr_mode == "out-of-pool") {
config->set("reservations-global", Element::create(false));
config->set("reservations-in-subnet", Element::create(true));
config->set("reservations-out-of-pool", Element::create(true));
} else if (hr_mode == "global") {
config->set("reservations-global", Element::create(true));
config->set("reservations-in-subnet", Element::create(false));
} else if (hr_mode == "all") {
config->set("reservations-global", Element::create(false));
config->set("reservations-in-subnet", Element::create(true));
config->set("reservations-out-of-pool", Element::create(false));
} else {
isc_throw(DhcpConfigError, "invalid reservation-mode parameter: '"
<< hr_mode << "' ("
<< getPosition("reservation-mode", config) << ")");
}
config->remove("reservation-mode");
}
const Triplet<uint32_t>
BaseNetworkParser::parseLifetime(const ConstElementPtr& scope,
const std::string& name) {
// Initialize as some compilers complain otherwise.
[#35,!517] Added DDDNS parameters to networks,subnets, and their parsers src/lib/dhcpsrv/network.* Network - added DDNS parameters: Optional members, getters, setters Network::toElement() - added DDNS parameters src/lib/dhcpsrv/parsers/base_network_parser.* BaseNetworkParser::parseDdnsParams() - new method to parse DDNS parameters BaseNetworkParser::parseLifetime() - fixed unitialized variables warning src/lib/dhcpsrv/parsers/dhcp_parsers.cc Subnet4ConfigParser::initSubnet() Subnet6ConfigParser::initSubnet() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/shared_network_parser.cc SharedNetwork4Parser::parse() SharedNetwork6Parser::parse() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/simple_parser4.cc SimpleParser4::GLOBAL4_PARAMETERS SimpleParser4::GLOBAL4_DEFAULTS SimpleParser4::SUBNET4_PARAMETERS SimpleParser4::INHERIT_TO_SUBNET4 SimpleParser4::SHARED_NETWORK4_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/parsers/simple_parser6.cc SimpleParser6::GLOBAL6_PARAMETERS SimpleParser6::GLOBAL6_DEFAULTS SimpleParser6::SUBNET6_PARAMETERS SimpleParser6::INHERIT_TO_SUBNET6 SimpleParser6::SHARED_NETWORK6_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc src/lib/dhcpsrv/tests/network_unittest.cc src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc src/lib/dhcpsrv/tests/shared_network_unittest.cc src/lib/dhcpsrv/tests/subnet_unittest.cc Updated tests.
2019-09-26 08:33:41 -04:00
uint32_t value = 0;
bool has_value = false;
[#35,!517] Added DDDNS parameters to networks,subnets, and their parsers src/lib/dhcpsrv/network.* Network - added DDNS parameters: Optional members, getters, setters Network::toElement() - added DDNS parameters src/lib/dhcpsrv/parsers/base_network_parser.* BaseNetworkParser::parseDdnsParams() - new method to parse DDNS parameters BaseNetworkParser::parseLifetime() - fixed unitialized variables warning src/lib/dhcpsrv/parsers/dhcp_parsers.cc Subnet4ConfigParser::initSubnet() Subnet6ConfigParser::initSubnet() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/shared_network_parser.cc SharedNetwork4Parser::parse() SharedNetwork6Parser::parse() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/simple_parser4.cc SimpleParser4::GLOBAL4_PARAMETERS SimpleParser4::GLOBAL4_DEFAULTS SimpleParser4::SUBNET4_PARAMETERS SimpleParser4::INHERIT_TO_SUBNET4 SimpleParser4::SHARED_NETWORK4_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/parsers/simple_parser6.cc SimpleParser6::GLOBAL6_PARAMETERS SimpleParser6::GLOBAL6_DEFAULTS SimpleParser6::SUBNET6_PARAMETERS SimpleParser6::INHERIT_TO_SUBNET6 SimpleParser6::SHARED_NETWORK6_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc src/lib/dhcpsrv/tests/network_unittest.cc src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc src/lib/dhcpsrv/tests/shared_network_unittest.cc src/lib/dhcpsrv/tests/subnet_unittest.cc Updated tests.
2019-09-26 08:33:41 -04:00
uint32_t min_value = 0;
bool has_min = false;
[#35,!517] Added DDDNS parameters to networks,subnets, and their parsers src/lib/dhcpsrv/network.* Network - added DDNS parameters: Optional members, getters, setters Network::toElement() - added DDNS parameters src/lib/dhcpsrv/parsers/base_network_parser.* BaseNetworkParser::parseDdnsParams() - new method to parse DDNS parameters BaseNetworkParser::parseLifetime() - fixed unitialized variables warning src/lib/dhcpsrv/parsers/dhcp_parsers.cc Subnet4ConfigParser::initSubnet() Subnet6ConfigParser::initSubnet() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/shared_network_parser.cc SharedNetwork4Parser::parse() SharedNetwork6Parser::parse() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/simple_parser4.cc SimpleParser4::GLOBAL4_PARAMETERS SimpleParser4::GLOBAL4_DEFAULTS SimpleParser4::SUBNET4_PARAMETERS SimpleParser4::INHERIT_TO_SUBNET4 SimpleParser4::SHARED_NETWORK4_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/parsers/simple_parser6.cc SimpleParser6::GLOBAL6_PARAMETERS SimpleParser6::GLOBAL6_DEFAULTS SimpleParser6::SUBNET6_PARAMETERS SimpleParser6::INHERIT_TO_SUBNET6 SimpleParser6::SHARED_NETWORK6_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc src/lib/dhcpsrv/tests/network_unittest.cc src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc src/lib/dhcpsrv/tests/shared_network_unittest.cc src/lib/dhcpsrv/tests/subnet_unittest.cc Updated tests.
2019-09-26 08:33:41 -04:00
uint32_t max_value = 0;
bool has_max = false;
if (scope->contains(name)) {
value = getInteger(scope, name);
has_value = true;
}
if (scope->contains("min-" + name)) {
min_value = getInteger(scope, "min-" + name);
has_min = true;
}
if (scope->contains("max-" + name)) {
max_value = getInteger(scope, "max-" + name);
has_max = true;
}
if (!has_value && !has_min && !has_max) {
return (Triplet<uint32_t>());
}
if (has_value) {
if (!has_min && !has_max) {
// default only.
min_value = value;
max_value = value;
} else if (!has_min) {
// default and max.
min_value = value;
} else if (!has_max) {
// default and min.
max_value = value;
}
} else if (has_min) {
// min only.
if (!has_max) {
value = min_value;
max_value = min_value;
} else {
// min and max.
isc_throw(DhcpConfigError, "have min-" << name << " and max-"
<< name << " but no " << name << " (default) in "
<< scope->getPosition());
}
} else {
// max only.
min_value = max_value;
value = max_value;
}
// Check that min <= max.
if (min_value > max_value) {
if (has_min && has_max) {
isc_throw(DhcpConfigError, "the value of min-" << name << " ("
<< min_value << ") is not less than max-" << name << " ("
<< max_value << ")");
} else if (has_min) {
// Only min and default so min > default.
isc_throw(DhcpConfigError, "the value of min-" << name << " ("
<< min_value << ") is not less than (default) " << name
<< " (" << value << ")");
} else {
// Only default and max so default > max.
isc_throw(DhcpConfigError, "the value of (default) " << name
<< " (" << value << ") is not less than max-" << name
<< " (" << max_value << ")");
}
}
// Check that value is between min and max.
if ((value < min_value) || (value > max_value)) {
isc_throw(DhcpConfigError, "the value of (default) " << name << " ("
<< value << ") is not between min-" << name << " ("
<< min_value << ") and max-" << name << " ("
<< max_value << ")");
}
return (Triplet<uint32_t>(min_value, value, max_value));
}
void
BaseNetworkParser::parseCommon(const ConstElementPtr& network_data,
NetworkPtr& network) {
bool has_renew = network_data->contains("renew-timer");
bool has_rebind = network_data->contains("rebind-timer");
int64_t renew = -1;
int64_t rebind = -1;
if (has_renew) {
renew = getInteger(network_data, "renew-timer");
if (renew < 0) {
isc_throw(DhcpConfigError, "the value of renew-timer" << " ("
<< renew << ") must be a positive number");
}
network->setT1(renew);
}
if (has_rebind) {
rebind = getInteger(network_data, "rebind-timer");
if (rebind < 0) {
isc_throw(DhcpConfigError, "the value of rebind-timer" << " ("
<< rebind << ") must be a positive number");
}
network->setT2(rebind);
}
if (has_renew && has_rebind && (renew > rebind)) {
isc_throw(DhcpConfigError, "the value of renew-timer" << " (" << renew
2020-08-20 23:07:52 +03:00
<< ") is greater than the value of rebind-timer" << " ("
<< rebind << ")");
}
network->setValid(parseLifetime(network_data, "valid-lifetime"));
if (network_data->contains("store-extended-info")) {
network->setStoreExtendedInfo(getBoolean(network_data,
"store-extended-info"));
}
2020-11-11 19:06:06 +02:00
if (network_data->contains("reservations-global")) {
network->setReservationsGlobal(getBoolean(network_data,
"reservations-global"));
}
if (network_data->contains("reservations-in-subnet")) {
network->setReservationsInSubnet(getBoolean(network_data,
"reservations-in-subnet"));
}
if (network_data->contains("reservations-out-of-pool")) {
network->setReservationsOutOfPool(getBoolean(network_data,
"reservations-out-of-pool"));
}
}
void
BaseNetworkParser::parseTeePercents(const ConstElementPtr& network_data,
NetworkPtr& network) {
bool calculate_tee_times = network->getCalculateTeeTimes();
if (network_data->contains("calculate-tee-times")) {
calculate_tee_times = getBoolean(network_data, "calculate-tee-times");
network->setCalculateTeeTimes(calculate_tee_times);
}
Optional<double> t2_percent;
if (network_data->contains("t2-percent")) {
t2_percent = getDouble(network_data, "t2-percent");
}
Optional<double> t1_percent;
if (network_data->contains("t1-percent")) {
t1_percent = getDouble(network_data, "t1-percent");
}
if (calculate_tee_times) {
if (!t2_percent.unspecified() && ((t2_percent.get() <= 0.0) ||
(t2_percent.get() >= 1.0))) {
isc_throw(DhcpConfigError, "t2-percent: " << t2_percent.get()
<< " is invalid, it must be greater than 0.0 and less than 1.0");
}
if (!t1_percent.unspecified() && ((t1_percent.get() <= 0.0) ||
(t1_percent.get() >= 1.0))) {
isc_throw(DhcpConfigError, "t1-percent: " << t1_percent.get()
<< " is invalid it must be greater than 0.0 and less than 1.0");
}
if (!t1_percent.unspecified() && !t2_percent.unspecified() &&
(t1_percent.get() >= t2_percent.get())) {
isc_throw(DhcpConfigError, "t1-percent: " << t1_percent.get()
<< " is invalid, it must be less than t2-percent: "
<< t2_percent.get());
}
}
network->setT2Percent(t2_percent);
network->setT1Percent(t1_percent);
}
void
BaseNetworkParser::parseCacheParams(const ConstElementPtr& network_data,
NetworkPtr& network) {
if (network_data->contains("cache-threshold")) {
double cache_threshold = getDouble(network_data, "cache-threshold");
if ((cache_threshold <= 0.0) || (cache_threshold >= 1.0)) {
isc_throw(DhcpConfigError, "cache-threshold: " << cache_threshold
<< " is invalid, it must be greater than 0.0 and less than 1.0");
}
network->setCacheThreshold(cache_threshold);
}
2020-10-02 17:10:31 +02:00
if (network_data->contains("cache-max-age")) {
network->setCacheMaxAge(getInteger(network_data, "cache-max-age"));
}
}
[#35,!517] Added DDDNS parameters to networks,subnets, and their parsers src/lib/dhcpsrv/network.* Network - added DDNS parameters: Optional members, getters, setters Network::toElement() - added DDNS parameters src/lib/dhcpsrv/parsers/base_network_parser.* BaseNetworkParser::parseDdnsParams() - new method to parse DDNS parameters BaseNetworkParser::parseLifetime() - fixed unitialized variables warning src/lib/dhcpsrv/parsers/dhcp_parsers.cc Subnet4ConfigParser::initSubnet() Subnet6ConfigParser::initSubnet() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/shared_network_parser.cc SharedNetwork4Parser::parse() SharedNetwork6Parser::parse() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/simple_parser4.cc SimpleParser4::GLOBAL4_PARAMETERS SimpleParser4::GLOBAL4_DEFAULTS SimpleParser4::SUBNET4_PARAMETERS SimpleParser4::INHERIT_TO_SUBNET4 SimpleParser4::SHARED_NETWORK4_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/parsers/simple_parser6.cc SimpleParser6::GLOBAL6_PARAMETERS SimpleParser6::GLOBAL6_DEFAULTS SimpleParser6::SUBNET6_PARAMETERS SimpleParser6::INHERIT_TO_SUBNET6 SimpleParser6::SHARED_NETWORK6_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc src/lib/dhcpsrv/tests/network_unittest.cc src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc src/lib/dhcpsrv/tests/shared_network_unittest.cc src/lib/dhcpsrv/tests/subnet_unittest.cc Updated tests.
2019-09-26 08:33:41 -04:00
void
BaseNetworkParser::parseDdnsParams(const data::ConstElementPtr& network_data,
NetworkPtr& network) {
if (network_data->contains("ddns-send-updates")) {
network->setDdnsSendUpdates(getBoolean(network_data, "ddns-send-updates"));
}
if (network_data->contains("ddns-override-no-update")) {
network->setDdnsOverrideNoUpdate(getBoolean(network_data, "ddns-override-no-update"));
}
if (network_data->contains("ddns-override-client-update")) {
network->setDdnsOverrideClientUpdate(getBoolean(network_data, "ddns-override-client-update"));
}
if (network_data->contains("ddns-replace-client-name")) {
network->setDdnsReplaceClientNameMode(getAndConvert<D2ClientConfig::ReplaceClientNameMode,
D2ClientConfig::stringToReplaceClientNameMode>
(network_data, "ddns-replace-client-name",
[#35,!517] Added DDDNS parameters to networks,subnets, and their parsers src/lib/dhcpsrv/network.* Network - added DDNS parameters: Optional members, getters, setters Network::toElement() - added DDNS parameters src/lib/dhcpsrv/parsers/base_network_parser.* BaseNetworkParser::parseDdnsParams() - new method to parse DDNS parameters BaseNetworkParser::parseLifetime() - fixed unitialized variables warning src/lib/dhcpsrv/parsers/dhcp_parsers.cc Subnet4ConfigParser::initSubnet() Subnet6ConfigParser::initSubnet() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/shared_network_parser.cc SharedNetwork4Parser::parse() SharedNetwork6Parser::parse() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/simple_parser4.cc SimpleParser4::GLOBAL4_PARAMETERS SimpleParser4::GLOBAL4_DEFAULTS SimpleParser4::SUBNET4_PARAMETERS SimpleParser4::INHERIT_TO_SUBNET4 SimpleParser4::SHARED_NETWORK4_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/parsers/simple_parser6.cc SimpleParser6::GLOBAL6_PARAMETERS SimpleParser6::GLOBAL6_DEFAULTS SimpleParser6::SUBNET6_PARAMETERS SimpleParser6::INHERIT_TO_SUBNET6 SimpleParser6::SHARED_NETWORK6_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc src/lib/dhcpsrv/tests/network_unittest.cc src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc src/lib/dhcpsrv/tests/shared_network_unittest.cc src/lib/dhcpsrv/tests/subnet_unittest.cc Updated tests.
2019-09-26 08:33:41 -04:00
"ReplaceClientName mode"));
}
if (network_data->contains("ddns-generated-prefix")) {
network->setDdnsGeneratedPrefix(getString(network_data, "ddns-generated-prefix"));
}
if (network_data->contains("ddns-qualifying-suffix")) {
network->setDdnsQualifyingSuffix(getString(network_data, "ddns-qualifying-suffix"));
}
std::string hostname_char_set;
if (network_data->contains("hostname-char-set")) {
hostname_char_set = getString(network_data, "hostname-char-set");
network->setHostnameCharSet(hostname_char_set);
}
std::string hostname_char_replacement;
if (network_data->contains("hostname-char-replacement")) {
hostname_char_replacement = getString(network_data, "hostname-char-replacement");
network->setHostnameCharReplacement(hostname_char_replacement);
}
// We need to validate santizer values here so we can detect problems and
// cause a configuration. We don't retain the compilation because it's not
// something we can inherit.
if (!hostname_char_set.empty()) {
try {
str::StringSanitizerPtr sanitizer(new str::StringSanitizer(hostname_char_set,
hostname_char_replacement));
} catch (const std::exception& ex) {
isc_throw(BadValue, "hostname-char-set '" << hostname_char_set
<< "' is not a valid regular expression");
}
}
if (network_data->contains("ddns-update-on-renew")) {
network->setDdnsUpdateOnRenew(getBoolean(network_data, "ddns-update-on-renew"));
}
if (network_data->contains("ddns-use-conflict-resolution")) {
network->setDdnsUseConflictResolution(getBoolean(network_data, "ddns-use-conflict-resolution"));
}
[#35,!517] Added DDDNS parameters to networks,subnets, and their parsers src/lib/dhcpsrv/network.* Network - added DDNS parameters: Optional members, getters, setters Network::toElement() - added DDNS parameters src/lib/dhcpsrv/parsers/base_network_parser.* BaseNetworkParser::parseDdnsParams() - new method to parse DDNS parameters BaseNetworkParser::parseLifetime() - fixed unitialized variables warning src/lib/dhcpsrv/parsers/dhcp_parsers.cc Subnet4ConfigParser::initSubnet() Subnet6ConfigParser::initSubnet() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/shared_network_parser.cc SharedNetwork4Parser::parse() SharedNetwork6Parser::parse() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/simple_parser4.cc SimpleParser4::GLOBAL4_PARAMETERS SimpleParser4::GLOBAL4_DEFAULTS SimpleParser4::SUBNET4_PARAMETERS SimpleParser4::INHERIT_TO_SUBNET4 SimpleParser4::SHARED_NETWORK4_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/parsers/simple_parser6.cc SimpleParser6::GLOBAL6_PARAMETERS SimpleParser6::GLOBAL6_DEFAULTS SimpleParser6::SUBNET6_PARAMETERS SimpleParser6::INHERIT_TO_SUBNET6 SimpleParser6::SHARED_NETWORK6_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc src/lib/dhcpsrv/tests/network_unittest.cc src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc src/lib/dhcpsrv/tests/shared_network_unittest.cc src/lib/dhcpsrv/tests/subnet_unittest.cc Updated tests.
2019-09-26 08:33:41 -04:00
}
} // end of namespace isc::dhcp
} // end of namespace isc