mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-02 15:05:16 +00:00
[4317] DHCPv4 server may search host reservations using client-id.
This commit is contained in:
@@ -269,7 +269,6 @@ Dhcpv4Exchange::setHostIdentifiers() {
|
|||||||
std::vector<uint8_t>(vec.begin() + 5,
|
std::vector<uint8_t>(vec.begin() + 5,
|
||||||
vec.end()));
|
vec.end()));
|
||||||
}
|
}
|
||||||
/// @todo Add support for other client identifiers (see #4317).
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -289,6 +288,15 @@ Dhcpv4Exchange::setHostIdentifiers() {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Host::IDENT_CLIENT_ID:
|
||||||
|
if (context_->clientid_) {
|
||||||
|
const std::vector<uint8_t>& vec = context_->clientid_->getDuid();
|
||||||
|
if (!vec.empty()) {
|
||||||
|
context_->addHostIdentifier(id_type, vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@@ -147,6 +147,10 @@ const char* DORA_CONFIGS[] = {
|
|||||||
" {"
|
" {"
|
||||||
" \"circuit-id\": \"'charter950'\","
|
" \"circuit-id\": \"'charter950'\","
|
||||||
" \"ip-address\": \"10.0.0.9\""
|
" \"ip-address\": \"10.0.0.9\""
|
||||||
|
" },"
|
||||||
|
" {"
|
||||||
|
" \"client-id\": \"01:11:22:33:44:55:66\","
|
||||||
|
" \"ip-address\": \"10.0.0.1\""
|
||||||
" }"
|
" }"
|
||||||
" ]"
|
" ]"
|
||||||
"} ]"
|
"} ]"
|
||||||
@@ -173,7 +177,8 @@ const char* DORA_CONFIGS[] = {
|
|||||||
"{ \"interfaces-config\": {"
|
"{ \"interfaces-config\": {"
|
||||||
" \"interfaces\": [ \"*\" ]"
|
" \"interfaces\": [ \"*\" ]"
|
||||||
"},"
|
"},"
|
||||||
"\"host-reservation-identifiers\": [ \"circuit-id\", \"hw-address\", \"duid\" ],"
|
"\"host-reservation-identifiers\": [ \"circuit-id\", \"hw-address\","
|
||||||
|
" \"duid\", \"client-id\" ],"
|
||||||
"\"valid-lifetime\": 600,"
|
"\"valid-lifetime\": 600,"
|
||||||
"\"subnet4\": [ { "
|
"\"subnet4\": [ { "
|
||||||
" \"subnet\": \"10.0.0.0/24\", "
|
" \"subnet\": \"10.0.0.0/24\", "
|
||||||
@@ -190,6 +195,10 @@ const char* DORA_CONFIGS[] = {
|
|||||||
" {"
|
" {"
|
||||||
" \"circuit-id\": \"'charter950'\","
|
" \"circuit-id\": \"'charter950'\","
|
||||||
" \"ip-address\": \"10.0.0.9\""
|
" \"ip-address\": \"10.0.0.9\""
|
||||||
|
" },"
|
||||||
|
" {"
|
||||||
|
" \"client-id\": \"01:11:22:33:44:55:66\","
|
||||||
|
" \"ip-address\": \"10.0.0.1\""
|
||||||
" }"
|
" }"
|
||||||
" ]"
|
" ]"
|
||||||
"} ]"
|
"} ]"
|
||||||
@@ -199,7 +208,8 @@ const char* DORA_CONFIGS[] = {
|
|||||||
"{ \"interfaces-config\": {"
|
"{ \"interfaces-config\": {"
|
||||||
" \"interfaces\": [ \"*\" ]"
|
" \"interfaces\": [ \"*\" ]"
|
||||||
"},"
|
"},"
|
||||||
"\"host-reservation-identifiers\": [ \"duid\", \"circuit-id\", \"hw-address\" ],"
|
"\"host-reservation-identifiers\": [ \"duid\", \"client-id\","
|
||||||
|
" \"circuit-id\", \"hw-address\" ],"
|
||||||
"\"valid-lifetime\": 600,"
|
"\"valid-lifetime\": 600,"
|
||||||
"\"subnet4\": [ { "
|
"\"subnet4\": [ { "
|
||||||
" \"subnet\": \"10.0.0.0/24\", "
|
" \"subnet\": \"10.0.0.0/24\", "
|
||||||
@@ -216,6 +226,10 @@ const char* DORA_CONFIGS[] = {
|
|||||||
" {"
|
" {"
|
||||||
" \"circuit-id\": \"'charter950'\","
|
" \"circuit-id\": \"'charter950'\","
|
||||||
" \"ip-address\": \"10.0.0.9\""
|
" \"ip-address\": \"10.0.0.9\""
|
||||||
|
" },"
|
||||||
|
" {"
|
||||||
|
" \"client-id\": \"01:11:22:33:44:55:66\","
|
||||||
|
" \"ip-address\": \"10.0.0.1\""
|
||||||
" }"
|
" }"
|
||||||
" ]"
|
" ]"
|
||||||
"} ]"
|
"} ]"
|
||||||
@@ -852,7 +866,7 @@ TEST_F(DORATest, hostIdentifiersOrder) {
|
|||||||
|
|
||||||
// Reconfigure the server to change the preference order of the
|
// Reconfigure the server to change the preference order of the
|
||||||
// host identifiers. The 'circuit-id' should now take precedence over
|
// host identifiers. The 'circuit-id' should now take precedence over
|
||||||
// the hw-address and duid.
|
// the hw-address, duid and client-id.
|
||||||
configure(DORA_CONFIGS[4], *client.getServer());
|
configure(DORA_CONFIGS[4], *client.getServer());
|
||||||
ASSERT_NO_THROW(client.doDORA(boost::shared_ptr<
|
ASSERT_NO_THROW(client.doDORA(boost::shared_ptr<
|
||||||
IOAddress>(new IOAddress("0.0.0.0"))));
|
IOAddress>(new IOAddress("0.0.0.0"))));
|
||||||
@@ -866,7 +880,7 @@ TEST_F(DORATest, hostIdentifiersOrder) {
|
|||||||
|
|
||||||
// Reconfigure the server to change the preference order of the
|
// Reconfigure the server to change the preference order of the
|
||||||
// host identifiers. The 'duid' should now take precedence over
|
// host identifiers. The 'duid' should now take precedence over
|
||||||
// the hw-address and circuit-id
|
// the client-id, hw-address and circuit-id
|
||||||
configure(DORA_CONFIGS[5], *client.getServer());
|
configure(DORA_CONFIGS[5], *client.getServer());
|
||||||
ASSERT_NO_THROW(client.doDORA(boost::shared_ptr<
|
ASSERT_NO_THROW(client.doDORA(boost::shared_ptr<
|
||||||
IOAddress>(new IOAddress("0.0.0.0"))));
|
IOAddress>(new IOAddress("0.0.0.0"))));
|
||||||
@@ -877,6 +891,23 @@ TEST_F(DORATest, hostIdentifiersOrder) {
|
|||||||
ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
|
ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
|
||||||
// Make sure that the client has got the lease for the reserved address.
|
// Make sure that the client has got the lease for the reserved address.
|
||||||
ASSERT_EQ("10.0.0.8", client.config_.lease_.addr_.toText());
|
ASSERT_EQ("10.0.0.8", client.config_.lease_.addr_.toText());
|
||||||
|
|
||||||
|
// Replace the client identifier with the one for which address
|
||||||
|
// 10.0.0.1 is reserved. Because the DUID is a special type of
|
||||||
|
// client identifier, this change effectively removes the association
|
||||||
|
// of the client with the DUID for which address 10.0.0.8 is reserved.
|
||||||
|
// The next identifier type to be used by the server (after DUID) is
|
||||||
|
// client-id and thus the server should assign address 10.0.0.1.
|
||||||
|
client.includeClientId("01:11:22:33:44:55:66");
|
||||||
|
ASSERT_NO_THROW(client.doDORA(boost::shared_ptr<
|
||||||
|
IOAddress>(new IOAddress("0.0.0.0"))));
|
||||||
|
// Make sure that the server responded.
|
||||||
|
ASSERT_TRUE(client.getContext().response_);
|
||||||
|
resp = client.getContext().response_;
|
||||||
|
// Make sure that the server has responded with DHCPACK.
|
||||||
|
ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
|
||||||
|
// Make sure that the client has got the lease for the reserved address.
|
||||||
|
ASSERT_EQ("10.0.0.1", client.config_.lease_.addr_.toText());
|
||||||
}
|
}
|
||||||
|
|
||||||
// This test checks that setting the match-client-id value to false causes
|
// This test checks that setting the match-client-id value to false causes
|
||||||
|
@@ -864,7 +864,7 @@ TEST_F(HostReservationIdsParserTest, dhcp4Identifiers) {
|
|||||||
ConstCfgHostOperationsPtr cfg = CfgMgr::instance().getStagingCfg()->
|
ConstCfgHostOperationsPtr cfg = CfgMgr::instance().getStagingCfg()->
|
||||||
getCfgHostOperations4();
|
getCfgHostOperations4();
|
||||||
const CfgHostOperations::IdentifierTypes& ids = cfg->getIdentifierTypes();
|
const CfgHostOperations::IdentifierTypes& ids = cfg->getIdentifierTypes();
|
||||||
ASSERT_EQ(3, ids.size());
|
ASSERT_EQ(4, ids.size());
|
||||||
|
|
||||||
CfgHostOperations::IdentifierTypes::const_iterator id = ids.begin();
|
CfgHostOperations::IdentifierTypes::const_iterator id = ids.begin();
|
||||||
EXPECT_EQ(*id++, Host::IDENT_CIRCUIT_ID);
|
EXPECT_EQ(*id++, Host::IDENT_CIRCUIT_ID);
|
||||||
@@ -920,7 +920,7 @@ TEST_F(HostReservationIdsParserTest, dhcp4AutoIdentifiers) {
|
|||||||
ConstCfgHostOperationsPtr cfg = CfgMgr::instance().getStagingCfg()->
|
ConstCfgHostOperationsPtr cfg = CfgMgr::instance().getStagingCfg()->
|
||||||
getCfgHostOperations4();
|
getCfgHostOperations4();
|
||||||
const CfgHostOperations::IdentifierTypes& ids = cfg->getIdentifierTypes();
|
const CfgHostOperations::IdentifierTypes& ids = cfg->getIdentifierTypes();
|
||||||
ASSERT_EQ(3, ids.size());
|
ASSERT_EQ(4, ids.size());
|
||||||
|
|
||||||
CfgHostOperations::IdentifierTypes::const_iterator id = ids.begin();
|
CfgHostOperations::IdentifierTypes::const_iterator id = ids.begin();
|
||||||
EXPECT_EQ(*id++, Host::IDENT_HWADDR);
|
EXPECT_EQ(*id++, Host::IDENT_HWADDR);
|
||||||
|
Reference in New Issue
Block a user