Kea  1.9.9-git
token.h
Go to the documentation of this file.
1 // Copyright (C) 2015-2021 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef TOKEN_H
8 #define TOKEN_H
9 
10 #include <exceptions/exceptions.h>
11 #include <dhcp/pkt.h>
12 #include <stack>
13 
14 namespace isc {
15 namespace dhcp {
16 
17 class Token;
18 
20 typedef boost::shared_ptr<Token> TokenPtr;
21 
28 typedef std::vector<TokenPtr> Expression;
29 
30 typedef boost::shared_ptr<Expression> ExpressionPtr;
31 
33 typedef std::stack<std::string> ValueStack;
34 
37 class EvalBadStack : public Exception {
38 public:
39  EvalBadStack(const char* file, size_t line, const char* what) :
40  isc::Exception(file, line, what) { };
41 };
42 
45 class EvalTypeError : public Exception {
46 public:
47  EvalTypeError(const char* file, size_t line, const char* what) :
48  isc::Exception(file, line, what) { };
49 };
50 
51 
63 class Token {
64 public:
65 
78  virtual void evaluate(Pkt& pkt, ValueStack& values) = 0;
79 
81  virtual ~Token() {}
82 
90  static inline bool toBool(std::string value) {
91  if (value == "true") {
92  return (true);
93  } else if (value == "false") {
94  return (false);
95  } else {
96  isc_throw(EvalTypeError, "Incorrect boolean. Expected exactly "
97  "\"false\" or \"true\", got \"" << value << "\"");
98  }
99  }
100 };
101 
109 
114 class TokenString : public Token {
115 public:
119  TokenString(const std::string& str)
120  :value_(str){
121  }
122 
127  void evaluate(Pkt& pkt, ValueStack& values);
128 
129 protected:
130  std::string value_;
131 };
132 
137 class TokenHexString : public Token {
138 public:
144  TokenHexString(const std::string& str);
145 
152  void evaluate(Pkt& pkt, ValueStack& values);
153 
154 protected:
155  std::string value_;
156 };
157 
164 class TokenInteger : public TokenString {
165 public:
172  TokenInteger(const uint32_t value);
173 
179  uint32_t getInteger() const {
180  return (int_value_);
181  }
182 
183 protected:
184  uint32_t int_value_;
185 };
186 
191 class TokenIpAddress : public Token {
192 public:
196  TokenIpAddress(const std::string& addr);
197 
203  void evaluate(Pkt& pkt, ValueStack& values);
204 
205 protected:
207  std::string value_;
208 };
209 
214 class TokenIpAddressToText : public Token {
215 public:
218 
224  void evaluate(Pkt& pkt, ValueStack& values);
225 };
226 
231 class TokenInt8ToText : public Token {
232 public:
235 
242  void evaluate(Pkt& pkt, ValueStack& values);
243 };
244 
249 class TokenInt16ToText : public Token {
250 public:
253 
260  void evaluate(Pkt& pkt, ValueStack& values);
261 };
262 
267 class TokenInt32ToText : public Token {
268 public:
271 
278  void evaluate(Pkt& pkt, ValueStack& values);
279 };
280 
285 class TokenUInt8ToText : public Token {
286 public:
289 
296  void evaluate(Pkt& pkt, ValueStack& values);
297 };
298 
303 class TokenUInt16ToText : public Token {
304 public:
307 
314  void evaluate(Pkt& pkt, ValueStack& values);
315 };
316 
321 class TokenUInt32ToText : public Token {
322 public:
325 
332  void evaluate(Pkt& pkt, ValueStack& values);
333 };
334 
344 class TokenOption : public Token {
345 public:
346 
358  };
359 
367  TokenOption(const uint16_t option_code, const RepresentationType& rep_type)
368  : option_code_(option_code), representation_type_(rep_type) {}
369 
378  void evaluate(Pkt& pkt, ValueStack& values);
379 
386  uint16_t getCode() const {
387  return (option_code_);
388  }
389 
397  return (representation_type_);
398  }
399 
400 protected:
410  virtual OptionPtr getOption(Pkt& pkt);
411 
418  virtual std::string pushFailure(ValueStack& values);
419 
420  uint16_t option_code_;
422 };
423 
436 public:
437 
442  TokenRelay4Option(const uint16_t option_code,
443  const RepresentationType& rep_type);
444 
445 protected:
449  virtual OptionPtr getOption(Pkt& pkt);
450 };
451 
468 public:
475  TokenRelay6Option(const int8_t nest_level, const uint16_t option_code,
476  const RepresentationType& rep_type)
477  :TokenOption(option_code, rep_type), nest_level_(nest_level) {}
478 
486  int8_t getNest() const {
487  return (nest_level_);
488  }
489 
490 protected:
494  virtual OptionPtr getOption(Pkt& pkt);
495 
496  int8_t nest_level_;
497 };
498 
509 class TokenPkt : public Token {
510 public:
511 
515  SRC,
516  DST,
518  };
519 
521  TokenPkt(const MetadataType type)
522  : type_(type) {}
523 
531  void evaluate(Pkt& pkt, ValueStack& values);
532 
538  return (type_);
539  }
540 
541 private:
543  MetadataType type_;
544 };
545 
559 class TokenPkt4 : public Token {
560 public:
561 
563  enum FieldType {
573  };
574 
576  TokenPkt4(const FieldType type)
577  : type_(type) {}
578 
588  void evaluate(Pkt& pkt, ValueStack& values);
589 
595  return (type_);
596  }
597 
598 private:
600  FieldType type_;
601 };
602 
613 class TokenPkt6 : public Token {
614 public:
616  enum FieldType {
619  };
620 
622  TokenPkt6(const FieldType type)
623  : type_(type) {}
624 
634  void evaluate(Pkt& pkt, ValueStack& values);
635 
641  return(type_);
642  }
643 
644 private:
646  FieldType type_;
647 };
648 
664 class TokenRelay6Field : public Token {
665 public:
666 
668  enum FieldType {
671  };
672 
678  TokenRelay6Field(const int8_t nest_level, const FieldType type)
679  : nest_level_(nest_level), type_(type) {}
680 
688  void evaluate(Pkt& pkt, ValueStack& values);
689 
697  int8_t getNest() const {
698  return (nest_level_);
699  }
700 
708  return (type_);
709  }
710 
711 protected:
713  int8_t nest_level_;
715 };
716 
721 class TokenEqual : public Token {
722 public:
725 
738  void evaluate(Pkt& pkt, ValueStack& values);
739 };
740 
746 class TokenSubstring : public Token {
747 public:
750 
795  void evaluate(Pkt& pkt, ValueStack& values);
796 };
797 
803 class TokenConcat : public Token {
804 public:
807 
819  void evaluate(Pkt& pkt, ValueStack& values);
820 };
821 
831 class TokenIfElse : public Token {
832 public:
835 
850  void evaluate(Pkt& pkt, ValueStack& values);
851 };
852 
861 class TokenToHexString : public Token {
862 public:
865 
889  void evaluate(Pkt& pkt, ValueStack& values);
890 };
891 
896 class TokenNot : public Token {
897 public:
899  TokenNot() {}
900 
914  void evaluate(Pkt& pkt, ValueStack& values);
915 };
916 
920 class TokenAnd : public Token {
921 public:
923  TokenAnd() {}
924 
939  void evaluate(Pkt& pkt, ValueStack& values);
940 };
941 
945 class TokenOr : public Token {
946 public:
948  TokenOr() {}
949 
964  void evaluate(Pkt& pkt, ValueStack& values);
965 };
966 
970 class TokenMember : public Token {
971 public:
975  TokenMember(const std::string& client_class)
976  :client_class_(client_class){
977  }
978 
984  void evaluate(Pkt& pkt, ValueStack& values);
985 
992  const ClientClass& getClientClass() const {
993  return (client_class_);
994  }
995 
996 protected:
999 };
1000 
1015 class TokenVendor : public TokenOption {
1016 public:
1017 
1019  enum FieldType {
1024  };
1025 
1031  TokenVendor(Option::Universe u, uint32_t vendor_id, FieldType field);
1032 
1033 
1045  TokenVendor(Option::Universe u, uint32_t vendor_id, RepresentationType repr,
1046  uint16_t option_code = 0);
1047 
1053  uint32_t getVendorId() const;
1054 
1060  FieldType getField() const;
1061 
1084  virtual void evaluate(Pkt& pkt, ValueStack& values);
1085 
1086 protected:
1095  virtual OptionPtr getOption(Pkt& pkt);
1096 
1102 
1107  uint32_t vendor_id_;
1108 
1111 };
1112 
1131 public:
1132 
1138  TokenVendorClass(Option::Universe u, uint32_t vendor_id, RepresentationType repr);
1139 
1146  TokenVendorClass(Option::Universe u, uint32_t vendor_id, FieldType field,
1147  uint16_t index = 0);
1148 
1153  uint16_t getDataIndex() const;
1154 
1155 protected:
1156 
1180  void evaluate(Pkt& pkt, ValueStack& values);
1181 
1183  uint16_t index_;
1184 };
1185 
1197 class TokenSubOption : public TokenOption {
1198 public:
1199 
1202 
1210  TokenSubOption(const uint16_t option_code,
1211  const uint16_t sub_option_code,
1212  const RepresentationType& rep_type)
1213  : TokenOption(option_code, rep_type), sub_option_code_(sub_option_code) {}
1214 
1226  virtual void evaluate(Pkt& pkt, ValueStack& values);
1227 
1234  uint16_t getSubCode() const {
1235  return (sub_option_code_);
1236  }
1237 
1238 protected:
1243  virtual OptionPtr getSubOption(const OptionPtr& parent);
1244 
1245  uint16_t sub_option_code_;
1246 };
1247 
1248 } // end of isc::dhcp namespace
1249 } // end of isc namespace
1250 
1251 #endif
data chunk, used in derived vendor-class only
Definition: token.h:1023
TokenConcat()
Constructor (does nothing)
Definition: token.h:806
void evaluate(Pkt &pkt, ValueStack &values)
Logical negation.
Definition: token.cc:869
uint32_t vendor_id_
Enterprise-id value.
Definition: token.h:1107
Token representing a 16 bit unsigned integer as a string.
Definition: token.h:303
virtual OptionPtr getOption(Pkt &pkt)
Attempts to get a suboption.
Definition: token.cc:1048
interface name (string)
Definition: token.h:514
Token that represents fields of DHCPv6 packet.
Definition: token.h:613
const ClientClass & getClientClass() const
Returns client class name.
Definition: token.h:992
void evaluate(Pkt &pkt, ValueStack &values)
Alternative.
Definition: token.cc:801
TokenMember(const std::string &client_class)
Constructor.
Definition: token.h:975
giaddr (IPv4 address)
Definition: token.h:565
uint16_t sub_option_code_
Code of the sub-option to be extracted.
Definition: token.h:1245
TokenRelay6Option(const int8_t nest_level, const uint16_t option_code, const RepresentationType &rep_type)
Constructor that takes a nesting level and an option code as parameters.
Definition: token.h:475
The order where Token subtypes are declared should be:
Definition: token.h:114
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:233
Token representing a 32 bit integer as a string.
Definition: token.h:267
void evaluate(Pkt &pkt, ValueStack &values)
Gets a value from the specified packet.
Definition: token.cc:479
MetadataType getType()
Returns metadata type.
Definition: token.h:537
virtual OptionPtr getSubOption(const OptionPtr &parent)
Attempts to retrieve a sub-option.
Definition: token.cc:1182
Token that represents meta data of a DHCP packet.
Definition: token.h:509
std::string value_
< Constant value (empty string if the IP address cannot be converted)
Definition: token.h:207
TokenEqual()
Constructor (does nothing)
Definition: token.h:724
Token that represents concat operator (concatenates two other tokens)
Definition: token.h:803
std::string value_
Constant value.
Definition: token.h:130
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:293
uint16_t option_code_
Code of the option to be extracted.
Definition: token.h:420
If this token fetches a suboption, not a field.
Definition: token.h:1020
FieldType type_
field to get
Definition: token.h:714
FieldType
enum value that determines the field.
Definition: token.h:563
RepresentationType getRepresentation() const
Returns representation-type.
Definition: token.h:396
destination (IP address)
Definition: token.h:516
void evaluate(Pkt &pkt, ValueStack &values)
Gets a value of the specified packet.
Definition: token.cc:558
Base class for classes representing DHCP messages.
Definition: pkt.h:90
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (check if client_class_ was added to packet client classes)
Definition: token.cc:945
boost::shared_ptr< Option > OptionPtr
Definition: option.h:36
TokenIpAddressToText()
Constructor (does nothing)
Definition: token.h:217
Token that converts to hexadecimal string.
Definition: token.h:861
Universe
defines option universe DHCPv4 or DHCPv6
Definition: option.h:82
FieldType
Specifies a field of the vendor option.
Definition: token.h:1019
FieldType
enum value that determines the field.
Definition: token.h:668
Token that represents logical negation operator.
Definition: token.h:896
FieldType getType()
Returns field type.
Definition: token.h:594
ClientClass client_class_
The client class name.
Definition: token.h:998
Link address field (IPv6 address)
Definition: token.h:670
void evaluate(Pkt &pkt, ValueStack &values)
Extracts the specified field from the requested relay.
Definition: token.cc:598
TokenInt16ToText()
Constructor (does nothing)
Definition: token.h:252
Token representing an 8 bit unsigned integer as a string.
Definition: token.h:285
Token that represents an alternative.
Definition: token.h:831
transaction-id (xid)
Definition: token.h:572
TokenPkt(const MetadataType type)
Constructor (does nothing)
Definition: token.h:521
TokenRelay4Option(const uint16_t option_code, const RepresentationType &rep_type)
Constructor for extracting sub-option from RAI (option 82)
Definition: token.cc:376
Token representing a constant string in hexadecimal format.
Definition: token.h:137
TokenPkt4(const FieldType type)
Constructor (does nothing)
Definition: token.h:576
virtual OptionPtr getOption(Pkt &pkt)
Attempts to obtain specified option from the specified relay block.
Definition: token.cc:392
MetadataType
enum value that determines the field.
Definition: token.h:513
TokenSubOption(const uint16_t option_code, const uint16_t sub_option_code, const RepresentationType &rep_type)
Constructor that takes an option and sub-option codes as parameter.
Definition: token.h:1210
Token that represents logical or operator.
Definition: token.h:945
Token that represents a value of a field within a DHCPv6 relay encapsulation.
Definition: token.h:664
virtual OptionPtr getOption(Pkt &pkt)
Attempts to retrieve an option.
Definition: token.cc:324
Token that represents sub-options in DHCPv4 and DHCPv6.
Definition: token.h:1197
void evaluate(Pkt &pkt, ValueStack &values)
This is a method for evaluating a packet.
Definition: token.cc:1085
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
TokenUInt16ToText()
Constructor (does nothing)
Definition: token.h:306
Base class for all tokens.
Definition: token.h:63
boost::shared_ptr< Token > TokenPtr
Pointer to a single Token.
Definition: token.h:17
ciaddr (IPv4 address)
Definition: token.h:566
vendor[123].exists
Definition: token.h:1022
Option::Universe universe_
Universe (V4 or V6)
Definition: token.h:1101
Token that represents logical and operator.
Definition: token.h:920
TokenUInt8ToText()
Constructor (does nothing)
Definition: token.h:288
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:202
TokenOption(const uint16_t option_code, const RepresentationType &rep_type)
Constructor that takes an option code as a parameter.
Definition: token.h:367
uint32_t getInteger() const
Returns integer value.
Definition: token.h:179
length (4 octets)
Definition: token.h:517
TokenUInt32ToText()
Constructor (does nothing)
Definition: token.h:324
uint32_t int_value_
value as integer (stored for testing only)
Definition: token.h:184
enterprise-id field (vendor-info, vendor-class)
Definition: token.h:1021
TokenOr()
Constructor (does nothing)
Definition: token.h:948
TokenInteger(const uint32_t value)
Integer value set during construction.
Definition: token.cc:1177
std::stack< std::string > ValueStack
Evaluated values are stored as a stack of strings.
Definition: token.h:33
std::string value_
Constant value.
Definition: token.h:155
uint16_t getCode() const
Returns option-code.
Definition: token.h:386
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:171
static bool toBool(std::string value)
Coverts a (string) value to a boolean.
Definition: token.h:90
virtual void evaluate(Pkt &pkt, ValueStack &values)
This is a method for evaluating a packet.
Definition: token.cc:1190
EvalBadStack(const char *file, size_t line, const char *what)
Definition: token.h:39
void evaluate(Pkt &pkt, ValueStack &values)
Extract a substring from a string.
Definition: token.cc:684
chaddr field (up to 16 bytes link-layer address)
Definition: token.h:564
Represents a sub-option inserted by the DHCPv4 relay.
Definition: token.h:435
Token that represents a value of an option.
Definition: token.h:344
Token representing an IP address as a constant string.
Definition: token.h:191
Token representing an IP address as a string.
Definition: token.h:214
htype (hardware address type)
Definition: token.h:570
virtual OptionPtr getOption(Pkt &pkt)
Attempts to obtain specified sub-option of option 82 from the packet.
Definition: token.cc:381
virtual ~Token()
Virtual destructor.
Definition: token.h:81
TokenNot()
Constructor (does nothing)
Definition: token.h:899
TokenSubstring()
Constructor (does nothing)
Definition: token.h:749
virtual std::string pushFailure(ValueStack &values)
Auxiliary method that puts string representing a failure.
Definition: token.cc:367
message type (not really a field, content of option 53)
Definition: token.h:571
void evaluate(Pkt &pkt, ValueStack &values)
Logical and.
Definition: token.cc:891
FieldType getField() const
Returns field.
Definition: token.cc:976
Token that represents vendor class options in DHCPv4 and DHCPv6.
Definition: token.h:1130
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the constant string on the stack after decoding or an empty string if...
Definition: token.cc:73
TokenInt32ToText()
Constructor (does nothing)
Definition: token.h:270
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:262
Token that represents fields of a DHCPv4 packet.
Definition: token.h:559
void evaluate(Pkt &pkt, ValueStack &values)
Concatenate two values.
Definition: token.cc:779
void evaluate(Pkt &pkt, ValueStack &values)
Gets a value from the specified packet.
Definition: token.cc:428
This is a base class for exceptions thrown from the DNS library module.
Defines the logger used by the top-level component of kea-dhcp-ddns.
std::vector< TokenPtr > Expression
This is a structure that holds an expression converted to RPN.
Definition: token.h:28
TokenVendor(Option::Universe u, uint32_t vendor_id, FieldType field)
Constructor used for accessing a field.
Definition: token.cc:964
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the constant string on the stack after decoding)
Definition: token.cc:98
uint16_t getDataIndex() const
Returns data index.
Definition: token.cc:1081
virtual void evaluate(Pkt &pkt, ValueStack &values)=0
This is a generic method for evaluating a packet.
int8_t getNest() const
Returns nest-level.
Definition: token.h:697
TokenInt8ToText()
Constructor (does nothing)
Definition: token.h:234
TokenIfElse()
Constructor (does nothing)
Definition: token.h:834
EvalTypeError(const char *file, size_t line, const char *what)
Definition: token.h:47
Token that represents equality operator (compares two other tokens)
Definition: token.h:721
void evaluate(Pkt &pkt, ValueStack &values)
Compare two values.
Definition: token.cc:660
int8_t getNest() const
Returns nest-level.
Definition: token.h:486
RepresentationType
Token representation type.
Definition: token.h:354
TokenAnd()
Constructor (does nothing)
Definition: token.h:923
EvalBadStack is thrown when more or less parameters are on the stack than expected.
Definition: token.h:37
TokenToHexString()
Constructor (does nothing)
Definition: token.h:864
yiaddr (IPv4 address)
Definition: token.h:567
TokenPkt6(const FieldType type)
Constructor (does nothing)
Definition: token.h:622
TokenString(const std::string &str)
Value is set during token construction.
Definition: token.h:119
Token that represents the substring operator (returns a portion of the supplied string) ...
Definition: token.h:746
Peer address field (IPv6 address)
Definition: token.h:669
RepresentationType representation_type_
Representation type.
Definition: token.h:421
void evaluate(Pkt &pkt, ValueStack &values)
Convert a binary value to its hexadecimal string representation.
Definition: token.cc:836
uint32_t getVendorId() const
Returns enterprise-id.
Definition: token.cc:972
Token representing a 32 bit unsigned integer as a string.
Definition: token.h:321
FieldType
enum value that determines the field.
Definition: token.h:616
siaddr (IPv4 address)
Definition: token.h:568
FieldType getType()
Returns field type.
Definition: token.h:640
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:108
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:142
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the constant string on the stack)
Definition: token.cc:35
EvalTypeError is thrown when a value on the stack has a content with an unexpected type...
Definition: token.h:45
uint16_t index_
Data chunk index.
Definition: token.h:1183
uint16_t getSubCode() const
Returns sub-option-code.
Definition: token.h:1234
void evaluate(Pkt &pkt, ValueStack &values)
Logical or.
Definition: token.cc:918
TokenIpAddress(const std::string &addr)
Value is set during token construction.
Definition: token.cc:82
FieldType getType()
Returns field type.
Definition: token.h:707
std::string ClientClass
Defines a single class name.
Definition: classify.h:37
source (IP address)
Definition: token.h:515
virtual void evaluate(Pkt &pkt, ValueStack &values)
This is a method for evaluating a packet.
Definition: token.cc:980
TokenHexString(const std::string &str)
Value is set during token construction.
Definition: token.cc:44
int8_t nest_level_
nesting level of the relay block to use
Definition: token.h:496
TokenRelay6Field(const int8_t nest_level, const FieldType type)
Constructor that takes a nesting level and field type as parameters.
Definition: token.h:678
Token representing a 16 bit integer as a string.
Definition: token.h:249
int8_t nest_level_
Specifies field of the DHCPv6 relay option to get.
Definition: token.h:713
void evaluate(Pkt &pkt, ValueStack &values)
Evaluates the values of the option.
Definition: token.cc:329
hlen (hardware address length)
Definition: token.h:569
boost::shared_ptr< Expression > ExpressionPtr
Definition: token.h:30
TokenVendorClass(Option::Universe u, uint32_t vendor_id, RepresentationType repr)
This constructor is used to access fields.
Definition: token.cc:1070
transaction id (integer but manipulated as a string)
Definition: token.h:618
Token representing an 8 bit integer as a string.
Definition: token.h:231
Token that represents a value of an option within a DHCPv6 relay encapsulation.
Definition: token.h:467
Token that represents client class membership.
Definition: token.h:970
Token that represents vendor options in DHCPv4 and DHCPv6.
Definition: token.h:1015
Token representing an unsigned 32 bit integer.
Definition: token.h:164
FieldType field_
Specifies which field should be accessed.
Definition: token.h:1110