]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[4059] Added layer 2 DHCPv6 relay support
authorFrancis Dupont <fdupont@isc.org>
Sat, 19 Sep 2015 20:56:02 +0000 (22:56 +0200)
committerFrancis Dupont <fdupont@isc.org>
Sat, 19 Sep 2015 20:56:02 +0000 (22:56 +0200)
src/bin/dhcp6/dhcp6_srv.cc
src/bin/dhcp6/tests/dhcp6_srv_unittest.cc

index 43f1b228162b6cae5aea39564b3f9799885dd54f..e348f3867ac6833fe0361d9bf0febd25bcdb156e 100644 (file)
@@ -1051,7 +1051,13 @@ Dhcpv6Srv::selectSubnet(const Pkt6Ptr& question) {
 
     // Initialize fields specific to relayed messages.
     if (!question->relay_info_.empty()) {
-        selector.first_relay_linkaddr_ = question->relay_info_.back().linkaddr_;
+        BOOST_REVERSE_FOREACH(Pkt6::RelayInfo relay, question->relay_info_) {
+            if (!relay.linkaddr_.isV6Zero() &&
+                !relay.linkaddr_.isV6LinkLocal()) {
+                selector.first_relay_linkaddr_ = relay.linkaddr_;
+                break;
+            }
+        }
         selector.interface_id_ =
             question->getAnyRelayOption(D6O_INTERFACE_ID,
                                         Pkt6::RELAY_GET_FIRST);
index 4fa269b0bc6e432d7d31e4a2f70faa1ac1098669..047c97ffb4adeed227d8bf3f22fa8a03dd15a244 100644 (file)
@@ -1323,6 +1323,20 @@ TEST_F(Dhcpv6SrvTest, selectSubnetRelayLinkaddr) {
     EXPECT_EQ(selected, subnet2);
 
     // CASE 4: 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;
+    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
     // that came out of undefined subnet. We should select nothing
     CfgMgr::instance().clear();
     CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->add(subnet1);