From: Francis Dupont Date: Thu, 15 Oct 2015 17:17:31 +0000 (+0200) Subject: [4059] Added new cases to selectSubnetRelayLinkaddr unit test X-Git-Tag: fdfb_base~12^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4668753de9940d1356d5ff154938ffec358f648;p=thirdparty%2Fkea.git [4059] Added new cases to selectSubnetRelayLinkaddr unit test --- diff --git a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc index 047c97ffb4..fa0f5b9ea4 100644 --- a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc +++ b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc @@ -1298,8 +1298,8 @@ TEST_F(Dhcpv6SrvTest, selectSubnetRelayLinkaddr) { Subnet6Ptr selected = srv.selectSubnet(pkt); EXPECT_FALSE(selected); - // CASE 2: We have three subnets defined and we received relayed traffic. - // Nothing should be selected. + // CASE 2: We have three subnets defined and we received relayed traffic + // that came out of subnet 2. We should select subnet2 then CfgMgr::instance().clear(); CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet1); CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet2); @@ -1308,35 +1308,71 @@ TEST_F(Dhcpv6SrvTest, selectSubnetRelayLinkaddr) { selected = srv.selectSubnet(pkt); EXPECT_EQ(selected, subnet2); - // CASE 3: We have three subnets defined and we received relayed traffic - // that came out of subnet 2. We should select subnet2 then - CfgMgr::instance().clear(); - CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet1); - CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet2); - CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet3); - CfgMgr::instance().commit(); - // Source of the packet should have no meaning. Selection is based // on linkaddr field in the relay pkt->setRemoteAddr(IOAddress("2001:db8:1::baca")); selected = srv.selectSubnet(pkt); EXPECT_EQ(selected, subnet2); - // CASE 4: We have three subnets defined and we received relayed traffic + // But not when this linkaddr field is not usable. + Pkt6::RelayInfo relay2; + relay2.peeraddr_ = IOAddress("fe80::1"); + pkt->relay_info_.clear(); + pkt->relay_info_.push_back(relay2); + selected = srv.selectSubnet(pkt); + EXPECT_EQ(selected, subnet1); + + // CASE 3: We have three subnets defined and we received relayed traffic // that came out a layer 2 relay on subnet 2. We should select subnet2 then CfgMgr::instance().clear(); CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet1); CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet2); CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet3); CfgMgr::instance().commit(); - Pkt6::RelayInfo relay2; + pkt->relay_info_.clear(); + pkt->relay_info_.push_back(relay); relay2.hop_count_ = 1; - relay2.peeraddr_ = IOAddress("fe80::1"); pkt->relay_info_.push_back(relay2); selected = srv.selectSubnet(pkt); EXPECT_EQ(selected, subnet2); - // CASE 5: We have three subnets defined and we received relayed traffic + // The number of level 2 relay doesn't matter + pkt->relay_info_.clear(); + Pkt6::RelayInfo relay20; + relay20.peeraddr_ = IOAddress("fe80::1"); + pkt->relay_info_.push_back(relay20); + Pkt6::RelayInfo relay21; + relay21.peeraddr_ = IOAddress("fe80::1"); + relay21.hop_count_ = 1; + pkt->relay_info_.push_back(relay21); + relay.hop_count_ = 2; + pkt->relay_info_.push_back(relay); + Pkt6::RelayInfo relay22; + relay22.peeraddr_ = IOAddress("fe80::1"); + relay22.hop_count_ = 3; + pkt->relay_info_.push_back(relay22); + Pkt6::RelayInfo relay23; + relay23.peeraddr_ = IOAddress("fe80::1"); + relay23.hop_count_ = 4; + pkt->relay_info_.push_back(relay23); + selected = srv.selectSubnet(pkt); + EXPECT_EQ(selected, subnet2); + + // Only the inner/last relay with a usable address matters + pkt->relay_info_.clear(); + pkt->relay_info_.push_back(relay20); + pkt->relay_info_.push_back(relay21); + pkt->relay_info_.push_back(relay); + pkt->relay_info_.push_back(relay22); + Pkt6::RelayInfo relay3; + relay3.linkaddr_ = IOAddress("2001:db8:3::1234"); + relay3.peeraddr_ = IOAddress("fe80::1"); + relay3.hop_count_ = 4; + pkt->relay_info_.push_back(relay3); + selected = srv.selectSubnet(pkt); + EXPECT_EQ(selected, subnet3); + + // CASE 4: We have three subnets defined and we received relayed traffic // that came out of undefined subnet. We should select nothing CfgMgr::instance().clear(); CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet1); @@ -1344,6 +1380,7 @@ TEST_F(Dhcpv6SrvTest, selectSubnetRelayLinkaddr) { CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet3); CfgMgr::instance().commit(); pkt->relay_info_.clear(); + relay.hop_count_ = 0; relay.linkaddr_ = IOAddress("2001:db8:4::1234"); pkt->relay_info_.push_back(relay); selected = srv.selectSubnet(pkt);