Commit 1a3fe2cd authored by Marcin Siodelski's avatar Marcin Siodelski
Browse files

[4320] Added container holding allocated addresses in IA context.

parent ea2e2ca8
......@@ -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.
......
// 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();
......
// 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,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment