12#include <boost/make_shared.hpp>
23 : id_(0), first_(first), last_(last), type_(type), capacity_(0),
53 std::stringstream tmp;
64 isc_throw(BadValue,
"Invalid Pool4 address boundaries: not IPv4");
83 isc_throw(BadValue,
"Invalid Pool4 address boundaries: not IPv4");
87 if (prefix_len == 0 || prefix_len > 32) {
92 if (first_address != prefix) {
94 <<
" is not the first address in prefix: " << first_address
95 <<
"/" <<
static_cast<uint32_t
>(prefix_len));
110 return (boost::make_shared<Pool4>(first, last));
115 return (boost::make_shared<Pool4>(prefix, prefix_len));
128 map->set(
"option-data", opts->toElement());
137 map->set(
"evaluate-additional-classes",
156 std::string range = first.
toText() +
"-" + last.
toText();
160 if (prefix_len >= 0) {
161 std::ostringstream oss;
162 oss << first.
toText() <<
"/" << prefix_len;
172 :
Pool(type, first, last), prefix_len_(128), pd_exclude_option_() {
175 if (!first.
isV6() || !last.
isV6()) {
176 isc_throw(BadValue,
"Invalid Pool6 address boundaries: not IPv6");
182 <<
", must be TYPE_IA, TYPE_TA or TYPE_PD");
203 <<
static_cast<int>(type));
213 const uint8_t prefix_len,
const uint8_t delegated_len )
215 prefix_len_(delegated_len), pd_exclude_option_() {
217 init(type, prefix, prefix_len, delegated_len,
222 const uint8_t delegated_len,
224 const uint8_t excluded_prefix_len)
226 prefix_len_(delegated_len), pd_exclude_option_() {
228 init(
Lease::TYPE_PD, prefix, prefix_len, delegated_len, excluded_prefix,
229 excluded_prefix_len);
234 if (!excluded_prefix.
isV6()) {
239 if ((excluded_prefix.
isV6Zero() && (excluded_prefix_len != 0)) ||
240 (!excluded_prefix.
isV6Zero() && (excluded_prefix_len == 0))) {
242 << excluded_prefix <<
"/"
243 <<
static_cast<unsigned>(excluded_prefix_len));
247 if (!excluded_prefix.
isV6Zero() && (excluded_prefix_len != 0)) {
249 if (excluded_prefix_len > 128) {
251 <<
static_cast<unsigned>(excluded_prefix_len)
252 <<
" must not be greater than 128");
257 if (excluded_prefix_len <= prefix_len_) {
259 <<
static_cast<unsigned>(excluded_prefix_len)
260 <<
" must be longer than the delegated prefix length "
261 <<
static_cast<unsigned>(prefix_len_));
274 return (boost::make_shared<Pool6>(type, first, last));
279 uint8_t prefix_len, uint8_t delegated_len) {
280 return (boost::make_shared<Pool6>(type, prefix, prefix_len, delegated_len));
285 const uint8_t delegated_len,
const IOAddress& excluded_prefix,
286 const uint8_t excluded_prefix_len) {
287 return (boost::make_shared<Pool6>(prefix, prefix_len,
288 delegated_len, excluded_prefix,
289 excluded_prefix_len));
295 const uint8_t prefix_len,
296 const uint8_t delegated_len,
298 const uint8_t excluded_prefix_len) {
300 if (!prefix.
isV6()) {
305 if (prefix_len == 0 || prefix_len > 128) {
307 <<
static_cast<unsigned>(prefix_len));
310 if (prefix_len > delegated_len) {
312 <<
static_cast<int>(delegated_len)
313 <<
") must be longer than or equal to prefix length ("
314 <<
static_cast<int>(prefix_len) <<
")");
323 if (excluded_prefix_len && (excluded_prefix_len <= delegated_len)) {
325 <<
static_cast<int>(excluded_prefix_len)
326 <<
") must be longer than the delegated prefix length ("
327 <<
static_cast<int>(delegated_len) <<
")");
330 if (prefix_len != 128) {
332 if (first_address != prefix) {
334 <<
" is not the first address in prefix: " << first_address
335 <<
"/" <<
static_cast<uint32_t
>(prefix_len));
352 if (excluded_prefix_len > 0) {
353 pd_exclude_option_.reset(
new Option6PDExclude(prefix, delegated_len,
355 excluded_prefix_len));
368 std::string range = first.
toText() +
"-" + last.
toText();
372 if (prefix_len >= 0) {
373 std::ostringstream oss;
374 oss << first.
toText() <<
"/" << prefix_len;
389 if (prefix_len < 0) {
403 const IOAddress& xprefix = xopt->getExcludedPrefix(prefix, len);
406 uint8_t xlen = xopt->getExcludedPrefixLength();
407 map->set(
"excluded-prefix-len",
422 <<
", unsupported for Pool6");
431 std::ostringstream s;
433 <<
"-" <<
last_ <<
", delegated_len="
434 <<
static_cast<unsigned>(prefix_len_);
436 if (pd_exclude_option_) {
437 s <<
", excluded_prefix="
438 << pd_exclude_option_->getExcludedPrefix(
first_, prefix_len_).toText()
440 <<
static_cast<unsigned>(pd_exclude_option_->getExcludedPrefixLength());
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
The IOAddress class represents an IP addresses (version agnostic)
std::string toText() const
Convert the address to a string.
bool isV6() const
Convenience function to check for an IPv6 address.
bool isV4() const
Convenience function to check for an IPv4 address.
bool isV6Zero() const
Convenience function to check if it is an IPv4 zero address.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
static ElementPtr create(const Position &pos=ZERO_POSITION())
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
Represents option data configuration for the DHCP server.
Container for storing client class names.
bool contains(const ClientClass &x) const
returns if class x belongs to the defined classes
void insert(const ClientClass &class_name)
Insert an element.
bool empty() const
Check if classes is empty.
virtual isc::data::ElementPtr toElement() const
Returns all class names as an ElementPtr of type ListElement.
bool intersects(const ClientClasses &cclasses) const
returns whether this container has at least one class in common with a given container.
virtual data::ElementPtr toElement() const
Unparse a Pool4 object.
Pool4(const isc::asiolink::IOAddress &first, const isc::asiolink::IOAddress &last)
the constructor for Pool4 "min-max" style definition
static Pool4Ptr create(const isc::asiolink::IOAddress &first, const isc::asiolink::IOAddress &last)
Factory function for creating an instance of the Pool4.
uint8_t getLength() const
returns delegated prefix length
virtual data::ElementPtr toElement() const
Unparse a Pool6 object.
Option6PDExcludePtr getPrefixExcludeOption() const
Returns instance of the pool specific Prefix Exclude option.
static Pool6Ptr create(Lease::Type type, const isc::asiolink::IOAddress &first, const isc::asiolink::IOAddress &last)
Factory function for creating an instance of the Pool6.
virtual std::string toText() const
returns textual representation of the pool
Pool6(Lease::Type type, const isc::asiolink::IOAddress &first, const isc::asiolink::IOAddress &last)
the constructor for Pool6 "min-max" style definition
Lease::Type getType() const
returns pool type
base class for Pool4 and Pool6
virtual data::ElementPtr toElement() const
Unparse a pool object.
Pool(Lease::Type type, const isc::asiolink::IOAddress &first, const isc::asiolink::IOAddress &last)
protected constructor
const isc::asiolink::IOAddress & getFirstAddress() const
Returns the first address in a pool.
ClientClasses additional_classes_
Additional classes.
const isc::asiolink::IOAddress & getLastAddress() const
Returns the last address in a pool.
isc::util::uint128_t capacity_
Stores number of possible leases.
ClientClasses client_classes_
List of client classes allowed to use this pool.
void allowClientClass(const isc::dhcp::ClientClass &class_name)
Adds class clas_name to the allowed client classes list.
isc::asiolink::IOAddress last_
The last address in a pool.
isc::asiolink::IOAddress first_
The first address in a pool.
CfgOptionPtr getCfgOption()
Returns pointer to the option data configuration for this pool.
virtual std::string toText() const
returns textual representation of the pool
bool inRange(const isc::asiolink::IOAddress &addr) const
Checks if a given address is in the range.
void addAdditionalClass(const ClientClass &class_name)
Adds class class_name to the additional classes list.
bool clientSupported(const ClientClasses &client_classes) const
Checks whether this pool supports client that belongs to specified classes.
Lease::Type type_
defines a lease type that will be served from this pool
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
IOAddress firstAddrInPrefix(const IOAddress &prefix, uint8_t len)
This code is based on similar code from the Dibbler project.
uint128_t addrsInRange(const IOAddress &min, const IOAddress &max)
Returns number of available addresses in the specified range (min - max).
uint128_t prefixesInRange(const uint8_t pool_len, const uint8_t delegated_len)
Returns number of available IPv6 prefixes in the specified prefix.
IOAddress lastAddrInPrefix(const IOAddress &prefix, uint8_t len)
returns a last address in a given prefix
int prefixLengthFromRange(const IOAddress &min, const IOAddress &max)
Returns prefix length from the specified range (min - max).
boost::shared_ptr< Element > ElementPtr
boost::shared_ptr< Pool4 > Pool4Ptr
a pointer an IPv4 Pool
std::string ClientClass
Defines a single class name.
boost::shared_ptr< Option6PDExclude > Option6PDExcludePtr
Pointer to the Option6PDExclude object.
boost::shared_ptr< const CfgOption > ConstCfgOptionPtr
Const pointer.
boost::shared_ptr< Pool6 > Pool6Ptr
a pointer an IPv6 Pool
Defines the logger used by the top-level component of kea-lfc.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.
a common structure for IPv4 and IPv6 leases
Type
Type of lease or pool.
@ TYPE_TA
the lease contains temporary IPv6 address
@ TYPE_PD
the lease contains IPv6 prefix (for prefix delegation)
@ TYPE_NA
the lease contains non-temporary IPv6 address
static std::string typeToText(Type type)
returns text representation of a lease type