|
@@ -29,7 +29,40 @@ using namespace isc::test;
|
|
|
namespace {
|
|
|
|
|
|
/// @brief Set of JSON configurations used throughout the Rebind tests.
|
|
|
-const std::string REBIND_CONFIGS[] = {
|
|
|
+///
|
|
|
+/// - Configuration 0:
|
|
|
+/// - only addresses (no prefixes)
|
|
|
+/// - 2 subnets with 2001:db8:1::/64 and 2001:db8:2::64
|
|
|
+/// - 1 subnet for eth0 and 1 subnet for eth1
|
|
|
+///
|
|
|
+/// - Configuration 1:
|
|
|
+/// - similar to Configuration 0 but different subnets
|
|
|
+/// - pools configured: 2001:db8:3::/64 and 2001:db8:4::/64
|
|
|
+///
|
|
|
+/// - Configuration 2:
|
|
|
+/// - similar to Configuration 0 and Configuration 1
|
|
|
+/// - pools configured: 3000:1::/64 and 3000:2::/64
|
|
|
+/// - this specific configuration is used by tests using relays
|
|
|
+///
|
|
|
+/// - Configuration 3:
|
|
|
+/// - similar to Configuration 2 but with different subnets
|
|
|
+/// - pools configured: 3000:3::/64 and 3000:4::/64
|
|
|
+/// - this specific configuration is used by tests using relays
|
|
|
+///
|
|
|
+/// - Configuration 5:
|
|
|
+/// - only prefixes (no addresses)
|
|
|
+/// - 2 subnets: 2001:db8:1::/40 and 2001:db8:2::/40
|
|
|
+/// - 2 prefix pools: 2001:db8:1::/72 and 2001:db8:2::/72
|
|
|
+/// - 1 subnet for eth0 and 1 subnet for eth1
|
|
|
+/// - this specific configuration is used by tests which don't use relays
|
|
|
+///
|
|
|
+/// - Configuration 6:
|
|
|
+/// - similar to Configuration 5 but with different subnets
|
|
|
+/// - 2 subnets: 2001:db8:3::/40 and 2001:db8:4::/40
|
|
|
+/// - 2 prefix pools: 2001:db8:3::/72 and 2001:db8:4::/72
|
|
|
+/// - delegated length /80
|
|
|
+/// - this specific configuration is used by tests which don't use relays
|
|
|
+const char* REBIND_CONFIGS[] = {
|
|
|
// Configuration 0
|
|
|
"{ \"interfaces\": [ \"all\" ],"
|
|
|
"\"preferred-lifetime\": 3000,"
|
|
@@ -112,25 +145,6 @@ const std::string REBIND_CONFIGS[] = {
|
|
|
"\"rebind-timer\": 2000, "
|
|
|
"\"renew-timer\": 1000, "
|
|
|
"\"subnet6\": [ { "
|
|
|
- " \"pool\": [ \"3000:3::/64\" ],"
|
|
|
- " \"subnet\": \"3000:3::/48\", "
|
|
|
- " \"interface-id\": \"\","
|
|
|
- " \"interface\": \"eth1\""
|
|
|
- " },"
|
|
|
- " {"
|
|
|
- " \"pool\": [ \"3000:4::/64\" ],"
|
|
|
- " \"subnet\": \"3000:4::/48\", "
|
|
|
- " \"interface-id\": \"\","
|
|
|
- " \"interface\": \"eth0\""
|
|
|
- " } ],"
|
|
|
- "\"valid-lifetime\": 4000 }",
|
|
|
-
|
|
|
-// Configuration 5
|
|
|
- "{ \"interfaces\": [ \"all\" ],"
|
|
|
- "\"preferred-lifetime\": 3000,"
|
|
|
- "\"rebind-timer\": 2000, "
|
|
|
- "\"renew-timer\": 1000, "
|
|
|
- "\"subnet6\": [ { "
|
|
|
" \"pd-pools\": ["
|
|
|
" { \"prefix\": \"2001:db8:1:01::\", "
|
|
|
" \"prefix-len\": 72, "
|
|
@@ -152,7 +166,7 @@ const std::string REBIND_CONFIGS[] = {
|
|
|
" } ],"
|
|
|
"\"valid-lifetime\": 4000 }",
|
|
|
|
|
|
-// Configuration 6
|
|
|
+// Configuration 5
|
|
|
"{ \"interfaces\": [ \"all\" ],"
|
|
|
"\"preferred-lifetime\": 3000,"
|
|
|
"\"rebind-timer\": 2000, "
|
|
@@ -218,6 +232,8 @@ RebindTest::configure(const std::string& config, NakedDhcpv6Srv& srv) {
|
|
|
void
|
|
|
RebindTest::requestLease(const int config_index, const int subnets_num,
|
|
|
Dhcp6Client& client) {
|
|
|
+ // Check that the index is in the configuration table.
|
|
|
+ ASSERT_LT(config_index, sizeof(REBIND_CONFIGS)/sizeof(REBIND_CONFIGS[0]));
|
|
|
// Configure the server.
|
|
|
configure(REBIND_CONFIGS[config_index], *client.getServer());
|
|
|
// Make sure we ended-up having expected number of subnets configured.
|
|
@@ -241,6 +257,8 @@ RebindTest::requestLease(const int config_index, const int subnets_num,
|
|
|
EXPECT_EQ(STATUS_Success, client.getStatusCode(0));
|
|
|
}
|
|
|
|
|
|
+// Test that directly connected client's Rebind message is processed and Reply
|
|
|
+// message is sent back.
|
|
|
TEST_F(RebindTest, directClient) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -266,6 +284,8 @@ TEST_F(RebindTest, directClient) {
|
|
|
EXPECT_TRUE(lease_server2);
|
|
|
}
|
|
|
|
|
|
+// Test that server doesn't extend the lease when the configuration has changed
|
|
|
+// such that the existing subnet is replaced with a different subnet.
|
|
|
TEST_F(RebindTest, directClientChangingSubnet) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -298,6 +318,8 @@ TEST_F(RebindTest, directClientChangingSubnet) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+// Check that the server doesn't extend the lease for the client when the
|
|
|
+// client sends IAID which doesn't belong to the lease that client has.
|
|
|
TEST_F(RebindTest, directClientChangingIAID) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -323,6 +345,8 @@ TEST_F(RebindTest, directClientChangingIAID) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+// Check that server sends NoBinding when the lease has been lost from
|
|
|
+// the database and client is trying to Rebind it.
|
|
|
TEST_F(RebindTest, directClientLostLease) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -341,6 +365,9 @@ TEST_F(RebindTest, directClientLostLease) {
|
|
|
EXPECT_EQ(STATUS_NoBinding, client.getStatusCode(0));
|
|
|
}
|
|
|
|
|
|
+/// @todo Extend tests for direct client changing address.
|
|
|
+
|
|
|
+// Check that the client can Rebind existing lease through a relay.
|
|
|
TEST_F(RebindTest, relayedClient) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -371,6 +398,9 @@ TEST_F(RebindTest, relayedClient) {
|
|
|
EXPECT_TRUE(lease_server2);
|
|
|
}
|
|
|
|
|
|
+// Check that the lease is not extended for the relayed client when the
|
|
|
+// configuration has changed such that the subnet that client is using
|
|
|
+// doesn't exist anymore.
|
|
|
TEST_F(RebindTest, relayedClientChangingSubnet) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -409,6 +439,8 @@ TEST_F(RebindTest, relayedClientChangingSubnet) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+// Check that the lease is not extended for the relayed client when the IAID in
|
|
|
+// the Rebind message doesn't match the one recorded for the client.
|
|
|
TEST_F(RebindTest, relayedClientChangingIAID) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -438,6 +470,8 @@ TEST_F(RebindTest, relayedClientChangingIAID) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+// Check that the relayed client receives NoBinding when the lease that he
|
|
|
+// is Rebinding has been lost from the database.
|
|
|
TEST_F(RebindTest, relayedClientLostLease) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -460,6 +494,8 @@ TEST_F(RebindTest, relayedClientLostLease) {
|
|
|
EXPECT_EQ(STATUS_NoBinding, client.getStatusCode(0));
|
|
|
}
|
|
|
|
|
|
+// Check that relayed client receives the IA with lifetimes of 0, when
|
|
|
+// client is tgrying to Rebind using an address it doesn't have.
|
|
|
TEST_F(RebindTest, relayedClientChangingAddress) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_NA.
|
|
@@ -497,13 +533,13 @@ TEST_F(RebindTest, relayedClientChangingAddress) {
|
|
|
EXPECT_NE(0, lease_server->preferred_lft_);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+// Check that the server extends the lease for the client having a prefix.
|
|
|
TEST_F(RebindTest, directClientPD) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_PD.
|
|
|
client.usePD();
|
|
|
// Make 4-way exchange to get the lease.
|
|
|
- ASSERT_NO_FATAL_FAILURE(requestLease(5, 2, client));
|
|
|
+ ASSERT_NO_FATAL_FAILURE(requestLease(4, 2, client));
|
|
|
// Keep the client's lease for future reference.
|
|
|
Lease6 lease_client = client.getLease(0);
|
|
|
// Send Rebind message to the server.
|
|
@@ -523,18 +559,21 @@ TEST_F(RebindTest, directClientPD) {
|
|
|
EXPECT_TRUE(lease_server2);
|
|
|
}
|
|
|
|
|
|
+// Check that the prefix lifetime is not extended for the client in case
|
|
|
+// the configuration has been changed such, that the subnet he is using
|
|
|
+// doesn't exist anymore.
|
|
|
TEST_F(RebindTest, directClientPDChangingSubnet) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_PD.
|
|
|
client.usePD();
|
|
|
// Make 4-way exchange to get the lease.
|
|
|
- ASSERT_NO_FATAL_FAILURE(requestLease(5, 2, client));
|
|
|
+ ASSERT_NO_FATAL_FAILURE(requestLease(4, 2, client));
|
|
|
// Keep the client's lease for future reference.
|
|
|
Lease6 lease_client = client.getLease(0);
|
|
|
// Reconfigure the server so as the new subnet is served on the
|
|
|
// client's interface. Note that there will also be a new subnet
|
|
|
// id assigned to the subnet on this interface.
|
|
|
- configure(REBIND_CONFIGS[6], *client.getServer());
|
|
|
+ configure(REBIND_CONFIGS[5], *client.getServer());
|
|
|
// Try to rebind, using the address that the client had acquired using
|
|
|
// previous server configuration.
|
|
|
ASSERT_NO_THROW(client.doRebind());
|
|
@@ -557,12 +596,15 @@ TEST_F(RebindTest, directClientPDChangingSubnet) {
|
|
|
EXPECT_TRUE(lease_server2);
|
|
|
}
|
|
|
|
|
|
+// Check that the prefix lifetime is not extended for the client when the
|
|
|
+// IAID used in the Rebind is not matching the one recorded by the server
|
|
|
+// for the particular client.
|
|
|
TEST_F(RebindTest, directClientPDChangingIAID) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_PD.
|
|
|
client.usePD();
|
|
|
// Make 4-way exchange to get the lease.
|
|
|
- ASSERT_NO_FATAL_FAILURE(requestLease(5, 2, client));
|
|
|
+ ASSERT_NO_FATAL_FAILURE(requestLease(4, 2, client));
|
|
|
// Keep the client's lease for future reference.
|
|
|
Lease6 lease_client = client.getLease(0);
|
|
|
// Modify the IAID of the lease record that client stores. By adding
|
|
@@ -585,17 +627,21 @@ TEST_F(RebindTest, directClientPDChangingIAID) {
|
|
|
EXPECT_TRUE(lease_server);
|
|
|
}
|
|
|
|
|
|
+// Check that the prefix lifetime is not extended for the client when the
|
|
|
+// prefix used in Rebind message doesn't match the one that client has.
|
|
|
TEST_F(RebindTest, directClientPDChangingPrefix) {
|
|
|
Dhcp6Client client;
|
|
|
// Configure client to request IA_PD.
|
|
|
client.usePD();
|
|
|
// Make 4-way exchange to get the lease.
|
|
|
- ASSERT_NO_FATAL_FAILURE(requestLease(5, 2, client));
|
|
|
+ ASSERT_NO_FATAL_FAILURE(requestLease(4, 2, client));
|
|
|
// Keep the client's lease for future reference.
|
|
|
Lease6 lease_client = client.getLease(0);
|
|
|
// Modify the Prefix of the lease record that client stores. The server
|
|
|
// should check that the prefix is invalid (hasn't been allocated for
|
|
|
// the particular IAID).
|
|
|
+ ASSERT_NE(client.config_.leases_[0].lease_.addr_,
|
|
|
+ IOAddress("2001:db8:1:10::"));
|
|
|
client.config_.leases_[0].lease_.addr_ = IOAddress("2001:db8:1:10::");
|
|
|
// Try to Rebind. The client will use correct IAID but will specify a
|
|
|
// wrong prefix. The server will discover that the client has a binding
|
|
@@ -625,6 +671,7 @@ TEST_F(RebindTest, directClientPDChangingPrefix) {
|
|
|
}
|
|
|
|
|
|
/// @todo Extend PD tests for relayed messages.
|
|
|
+/// @todo Extend PD tests to cover same prefix buyt different length.
|
|
|
|
|
|
// This test checks that the Rebind message is discarded by the server if it
|
|
|
// has been sent to unicast address (RFC3315, section 15).
|
|
@@ -636,7 +683,7 @@ TEST_F(RebindTest, unicast) {
|
|
|
ASSERT_NO_FATAL_FAILURE(requestLease(0, 2, client));
|
|
|
// Keep the client's lease for future reference.
|
|
|
Lease6 lease_client = client.getLease(0);
|
|
|
- // Set the unicast destionation address for the Rebind message.
|
|
|
+ // Set the unicast destination address for the Rebind message.
|
|
|
// The Rebind should be discarded when sent to unicast address,
|
|
|
// according to section 15 of RFC3315.
|
|
|
client.setDestAddress(IOAddress("2001:db8:1::1"));
|
|
@@ -655,5 +702,38 @@ TEST_F(RebindTest, unicast) {
|
|
|
EXPECT_FALSE(client.getContext().response_);
|
|
|
}
|
|
|
|
|
|
+// This test checks that the relayed Rebind message is processed by the server
|
|
|
+// when sent to unicast address.
|
|
|
+TEST_F(RebindTest, relayedUnicast) {
|
|
|
+ Dhcp6Client client;
|
|
|
+ // Configure client to request IA_NA.
|
|
|
+ client.useNA();
|
|
|
+ // Configure DHCPv6 client to simulate sending the message through a relay
|
|
|
+ // agent. The default link-addr is 3001:1::1. This address should be used
|
|
|
+ // by the server to pick the suitable subnet.
|
|
|
+ client.useRelay();
|
|
|
+ // Make 4-way exchange to get the lease. Pick the configuration #2 as it
|
|
|
+ // specifies the subnet for the relay agent's link address.
|
|
|
+ ASSERT_NO_FATAL_FAILURE(requestLease(2, 2, client));
|
|
|
+ // Keep the client's lease for future reference.
|
|
|
+ Lease6 lease_client = client.getLease(0);
|
|
|
+ // Set the unicast destination address.
|
|
|
+ client.setDestAddress(IOAddress("2001:db8:1::1"));
|
|
|
+ // Send Rebind message to the server.
|
|
|
+ ASSERT_NO_THROW(client.doRebind());
|
|
|
+ // The client should still have one lease which belongs to one of the
|
|
|
+ // subnets.
|
|
|
+ ASSERT_EQ(1, client.getLeaseNum());
|
|
|
+ Lease6 lease_client2 = client.getLease(0);
|
|
|
+ ASSERT_TRUE(CfgMgr::instance().getSubnet6(lease_client2.addr_,
|
|
|
+ ClientClasses()));
|
|
|
+ // The client's lease should have been extended. The client will
|
|
|
+ // update the cltt to current time when the lease gets extended.
|
|
|
+ ASSERT_GE(lease_client2.cltt_ - lease_client.cltt_, 1000);
|
|
|
+ // Make sure, that the client's lease matches the lease held by the
|
|
|
+ // server.
|
|
|
+ Lease6Ptr lease_server2 = checkLease(lease_client2);
|
|
|
+ EXPECT_TRUE(lease_server2);
|
|
|
+}
|
|
|
|
|
|
} // end of anonymous namespace
|