From: Francis Dupont Date: Fri, 11 May 2018 14:35:04 +0000 (+0200) Subject: [5617] Moved selector init to library X-Git-Tag: trac5549a_base~12^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f8a235791a8f8dbf7deb446fd7af13ce0f777ca6;p=thirdparty%2Fkea.git [5617] Moved selector init to library --- diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index ddd6043370..b10c113e5b 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -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(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(sbnsel); - if (oc) { - selector.option_select_ = oc->readAddress(); - } - } - } + const SubnetSelector& selector = CfgSubnets4::initSelector(query); CfgMgr& cfgmgr = CfgMgr::instance(); subnet = cfgmgr.getCurrentCfg()->getCfgSubnets4()->selectSubnet(selector); diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 764a6173ba..b5a75801bd 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -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); diff --git a/src/lib/dhcpsrv/cfg_subnets4.cc b/src/lib/dhcpsrv/cfg_subnets4.cc index 21c188ae30..4d12e83e08 100644 --- a/src/lib/dhcpsrv/cfg_subnets4.cc +++ b/src/lib/dhcpsrv/cfg_subnets4.cc @@ -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 #include +#include #include #include #include @@ -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(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(sbnsel); + if (oc) { + selector.option_select_ = oc->readAddress(); + } + } + } + + return (selector); +} + Subnet4Ptr CfgSubnets4::selectSubnet4o6(const SubnetSelector& selector) const { diff --git a/src/lib/dhcpsrv/cfg_subnets4.h b/src/lib/dhcpsrv/cfg_subnets4.h index 86758172a5..521ffa0a32 100644 --- a/src/lib/dhcpsrv/cfg_subnets4.h +++ b/src/lib/dhcpsrv/cfg_subnets4.h @@ -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 #include +#include #include #include #include @@ -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 diff --git a/src/lib/dhcpsrv/cfg_subnets6.cc b/src/lib/dhcpsrv/cfg_subnets6.cc index 9db6aa4fee..0d058b3954 100644 --- a/src/lib/dhcpsrv/cfg_subnets6.cc +++ b/src/lib/dhcpsrv/cfg_subnets6.cc @@ -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 +#include +#include #include #include #include #include #include #include +#include #include #include @@ -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; diff --git a/src/lib/dhcpsrv/cfg_subnets6.h b/src/lib/dhcpsrv/cfg_subnets6.h index 5e03152275..84003101a7 100644 --- a/src/lib/dhcpsrv/cfg_subnets6.h +++ b/src/lib/dhcpsrv/cfg_subnets6.h @@ -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 #include +#include #include #include #include @@ -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