12#include <boost/make_shared.hpp>
23 : id_(0), first_(first), last_(last), type_(type), capacity_(0),
53 std::stringstream tmp;
63 if (!first.
isV4() || !last.isV4()) {
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()) {
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) {
392 << prefix.toText() <<
"-" << last.toText());
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.
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