22#include <boost/algorithm/string/split.hpp>
23#include <boost/algorithm/string/classification.hpp>
142 source_is_query_ = source_is_query;
149 return (source_is_query_);
157 dest_is_response_ = dest_is_response;
164 return (dest_is_response_);
188 bool source_is_query_;
191 bool dest_is_response_;
223 vendor_id_ = vendor_id;
237 return (container_->getCode());
244 return (container_->getOptionDef());
251 return (container_->getClass());
258 container_action_ = action;
265 return (container_action_);
300 return (option_config_map_);
307 return (sub_option_config_map_);
322 template <
typename PktType>
324 PktType query, PktType response) {
327 if (query && response && need_copy_classes_to_response_) {
328 response->copyClasses(*query);
332 if (!opt_cfg->getDestination() && response) {
338 if (!client_class.empty()) {
339 if (!query->inClass(client_class)) {
340 logClass(client_class, opt_cfg->getCode());
344 PktType source = (opt_cfg->getSource() ? query : response);
345 PktType dest = (opt_cfg->getDestination() ? response : query);
346 if (!source || !dest) {
351 uint16_t code = opt_cfg->getCode();
354 switch (opt_cfg->getAction()) {
370 std::vector<std::string> split_vec =
372 opt = def->optionFactory(universe, code, split_vec);
374 buffer.assign(value.begin(), value.end());
379 dest->addOption(opt);
391 std::vector<std::string> split_vec =
393 opt = def->optionFactory(universe, code,
396 buffer.assign(value.begin(), value.end());
402 while (dest->getOption(code)) {
403 dest->delOption(code);
406 dest->addOption(opt);
419 while (dest->getOption(code)) {
420 dest->delOption(code);
428 for (
auto const& sub_pair :
pair.second) {
430 if (!sub_cfg->getDestination() && response) {
434 uint16_t sub_code = sub_cfg->getCode();
435 uint16_t opt_code = sub_cfg->getContainerCode();
437 sub_cfg->getContainerClass();
438 if (!opt_class.empty()) {
439 if (!query->inClass(opt_class)) {
446 if (!sub_class.empty()) {
447 if (!query->inClass(sub_class)) {
452 PktType source = (sub_cfg->getSource() ? query : response);
453 PktType dest = (sub_cfg->getDestination() ? response : query);
454 if (!source || !dest) {
462 uint32_t vendor_id = sub_cfg->getVendorId();
463 switch (sub_cfg->getAction()) {
468 if (!opt && (sub_cfg->getContainerAction() !=
ADD)) {
478 if (opt && vendor_id && !
checkVendor(opt, vendor_id)) {
482 if (opt && opt->getOption(sub_code)) {
487 std::vector<std::string> split_vec =
489 sub = def->optionFactory(universe, sub_code,
492 buffer.assign(value.begin(), value.end());
505 dest->addOption(opt);
518 if (!opt && (sub_cfg->getContainerAction() !=
ADD)) {
528 if (opt && vendor_id && !
checkVendor(opt, vendor_id)) {
533 std::vector<std::string> split_vec =
535 sub = def->optionFactory(universe, sub_code,
538 buffer.assign(value.begin(), value.end());
544 while (opt->getOption(sub_code)) {
545 opt->delOption(sub_code);
557 dest->addOption(opt);
573 sub = opt->getOption(sub_code);
583 if (opt && vendor_id && !
checkVendor(opt, vendor_id)) {
587 while (opt->getOption(sub_code)) {
588 opt->delOption(sub_code);
592 if ((sub_cfg->getContainerAction() ==
REMOVE) &&
593 opt->getOptions().empty()) {
594 dest->delOption(opt_code);
616 const std::string& value);
623 static void logAction(
Action action, uint16_t code, uint32_t vendor_id);
631 uint16_t code, uint16_t container_code);
640 uint16_t container_code,
641 const std::string& value);
654 return (option_config_map_);
661 return (sub_option_config_map_);
678 bool need_copy_classes_to_response_;
Defines elements for storing the names of client classes.
This class represents vendor-specific information option.
Universe
defines option universe DHCPv4 or DHCPv6
bool getSource() const
Get source.
void setDestination(bool dest_is_response)
Set destination.
virtual ~OptionConfig()
Destructor.
void setExpr(const isc::dhcp::ExpressionPtr &expr)
Set match expression.
void setSource(bool source_is_query)
Set source.
const isc::dhcp::ExpressionPtr & getExpr() const
Get match expression.
uint16_t getCode() const
Return option code.
OptionConfig(uint16_t code, isc::dhcp::OptionDefinitionPtr def)
Constructor.
Action getAction() const
Return action.
bool getDestination() const
Get destination.
const isc::dhcp::ClientClass & getClass() const
Get client class.
void setClass(const isc::dhcp::ClientClass &class_name)
Set client class.
isc::dhcp::OptionDefinitionPtr getOptionDef() const
Return option definition.
void setText(const std::string &text)
Set textual expression.
void setAction(Action action)
Set action.
const std::string & getText() const
Get textual expression.
isc::dhcp::OptionDefinitionPtr getContainerDef() const
Return container definition.
Action getContainerAction() const
Return action on the container.
SubOptionConfig(uint16_t code, isc::dhcp::OptionDefinitionPtr def, OptionConfigPtr container)
Constructor.
uint32_t getVendorId() const
Return vendor id.
void setVendorId(uint32_t vendor_id)
Set vendor id.
const isc::dhcp::ClientClass & getContainerClass() const
Return container client class.
void setContainerAction(Action action)
Set action on the container.
uint16_t getContainerCode() const
Return container code.
virtual ~SubOptionConfig()
Destructor.
void configure(isc::data::ConstElementPtr options)
Configure the Flex Option implementation.
const OptionConfigMap & getOptionConfigMap() const
Get the option config map.
boost::shared_ptr< OptionConfig > OptionConfigPtr
The type of shared pointers to option config.
std::map< uint16_t, OptionConfigList > OptionConfigMap
The type of the option config map.
~FlexOptionImpl()
Destructor.
std::map< uint16_t, SubOptionConfigMap > SubOptionConfigMapMap
The type of the map of sub-option config maps.
boost::shared_ptr< SubOptionConfig > SubOptionConfigPtr
The type of shared pointers to sub-option config.
static void logAction(Action action, uint16_t code, const std::string &value)
Log the action for option.
void process(isc::dhcp::Option::Universe universe, PktType query, PktType response)
Process a query / response pair.
static void logSubClass(const isc::dhcp::ClientClass &client_class, uint16_t code, uint16_t container_code)
Log the client class for sub-option.
SubOptionConfigMapMap & getMutableSubOptionConfigMap()
Get a mutable reference to the sub-option config map of maps.
OptionConfigMap & getMutableOptionConfigMap()
Get a mutable reference to the option config map.
static void logSubAction(Action action, uint16_t code, uint16_t container_code, const std::string &value)
Log the action for sub-option.
FlexOptionImpl()
Constructor.
std::list< OptionConfigPtr > OptionConfigList
The type of lists of shared pointers to option config.
static bool checkVendor(isc::dhcp::OptionPtr opt, uint32_t vendor_id)
Check vendor option vendor id mismatch.
std::map< uint16_t, SubOptionConfigPtr > SubOptionConfigMap
The type of the sub-option config map.
static void logClass(const isc::dhcp::ClientClass &client_class, uint16_t code)
Log the client class for option.
const SubOptionConfigMapMap & getSubOptionConfigMap() const
Get the sub-option config map of maps.
boost::shared_ptr< const Element > ConstElementPtr
std::map< std::string, isc::data::Element::types > SimpleKeywords
This specifies all accepted keywords with their types.
std::string ClientClass
Defines a single class name.
std::string evaluateString(const Expression &expr, Pkt &pkt)
Evaluate a RPN expression for a v4 or v6 packet and return a string value.
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
boost::shared_ptr< Expression > ExpressionPtr
bool evaluateBool(const Expression &expr, Pkt &pkt)
Evaluate a RPN expression for a v4 or v6 packet and return a true or false decision.
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
boost::shared_ptr< Option > OptionPtr
boost::shared_ptr< FlexOptionImpl > FlexOptionImplPtr
The type of shared pointers to Flex Option implementations.
vector< string > tokens(const string &text, const string &delim, bool escape)
Split string into tokens.
Defines the logger used by the top-level component of kea-lfc.