Parcourir la source

[4059] Added new cases to selectSubnetRelayLinkaddr unit test

Francis Dupont il y a 9 ans
Parent
commit
d4668753de
1 fichiers modifiés avec 51 ajouts et 14 suppressions
  1. 51 14
      src/bin/dhcp6/tests/dhcp6_srv_unittest.cc

+ 51 - 14
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);