mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-29 13:07:50 +00:00
[4320] Added container holding allocated addresses in IA context.
This commit is contained in:
parent
ea2e2ca862
commit
1a3fe2cd3a
@ -1493,7 +1493,7 @@ Dhcpv6Srv::assignIA_PD(const Pkt6Ptr& query, const Pkt6Ptr& answer,
|
||||
|
||||
// We have a lease! Let's wrap its content into IA_PD option
|
||||
// with IAADDR suboption.
|
||||
LOG_INFO(lease6_logger, ctx.fake_allocation ?
|
||||
LOG_INFO(lease6_logger, ctx.fake_allocation_ ?
|
||||
DHCP6_PD_LEASE_ADVERT : DHCP6_PD_LEASE_ALLOC)
|
||||
.arg(query->getLabel())
|
||||
.arg((*l)->addr_.toText())
|
||||
@ -1516,7 +1516,7 @@ Dhcpv6Srv::assignIA_PD(const Pkt6Ptr& query, const Pkt6Ptr& answer,
|
||||
// cause of that failure. The only thing left is to insert
|
||||
// status code to pass the sad news to the client.
|
||||
|
||||
LOG_DEBUG(lease6_logger, DBG_DHCP6_DETAIL, ctx.fake_allocation ?
|
||||
LOG_DEBUG(lease6_logger, DBG_DHCP6_DETAIL, ctx.fake_allocation_ ?
|
||||
DHCP6_PD_LEASE_ADVERT_FAIL : DHCP6_PD_LEASE_ALLOC_FAIL)
|
||||
.arg(query->getLabel())
|
||||
.arg(ia->getIAID());
|
||||
@ -1615,7 +1615,7 @@ Dhcpv6Srv::extendIA_NA(const Pkt6Ptr& query, const Pkt6Ptr& answer,
|
||||
// those prefixes and remove those that we have already processed. We
|
||||
// don't want to remove them from the context, so we need to copy them
|
||||
// into temporary container.
|
||||
AllocEngine::HintContainer hints = ctx.currentIA().hints_;
|
||||
AllocEngine::ResourceContainer hints = ctx.currentIA().hints_;
|
||||
|
||||
// For all leases we have now, add the IAADDR with non-zero lifetimes.
|
||||
for (Lease6Collection::const_iterator l = leases.begin(); l != leases.end(); ++l) {
|
||||
@ -1628,7 +1628,7 @@ Dhcpv6Srv::extendIA_NA(const Pkt6Ptr& query, const Pkt6Ptr& answer,
|
||||
.arg(ia_rsp->getIAID());
|
||||
|
||||
// Now remove this address from the hints list.
|
||||
AllocEngine::HintType hint_type((*l)->addr_, 128);
|
||||
AllocEngine::ResourceType hint_type((*l)->addr_, 128);
|
||||
hints.erase(std::remove(hints.begin(), hints.end(), hint_type),
|
||||
hints.end());
|
||||
}
|
||||
@ -1641,7 +1641,7 @@ Dhcpv6Srv::extendIA_NA(const Pkt6Ptr& query, const Pkt6Ptr& answer,
|
||||
ia_rsp->addOption(iaaddr);
|
||||
|
||||
// Now remove this address from the hints list.
|
||||
AllocEngine::HintType hint_type((*l)->addr_, 128);
|
||||
AllocEngine::ResourceType hint_type((*l)->addr_, 128);
|
||||
hints.erase(std::remove(hints.begin(), hints.end(), hint_type), hints.end());
|
||||
|
||||
// If the new FQDN settings have changed for the lease, we need to
|
||||
@ -1662,7 +1662,7 @@ Dhcpv6Srv::extendIA_NA(const Pkt6Ptr& query, const Pkt6Ptr& answer,
|
||||
|
||||
// Finally, if there are any addresses requested that we haven't dealt with
|
||||
// already, inform the client that he can't have them.
|
||||
for (AllocEngine::HintContainer::const_iterator hint = hints.begin();
|
||||
for (AllocEngine::ResourceContainer::const_iterator hint = hints.begin();
|
||||
hint != hints.end(); ++hint) {
|
||||
Option6IAAddrPtr iaaddr(new Option6IAAddr(D6O_IAADDR,
|
||||
hint->first, 0, 0));
|
||||
@ -1775,7 +1775,7 @@ Dhcpv6Srv::extendIA_PD(const Pkt6Ptr& query,
|
||||
// those prefixes and remove those that we have already processed. We
|
||||
// don't want to remove them from the context, so we need to copy them
|
||||
// into temporary container.
|
||||
AllocEngine::HintContainer hints = ctx.currentIA().hints_;
|
||||
AllocEngine::ResourceContainer hints = ctx.currentIA().hints_;
|
||||
|
||||
// For all the leases we have now, add the IAPPREFIX with non-zero lifetimes
|
||||
for (Lease6Collection::const_iterator l = leases.begin(); l != leases.end(); ++l) {
|
||||
@ -1790,7 +1790,7 @@ Dhcpv6Srv::extendIA_PD(const Pkt6Ptr& query,
|
||||
.arg(ia->getIAID());
|
||||
|
||||
// Now remove this address from the hints list.
|
||||
AllocEngine::HintType hint_type((*l)->addr_, (*l)->prefixlen_);
|
||||
AllocEngine::ResourceType hint_type((*l)->addr_, (*l)->prefixlen_);
|
||||
hints.erase(std::remove(hints.begin(), hints.end(), hint_type),
|
||||
hints.end());
|
||||
}
|
||||
@ -1802,7 +1802,7 @@ Dhcpv6Srv::extendIA_PD(const Pkt6Ptr& query,
|
||||
// zero lifetimes
|
||||
// Finally, if there are any addresses requested that we haven't dealt with
|
||||
// already, inform the client that he can't have them.
|
||||
for (AllocEngine::HintContainer::const_iterator prefix = hints.begin();
|
||||
for (AllocEngine::ResourceContainer::const_iterator prefix = hints.begin();
|
||||
prefix != hints.end(); ++prefix) {
|
||||
// Send the prefix with the zero lifetimes only if the prefix
|
||||
// contains non-zero value. A zero value indicates that the hint was
|
||||
|
@ -358,8 +358,8 @@ AllocEngine::ClientContext6::ClientContext6(const Subnet6Ptr& subnet,
|
||||
}
|
||||
|
||||
AllocEngine::ClientContext6::IAContext::IAContext()
|
||||
: iaid_(0), type_(Lease::TYPE_NA), hints_(), old_leases_(),
|
||||
changed_leases_(), ia_rsp_() {
|
||||
: iaid_(0), type_(Lease::TYPE_NA), hints_(), allocated_resources_(),
|
||||
old_leases_(), changed_leases_(), ia_rsp_() {
|
||||
}
|
||||
|
||||
void
|
||||
@ -369,6 +369,14 @@ IAContext::addHint(const asiolink::IOAddress& prefix,
|
||||
hints_.push_back(std::make_pair(prefix, prefix_len));
|
||||
}
|
||||
|
||||
void
|
||||
AllocEngine::ClientContext6::
|
||||
IAContext::addAllocatedResource(const asiolink::IOAddress& prefix,
|
||||
const uint8_t prefix_len) {
|
||||
allocated_resources_.push_back(std::make_pair(prefix, prefix_len));
|
||||
}
|
||||
|
||||
|
||||
void AllocEngine::findReservation(ClientContext6& ctx) {
|
||||
findReservationInternal(ctx, boost::bind(&HostMgr::get6,
|
||||
&HostMgr::instance(),
|
||||
|
@ -248,10 +248,10 @@ public:
|
||||
/// This is an entry that represents what the client had requested,
|
||||
/// either an address or a prefix. Prefix length is 128 for regular
|
||||
/// addresses.
|
||||
typedef std::pair<isc::asiolink::IOAddress, uint8_t> HintType;
|
||||
typedef std::pair<isc::asiolink::IOAddress, uint8_t> ResourceType;
|
||||
|
||||
/// @brief Container for client's hints.
|
||||
typedef std::vector<HintType> HintContainer;
|
||||
typedef std::vector<ResourceType> ResourceContainer;
|
||||
|
||||
/// @brief A tuple holding host identifier type and value.
|
||||
typedef std::pair<Host::IdentifierType, std::vector<uint8_t> > IdentifierPair;
|
||||
@ -351,7 +351,10 @@ public:
|
||||
///
|
||||
/// There will typically be just one address, but the protocol
|
||||
/// allows more than one address or prefix for each IA container.
|
||||
HintContainer hints_;
|
||||
ResourceContainer hints_;
|
||||
|
||||
/// @brief Holds addresses or prefixes allocated for this IA.
|
||||
ResourceContainer allocated_resources_;
|
||||
|
||||
/// @brief A pointer to any old leases that the client had before
|
||||
/// update but are no longer valid after the update/allocation.
|
||||
@ -386,6 +389,13 @@ public:
|
||||
void addHint(const asiolink::IOAddress& prefix,
|
||||
const uint8_t prefix_len = 128);
|
||||
|
||||
/// @brief Convenience method adding allocated prefix or address.
|
||||
///
|
||||
/// @param prefix Prefix or address.
|
||||
/// @param prefix_len Prefix length. Default is 128 for addresses.
|
||||
void addAllocatedResource(const asiolink::IOAddress& prefix,
|
||||
const uint8_t prefix_len = 128);
|
||||
|
||||
};
|
||||
|
||||
/// @brief Container holding IA specific contexts.
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2015-2016 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
|
||||
@ -20,6 +20,29 @@ namespace isc {
|
||||
namespace dhcp {
|
||||
namespace test {
|
||||
|
||||
// Test convenience method adding hints to IA context.
|
||||
TEST(ClientContext6Test, addHint) {
|
||||
AllocEngine::ClientContext6 ctx;
|
||||
ctx.currentIA().addHint(IOAddress("2001:db8:1::1"));
|
||||
ctx.currentIA().addHint(IOAddress("3000:1::"), 64);
|
||||
|
||||
ASSERT_EQ(2, ctx.currentIA().hints_.size());
|
||||
EXPECT_EQ("2001:db8:1::1", ctx.currentIA().hints_[0].first.toText());
|
||||
EXPECT_EQ("3000:1::", ctx.currentIA().hints_[1].first.toText());
|
||||
}
|
||||
|
||||
// Test convenience method adding allocated prefixes and addresses to
|
||||
// IA context.
|
||||
TEST(ClientContext6Test, addAllocatedResource) {
|
||||
AllocEngine::ClientContext6 ctx;
|
||||
ctx.currentIA().addAllocatedResource(IOAddress("2001:db8:1::1"));
|
||||
ctx.currentIA().addAllocatedResource(IOAddress("3000:1::"), 64);
|
||||
|
||||
ASSERT_EQ(2, ctx.currentIA().allocated_resources_.size());
|
||||
EXPECT_EQ("2001:db8:1::1", ctx.currentIA().allocated_resources_[0].first.toText());
|
||||
EXPECT_EQ("3000:1::", ctx.currentIA().allocated_resources_[1].first.toText());
|
||||
}
|
||||
|
||||
// This test checks if the v6 Allocation Engine can be instantiated, parses
|
||||
// parameters string and allocators are created.
|
||||
TEST_F(AllocEngine6Test, constructor) {
|
||||
@ -667,7 +690,7 @@ TEST_F(AllocEngine6Test, renewExtendLeaseLifetime) {
|
||||
AllocEngine engine(AllocEngine::ALLOC_ITERATIVE, 100);
|
||||
|
||||
// This is what the client will send in his renew message.
|
||||
AllocEngine::HintContainer hints;
|
||||
AllocEngine::ResourceContainer hints;
|
||||
hints.push_back(make_pair(IOAddress("2001:db8:1::15"), 128));
|
||||
|
||||
// Client should receive a lease.
|
||||
@ -700,7 +723,7 @@ TEST_F(AllocEngine6Test, renewExtendLeaseLifetimeForReservation) {
|
||||
AllocEngine engine(AllocEngine::ALLOC_ITERATIVE, 100);
|
||||
|
||||
// This is what the client will send in his renew message.
|
||||
AllocEngine::HintContainer hints;
|
||||
AllocEngine::ResourceContainer hints;
|
||||
hints.push_back(make_pair(IOAddress("2001:db8:1::15"), 128));
|
||||
|
||||
// Client should receive a lease.
|
||||
@ -1250,7 +1273,7 @@ TEST_F(AllocEngine6Test, addressRenewal) {
|
||||
ASSERT_EQ(1, leases.size());
|
||||
|
||||
// This is what the client will send in his renew message.
|
||||
AllocEngine::HintContainer hints;
|
||||
AllocEngine::ResourceContainer hints;
|
||||
hints.push_back(make_pair(leases[0]->addr_, 128));
|
||||
|
||||
Lease6Collection renewed = renewTest(engine, pool_, hints, true);
|
||||
@ -1281,7 +1304,7 @@ TEST_F(AllocEngine6Test, reservedAddressRenewal) {
|
||||
ASSERT_EQ("2001:db8:1::1c", leases[0]->addr_.toText());
|
||||
|
||||
// This is what the client will send in his renew message.
|
||||
AllocEngine::HintContainer hints;
|
||||
AllocEngine::ResourceContainer hints;
|
||||
hints.push_back(make_pair(leases[0]->addr_, 128));
|
||||
|
||||
Lease6Collection renewed = renewTest(engine, pool_, hints, true);
|
||||
@ -1417,7 +1440,7 @@ TEST_F(AllocEngine6Test, reservedAddressRenewChange) {
|
||||
ASSERT_NE("2001:db8:1::1c", leases[0]->addr_.toText());
|
||||
|
||||
// This is what the client will send in his renew message.
|
||||
AllocEngine::HintContainer hints;
|
||||
AllocEngine::ResourceContainer hints;
|
||||
hints.push_back(make_pair(leases[0]->addr_, 128));
|
||||
|
||||
// Create reservation for the client. This is in-pool reservation,
|
||||
@ -1441,7 +1464,7 @@ TEST_F(AllocEngine6Test, reservedAddressRenewReserved) {
|
||||
ASSERT_EQ(1, leases.size());
|
||||
|
||||
// This is what the client will send in his renew message.
|
||||
AllocEngine::HintContainer hints;
|
||||
AllocEngine::ResourceContainer hints;
|
||||
hints.push_back(make_pair(leases[0]->addr_, 128));
|
||||
|
||||
// Create reservation for this address, but for another client.
|
||||
|
@ -316,7 +316,7 @@ AllocEngine6Test::simpleAlloc6Test(const Pool6Ptr& pool, const IOAddress& hint,
|
||||
|
||||
Lease6Collection
|
||||
AllocEngine6Test::renewTest(AllocEngine& engine, const Pool6Ptr& pool,
|
||||
AllocEngine::HintContainer& hints,
|
||||
AllocEngine::ResourceContainer& hints,
|
||||
bool in_pool) {
|
||||
|
||||
Lease::Type type = pool->getType();
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2015-2016 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
|
||||
@ -260,7 +260,7 @@ public:
|
||||
/// @param in_pool specifies whether the lease is expected to be in pool
|
||||
/// @return allocated lease(s) (may be empty)
|
||||
Lease6Collection renewTest(AllocEngine& engine, const Pool6Ptr& pool,
|
||||
AllocEngine::HintContainer& hints,
|
||||
AllocEngine::ResourceContainer& hints,
|
||||
bool in_pool = true);
|
||||
|
||||
/// @brief Checks if the address allocation with a hint that is in range,
|
||||
|
Loading…
x
Reference in New Issue
Block a user