Browse Source

[4059] Added layer 2 DHCPv6 relay support

Francis Dupont 9 years ago
parent
commit
0b9d3518f8
2 changed files with 21 additions and 1 deletions
  1. 7 1
      src/bin/dhcp6/dhcp6_srv.cc
  2. 14 0
      src/bin/dhcp6/tests/dhcp6_srv_unittest.cc

+ 7 - 1
src/bin/dhcp6/dhcp6_srv.cc

@@ -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);

+ 14 - 0
src/bin/dhcp6/tests/dhcp6_srv_unittest.cc

@@ -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);