From: Marcin Siodelski Date: Wed, 23 Apr 2014 08:53:12 +0000 (+0200) Subject: [3148] Implemented getLeases6 methods which take lease type into account. X-Git-Tag: trac2406km_base~1^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=43fc427118e67f7609d4196f12c2b9f01ac835da;p=thirdparty%2Fkea.git [3148] Implemented getLeases6 methods which take lease type into account. --- diff --git a/src/lib/dhcpsrv/dhcpsrv_messages.mes b/src/lib/dhcpsrv/dhcpsrv_messages.mes index 76478cb409..cfcff517ca 100644 --- a/src/lib/dhcpsrv/dhcpsrv_messages.mes +++ b/src/lib/dhcpsrv/dhcpsrv_messages.mes @@ -236,7 +236,7 @@ address. A debug message issued when the server is attempting to obtain an IPv4 lease from the memory file database for the specified address. -% DHCPSRV_MEMFILE_GET_ADDR6 obtaining IPv6 lease for address %1 +% DHCPSRV_MEMFILE_GET_ADDR6 obtaining IPv6 lease for address %1 and lease type %2 A debug message issued when the server is attempting to obtain an IPv6 lease from the memory file database for the specified address. @@ -255,12 +255,12 @@ A debug message issued when the server is attempting to obtain a set of IPv4 leases from the memory file database for a client with the specified hardware address. -% DHCPSRV_MEMFILE_GET_IAID_DUID obtaining IPv6 leases for IAID %1 and DUID %2 +% DHCPSRV_MEMFILE_GET_IAID_DUID obtaining IPv6 leases for IAID %1 and DUID %2 and lease type %3 A debug message issued when the server is attempting to obtain a set of IPv6 lease from the memory file database for a client with the specified IAID (Identity Association ID) and DUID (DHCP Unique Identifier). -% DHCPSRV_MEMFILE_GET_IAID_SUBID_DUID obtaining IPv6 leases for IAID %1, Subnet ID %2 and DUID %3 +% DHCPSRV_MEMFILE_GET_IAID_SUBID_DUID obtaining IPv6 leases for IAID %1, Subnet ID %2, DUID %3 and lease type %4 A debug message issued when the server is attempting to obtain an IPv6 lease from the memory file database for a client with the specified IAID (Identity Association ID), Subnet ID and DUID (DHCP Unique Identifier). diff --git a/src/lib/dhcpsrv/memfile_lease_mgr.cc b/src/lib/dhcpsrv/memfile_lease_mgr.cc index 29a6fe6ca4..5fc4644e3d 100644 --- a/src/lib/dhcpsrv/memfile_lease_mgr.cc +++ b/src/lib/dhcpsrv/memfile_lease_mgr.cc @@ -235,13 +235,14 @@ Memfile_LeaseMgr::getLease4(const ClientId& client_id, } Lease6Ptr -Memfile_LeaseMgr::getLease6(Lease::Type /* not used yet */, +Memfile_LeaseMgr::getLease6(Lease::Type type, const isc::asiolink::IOAddress& addr) const { LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, - DHCPSRV_MEMFILE_GET_ADDR6).arg(addr.toText()); - + DHCPSRV_MEMFILE_GET_ADDR6) + .arg(addr.toText()) + .arg(Lease::typeToText(type)); Lease6Storage::iterator l = storage6_.find(addr); - if (l == storage6_.end()) { + if (l == storage6_.end() || !(*l) || ((*l)->type_ != type)) { return (Lease6Ptr()); } else { return (Lease6Ptr(new Lease6(**l))); @@ -249,42 +250,55 @@ Memfile_LeaseMgr::getLease6(Lease::Type /* not used yet */, } Lease6Collection -Memfile_LeaseMgr::getLeases6(Lease::Type /* not used yet */, +Memfile_LeaseMgr::getLeases6(Lease::Type type, const DUID& duid, uint32_t iaid) const { LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, - DHCPSRV_MEMFILE_GET_IAID_DUID).arg(iaid).arg(duid.toText()); + DHCPSRV_MEMFILE_GET_IAID_DUID) + .arg(iaid) + .arg(duid.toText()) + .arg(Lease::typeToText(type)); - /// @todo Not implemented. + // We are going to use index #1 of the multi index container. + typedef Lease6Storage::nth_index<1>::type SearchIndex; + // Get the index. + const SearchIndex& idx = storage6_.get<1>(); + // Try to get the lease using the DUID, IAID and lease type. + std::pair l = + idx.equal_range(boost::make_tuple(duid.getDuid(), iaid, type)); + Lease6Collection collection; + for(SearchIndex::iterator lease = l.first; lease != l.second; ++lease) { + collection.push_back(Lease6Ptr(new Lease6(**lease))); + } - return (Lease6Collection()); + return (collection); } Lease6Collection -Memfile_LeaseMgr::getLeases6(Lease::Type /* not used yet */, +Memfile_LeaseMgr::getLeases6(Lease::Type type, const DUID& duid, uint32_t iaid, SubnetID subnet_id) const { LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MEMFILE_GET_IAID_SUBID_DUID) - .arg(iaid).arg(subnet_id).arg(duid.toText()); + .arg(iaid) + .arg(subnet_id) + .arg(duid.toText()) + .arg(Lease::typeToText(type)); // We are going to use index #1 of the multi index container. - // We define SearchIndex locally in this function because - // currently only this function uses this index. typedef Lease6Storage::nth_index<1>::type SearchIndex; // Get the index. const SearchIndex& idx = storage6_.get<1>(); - // Try to get the lease using the DUID, IAID and Subnet ID. - SearchIndex::const_iterator lease = - idx.find(boost::make_tuple(duid.getDuid(), iaid, subnet_id)); - // Lease was not found. Return empty pointer. - if (lease == idx.end()) { - return (Lease6Collection()); + // Try to get the lease using the DUID, IAID and lease type. + std::pair l = + idx.equal_range(boost::make_tuple(duid.getDuid(), iaid, type)); + Lease6Collection collection; + for(SearchIndex::iterator lease = l.first; lease != l.second; ++lease) { + // Filter out the leases which subnet id doesn't match. + if((*lease)->subnet_id_ == subnet_id) { + collection.push_back(Lease6Ptr(new Lease6(**lease))); + } } - // Lease was found, return it to the caller. - /// @todo: allow multiple leases for a single duid+iaid+subnet_id tuple - Lease6Collection collection; - collection.push_back(Lease6Ptr(new Lease6(**lease))); return (collection); } diff --git a/src/lib/dhcpsrv/memfile_lease_mgr.h b/src/lib/dhcpsrv/memfile_lease_mgr.h index 31e738b11e..32e5349171 100644 --- a/src/lib/dhcpsrv/memfile_lease_mgr.h +++ b/src/lib/dhcpsrv/memfile_lease_mgr.h @@ -190,9 +190,8 @@ public: virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress& addr) const; - /// @brief Returns existing IPv6 lease for a given DUID+IA combination - /// - /// @todo Not implemented yet + /// @brief Returns existing IPv6 lease for a given DUID + IA + lease type + /// combination /// /// @param type specifies lease type: (NA, TA or PD) /// @param duid client DUID @@ -202,7 +201,8 @@ public: virtual Lease6Collection getLeases6(Lease::Type type, const DUID& duid, uint32_t iaid) const; - /// @brief Returns existing IPv6 lease for a given DUID/IA/subnet-id tuple + /// @brief Returns existing IPv6 lease for a given DUID + IA + subnet-id + + /// lease type combination. /// /// This function returns a copy of the lease. The modification in the /// return lease does not affect the instance held in the lease storage. @@ -214,7 +214,8 @@ public: /// /// @return lease collection (may be empty if no lease is found) virtual Lease6Collection getLeases6(Lease::Type type, const DUID& duid, - uint32_t iaid, SubnetID subnet_id) const; + uint32_t iaid, + SubnetID subnet_id) const; /// @brief Updates IPv4 lease. /// @@ -372,8 +373,6 @@ protected: /// will not be written to disk. /// /// @param u Universe (v4 or v6) - /// @param parameters Map holding parameters of the Lease Manager, passed to - /// the constructor. /// /// @return The location of the lease file that should be assigned to the /// lease_file4_ or lease_file6_, depending on the universe specified as an @@ -394,9 +393,9 @@ protected: >, // Specification of the second index starts here. - boost::multi_index::ordered_unique< + boost::multi_index::ordered_non_unique< // This is a composite index that will be used to search for - // the lease using three attributes: DUID, IAID, Subnet Id. + // the lease using three attributes: DUID, IAID and lease type. boost::multi_index::composite_key< Lease6, // The DUID can be retrieved from the Lease6 object using @@ -404,9 +403,9 @@ protected: boost::multi_index::const_mem_fun&, &Lease6::getDuidVector>, // The two other ingredients of this index are IAID and - // subnet id. + // lease type. boost::multi_index::member, - boost::multi_index::member + boost::multi_index::member > > > diff --git a/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc b/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc index 30a888443d..0f40957064 100644 --- a/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc @@ -319,7 +319,7 @@ TEST_F(MemfileLeaseMgrTest, basicLease6) { /// a combination of DUID and IAID. /// @todo: test disabled, because Memfile_LeaseMgr::getLeases6(Lease::Type, /// const DUID& duid, uint32_t iaid) const is not implemented yet. -TEST_F(MemfileLeaseMgrTest, DISABLED_getLeases6DuidIaid) { +TEST_F(MemfileLeaseMgrTest, getLeases6DuidIaid) { startBackend(V6); testGetLeases6DuidIaid(); } @@ -328,7 +328,7 @@ TEST_F(MemfileLeaseMgrTest, DISABLED_getLeases6DuidIaid) { /// @todo: test disabled, because Memfile_LeaseMgr::getLeases6(Lease::Type, /// const DUID& duid, uint32_t iaid) const is not implemented yet. -TEST_F(MemfileLeaseMgrTest, DISABLED_getLeases6DuidSize) { +TEST_F(MemfileLeaseMgrTest, getLeases6DuidSize) { startBackend(V6); testGetLeases6DuidSize(); } @@ -341,7 +341,7 @@ TEST_F(MemfileLeaseMgrTest, DISABLED_getLeases6DuidSize) { /// discriminate between the leases based on lease type alone. /// @todo: Disabled, because type parameter in Memfile_LeaseMgr::getLease6 /// (Lease::Type, const isc::asiolink::IOAddress& addr) const is not used. -TEST_F(MemfileLeaseMgrTest, DISABLED_lease6LeaseTypeCheck) { +TEST_F(MemfileLeaseMgrTest, lease6LeaseTypeCheck) { startBackend(V6); testLease6LeaseTypeCheck(); }