19 : range_start_(range.start_), step_(1), cursor_(
addrsInRange(range_start_, range.end_) - 1),
20 initial_cursor_(cursor_), state_(), done_(false), generator_() {
21 std::random_device rd;
22 generator_.seed(rd());
24 if (!initial_cursor_) {
25 state_.insert(std::make_pair(0, range_start_));
30 : range_start_(range.start_), step_(
isc::
util::
uint128_t(1) << (128 - range.delegated_length_)),
31 cursor_(
prefixesInRange(range.prefix_length_, range.delegated_length_) - 1),
32 initial_cursor_(cursor_), state_(), done_(false), generator_() {
33 std::random_device rd;
34 generator_.seed(rd());
36 if (!initial_cursor_) {
37 state_.insert(std::make_pair(0, range_start_));
53 return (state_.at(0));
63 uint64_t max_limit = std::numeric_limits<uint64_t>::max();
65 max_limit =
static_cast<uint64_t
>(cursor_ - 1);
67 std::uniform_int_distribution<uint64_t> dist(0, max_limit);
68 auto next_loc = dist(generator_);
75 auto next_loc_existing = state_.find(next_loc);
76 if (next_loc_existing != state_.end()) {
78 next_loc_address = next_loc_existing->second;
85 next_loc_address =
offsetAddress(range_start_, next_loc * step_);
90 auto cursor_existing = state_.find(cursor_);
91 if (cursor_existing != state_.end()) {
92 cursor_address = cursor_existing->second;
94 cursor_address =
offsetAddress(range_start_, cursor_ * step_);
102 if (next_loc_existing == state_.end()) {
103 state_.insert(std::make_pair(next_loc, cursor_address));
105 state_.at(next_loc) = cursor_address;
111 return (next_loc_address);
117 cursor_ = initial_cursor_;
120 if (!initial_cursor_) {
121 state_.insert(std::make_pair(0, range_start_));
The IOAddress class represents an IP addresses (version agnostic).
static const IOAddress & IPV4_ZERO_ADDRESS()
Returns an address set to all zeros.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
asiolink::IOAddress next(bool &done)
Returns next random address or prefix from the permutation.
void reset()
Resets the permutation state.
IPRangePermutation(const AddressRange &range)
Constructor for address ranges.
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 offsetAddress(const IOAddress &addr, uint128_t offset)
Finds the address increased by offset.
boost::multiprecision::checked_int128_t int128_t
boost::multiprecision::checked_uint128_t uint128_t
Defines the logger used by the top-level component of kea-lfc.
Structure representing IP address range.
Structure representing delegated prefix range.