]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5617] Moved selector init to library
authorFrancis Dupont <fdupont@isc.org>
Fri, 11 May 2018 14:35:04 +0000 (16:35 +0200)
committerFrancis Dupont <fdupont@isc.org>
Fri, 11 May 2018 14:35:04 +0000 (16:35 +0200)
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp6/dhcp6_srv.cc
src/lib/dhcpsrv/cfg_subnets4.cc
src/lib/dhcpsrv/cfg_subnets4.h
src/lib/dhcpsrv/cfg_subnets6.cc
src/lib/dhcpsrv/cfg_subnets6.h

index ddd6043370c678c6b98cfabe8de891339d52de54..b10c113e5b5da3e1d50cb460c9ace8dc7e8cad23 100644 (file)
@@ -500,48 +500,7 @@ Dhcpv4Srv::selectSubnet(const Pkt4Ptr& query, bool& drop,
 
     Subnet4Ptr subnet;
 
-    SubnetSelector selector;
-    selector.ciaddr_ = query->getCiaddr();
-    selector.giaddr_ = query->getGiaddr();
-    selector.local_address_ = query->getLocalAddr();
-    selector.remote_address_ = query->getRemoteAddr();
-    selector.client_classes_ = query->classes_;
-    selector.iface_name_ = query->getIface();
-
-    // If the link-selection sub-option is present, extract its value.
-    // "The link-selection sub-option is used by any DHCP relay agent
-    // that desires to specify a subnet/link for a DHCP client request
-    // that it is relaying but needs the subnet/link specification to
-    // be different from the IP address the DHCP server should use
-    // when communicating with the relay agent." (RFC 3527)
-    //
-    // Try first Relay Agent Link Selection sub-option
-    OptionPtr rai = query->getOption(DHO_DHCP_AGENT_OPTIONS);
-    if (rai) {
-        OptionCustomPtr rai_custom =
-            boost::dynamic_pointer_cast<OptionCustom>(rai);
-        if (rai_custom) {
-            OptionPtr link_select =
-                rai_custom->getOption(RAI_OPTION_LINK_SELECTION);
-            if (link_select) {
-                OptionBuffer link_select_buf = link_select->getData();
-                if (link_select_buf.size() == sizeof(uint32_t)) {
-                    selector.option_select_ =
-                        IOAddress::fromBytes(AF_INET, &link_select_buf[0]);
-                }
-            }
-        }
-    } else {
-        // Or Subnet Selection option
-        OptionPtr sbnsel = query->getOption(DHO_SUBNET_SELECTION);
-        if (sbnsel) {
-            OptionCustomPtr oc =
-                boost::dynamic_pointer_cast<OptionCustom>(sbnsel);
-            if (oc) {
-                selector.option_select_ = oc->readAddress();
-            }
-        }
-    }
+    const SubnetSelector& selector = CfgSubnets4::initSelector(query);
 
     CfgMgr& cfgmgr = CfgMgr::instance();
     subnet = cfgmgr.getCurrentCfg()->getCfgSubnets4()->selectSubnet(selector);
index 764a6173bad673d1dc8510b9292dc97345fa19c7..b5a75801bdde38c812f35b5ce044cf308c6ed7cd 100644 (file)
@@ -1305,31 +1305,11 @@ Dhcpv6Srv::sanityCheck(const Pkt6Ptr& pkt, RequirementLevel clientid,
 
 Subnet6Ptr
 Dhcpv6Srv::selectSubnet(const Pkt6Ptr& question, bool& drop) {
-    // Initialize subnet selector with the values used to select the subnet.
-    SubnetSelector selector;
-    selector.iface_name_ = question->getIface();
-    selector.remote_address_ = question->getRemoteAddr();
-    selector.first_relay_linkaddr_ = IOAddress("::");
-    selector.client_classes_ = question->classes_;
-
-    // Initialize fields specific to relayed messages.
-    if (!question->relay_info_.empty()) {
-        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);
-    }
+    const SubnetSelector& selector = CfgSubnets6::initSelector(question);
 
     Subnet6Ptr subnet = CfgMgr::instance().getCurrentCfg()->
         getCfgSubnets6()->selectSubnet(selector);
 
-
     // Let's execute all callouts registered for subnet6_receive
     if (HooksManager::calloutsPresent(Hooks.hook_index_subnet6_select_)) {
         CalloutHandlePtr callout_handle = getCalloutHandle(question);
index 21c188ae300231063b0055c7e1ac616eca0aa441..4d12e83e08df07286ce34f008905c1717f215490 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -6,6 +6,7 @@
 
 #include <config.h>
 #include <dhcp/iface_mgr.h>
+#include <dhcp/option_custom.h>
 #include <dhcpsrv/cfg_subnets4.h>
 #include <dhcpsrv/dhcpsrv_log.h>
 #include <dhcpsrv/lease_mgr_factory.h>
@@ -75,6 +76,54 @@ CfgSubnets4::hasSubnetWithServerId(const asiolink::IOAddress& server_id) const {
     return (subnet_it != index.cend());
 }
 
+SubnetSelector
+CfgSubnets4::initSelector(const Pkt4Ptr& query) {
+    SubnetSelector selector;
+    selector.ciaddr_ = query->getCiaddr();
+    selector.giaddr_ = query->getGiaddr();
+    selector.local_address_ = query->getLocalAddr();
+    selector.remote_address_ = query->getRemoteAddr();
+    selector.client_classes_ = query->classes_;
+    selector.iface_name_ = query->getIface();
+
+    // If the link-selection sub-option is present, extract its value.
+    // "The link-selection sub-option is used by any DHCP relay agent
+    // that desires to specify a subnet/link for a DHCP client request
+    // that it is relaying but needs the subnet/link specification to
+    // be different from the IP address the DHCP server should use
+    // when communicating with the relay agent." (RFC 3527)
+    //
+    // Try first Relay Agent Link Selection sub-option
+    OptionPtr rai = query->getOption(DHO_DHCP_AGENT_OPTIONS);
+    if (rai) {
+        OptionCustomPtr rai_custom =
+            boost::dynamic_pointer_cast<OptionCustom>(rai);
+        if (rai_custom) {
+            OptionPtr link_select =
+                rai_custom->getOption(RAI_OPTION_LINK_SELECTION);
+            if (link_select) {
+                OptionBuffer link_select_buf = link_select->getData();
+                if (link_select_buf.size() == sizeof(uint32_t)) {
+                    selector.option_select_ =
+                        IOAddress::fromBytes(AF_INET, &link_select_buf[0]);
+                }
+            }
+        }
+    } else {
+        // Or Subnet Selection option
+        OptionPtr sbnsel = query->getOption(DHO_SUBNET_SELECTION);
+        if (sbnsel) {
+            OptionCustomPtr oc =
+                boost::dynamic_pointer_cast<OptionCustom>(sbnsel);
+            if (oc) {
+                selector.option_select_ = oc->readAddress();
+            }
+        }
+    }
+
+    return (selector);
+}
+
 Subnet4Ptr
 CfgSubnets4::selectSubnet4o6(const SubnetSelector& selector) const {
 
index 86758172a5c47726e45e40b32365e7c84a42a61d..521ffa0a328cccf5a235c125dde444cec41c4624 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -9,6 +9,7 @@
 
 #include <asiolink/io_address.h>
 #include <cc/cfg_to_element.h>
+#include <dhcp/pkt4.h>
 #include <dhcpsrv/subnet.h>
 #include <dhcpsrv/subnet_id.h>
 #include <dhcpsrv/subnet_selector.h>
@@ -99,6 +100,14 @@ public:
     /// @return true if there is a subnet with a specified server identifier.
     bool hasSubnetWithServerId(const asiolink::IOAddress& server_id) const;
 
+    /// @brief Build selector from a client's message.
+    ///
+    /// @note: code moved from server.
+    ///
+    /// @param query client's message.
+    /// @return filled selector.
+    static SubnetSelector initSelector(const Pkt4Ptr& query);
+
     /// @brief Returns a pointer to the selected subnet.
     ///
     /// This method tries to retrieve the subnet for the client using various
index 9db6aa4fee451a78df623ea0c414b4ec915c1334..0d058b3954d5d51130e3551716a21a2e942bfef1 100644 (file)
@@ -1,16 +1,19 @@
-// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 #include <config.h>
+#include <dhcp/dhcp6.h>
+#include <dhcp/option_custom.h>
 #include <dhcpsrv/cfg_subnets6.h>
 #include <dhcpsrv/dhcpsrv_log.h>
 #include <dhcpsrv/lease_mgr_factory.h>
 #include <dhcpsrv/subnet_id.h>
 #include <dhcpsrv/addr_utilities.h>
 #include <stats/stats_mgr.h>
+#include <boost/foreach.hpp>
 #include <string.h>
 #include <sstream>
 
@@ -66,6 +69,32 @@ CfgSubnets6::getByPrefix(const std::string& subnet_text) const {
     return ((subnet_it != index.cend()) ? (*subnet_it) : ConstSubnet6Ptr());
 }
 
+SubnetSelector
+CfgSubnets6::initSelector(const Pkt6Ptr& query) {
+    // Initialize subnet selector with the values used to select the subnet.
+    SubnetSelector selector;
+    selector.iface_name_ = query->getIface();
+    selector.remote_address_ = query->getRemoteAddr();
+    selector.first_relay_linkaddr_ = IOAddress("::");
+    selector.client_classes_ = query->classes_;
+
+    // Initialize fields specific to relayed messages.
+    if (!query->relay_info_.empty()) {
+        BOOST_REVERSE_FOREACH(Pkt6::RelayInfo relay, query->relay_info_) {
+            if (!relay.linkaddr_.isV6Zero() &&
+                !relay.linkaddr_.isV6LinkLocal()) {
+                selector.first_relay_linkaddr_ = relay.linkaddr_;
+                break;
+            }
+        }
+        selector.interface_id_ =
+            query->getAnyRelayOption(D6O_INTERFACE_ID,
+                                     Pkt6::RELAY_GET_FIRST);
+    }
+
+    return (selector);
+}
+
 Subnet6Ptr
 CfgSubnets6::selectSubnet(const SubnetSelector& selector) const {
     Subnet6Ptr subnet;
index 5e031522751b78e94ec068028f6b6e12cab0b912..84003101a77eb5ac84b99a5b01f600415f8b5267 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -9,6 +9,7 @@
 
 #include <asiolink/io_address.h>
 #include <dhcp/option.h>
+#include <dhcp/pkt6.h>
 #include <cc/cfg_to_element.h>
 #include <dhcpsrv/subnet.h>
 #include <dhcpsrv/subnet_id.h>
@@ -92,6 +93,14 @@ public:
     /// subnet doesn't exist.
     ConstSubnet6Ptr getByPrefix(const std::string& subnet_prefix) const;
 
+    /// @brief Build selector from a client's message.
+    ///
+    /// @note: code moved from server.
+    ///
+    /// @param query client's message.
+    /// @return filled selector.
+    static SubnetSelector initSelector(const Pkt6Ptr& query);
+
     /// @brief Selects a subnet using parameters specified in the selector.
     ///
     /// This method tries to retrieve the subnet for the client using various