summaryrefslogtreecommitdiffstats
path: root/src/lib/dhcpsrv/flq_allocation_state.cc
blob: 816759afbbf144db09286a73143d21fb231e4af3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright (C) 2023 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/flq_allocation_state.h>
#include <boost/make_shared.hpp>

using namespace isc::asiolink;

namespace isc {
namespace dhcp {

PoolFreeLeaseQueueAllocationStatePtr
PoolFreeLeaseQueueAllocationState::create(const PoolPtr& pool) {
    return (boost::make_shared<PoolFreeLeaseQueueAllocationState>(pool->getType()));
}

PoolFreeLeaseQueueAllocationState::PoolFreeLeaseQueueAllocationState(Lease::Type type)
    : AllocationState(), free_lease4_queue_(), free_lease6_queue_() {
    if (type == Lease::TYPE_V4) {
        free_lease4_queue_ = boost::make_shared<FreeLeaseQueue<uint32_t>>();
    } else {
        free_lease6_queue_ = boost::make_shared<FreeLeaseQueue<IOAddress>>();
    }
}

bool
PoolFreeLeaseQueueAllocationState::exhausted() const {
    return ((free_lease4_queue_ && free_lease4_queue_->empty()) ||
            (free_lease6_queue_ && free_lease6_queue_->empty()));
}

void
PoolFreeLeaseQueueAllocationState::addFreeLease(const asiolink::IOAddress& address) {
    if (free_lease4_queue_) {
        free_lease4_queue_->push_back(address.toUint32());
    } else {
        free_lease6_queue_->push_back(address);
    }
}

void
PoolFreeLeaseQueueAllocationState::deleteFreeLease(const asiolink::IOAddress& address) {
    if (free_lease4_queue_) {
        auto& idx = free_lease4_queue_->get<1>();
        idx.erase(address.toUint32());
    } else {
        auto& idx = free_lease6_queue_->get<1>();
        idx.erase(address);
    }
}

IOAddress
PoolFreeLeaseQueueAllocationState::offerFreeLease() {
    if (free_lease4_queue_) {
        if (free_lease4_queue_->empty()) {
            return (IOAddress::IPV4_ZERO_ADDRESS());
        }
        uint32_t lease = free_lease4_queue_->front();
        free_lease4_queue_->pop_front();
        free_lease4_queue_->push_back(lease);
        return (IOAddress(lease));
    }

    if (free_lease6_queue_->empty()) {
        return (IOAddress::IPV6_ZERO_ADDRESS());
    }
    IOAddress lease = free_lease6_queue_->front();
    free_lease6_queue_->pop_front();
    free_lease6_queue_->push_back(lease);
    return (lease);
}

size_t
PoolFreeLeaseQueueAllocationState::getFreeLeaseCount() const {
    if (free_lease4_queue_) {
        return (free_lease4_queue_->size());
    }
    return (free_lease6_queue_->size());
}

} // end of namespace isc::dhcp
} // end of namespace isc