Commit 338d7d58 authored by Marcin Siodelski's avatar Marcin Siodelski

[2940] Implemented Lease6::getDuidVector function and remove key extractors

parent 3328fb38
...@@ -46,7 +46,7 @@ DUID::DUID(const uint8_t* data, size_t len) { ...@@ -46,7 +46,7 @@ DUID::DUID(const uint8_t* data, size_t len) {
duid_ = std::vector<uint8_t>(data, data + len); duid_ = std::vector<uint8_t>(data, data + len);
} }
std::vector<uint8_t> DUID::getDuid() const { const std::vector<uint8_t>& DUID::getDuid() const {
return (duid_); return (duid_);
} }
......
...@@ -58,12 +58,13 @@ class DUID { ...@@ -58,12 +58,13 @@ class DUID {
/// @brief Returns a const reference to the actual DUID value /// @brief Returns a const reference to the actual DUID value
/// ///
/// Note: For safety reasons, this method returns a copy of data as /// @warning Since this function returns a reference to the vector (not a
/// otherwise the reference would be only valid as long as the object that /// copy) the returned object must be used with caution because it remains
/// returned it. In any case, this method should be used only sporadically. /// valid only for the time period when the object which returned it is
/// If there are frequent uses, we must implement some other method /// valid.
/// (e.g. storeSelf()) that will avoid data copying. ///
std::vector<uint8_t> getDuid() const; /// @return A reference to a vector holding a DUID.
const std::vector<uint8_t>& getDuid() const;
/// @brief Returns the DUID type /// @brief Returns the DUID type
DUIDType getType() const; DUIDType getType() const;
...@@ -122,6 +123,8 @@ public: ...@@ -122,6 +123,8 @@ public:
/// copy) the returned object must be used with caution because it remains /// copy) the returned object must be used with caution because it remains
/// valid only for the time period when the object which returned it is /// valid only for the time period when the object which returned it is
/// valid. /// valid.
///
/// @return A reference to a vector holding a client identifier.
const std::vector<uint8_t>& getClientId() const; const std::vector<uint8_t>& getClientId() const;
/// @brief Returns textual representation of a DUID (e.g. 00:01:02:03:ff) /// @brief Returns textual representation of a DUID (e.g. 00:01:02:03:ff)
......
...@@ -139,6 +139,16 @@ Lease6::Lease6(Type type, const isc::asiolink::IOAddress& addr, ...@@ -139,6 +139,16 @@ Lease6::Lease6(Type type, const isc::asiolink::IOAddress& addr,
cltt_ = time(NULL); cltt_ = time(NULL);
} }
const std::vector<uint8_t>&
Lease6::getDuidVector() const {
if (!duid_) {
static std::vector<uint8_t> empty_vec;
return (empty_vec);
}
return (duid_->getDuid());
}
std::string std::string
Lease6::toText() const { Lease6::toText() const {
ostringstream stream; ostringstream stream;
......
...@@ -331,6 +331,16 @@ struct Lease6 : public Lease { ...@@ -331,6 +331,16 @@ struct Lease6 : public Lease {
type_(TYPE_NA) { type_(TYPE_NA) {
} }
/// @brief Returns a reference to a vector representing a DUID.
///
/// @warning Since the function returns the reference to a vector (not a
/// copy), the returned object should be used with caution because it will
/// remain valid only for the period of time when an object which returned
/// it exists.
///
/// @return A reference to a vector holding a DUID.
const std::vector<uint8_t>& getDuidVector() const;
/// @brief Compare two leases for equality /// @brief Compare two leases for equality
/// ///
/// @param other lease6 object with which to compare /// @param other lease6 object with which to compare
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#define MEMFILE_LEASE_MGR_H #define MEMFILE_LEASE_MGR_H
#include <dhcp/hwaddr.h> #include <dhcp/hwaddr.h>
#include <dhcpsrv/key_from_key.h>
#include <dhcpsrv/lease_mgr.h> #include <dhcpsrv/lease_mgr.h>
#include <boost/multi_index/indexed_by.hpp> #include <boost/multi_index/indexed_by.hpp>
...@@ -267,20 +266,10 @@ protected: ...@@ -267,20 +266,10 @@ protected:
// the lease using three attributes: DUID, IAID, Subnet Id. // the lease using three attributes: DUID, IAID, Subnet Id.
boost::multi_index::composite_key< boost::multi_index::composite_key<
Lease6, Lease6,
// The DUID value can't be directly accessed from the Lease6 // The DUID can be retrieved from the Lease6 object using
// object because it is wrapped with the DUID object (actually // a getDuidVector const function.
// pointer to this object). Therefore we need to use boost::multi_index::const_mem_fun<Lease6, const std::vector<uint8_t>&,
// KeyFromKeyExtractor class to extract the DUID value from &Lease6::getDuidVector>,
// this cascaded structure.
KeyFromKeyExtractor<
// The value of the DUID is accessed by the getDuid() method
// from the DUID object.
boost::multi_index::const_mem_fun<DUID, std::vector<uint8_t>,
&DUID::getDuid>,
// The DUID object is stored in the duid_ member of the
// Lease6 object.
boost::multi_index::member<Lease6, DuidPtr, &Lease6::duid_>
>,
// The two other ingredients of this index are IAID and // The two other ingredients of this index are IAID and
// subnet id. // subnet id.
boost::multi_index::member<Lease6, uint32_t, &Lease6::iaid_>, boost::multi_index::member<Lease6, uint32_t, &Lease6::iaid_>,
...@@ -330,6 +319,8 @@ protected: ...@@ -330,6 +319,8 @@ protected:
// lease: client id and subnet id. // lease: client id and subnet id.
boost::multi_index::composite_key< boost::multi_index::composite_key<
Lease4, Lease4,
// The client id can be retrieved from the Lease4 object by
// calling getClientIdVector const function.
boost::multi_index::const_mem_fun<Lease4, const std::vector<uint8_t>&, boost::multi_index::const_mem_fun<Lease4, const std::vector<uint8_t>&,
&Lease4::getClientIdVector>, &Lease4::getClientIdVector>,
// The subnet id is accessed through the subnet_id_ member. // The subnet id is accessed through the subnet_id_ member.
...@@ -343,6 +334,8 @@ protected: ...@@ -343,6 +334,8 @@ protected:
// lease: client id and subnet id. // lease: client id and subnet id.
boost::multi_index::composite_key< boost::multi_index::composite_key<
Lease4, Lease4,
// The client id can be retrieved from the Lease4 object by
// calling getClientIdVector const function.
boost::multi_index::const_mem_fun<Lease4, const std::vector<uint8_t>&, boost::multi_index::const_mem_fun<Lease4, const std::vector<uint8_t>&,
&Lease4::getClientIdVector>, &Lease4::getClientIdVector>,
// The hardware address is held in the hwaddr_ member of the // The hardware address is held in the hwaddr_ member of the
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
// PERFORMANCE OF THIS SOFTWARE. // PERFORMANCE OF THIS SOFTWARE.
#include <config.h> #include <config.h>
#include <dhcp/duid.h>
#include <dhcpsrv/lease.h> #include <dhcpsrv/lease.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <vector> #include <vector>
...@@ -22,8 +23,9 @@ using namespace isc::dhcp; ...@@ -22,8 +23,9 @@ using namespace isc::dhcp;
namespace { namespace {
// @todo Currently this file contains a single test. Other tests for Lease // @todo Currently this file contains tests for new functions which return DUID
// objects must be implemented. See http://bind10.isc.org/ticket/3240. // or client identifier. Other tests for Lease objects must be implemented.
// See http://bind10.isc.org/ticket/3240.
// Verify that the client id can be returned as a vector object and if client // Verify that the client id can be returned as a vector object and if client
// id is NULL the empty vector is returned. // id is NULL the empty vector is returned.
...@@ -45,5 +47,25 @@ TEST(Lease4Test, getClientIdVector) { ...@@ -45,5 +47,25 @@ TEST(Lease4Test, getClientIdVector) {
EXPECT_TRUE(returned_vec == client_id_vec); EXPECT_TRUE(returned_vec == client_id_vec);
} }
// Verify that the DUID can be returned as a vector object and if DUID is NULL
// the empty vector is returned.
TEST(Lease6Test, getDuidVector) {
// Create a lease.
Lease6 lease;
// By default, the lease should have client id set to NULL. If it doesn't,
// continuing the test makes no sense.
ASSERT_FALSE(lease.duid_);
// When client id is NULL the vector returned should be empty.
EXPECT_TRUE(lease.getDuidVector().empty());
// Now, let's set the non NULL DUID. Fill it with the 8 bytes, each
// holding a value of 0x42.
std::vector<uint8_t> duid_vec(8, 0x42);
lease.duid_ = DuidPtr(new DUID(duid_vec));
// Check that the returned vector, encapsulating DUID is equal to
// the one that has been used to set the DUID for the lease.
std::vector<uint8_t> returned_vec = lease.getDuidVector();
EXPECT_TRUE(returned_vec == duid_vec);
}
}; // end of anonymous namespace }; // end of anonymous namespace
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