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
|
// We have a lease! Let's wrap its content into IA_PD option
|
||||||
// with IAADDR suboption.
|
// 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)
|
DHCP6_PD_LEASE_ADVERT : DHCP6_PD_LEASE_ALLOC)
|
||||||
.arg(query->getLabel())
|
.arg(query->getLabel())
|
||||||
.arg((*l)->addr_.toText())
|
.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
|
// cause of that failure. The only thing left is to insert
|
||||||
// status code to pass the sad news to the client.
|
// 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)
|
DHCP6_PD_LEASE_ADVERT_FAIL : DHCP6_PD_LEASE_ALLOC_FAIL)
|
||||||
.arg(query->getLabel())
|
.arg(query->getLabel())
|
||||||
.arg(ia->getIAID());
|
.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
|
// 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
|
// don't want to remove them from the context, so we need to copy them
|
||||||
// into temporary container.
|
// 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 all leases we have now, add the IAADDR with non-zero lifetimes.
|
||||||
for (Lease6Collection::const_iterator l = leases.begin(); l != leases.end(); ++l) {
|
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());
|
.arg(ia_rsp->getIAID());
|
||||||
|
|
||||||
// Now remove this address from the hints list.
|
// 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.erase(std::remove(hints.begin(), hints.end(), hint_type),
|
||||||
hints.end());
|
hints.end());
|
||||||
}
|
}
|
||||||
@ -1641,7 +1641,7 @@ Dhcpv6Srv::extendIA_NA(const Pkt6Ptr& query, const Pkt6Ptr& answer,
|
|||||||
ia_rsp->addOption(iaaddr);
|
ia_rsp->addOption(iaaddr);
|
||||||
|
|
||||||
// Now remove this address from the hints list.
|
// 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());
|
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
|
// 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
|
// Finally, if there are any addresses requested that we haven't dealt with
|
||||||
// already, inform the client that he can't have them.
|
// 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) {
|
hint != hints.end(); ++hint) {
|
||||||
Option6IAAddrPtr iaaddr(new Option6IAAddr(D6O_IAADDR,
|
Option6IAAddrPtr iaaddr(new Option6IAAddr(D6O_IAADDR,
|
||||||
hint->first, 0, 0));
|
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
|
// 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
|
// don't want to remove them from the context, so we need to copy them
|
||||||
// into temporary container.
|
// 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 all the leases we have now, add the IAPPREFIX with non-zero lifetimes
|
||||||
for (Lease6Collection::const_iterator l = leases.begin(); l != leases.end(); ++l) {
|
for (Lease6Collection::const_iterator l = leases.begin(); l != leases.end(); ++l) {
|
||||||
@ -1790,7 +1790,7 @@ Dhcpv6Srv::extendIA_PD(const Pkt6Ptr& query,
|
|||||||
.arg(ia->getIAID());
|
.arg(ia->getIAID());
|
||||||
|
|
||||||
// Now remove this address from the hints list.
|
// 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.erase(std::remove(hints.begin(), hints.end(), hint_type),
|
||||||
hints.end());
|
hints.end());
|
||||||
}
|
}
|
||||||
@ -1802,7 +1802,7 @@ Dhcpv6Srv::extendIA_PD(const Pkt6Ptr& query,
|
|||||||
// zero lifetimes
|
// zero lifetimes
|
||||||
// Finally, if there are any addresses requested that we haven't dealt with
|
// Finally, if there are any addresses requested that we haven't dealt with
|
||||||
// already, inform the client that he can't have them.
|
// 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) {
|
prefix != hints.end(); ++prefix) {
|
||||||
// Send the prefix with the zero lifetimes only if the prefix
|
// Send the prefix with the zero lifetimes only if the prefix
|
||||||
// contains non-zero value. A zero value indicates that the hint was
|
// 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()
|
AllocEngine::ClientContext6::IAContext::IAContext()
|
||||||
: iaid_(0), type_(Lease::TYPE_NA), hints_(), old_leases_(),
|
: iaid_(0), type_(Lease::TYPE_NA), hints_(), allocated_resources_(),
|
||||||
changed_leases_(), ia_rsp_() {
|
old_leases_(), changed_leases_(), ia_rsp_() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -369,6 +369,14 @@ IAContext::addHint(const asiolink::IOAddress& prefix,
|
|||||||
hints_.push_back(std::make_pair(prefix, prefix_len));
|
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) {
|
void AllocEngine::findReservation(ClientContext6& ctx) {
|
||||||
findReservationInternal(ctx, boost::bind(&HostMgr::get6,
|
findReservationInternal(ctx, boost::bind(&HostMgr::get6,
|
||||||
&HostMgr::instance(),
|
&HostMgr::instance(),
|
||||||
|
@ -248,10 +248,10 @@ public:
|
|||||||
/// This is an entry that represents what the client had requested,
|
/// This is an entry that represents what the client had requested,
|
||||||
/// either an address or a prefix. Prefix length is 128 for regular
|
/// either an address or a prefix. Prefix length is 128 for regular
|
||||||
/// addresses.
|
/// 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.
|
/// @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.
|
/// @brief A tuple holding host identifier type and value.
|
||||||
typedef std::pair<Host::IdentifierType, std::vector<uint8_t> > IdentifierPair;
|
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
|
/// There will typically be just one address, but the protocol
|
||||||
/// allows more than one address or prefix for each IA container.
|
/// 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
|
/// @brief A pointer to any old leases that the client had before
|
||||||
/// update but are no longer valid after the update/allocation.
|
/// update but are no longer valid after the update/allocation.
|
||||||
@ -386,6 +389,13 @@ public:
|
|||||||
void addHint(const asiolink::IOAddress& prefix,
|
void addHint(const asiolink::IOAddress& prefix,
|
||||||
const uint8_t prefix_len = 128);
|
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.
|
/// @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
|
// 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
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
@ -20,6 +20,29 @@ namespace isc {
|
|||||||
namespace dhcp {
|
namespace dhcp {
|
||||||
namespace test {
|
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
|
// This test checks if the v6 Allocation Engine can be instantiated, parses
|
||||||
// parameters string and allocators are created.
|
// parameters string and allocators are created.
|
||||||
TEST_F(AllocEngine6Test, constructor) {
|
TEST_F(AllocEngine6Test, constructor) {
|
||||||
@ -667,7 +690,7 @@ TEST_F(AllocEngine6Test, renewExtendLeaseLifetime) {
|
|||||||
AllocEngine engine(AllocEngine::ALLOC_ITERATIVE, 100);
|
AllocEngine engine(AllocEngine::ALLOC_ITERATIVE, 100);
|
||||||
|
|
||||||
// This is what the client will send in his renew message.
|
// 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));
|
hints.push_back(make_pair(IOAddress("2001:db8:1::15"), 128));
|
||||||
|
|
||||||
// Client should receive a lease.
|
// Client should receive a lease.
|
||||||
@ -700,7 +723,7 @@ TEST_F(AllocEngine6Test, renewExtendLeaseLifetimeForReservation) {
|
|||||||
AllocEngine engine(AllocEngine::ALLOC_ITERATIVE, 100);
|
AllocEngine engine(AllocEngine::ALLOC_ITERATIVE, 100);
|
||||||
|
|
||||||
// This is what the client will send in his renew message.
|
// 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));
|
hints.push_back(make_pair(IOAddress("2001:db8:1::15"), 128));
|
||||||
|
|
||||||
// Client should receive a lease.
|
// Client should receive a lease.
|
||||||
@ -1250,7 +1273,7 @@ TEST_F(AllocEngine6Test, addressRenewal) {
|
|||||||
ASSERT_EQ(1, leases.size());
|
ASSERT_EQ(1, leases.size());
|
||||||
|
|
||||||
// This is what the client will send in his renew message.
|
// 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));
|
hints.push_back(make_pair(leases[0]->addr_, 128));
|
||||||
|
|
||||||
Lease6Collection renewed = renewTest(engine, pool_, hints, true);
|
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());
|
ASSERT_EQ("2001:db8:1::1c", leases[0]->addr_.toText());
|
||||||
|
|
||||||
// This is what the client will send in his renew message.
|
// 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));
|
hints.push_back(make_pair(leases[0]->addr_, 128));
|
||||||
|
|
||||||
Lease6Collection renewed = renewTest(engine, pool_, hints, true);
|
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());
|
ASSERT_NE("2001:db8:1::1c", leases[0]->addr_.toText());
|
||||||
|
|
||||||
// This is what the client will send in his renew message.
|
// 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));
|
hints.push_back(make_pair(leases[0]->addr_, 128));
|
||||||
|
|
||||||
// Create reservation for the client. This is in-pool reservation,
|
// Create reservation for the client. This is in-pool reservation,
|
||||||
@ -1441,7 +1464,7 @@ TEST_F(AllocEngine6Test, reservedAddressRenewReserved) {
|
|||||||
ASSERT_EQ(1, leases.size());
|
ASSERT_EQ(1, leases.size());
|
||||||
|
|
||||||
// This is what the client will send in his renew message.
|
// 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));
|
hints.push_back(make_pair(leases[0]->addr_, 128));
|
||||||
|
|
||||||
// Create reservation for this address, but for another client.
|
// Create reservation for this address, but for another client.
|
||||||
|
@ -316,7 +316,7 @@ AllocEngine6Test::simpleAlloc6Test(const Pool6Ptr& pool, const IOAddress& hint,
|
|||||||
|
|
||||||
Lease6Collection
|
Lease6Collection
|
||||||
AllocEngine6Test::renewTest(AllocEngine& engine, const Pool6Ptr& pool,
|
AllocEngine6Test::renewTest(AllocEngine& engine, const Pool6Ptr& pool,
|
||||||
AllocEngine::HintContainer& hints,
|
AllocEngine::ResourceContainer& hints,
|
||||||
bool in_pool) {
|
bool in_pool) {
|
||||||
|
|
||||||
Lease::Type type = pool->getType();
|
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
|
// 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
|
// 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
|
/// @param in_pool specifies whether the lease is expected to be in pool
|
||||||
/// @return allocated lease(s) (may be empty)
|
/// @return allocated lease(s) (may be empty)
|
||||||
Lease6Collection renewTest(AllocEngine& engine, const Pool6Ptr& pool,
|
Lease6Collection renewTest(AllocEngine& engine, const Pool6Ptr& pool,
|
||||||
AllocEngine::HintContainer& hints,
|
AllocEngine::ResourceContainer& hints,
|
||||||
bool in_pool = true);
|
bool in_pool = true);
|
||||||
|
|
||||||
/// @brief Checks if the address allocation with a hint that is in range,
|
/// @brief Checks if the address allocation with a hint that is in range,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user