| Kea 3.0.2-git

cfg_globals.cc
Go to the documentation of this file.
1// Copyright (C) 2021-2024 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#include <dhcpsrv/cfg_globals.h>
9
10 using namespace isc::data;
11
12 namespace isc {
13 namespace dhcp {
14
15 const std::map<std::string, int>
16 CfgGlobals::nameToIndex = {
17 // Common parameters.
18 { "valid-lifetime", VALID_LIFETIME },
19 { "min-valid-lifetime", MIN_VALID_LIFETIME },
20 { "max-valid-lifetime", MAX_VALID_LIFETIME },
21 { "renew-timer", RENEW_TIMER },
22 { "rebind-timer", REBIND_TIMER },
23 { "decline-probation-period", DECLINE_PROBATION_PERIOD },
24 { "dhcp4o6-port", DHCP4O6_PORT },
25 { "comment", COMMENT },
26 { "server-tag", SERVER_TAG },
27 { "reservations-global", RESERVATIONS_GLOBAL },
28 { "reservations-in-subnet", RESERVATIONS_IN_SUBNET },
29 { "reservations-out-of-pool", RESERVATIONS_OUT_OF_POOL },
30 { "calculate-tee-times", CALCULATE_TEE_TIMES },
31 { "t1-percent", T1_PERCENT },
32 { "t2-percent", T2_PERCENT },
33 { "hostname-char-set", HOSTNAME_CHAR_SET },
34 { "hostname-char-replacement", HOSTNAME_CHAR_REPLACEMENT },
35 { "ddns-send-updates", DDNS_SEND_UPDATES },
36 { "ddns-override-no-update", DDNS_OVERRIDE_NO_UPDATE },
37 { "ddns-override-client-update", DDNS_OVERRIDE_CLIENT_UPDATE },
38 { "ddns-replace-client-name", DDNS_REPLACE_CLIENT_NAME },
39 { "ddns-generated-prefix", DDNS_GENERATED_PREFIX },
40 { "ddns-qualifying-suffix", DDNS_QUALIFYING_SUFFIX },
41 { "store-extended-info", STORE_EXTENDED_INFO },
42 { "statistic-default-sample-count", STATISTIC_DEFAULT_SAMPLE_COUNT },
43 { "statistic-default-sample-age", STATISTIC_DEFAULT_SAMPLE_AGE },
44 { "cache-threshold", CACHE_THRESHOLD },
45 { "cache-max-age", CACHE_MAX_AGE },
46 { "early-global-reservations-lookup", EARLY_GLOBAL_RESERVATIONS_LOOKUP },
47 { "ip-reservations-unique", IP_RESERVATIONS_UNIQUE },
48 { "reservations-lookup-first", RESERVATIONS_LOOKUP_FIRST },
49 { "ddns-update-on-renew", DDNS_UPDATE_ON_RENEW },
50 { "parked-packet-limit", PARKED_PACKET_LIMIT },
51 { "allocator", ALLOCATOR },
52 { "ddns-ttl-percent", DDNS_TTL_PERCENT },
53 { "ddns-conflict-resolution-mode", DDNS_CONFLICT_RESOLUTION_MODE },
54 { "compatibility", COMPATIBILITY },
55 { "dhcp-ddns", DHCP_DDNS },
56 { "expired-leases-processing", EXPIRED_LEASES_PROCESSING },
57 { "multi-threading", MULTI_THREADING },
58 { "sanity-checks", SANITY_CHECKS },
59 { "dhcp-queue-control", DHCP_QUEUE_CONTROL },
60 { "ddns-ttl", DDNS_TTL },
61 { "ddns-ttl-min", DDNS_TTL_MIN },
62 { "ddns-ttl-max", DDNS_TTL_MAX },
63
64 // DHCPv4 specific parameters.
65 { "echo-client-id", ECHO_CLIENT_ID },
66 { "match-client-id", MATCH_CLIENT_ID },
67 { "authoritative", AUTHORITATIVE },
68 { "next-server", NEXT_SERVER },
69 { "server-hostname", SERVER_HOSTNAME },
70 { "boot-file-name", BOOT_FILE_NAME },
71 { "offer-lifetime", OFFER_LIFETIME },
72 { "stash-agent-options", STASH_AGENT_OPTIONS },
73
74 // DHCPv6 specific parameters.
75 { "data-directory", DATA_DIRECTORY },
76 { "preferred-lifetime", PREFERRED_LIFETIME },
77 { "min-preferred-lifetime", MIN_PREFERRED_LIFETIME },
78 { "max-preferred-lifetime", MAX_PREFERRED_LIFETIME },
79 { "pd-allocator", PD_ALLOCATOR },
80 { "server-id", SERVER_ID }
81};
82
83// Load time sanity check.
84 namespace {
85 struct CfgGlobalsChecks {
86 CfgGlobalsChecks() {
87 // Check the size for missing entries.
88 if (CfgGlobals::nameToIndex.size() != CfgGlobals::SIZE) {
89 isc_throw(Unexpected, "CfgGlobals::nameToIndex has "
90 << CfgGlobals::nameToIndex.size()
91 << " elements (expected " << CfgGlobals::SIZE << ")");
92 }
93
94 // Build the name vector.
95 std::vector<std::string> names;
96 names.resize(CfgGlobals::SIZE);
97 for (auto const& it : CfgGlobals::nameToIndex) {
98 int idx = it.second;
99 if ((idx < 0) || (idx >= CfgGlobals::SIZE)) {
100 isc_throw(Unexpected, "invalid index " << idx
101 << " for name " << it.first);
102 }
103 if (!names[idx].empty()) {
104 isc_throw(Unexpected, "duplicated names for " << idx
105 << " got " << names[idx]);
106 }
107 names[idx] = it.first;
108 }
109
110 // No name should be empty.
111 for (int idx = 0; idx < CfgGlobals::SIZE; ++idx) {
112 if (names[idx].empty()) {
113 isc_throw(Unexpected, "missing name for " << idx);
114 }
115 }
116 }
117};
118
119CfgGlobalsChecks check;
120} // end of anonymous namespace
121
122 CfgGlobals::CfgGlobals() : values_(SIZE) {
123}
124
125 ConstElementPtr
126 CfgGlobals::get(const std::string& name) const {
127 auto const& it = nameToIndex.find(name);
128 if (it == nameToIndex.cend()) {
129 isc_throw(NotFound, "invalid global parameter name '" << name << "'");
130 }
131 return (get(it->second));
132}
133
134 ConstElementPtr
135 CfgGlobals::get(int index) const {
136 if ((index < 0) || (index >= CfgGlobals::SIZE)) {
137 isc_throw(OutOfRange, "invalid global parameter index " << index);
138 }
139 return (values_[index]);
140}
141
142 void
143 CfgGlobals::set(const std::string& name, ConstElementPtr value) {
144 auto const& it = nameToIndex.find(name);
145 if (it == nameToIndex.cend()) {
146 isc_throw(NotFound, "invalid global parameter name '" << name << "'");
147 }
148
149 set(it->second, value);
150}
151
152 void
153 CfgGlobals::set(int index, ConstElementPtr value) {
154 if ((index < 0) || (index >= CfgGlobals::SIZE)) {
155 isc_throw(OutOfRange, "invalid global parameter index " << index);
156 }
157 values_[index] = value;
158}
159
160 void
161 CfgGlobals::clear() {
162 for (int idx = 0; idx < CfgGlobals::SIZE; ++idx) {
163 if (values_[idx]) {
164 values_[idx] = ConstElementPtr();
165 }
166 }
167}
168
169 const CfgGlobals::MapType
170 CfgGlobals::valuesMap() const {
171 MapType map;
172 for (auto const& it : nameToIndex) {
173 int idx = it.second;
174 ConstElementPtr value = values_[idx];
175 if (value) {
176 map.insert(make_pair(it.first, value));
177 }
178 }
179 return (map);
180}
181
182 ElementPtr
183 CfgGlobals::toElement() const {
184 ElementPtr result = Element::createMap();
185 for (auto const& it : nameToIndex) {
186 int idx = it.second;
187 ConstElementPtr value = values_[idx];
188 if (value) {
189 result->set(it.first, value);
190 }
191 }
192 return (result);
193}
194
195} // namespace isc::dhcp
196} // namespace isc
COMMENT
#define COMMENT
Definition agent_lexer.cc:1657
cfg_globals.h
isc::NotFound
A generic exception that is thrown when an object can not be found.
Definition exceptions/exceptions.h:175
isc::OutOfRange
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
Definition exceptions/exceptions.h:115
isc::data::Element::createMap
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
Definition data.cc:304
isc::dhcp::CfgGlobals::clear
void clear()
Clear configured parameter values.
Definition cfg_globals.cc:161
isc::dhcp::CfgGlobals::set
void set(const std::string &name, isc::data::ConstElementPtr value)
Set a configured parameter value by name.
Definition cfg_globals.cc:143
isc::dhcp::CfgGlobals::valuesMap
const MapType valuesMap() const
Returns configured parameters as a map.
Definition cfg_globals.cc:170
isc::dhcp::CfgGlobals::CfgGlobals
CfgGlobals()
Instance members.
Definition cfg_globals.cc:122
isc::dhcp::CfgGlobals::nameToIndex
static const std::map< std::string, int > nameToIndex
Name to index map.
Definition cfg_globals.h:110
isc::dhcp::CfgGlobals::MapType
std::map< std::string, isc::data::ConstElementPtr > MapType
Type of name and value map.
Definition cfg_globals.h:151
isc::dhcp::CfgGlobals::toElement
isc::data::ElementPtr toElement() const
Unparse configured global parameters.
Definition cfg_globals.cc:183
isc::dhcp::CfgGlobals::get
isc::data::ConstElementPtr get(const std::string &name) const
Get a configured parameter value by name.
Definition cfg_globals.cc:126
isc::dhcp::CfgGlobals::values_
std::vector< isc::data::ConstElementPtr > values_
Vectors of values.
Definition cfg_globals.h:166
isc::dhcp::CfgGlobals::SIZE
@ SIZE
Definition cfg_globals.h:106
isc_throw
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
Definition exceptions/exceptions.h:210
isc::data
Definition base_stamped_element.cc:12
isc::data::ConstElementPtr
boost::shared_ptr< const Element > ConstElementPtr
Definition data.h:29
isc::data::ElementPtr
boost::shared_ptr< Element > ElementPtr
Definition data.h:28
isc::dhcp
Definition dhcp4/client_handler.cc:20
isc
Defines the logger used by the top-level component of kea-lfc.
Definition agent_parser.cc:148