<< " doesn't exist and therefore it is impossible"
" to find a suitable subnet for its IPv4 address");
}
- iface->getAddress4(address);
+
+ // Attempt to select subnet based on the interface name.
+ Subnet4Ptr subnet = selectSubnet(selector.iface_name_,
+ selector.client_classes_);
+
+ // If it matches - great. If not, we'll try to use a different
+ // selection criteria below.
+ if (subnet) {
+ return (subnet);
+ }
}
// Unable to find a suitable address to use for subnet selection.
return (selectSubnet(address, selector.client_classes_));
}
+Subnet4Ptr
+CfgSubnets4::selectSubnet(const std::string& iface,
+ const ClientClasses& client_classes) const {
+ for (Subnet4Collection::const_iterator subnet = subnets_.begin();
+ subnet != subnets_.end(); ++subnet) {
+
+ // If there's no interface specified for this subnet, proceed to
+ // the next subnet.
+ if ((*subnet)->getIface().empty()) {
+ continue;
+ }
+
+ // If it's specified, but does not match, proceed to the next
+ // subnet.
+ if ((*subnet)->getIface() != iface) {
+ continue;
+ }
+
+ // Eliminate those subnets that do not meet client class criteria.
+ if ((*subnet)->clientSupported(client_classes)) {
+ return (*subnet);
+ }
+ }
+
+ // Failed to find a subnet.
+ return (Subnet4Ptr());
+}
+
Subnet4Ptr
CfgSubnets4::selectSubnet(const IOAddress& address,
const ClientClasses& client_classes) const {
return (Subnet4Ptr());
}
+
bool
CfgSubnets4::isDuplicate(const Subnet4& subnet) const {
for (Subnet4Collection::const_iterator subnet_it = subnets_.begin();
const ClientClasses& client_classes
= ClientClasses()) const;
+ /// @brief Returns pointer to a subnet if provided interface name matches.
+ ///
+ /// This method returns a pointer to the subnet if the interface name passed
+ /// in parameter matches that of a subnet. This is mainly used for matching
+ /// local incoming traffic, even when the addresses on local interfaces do
+ /// not match subnet definition. This method is also called by the
+ /// @c selectSubnet(SubnetSelector).
+ ///
+ /// @todo This method requires performance improvement! It currently
+ /// iterates over all existing subnets to find the one which fulfils
+ /// the search criteria. The subnet storage is implemented as a simple
+ /// STL vector which precludes fast searches using specific keys.
+ /// Hence, full scan is required. To improve the search performance a
+ /// different container type is required, e.g. multi-index container,
+ /// or something of a similar functionality.
+ ///
+ /// @param iface name of the interface to be matched.
+ /// @param client_classes Optional parameter specifying the classes that
+ /// the client belongs to.
+ ///
+ /// @return Pointer to the selected subnet or NULL if no subnet found.
+ Subnet4Ptr selectSubnet(const std::string& iface,
+ const ClientClasses& client_classes) const;
+
/// @brief Attempts to do subnet selection based on DHCP4o6 information
///
/// The algorithm implemented is as follows: