From: Marcin Siodelski Date: Wed, 8 Jun 2016 11:06:13 +0000 (+0200) Subject: [4321] Test DHCPv6 client can send multiple IAs. X-Git-Tag: trac4551_base~29^2~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fb8666ba0bace10952eb387326207f327b2557ef;p=thirdparty%2Fkea.git [4321] Test DHCPv6 client can send multiple IAs. --- diff --git a/src/bin/dhcp6/tests/decline_unittest.cc b/src/bin/dhcp6/tests/decline_unittest.cc index 258b0055f7..c2efa86d00 100644 --- a/src/bin/dhcp6/tests/decline_unittest.cc +++ b/src/bin/dhcp6/tests/decline_unittest.cc @@ -133,7 +133,8 @@ Dhcpv6SrvTest::acquireAndDecline(Dhcp6Client& client, break; case NO_IA: // Tell the client to not include IA_NA at all - client.useNA(false); + client.config_.clear(); + client.clearRequestedIAs(); } // Use the second duid diff --git a/src/bin/dhcp6/tests/dhcp6_client.cc b/src/bin/dhcp6/tests/dhcp6_client.cc index 54ba4d7459..ab6314748c 100644 --- a/src/bin/dhcp6/tests/dhcp6_client.cc +++ b/src/bin/dhcp6/tests/dhcp6_client.cc @@ -77,17 +77,12 @@ Dhcp6Client::Dhcp6Client() : link_local_("fe80::3a60:77ff:fed5:cdef"), iface_name_("eth0"), srv_(boost::shared_ptr(new NakedDhcpv6Srv(0))), - use_na_(false), - use_pd_(false), use_relay_(false), use_oro_(false), use_client_id_(true), use_rapid_commit_(false), - address_hint_(), - prefix_hint_(), + client_ias_(), fqdn_(), - na_iaid_(1234), - pd_iaid_(5678), include_address_(true) { } @@ -99,17 +94,12 @@ Dhcp6Client::Dhcp6Client(boost::shared_ptr& srv) : link_local_("fe80::3a60:77ff:fed5:cdef"), iface_name_("eth0"), srv_(srv), - use_na_(false), - use_pd_(false), use_relay_(false), use_oro_(false), use_client_id_(true), use_rapid_commit_(false), - address_hint_(), - prefix_hint_(), + client_ias_(), fqdn_(), - na_iaid_(1234), - pd_iaid_(5678), include_address_(true) { } @@ -240,52 +230,64 @@ Dhcp6Client::appendFQDN() { void Dhcp6Client::appendRequestedIAs(const Pkt6Ptr& query) const { - if (use_na_) { - conditionallyAppendRequestedIA(query, D6O_IA_NA, na_iaid_); - } - - if (use_pd_) { - conditionallyAppendRequestedIA(query, D6O_IA_PD, pd_iaid_); - } -} - -void -Dhcp6Client::conditionallyAppendRequestedIA(const Pkt6Ptr& query, - const uint8_t ia_type, - const uint32_t iaid) const { - // Get existing options of the specified type. - OptionCollection options = query->getOptions(ia_type); - std::pair option_pair; - - // Check if the option we want to add is already present. - BOOST_FOREACH(option_pair, options) { - Option6IAPtr ia = boost::dynamic_pointer_cast(option_pair.second); - // This shouldn't happen. - if (!ia) { - isc_throw(Unexpected, "Dhcp6Client: IA option has an invalid C++ type;" - " this is a programming issue"); + BOOST_FOREACH(const ClientIA& ia, client_ias_) { + OptionCollection options = query->getOptions(ia.type_ == Lease::TYPE_NA ? + D6O_IA_NA : D6O_IA_PD); + std::pair option_pair; + Option6IAPtr existing_ia; + BOOST_FOREACH(option_pair, options) { + Option6IAPtr ia_opt = boost::dynamic_pointer_cast(option_pair.second); + // This shouldn't happen. + if (!ia_opt) { + isc_throw(Unexpected, "Dhcp6Client: IA option has an invalid C++ type;" + " this is a programming issue"); + } + if (ia_opt->getIAID() == ia.iaid_) { + existing_ia = ia_opt; + } } - // There is an option of the specific type already. If it has our - // IAID we return here, because we don't want to duplicate the IA. - // If IAID is different, we check other existing IAs. - if (ia->getIAID() == iaid) { - return; + if (!existing_ia) { + existing_ia.reset(new Option6IA(ia.type_ == Lease::TYPE_NA ? + D6O_IA_NA : D6O_IA_PD, ia.iaid_)); + query->addOption(existing_ia); } - } - // If we're here, it means that there is no instance of our IA yet. - Option6IAPtr requested_ia(new Option6IA(ia_type, iaid)); - // Add prefix hint if specified. - if (prefix_hint_ && (ia_type == D6O_IA_PD)) { - requested_ia->addOption(prefix_hint_); + bool option_exists = false; + if ((ia.type_ == Lease::TYPE_NA) && !ia.prefix_.isV6Zero()) { + Option6IAAddrPtr ia_addr(new Option6IAAddr(D6O_IAADDR, ia.prefix_, + 0, 0)); + BOOST_FOREACH(option_pair, existing_ia->getOptions()) { + Option6IAAddrPtr existing_addr = boost::dynamic_pointer_cast< + Option6IAAddr>(option_pair.second); + if (existing_addr && (existing_addr->getAddress() == ia.prefix_)) { + option_exists = true; + } + } - } else if (address_hint_ && (ia_type == D6O_IA_NA)) { - requested_ia->addOption(address_hint_); - } + if (!option_exists) { + existing_ia->addOption(ia_addr); + } - query->addOption(requested_ia); -} + } else if ((ia.type_ == Lease::TYPE_PD) && (!ia.prefix_.isV6Zero() || + (ia.prefix_len_ > 0))) { + Option6IAPrefixPtr ia_prefix(new Option6IAPrefix(D6O_IAPREFIX, ia.prefix_, + ia.prefix_len_, + 0, 0)); + BOOST_FOREACH(option_pair, existing_ia->getOptions()) { + Option6IAPrefixPtr existing_prefix = boost::dynamic_pointer_cast< + Option6IAPrefix>(option_pair.second); + if (existing_prefix && (existing_prefix->getAddress() == ia.prefix_) && + existing_prefix->getLength()) { + option_exists = true; + } + } + if (!option_exists) { + existing_ia->addOption(ia_prefix); + } + } + } +} void Dhcp6Client::copyIAs(const Pkt6Ptr& source, const Pkt6Ptr& dest) { @@ -451,21 +453,7 @@ Dhcp6Client::doInfRequest() { // IA_NA, IA_TA and IA_PD options are not allowed in INF-REQUEST, // but hey! Let's test it. - if (use_na_) { - // Insert IA_NA option. - context_.query_->addOption(Option6IAPtr(new Option6IA(D6O_IA_NA, - na_iaid_))); - } - - // IA-PD is also not allowed. So it may be useful in testing, too. - if (use_pd_) { - // Insert IA_PD option. - Option6IAPtr ia(new Option6IA(D6O_IA_PD, pd_iaid_)); - if (prefix_hint_) { - ia->addOption(prefix_hint_); - } - context_.query_->addOption(ia); - } + appendRequestedIAs(context_.query_); sendMsg(context_.query_); context_.response_ = receiveOneMsg(); @@ -556,10 +544,10 @@ void Dhcp6Client::generateIAFromLeases(const Pkt6Ptr& query) { /// @todo: add support for IAPREFIX here. - if (!use_na_) { +/* if (!use_na_) { // If we're told to not use IA_NA at all, there's nothing to be done here return; - } + } */ for (std::vector::const_iterator lease = config_.leases_.begin(); lease != config_.leases_.end(); ++lease) { @@ -737,20 +725,33 @@ Dhcp6Client::sendMsg(const Pkt6Ptr& msg) { srv_->run(); } +/*void +Dhcp6Client::useNA(const bool use, const uint32_t iaid) { + use_na_ = use; + client_ias_.push_back(ClientIA(Lease::TYPE_NA, iaid, + asiolink::IOAddress::IPV6_ZERO_ADDRESS(), + 0)); + na_iaid_ = iaid; +} */ + void -Dhcp6Client::useHint(const uint32_t pref_lft, const uint32_t valid_lft, - const std::string& address) { - address_hint_.reset(new Option6IAAddr(D6O_IAADDR, - asiolink::IOAddress(address), - pref_lft, valid_lft)); +Dhcp6Client::useNA(const uint32_t iaid, const asiolink::IOAddress& address) { + client_ias_.push_back(ClientIA(Lease::TYPE_NA, iaid, address, 128)); } +/*void +Dhcp6Client::usePD(const bool use, const uint32_t iaid) { + use_pd_ = use; + client_ias_.push_back(ClientIA(Lease::TYPE_PD, iaid, + asiolink::IOAddress::IPV6_ZERO_ADDRESS(), + 0)); + pd_iaid_ = iaid; +}*/ + void -Dhcp6Client::useHint(const uint32_t pref_lft, const uint32_t valid_lft, - const uint8_t len, const std::string& prefix) { - prefix_hint_.reset(new Option6IAPrefix(D6O_IAPREFIX, - asiolink::IOAddress(prefix), - len, pref_lft, valid_lft)); +Dhcp6Client::usePD(const uint32_t iaid,const asiolink::IOAddress& prefix, + const uint8_t prefix_len) { + client_ias_.push_back(ClientIA(Lease::TYPE_PD, iaid, prefix, prefix_len)); } void diff --git a/src/bin/dhcp6/tests/dhcp6_client.h b/src/bin/dhcp6/tests/dhcp6_client.h index 3bf97d8389..ea1f40c535 100644 --- a/src/bin/dhcp6/tests/dhcp6_client.h +++ b/src/bin/dhcp6/tests/dhcp6_client.h @@ -11,9 +11,11 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -142,6 +144,27 @@ public: Pkt6Ptr response_; }; + /// @brief Structure holding information to be placed in client's IA. + struct ClientIA { + Lease::Type type_; ///< IA type + uint32_t iaid_; ///< IAID + asiolink::IOAddress prefix_; ///< prefix or address + uint8_t prefix_len_; ///< prefix length + + /// @brief Constructor. + /// + /// @param type IA type. + /// @param iaid IAID. + /// @param prefix Address or prefix. + /// @param prefix_len Prefix length. + ClientIA(const Lease::Type& type, const uint32_t iaid, + const asiolink::IOAddress& prefix, + const uint8_t prefix_len) + : type_(type), iaid_(iaid), prefix_(prefix), + prefix_len_(prefix_len) { + } + }; + /// @brief Creates a new client. /// /// This constructor initializes the class members to default values: @@ -419,34 +442,17 @@ public: link_local_ = link_local; } - /// @brief Set an address hint to be sent to a server. - /// - /// @param pref_lft Preferred lifetime. - /// @param valid_lft Valid lifetime. - /// @param address Address for which the client has a preference. - void useHint(const uint32_t pref_lft, const uint32_t valid_lft, - const std::string& address); - - /// @brief Sets a prefix hint to be sent to a server. - /// - /// @param pref_lft Preferred lifetime. - /// @param valid_lft Valid lifetime. - /// @param len Prefix length. - /// @param prefix Prefix for which the client has a preference. - void useHint(const uint32_t pref_lft, const uint32_t valid_lft, - const uint8_t len, const std::string& prefix); - /// @brief Place IA_NA options to request address assignment. /// /// This function configures the client to place IA_NA options in its /// Solicit messages to request the IPv6 address assignment. /// /// @param iaid IAID to be used in the IA_NA. - void useNA(const uint32_t iaid) { +/* void useNA(const uint32_t iaid) { useNA(true, iaid); - } + } */ - /// @brief Place IA_NA options to request address assignment. +/* /// @brief Place IA_NA options to request address assignment. /// /// This function configures the client to place IA_NA options in its /// Solicit messages to request the IPv6 address assignment. @@ -454,10 +460,7 @@ public: /// @param use Parameter which 'true' value indicates that client should /// request address assignment. /// @param iaid IAID to be used in the IA_NA. - void useNA(const bool use = true, const uint32_t iaid = 1234) { - use_na_ = use; - na_iaid_ = iaid; - } + void useNA(const bool use = true, const uint32_t iaid = 1234); */ /// @brief Place IA_PD options to request address assignment. /// @@ -465,9 +468,9 @@ public: /// Solicit messages to request the IPv6 address assignment. /// /// @param iaid IAID to be used in the IA_PD. - void usePD(const uint32_t iaid) { +/* void usePD(const uint32_t iaid) { usePD(true, iaid); - } + } */ /// @brief Place IA_PD options to request prefix assignment. /// @@ -477,9 +480,18 @@ public: /// @param use Parameter which 'true' value indicates that client should /// request prefix assignment. /// @param iaid IAID to be used in the IA_NA. - void usePD(const bool use = true, const uint32_t iaid = 5678) { - use_pd_ = use; - pd_iaid_ = iaid; +// void usePD(const bool use = true, const uint32_t iaid = 5678); + + void useNA(const uint32_t iaid = 1234, const asiolink::IOAddress& address = + asiolink::IOAddress::IPV6_ZERO_ADDRESS()); + + void usePD(const uint32_t iaid = 5678, const asiolink::IOAddress& prefix = + asiolink::IOAddress::IPV6_ZERO_ADDRESS(), + const uint8_t prefix_len = 0); + + /// @brief Removes requested IAs. + void clearRequestedIAs() { + client_ias_.clear(); } /// @brief Simulate sending messages through a relay. @@ -499,14 +511,6 @@ public: use_client_id_ = send; } - /// @brief Controls whether the client should send an addres in IA_NA - /// - /// @todo: For now, this flag is only used in Decline - /// @param send should the address be included? - void includeAddress(const bool send) { - include_address_ = send; - } - /// @brief Specifies if the Rapid Commit option should be included in /// the Solicit message. /// @@ -536,6 +540,10 @@ public: void useFQDN(const uint8_t flags, const std::string& fqdn_name, Option6ClientFqdn::DomainNameType fqdn_type); + void includeAddress(const bool send) { + include_address_ = send; + } + /// @brief Lease configuration obtained by the client. Configuration config_; @@ -628,20 +636,6 @@ private: /// added. void appendRequestedIAs(const Pkt6Ptr& query) const; - /// @brief Include IA of the specified type if it doesn't exist yet. - /// - /// This methods includes an IA option of the specific type, and - /// having a given IAID to the query message, if this IA hasn't - /// been added yet. - /// - /// @param query Pointer to the client's message to which IA should be - /// added. - /// @param ia_type One of the D6O_IA_NA or D6O_IA_PD - /// @param iaid IAID of the IA. - void conditionallyAppendRequestedIA(const Pkt6Ptr& query, - const uint8_t ia_type, - const uint32_t iaid) const; - /// @brief Copy IA options from one message to another. /// /// This method copies IA_NA and IA_PD options from one message to another. @@ -733,19 +727,14 @@ private: /// @brief Pointer to the server that the client is communicating with. boost::shared_ptr srv_; - bool use_na_; ///< Enable address assignment. - bool use_pd_; ///< Enable prefix delegation. bool use_relay_; ///< Enable relaying messages to the server. bool use_oro_; ///< Conth bool use_client_id_; bool use_rapid_commit_; - /// @brief Pointer to the option holding an address hint. - Option6IAAddrPtr address_hint_; - - /// @brief Pointer to the option holding a prefix hint. - Option6IAPrefixPtr prefix_hint_; + /// @brief List holding information to be sent in client's IAs. + std::list client_ias_; /// @brief List of options to be requested /// @@ -762,15 +751,6 @@ private: /// @brief FQDN requested by the client. Option6ClientFqdnPtr fqdn_; - /// @bref IAID used by the client when requesting address assignment. - uint32_t na_iaid_; - /// @brief IAID used by the client when requesting prefix delegation. - uint32_t pd_iaid_; - - /// @brief Determines if the client will include address in the messages - /// it sends. - /// - /// @todo this flag is currently supported in Decline only. bool include_address_; }; diff --git a/src/bin/dhcp6/tests/host_unittest.cc b/src/bin/dhcp6/tests/host_unittest.cc index 3a5e65c3b9..fe7ca7a1fd 100644 --- a/src/bin/dhcp6/tests/host_unittest.cc +++ b/src/bin/dhcp6/tests/host_unittest.cc @@ -142,8 +142,7 @@ public: // Configure client to request IA_NA and append IA_NA option // to the client's message. - client.useNA(); - ASSERT_NO_THROW(client.useHint(100, 200, 64, "2001:db8:1:1::dead:beef")); + client.useNA(1234, IOAddress("2001:db8:1:1::dead:beef")); // Perform 4-way exchange. ASSERT_NO_THROW(client.doSARR()); @@ -182,8 +181,7 @@ TEST_F(HostTest, basicSarrs) { // Configure client to request IA_NA and aAppend IA_NA option // to the client's message. client.setDUID("01:02:03:04"); - client.useNA(); - ASSERT_NO_THROW(client.useHint(100, 200, 64, "2001:db8:1:1::dead:beef")); + client.useNA(1234, IOAddress("2001:db8:1:1::dead:beef")); // Perform 4-way exchange. ASSERT_NO_THROW(client.doSARR()); @@ -202,8 +200,6 @@ TEST_F(HostTest, basicSarrs) { // Now redo the client, adding one to the DUID client.clearConfig(); client.modifyDUID(); - client.useNA(); - ASSERT_NO_THROW(client.useHint(100, 200, 64, "2001:db8:1:1::dead:beef")); // Perform 4-way exchange. ASSERT_NO_THROW(client.doSARR()); @@ -223,8 +219,8 @@ TEST_F(HostTest, basicSarrs) { // we get a dynamic address. client.clearConfig(); client.modifyDUID(); - client.useNA(); - ASSERT_NO_THROW(client.useHint(100, 200, 64, "2001:db8:1:1::dead:beef")); + client.clearRequestedIAs(); + client.useNA(1234); // Perform 4-way exchange. ASSERT_NO_THROW(client.doSARR()); @@ -258,8 +254,7 @@ TEST_F(HostTest, sarrAndRenew) { // Configure client to request IA_NA and aAppend IA_NA option // to the client's message. client.setDUID("01:02:03:04"); - client.useNA(); - ASSERT_NO_THROW(client.useHint(100, 200, 64, "2001:db8:1:1::dead:beef")); + client.useNA(1234, IOAddress("2001:db8:1:1::dead:beef")); // Perform 4-way exchange. ASSERT_NO_THROW(client.doSARR()); @@ -272,6 +267,9 @@ TEST_F(HostTest, sarrAndRenew) { Lease6 lease_client = client.getLease(0); EXPECT_EQ("2001:db8:1:1::babe", lease_client.addr_.toText()); + // Do not send the hint while renewing. + client.clearRequestedIAs(); + // Send Renew message to the server. ASSERT_NO_THROW(client.doRenew()); @@ -308,8 +306,7 @@ TEST_F(HostTest, sarrAndRebind) { // Configure client to request IA_NA and aAppend IA_NA option // to the client's message. client.setDUID("01:02:03:04"); - client.useNA(); - ASSERT_NO_THROW(client.useHint(100, 200, 64, "2001:db8:1:1::dead:beef")); + client.useNA(1234, IOAddress("2001:db8:1:1::dead:beef")); // Perform 4-way exchange. ASSERT_NO_THROW(client.doSARR()); @@ -322,6 +319,9 @@ TEST_F(HostTest, sarrAndRebind) { Lease6 lease_client = client.getLease(0); EXPECT_EQ("2001:db8:1:1::babe", lease_client.addr_.toText()); + // Do not send the hint while renewing. + client.clearRequestedIAs(); + // Send Rebind message to the server. ASSERT_NO_THROW(client.doRebind()); diff --git a/src/bin/dhcp6/tests/rebind_unittest.cc b/src/bin/dhcp6/tests/rebind_unittest.cc index ff61204a31..6e5b64140d 100644 --- a/src/bin/dhcp6/tests/rebind_unittest.cc +++ b/src/bin/dhcp6/tests/rebind_unittest.cc @@ -332,8 +332,9 @@ TEST_F(RebindTest, directClientChangingIAID) { Lease6 lease_client = client.getLease(0); // Modify the IAID of the lease record that client stores. By adding // one to IAID we guarantee that the IAID will change. + client.clearRequestedIAs(); client.config_.leases_[0].iaid_ = 1235; - client.useNA(true, 1235); + client.useNA(1235); // Try to Rebind. The server should allocate new lease for this IAID. ASSERT_NO_THROW(client.doRebind()); @@ -459,8 +460,9 @@ TEST_F(RebindTest, relayedClientChangingIAID) { // Modify the IAID of the lease record that client stores. By adding // one to IAID we guarantee that the IAID will change. + client.clearRequestedIAs(); client.config_.leases_[0].iaid_ = 1235; - client.useNA(true, 1235); + client.useNA(1235); // Try to Rebind. The server should allocate new lease for this IAID. ASSERT_NO_THROW(client.doRebind()); @@ -642,8 +644,9 @@ TEST_F(RebindTest, directClientPDChangingIAID) { // Modify the IAID of the lease record that client stores. By adding // one to IAID we guarantee that the IAID will change. + client.clearRequestedIAs(); client.config_.leases_[0].iaid_ = 5679; - client.usePD(true, 5679); + client.usePD(5679); // Try to Rebind. The server should allocate new lease for this IAID. ASSERT_NO_THROW(client.doRebind()); diff --git a/src/bin/dhcp6/tests/renew_unittest.cc b/src/bin/dhcp6/tests/renew_unittest.cc index da42bfe283..11bc0e13fa 100644 --- a/src/bin/dhcp6/tests/renew_unittest.cc +++ b/src/bin/dhcp6/tests/renew_unittest.cc @@ -208,7 +208,7 @@ TEST_F(RenewTest, requestPrefixInRenewUseHint) { EXPECT_EQ(STATUS_Success, client.getStatusCode(na_iaid_)); // Specify the hint used for IA_PD. - client.useHint(0, 0, 64, "::"); + client.usePD(pd_iaid_, IOAddress::IPV6_ZERO_ADDRESS(), 64); // Send Renew message to the server, including IA_NA and requesting IA_PD. ASSERT_NO_THROW(client.doRenew()); @@ -225,9 +225,6 @@ TEST_F(RenewTest, requestPrefixInRenewUseHint) { // Reconfigure the server to use both NA and PD pools. configure(RENEW_CONFIGS[2], *client.getServer()); - // Specify the hint used for IA_PD. - client.useHint(0, 0, 64, "::"); - // Send Renew message to the server, including IA_NA and requesting IA_PD. ASSERT_NO_THROW(client.doRenew()); @@ -334,7 +331,7 @@ TEST_F(RenewTest, requestAddressInRenewHint) { ASSERT_EQ(0, leases_client_na.size()); ASSERT_EQ(STATUS_NoAddrsAvail, client.getStatusCode(na_iaid_)); - client.useHint(0, 0, "2001:db8:1::100"); + client.useNA(na_iaid_, IOAddress("2001:db8:1::100")); // Send Renew message to the server, including IA_PD and requesting IA_NA. // The server should return NoAddrsAvail status code in this case. diff --git a/src/bin/dhcp6/tests/sarr_unittest.cc b/src/bin/dhcp6/tests/sarr_unittest.cc index eae1b6bd92..13b97f2a32 100644 --- a/src/bin/dhcp6/tests/sarr_unittest.cc +++ b/src/bin/dhcp6/tests/sarr_unittest.cc @@ -15,6 +15,7 @@ #include using namespace isc; +using namespace isc::asiolink; using namespace isc::dhcp; using namespace isc::dhcp::test; @@ -129,7 +130,8 @@ TEST_F(SARRTest, directClientPrefixHint) { getCfgSubnets6()->getAll(); ASSERT_EQ(1, subnets->size()); // Append IAPREFIX option to the client's message. - ASSERT_NO_THROW(client.useHint(100, 200, 64, "2001:db8:3:33::33")); + ASSERT_NO_THROW(client.usePD(5678, asiolink::IOAddress("2001:db8:3:33::33"), + 64)); // Perform 4-way exchange. ASSERT_NO_THROW(client.doSARR()); // Server should have assigned a prefix. @@ -153,7 +155,8 @@ TEST_F(SARRTest, directClientPrefixHint) { client.modifyDUID(); // Use the hint with some least significant bytes set. - ASSERT_NO_THROW(client.useHint(100, 200, 64, "2001:db8:3:33::34")); + client.clearRequestedIAs(); + ASSERT_NO_THROW(client.usePD(5678, IOAddress("2001:db8:3:33::34"), 64)); ASSERT_NO_THROW(client.doSARR()); // Server should assign a lease. ASSERT_EQ(1, client.getLeaseNum()); diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index aaae39f8df..31d62c3b50 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -587,6 +587,7 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { Pool6>(ctx.subnet_->getPool(ctx.currentIA().type_, hint, false)); if (pool) { + /// @todo: We support only one hint for now Lease6Ptr lease = LeaseMgrFactory::instance().getLease6(ctx.currentIA().type_, hint);