2022-02-21 10:36:48 +02:00
|
|
|
// Copyright (C) 2014-2022 Internet Systems Consortium, Inc. ("ISC")
|
2014-02-03 18:50:24 +01:00
|
|
|
//
|
2015-12-15 21:37:34 +01:00
|
|
|
// 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/.
|
2014-02-03 18:50:24 +01:00
|
|
|
|
2014-02-03 20:33:33 +01:00
|
|
|
#ifndef CLASSIFY_H
|
|
|
|
#define CLASSIFY_H
|
|
|
|
|
2022-05-06 08:56:19 +03:00
|
|
|
#include <boost/multi_index_container.hpp>
|
2020-07-22 19:13:50 +02:00
|
|
|
#include <boost/multi_index/hashed_index.hpp>
|
|
|
|
#include <boost/multi_index/identity.hpp>
|
2022-05-06 08:56:19 +03:00
|
|
|
#include <boost/multi_index/ordered_index.hpp>
|
2020-07-22 19:13:50 +02:00
|
|
|
#include <boost/multi_index/sequenced_index.hpp>
|
2022-05-06 08:56:19 +03:00
|
|
|
|
2014-02-03 18:50:24 +01:00
|
|
|
#include <string>
|
|
|
|
|
|
|
|
/// @file classify.h
|
|
|
|
///
|
2015-11-10 15:40:00 -05:00
|
|
|
/// @brief Defines elements for storing the names of client classes
|
2014-02-03 18:50:24 +01:00
|
|
|
///
|
2015-11-10 15:40:00 -05:00
|
|
|
/// This file defines common elements used to track the client classes
|
|
|
|
/// that may be associated with a given packet. In order to minimize the
|
|
|
|
/// exposure of the DHCP library to server side concepts such as client
|
|
|
|
/// classification the classes herein provide a mechanism to maintain lists
|
|
|
|
/// of class names, rather than the classes they represent. It is the
|
2021-01-22 01:36:41 +02:00
|
|
|
/// upper layers' prerogative to use these names as they see fit.
|
2014-02-03 18:50:24 +01:00
|
|
|
///
|
|
|
|
/// @todo This file should be moved to dhcpsrv eventually as the classification
|
2014-02-06 20:40:02 +01:00
|
|
|
/// is server side concept. Client has no notion of classifying incoming server
|
|
|
|
/// messages as it usually talks to only one server. That move is not possible
|
|
|
|
/// yet, as the Pkt4 and Pkt6 classes have server-side implementation, even
|
|
|
|
/// though they reside in the dhcp directory.
|
2014-02-03 18:50:24 +01:00
|
|
|
|
|
|
|
namespace isc {
|
|
|
|
|
|
|
|
namespace dhcp {
|
|
|
|
|
2015-11-10 15:40:00 -05:00
|
|
|
/// @brief Defines a single class name.
|
2014-02-03 19:53:14 +01:00
|
|
|
typedef std::string ClientClass;
|
|
|
|
|
2020-07-22 19:13:50 +02:00
|
|
|
/// @brief Tag for the sequence index.
|
|
|
|
struct ClassSequenceTag { };
|
|
|
|
|
|
|
|
/// @brief Tag for the name index.
|
|
|
|
struct ClassNameTag { };
|
|
|
|
|
|
|
|
/// @brief the client class multi-index.
|
|
|
|
typedef boost::multi_index_container<
|
|
|
|
ClientClass,
|
|
|
|
boost::multi_index::indexed_by<
|
|
|
|
// First index is the sequence one.
|
|
|
|
boost::multi_index::sequenced<
|
|
|
|
boost::multi_index::tag<ClassSequenceTag>
|
|
|
|
>,
|
|
|
|
// Second index is the name hash one.
|
|
|
|
boost::multi_index::hashed_unique<
|
|
|
|
boost::multi_index::tag<ClassNameTag>,
|
|
|
|
boost::multi_index::identity<ClientClass>
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> ClientClassContainer;
|
|
|
|
|
2015-11-10 15:40:00 -05:00
|
|
|
/// @brief Container for storing client class names
|
2014-02-03 20:33:33 +01:00
|
|
|
///
|
2017-11-24 01:07:17 +01:00
|
|
|
/// Both a list to iterate on it in insert order and unordered
|
|
|
|
/// set of names for existence.
|
|
|
|
class ClientClasses {
|
2014-02-03 20:33:33 +01:00
|
|
|
public:
|
2014-10-14 10:47:10 +02:00
|
|
|
|
2017-11-24 01:07:17 +01:00
|
|
|
/// @brief Type of iterators
|
2020-07-22 19:13:50 +02:00
|
|
|
typedef ClientClassContainer::const_iterator const_iterator;
|
2022-05-06 08:55:44 +03:00
|
|
|
typedef ClientClassContainer::iterator iterator;
|
2017-11-24 01:07:17 +01:00
|
|
|
|
2014-10-14 10:47:10 +02:00
|
|
|
/// @brief Default constructor.
|
2020-07-22 19:13:50 +02:00
|
|
|
ClientClasses() : container_() {
|
2014-10-14 10:47:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// @brief Constructor from comma separated values.
|
|
|
|
///
|
|
|
|
/// @param class_names A string containing a client classes separated
|
|
|
|
/// with commas. The class names are trimmed before insertion to the set.
|
2017-11-24 01:07:17 +01:00
|
|
|
ClientClasses(const ClientClass& class_names);
|
|
|
|
|
|
|
|
/// @brief Insert an element.
|
|
|
|
///
|
|
|
|
/// @param class_name The name of the class to insert
|
|
|
|
void insert(const ClientClass& class_name) {
|
2020-07-22 19:13:50 +02:00
|
|
|
static_cast<void>(container_.push_back(class_name));
|
2017-11-24 01:07:17 +01:00
|
|
|
}
|
|
|
|
|
2020-03-09 16:43:05 +01:00
|
|
|
/// @brief Erase element by name.
|
|
|
|
///
|
|
|
|
/// @param class_name The name of the class to erase.
|
|
|
|
void erase(const ClientClass& class_name);
|
|
|
|
|
2017-11-24 01:07:17 +01:00
|
|
|
/// @brief Check if classes is empty.
|
|
|
|
bool empty() const {
|
2020-07-22 19:13:50 +02:00
|
|
|
return (container_.empty());
|
2017-11-24 01:07:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/// @brief Returns the number of classes.
|
|
|
|
///
|
|
|
|
/// @note; in C++ 11 list size complexity is constant so
|
|
|
|
/// there is no advantage to use the set part.
|
|
|
|
size_t size() const {
|
2020-07-22 19:13:50 +02:00
|
|
|
return (container_.size());
|
2017-11-24 01:07:17 +01:00
|
|
|
}
|
|
|
|
|
2022-05-06 08:55:44 +03:00
|
|
|
/// @brief Iterators to the first element.
|
|
|
|
/// @{
|
2017-11-24 01:07:17 +01:00
|
|
|
const_iterator cbegin() const {
|
2020-07-22 19:13:50 +02:00
|
|
|
return (container_.cbegin());
|
2017-11-24 01:07:17 +01:00
|
|
|
}
|
2022-05-06 08:55:44 +03:00
|
|
|
const_iterator begin() const {
|
|
|
|
return (container_.begin());
|
|
|
|
}
|
|
|
|
iterator begin() {
|
|
|
|
return (container_.begin());
|
|
|
|
}
|
|
|
|
/// @}
|
2017-11-24 01:07:17 +01:00
|
|
|
|
2022-05-06 08:55:44 +03:00
|
|
|
/// @brief Iterators to the past the end element.
|
|
|
|
/// @{
|
2017-11-24 01:07:17 +01:00
|
|
|
const_iterator cend() const {
|
2020-07-22 19:13:50 +02:00
|
|
|
return (container_.cend());
|
2017-11-24 01:07:17 +01:00
|
|
|
}
|
2022-05-06 08:55:44 +03:00
|
|
|
const_iterator end() const {
|
|
|
|
return (container_.end());
|
|
|
|
}
|
|
|
|
iterator end() {
|
|
|
|
return (container_.end());
|
|
|
|
}
|
|
|
|
/// @}
|
2014-10-14 10:47:10 +02:00
|
|
|
|
2014-02-06 20:40:02 +01:00
|
|
|
/// @brief returns if class x belongs to the defined classes
|
2014-02-03 20:33:33 +01:00
|
|
|
///
|
|
|
|
/// @param x client class to be checked
|
2014-02-06 20:40:02 +01:00
|
|
|
/// @return true if x belongs to the classes
|
2020-07-22 19:13:50 +02:00
|
|
|
bool contains(const ClientClass& x) const;
|
2017-11-24 01:07:17 +01:00
|
|
|
|
|
|
|
/// @brief Clears containers.
|
|
|
|
void clear() {
|
2020-07-22 19:13:50 +02:00
|
|
|
container_.clear();
|
2014-02-03 20:33:33 +01:00
|
|
|
}
|
2016-03-02 17:59:54 +01:00
|
|
|
|
|
|
|
/// @brief Returns all class names as text
|
|
|
|
///
|
|
|
|
/// @param separator Separator to be used between class names. The
|
|
|
|
/// default separator comprises comma sign followed by space
|
|
|
|
/// character.
|
|
|
|
std::string toText(const std::string& separator = ", ") const;
|
2017-11-24 01:07:17 +01:00
|
|
|
|
|
|
|
private:
|
2020-07-22 19:13:50 +02:00
|
|
|
/// @brief container part
|
|
|
|
ClientClassContainer container_;
|
2014-02-03 20:33:33 +01:00
|
|
|
};
|
2020-07-22 19:13:50 +02:00
|
|
|
}
|
2014-02-03 18:50:24 +01:00
|
|
|
|
2020-07-22 19:13:50 +02:00
|
|
|
}
|
2014-02-03 20:33:33 +01:00
|
|
|
|
|
|
|
#endif /* CLASSIFY_H */
|