From: Marcin Siodelski Date: Mon, 6 Jun 2016 10:10:21 +0000 (+0200) Subject: [4320] Added container holding allocated addresses in IA context. X-Git-Tag: fdxhook_base~3^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a3fe2cd3a10df6e35d93239675f447a127cdcd9;p=thirdparty%2Fkea.git [4320] Added container holding allocated addresses in IA context. --- diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index d32fe9586b..a8ee72155e 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -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 diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index 84961fd692..01a33be064 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -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(), diff --git a/src/lib/dhcpsrv/alloc_engine.h b/src/lib/dhcpsrv/alloc_engine.h index 6c749f3f09..85d18a151e 100644 --- a/src/lib/dhcpsrv/alloc_engine.h +++ b/src/lib/dhcpsrv/alloc_engine.h @@ -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 HintType; + typedef std::pair ResourceType; /// @brief Container for client's hints. - typedef std::vector HintContainer; + typedef std::vector ResourceContainer; /// @brief A tuple holding host identifier type and value. typedef std::pair > 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. diff --git a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc index 4db57d7a39..22f49f004a 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc @@ -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. diff --git a/src/lib/dhcpsrv/tests/alloc_engine_utils.cc b/src/lib/dhcpsrv/tests/alloc_engine_utils.cc index 224a662c83..5b41bb9d3b 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine_utils.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine_utils.cc @@ -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(); diff --git a/src/lib/dhcpsrv/tests/alloc_engine_utils.h b/src/lib/dhcpsrv/tests/alloc_engine_utils.h index cbedaeff04..f5dbe2c2d1 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine_utils.h +++ b/src/lib/dhcpsrv/tests/alloc_engine_utils.h @@ -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,