Kea 2.2.0
token.h
Go to the documentation of this file.
1// Copyright (C) 2015-2022 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
11#include <dhcp/pkt.h>
12#include <stack>
13
14namespace isc {
15namespace dhcp {
16
17class Token;
18
20typedef boost::shared_ptr<Token> TokenPtr;
21
28typedef std::vector<TokenPtr> Expression;
29
30typedef boost::shared_ptr<Expression> ExpressionPtr;
31
33typedef std::stack<std::string> ValueStack;
34
37class EvalBadStack : public Exception {
38public:
39 EvalBadStack(const char* file, size_t line, const char* what) :
40 isc::Exception(file, line, what) { };
41};
42
45class EvalTypeError : public Exception {
46public:
47 EvalTypeError(const char* file, size_t line, const char* what) :
48 isc::Exception(file, line, what) { };
49};
50
51
63class Token {
64public:
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
114class TokenString : public Token {
115public:
119 TokenString(const std::string& str)
120 :value_(str){
121 }
122
127 void evaluate(Pkt& pkt, ValueStack& values);
128
129protected:
130 std::string value_;
131};
132
137class TokenHexString : public Token {
138public:
144 TokenHexString(const std::string& str);
145
152 void evaluate(Pkt& pkt, ValueStack& values);
153
154protected:
155 std::string value_;
156};
157
164class TokenInteger : public TokenString {
165public:
172 TokenInteger(const uint32_t value);
173
179 uint32_t getInteger() const {
180 return (int_value_);
181 }
182
183protected:
184 uint32_t int_value_;
185};
186
191class TokenIpAddress : public Token {
192public:
196 TokenIpAddress(const std::string& addr);
197
203 void evaluate(Pkt& pkt, ValueStack& values);
204
205protected:
207 std::string value_;
208};
209
215public:
218
224 void evaluate(Pkt& pkt, ValueStack& values);
225};
226
231class TokenInt8ToText : public Token {
232public:
235
242 void evaluate(Pkt& pkt, ValueStack& values);
243};
244
249class TokenInt16ToText : public Token {
250public:
253
260 void evaluate(Pkt& pkt, ValueStack& values);
261};
262
267class TokenInt32ToText : public Token {
268public:
271
278 void evaluate(Pkt& pkt, ValueStack& values);
279};
280
285class TokenUInt8ToText : public Token {
286public:
289
296 void evaluate(Pkt& pkt, ValueStack& values);
297};
298
303class TokenUInt16ToText : public Token {
304public:
307
314 void evaluate(Pkt& pkt, ValueStack& values);
315};
316
321class TokenUInt32ToText : public Token {
322public:
325
332 void evaluate(Pkt& pkt, ValueStack& values);
333};
334
344class TokenOption : public Token {
345public:
346
357 EXISTS
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
400protected:
410 virtual OptionPtr getOption(Pkt& pkt);
411
418 virtual std::string pushFailure(ValueStack& values);
419
420 uint16_t option_code_;
422};
423
436public:
437
442 TokenRelay4Option(const uint16_t option_code,
443 const RepresentationType& rep_type);
444
445protected:
449 virtual OptionPtr getOption(Pkt& pkt);
450};
451
468public:
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
490protected:
494 virtual OptionPtr getOption(Pkt& pkt);
495
496 int8_t nest_level_;
497};
498
509class TokenPkt : public Token {
510public:
511
517 LEN
518 };
519
522 : type_(type) {}
523
531 void evaluate(Pkt& pkt, ValueStack& values);
532
538 return (type_);
539 }
540
541private:
543 MetadataType type_;
544};
545
559class TokenPkt4 : public Token {
560public:
561
573 };
574
577 : type_(type) {}
578
588 void evaluate(Pkt& pkt, ValueStack& values);
589
595 return (type_);
596 }
597
598private:
600 FieldType type_;
601};
602
613class TokenPkt6 : public Token {
614public:
618 TRANSID
619 };
620
623 : type_(type) {}
624
634 void evaluate(Pkt& pkt, ValueStack& values);
635
641 return(type_);
642 }
643
644private:
646 FieldType type_;
647};
648
664class TokenRelay6Field : public Token {
665public:
666
670 LINKADDR
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
711protected:
713 int8_t nest_level_;
715};
716
721class TokenEqual : public Token {
722public:
725
738 void evaluate(Pkt& pkt, ValueStack& values);
739};
740
746class TokenSubstring : public Token {
747public:
750
795 void evaluate(Pkt& pkt, ValueStack& values);
796};
797
798class TokenSplit : public Token {
799public:
802
839 void evaluate(Pkt& pkt, ValueStack& values);
840};
841
847class TokenConcat : public Token {
848public:
851
863 void evaluate(Pkt& pkt, ValueStack& values);
864};
865
875class TokenIfElse : public Token {
876public:
879
894 void evaluate(Pkt& pkt, ValueStack& values);
895};
896
905class TokenToHexString : public Token {
906public:
909
933 void evaluate(Pkt& pkt, ValueStack& values);
934};
935
940class TokenNot : public Token {
941public:
944
958 void evaluate(Pkt& pkt, ValueStack& values);
959};
960
964class TokenAnd : public Token {
965public:
968
983 void evaluate(Pkt& pkt, ValueStack& values);
984};
985
989class TokenOr : public Token {
990public:
993
1008 void evaluate(Pkt& pkt, ValueStack& values);
1009};
1010
1014class TokenMember : public Token {
1015public:
1019 TokenMember(const std::string& client_class)
1020 :client_class_(client_class){
1021 }
1022
1028 void evaluate(Pkt& pkt, ValueStack& values);
1029
1037 return (client_class_);
1038 }
1039
1040protected:
1043};
1044
1059class TokenVendor : public TokenOption {
1060public:
1061
1067 DATA
1069
1075 TokenVendor(Option::Universe u, uint32_t vendor_id, FieldType field);
1076
1077
1089 TokenVendor(Option::Universe u, uint32_t vendor_id, RepresentationType repr,
1090 uint16_t option_code = 0);
1091
1097 uint32_t getVendorId() const;
1098
1104 FieldType getField() const;
1105
1128 virtual void evaluate(Pkt& pkt, ValueStack& values);
1129
1130protected:
1139 virtual OptionPtr getOption(Pkt& pkt);
1140
1146
1151 uint32_t vendor_id_;
1152
1155};
1156
1175public:
1176
1182 TokenVendorClass(Option::Universe u, uint32_t vendor_id, RepresentationType repr);
1183
1190 TokenVendorClass(Option::Universe u, uint32_t vendor_id, FieldType field,
1191 uint16_t index = 0);
1192
1197 uint16_t getDataIndex() const;
1198
1199protected:
1200
1224 void evaluate(Pkt& pkt, ValueStack& values);
1225
1227 uint16_t index_;
1228};
1229
1246class TokenSubOption : public virtual TokenOption {
1247public:
1248
1251
1259 TokenSubOption(const uint16_t option_code,
1260 const uint16_t sub_option_code,
1261 const RepresentationType& rep_type)
1262 : TokenOption(option_code, rep_type), sub_option_code_(sub_option_code) {}
1263
1275 virtual void evaluate(Pkt& pkt, ValueStack& values);
1276
1283 uint16_t getSubCode() const {
1284 return (sub_option_code_);
1285 }
1286
1287protected:
1292 virtual OptionPtr getSubOption(const OptionPtr& parent);
1293
1295};
1296
1297} // end of isc::dhcp namespace
1298} // end of isc namespace
1299
1300#endif
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
EvalBadStack is thrown when more or less parameters are on the stack than expected.
Definition: token.h:37
EvalBadStack(const char *file, size_t line, const char *what)
Definition: token.h:39
EvalTypeError is thrown when a value on the stack has a content with an unexpected type.
Definition: token.h:45
EvalTypeError(const char *file, size_t line, const char *what)
Definition: token.h:47
Universe
defines option universe DHCPv4 or DHCPv6
Definition: option.h:83
Base class for classes representing DHCP messages.
Definition: pkt.h:90
Token that represents logical and operator.
Definition: token.h:964
void evaluate(Pkt &pkt, ValueStack &values)
Logical and.
Definition: token.cc:977
TokenAnd()
Constructor (does nothing)
Definition: token.h:967
Token that represents concat operator (concatenates two other tokens)
Definition: token.h:847
void evaluate(Pkt &pkt, ValueStack &values)
Concatenate two values.
Definition: token.cc:865
TokenConcat()
Constructor (does nothing)
Definition: token.h:850
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:664
TokenEqual()
Constructor (does nothing)
Definition: token.h:724
Token representing a constant string in hexadecimal format.
Definition: token.h:137
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:77
std::string value_
Constant value.
Definition: token.h:155
TokenHexString(const std::string &str)
Value is set during token construction.
Definition: token.cc:48
Token that represents an alternative.
Definition: token.h:875
TokenIfElse()
Constructor (does nothing)
Definition: token.h:878
void evaluate(Pkt &pkt, ValueStack &values)
Alternative.
Definition: token.cc:887
Token representing a 16 bit integer as a string.
Definition: token.h:249
TokenInt16ToText()
Constructor (does nothing)
Definition: token.h:252
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:175
Token representing a 32 bit integer as a string.
Definition: token.h:267
TokenInt32ToText()
Constructor (does nothing)
Definition: token.h:270
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:206
Token representing an 8 bit integer as a string.
Definition: token.h:231
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:146
TokenInt8ToText()
Constructor (does nothing)
Definition: token.h:234
Token representing an unsigned 32 bit integer.
Definition: token.h:164
TokenInteger(const uint32_t value)
Integer value set during construction.
Definition: token.cc:1263
uint32_t getInteger() const
Returns integer value.
Definition: token.h:179
uint32_t int_value_
value as integer (stored for testing only)
Definition: token.h:184
Token representing an IP address as a string.
Definition: token.h:214
TokenIpAddressToText()
Constructor (does nothing)
Definition: token.h:217
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:112
Token representing an IP address as a constant string.
Definition: token.h:191
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the constant string on the stack after decoding)
Definition: token.cc:102
std::string value_
< Constant value (empty string if the IP address cannot be converted)
Definition: token.h:207
TokenIpAddress(const std::string &addr)
Value is set during token construction.
Definition: token.cc:86
Token that represents client class membership.
Definition: token.h:1014
const ClientClass & getClientClass() const
Returns client class name.
Definition: token.h:1036
ClientClass client_class_
The client class name.
Definition: token.h:1042
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (check if client_class_ was added to packet client classes)
Definition: token.cc:1031
TokenMember(const std::string &client_class)
Constructor.
Definition: token.h:1019
Token that represents logical negation operator.
Definition: token.h:940
TokenNot()
Constructor (does nothing)
Definition: token.h:943
void evaluate(Pkt &pkt, ValueStack &values)
Logical negation.
Definition: token.cc:955
Token that represents a value of an option.
Definition: token.h:344
uint16_t getCode() const
Returns option-code.
Definition: token.h:386
RepresentationType getRepresentation() const
Returns representation-type.
Definition: token.h:396
virtual OptionPtr getOption(Pkt &pkt)
Attempts to retrieve an option.
Definition: token.cc:328
void evaluate(Pkt &pkt, ValueStack &values)
Evaluates the values of the option.
Definition: token.cc:333
RepresentationType representation_type_
Representation type.
Definition: token.h:421
uint16_t option_code_
Code of the option to be extracted.
Definition: token.h:420
RepresentationType
Token representation type.
Definition: token.h:354
TokenOption(const uint16_t option_code, const RepresentationType &rep_type)
Constructor that takes an option code as a parameter.
Definition: token.h:367
virtual std::string pushFailure(ValueStack &values)
Auxiliary method that puts string representing a failure.
Definition: token.cc:371
Token that represents logical or operator.
Definition: token.h:989
void evaluate(Pkt &pkt, ValueStack &values)
Logical or.
Definition: token.cc:1004
TokenOr()
Constructor (does nothing)
Definition: token.h:992
Token that represents fields of a DHCPv4 packet.
Definition: token.h:559
FieldType getType()
Returns field type.
Definition: token.h:594
FieldType
enum value that determines the field.
Definition: token.h:563
@ CIADDR
ciaddr (IPv4 address)
Definition: token.h:566
@ HLEN
hlen (hardware address length)
Definition: token.h:569
@ HTYPE
htype (hardware address type)
Definition: token.h:570
@ GIADDR
giaddr (IPv4 address)
Definition: token.h:565
@ CHADDR
chaddr field (up to 16 bytes link-layer address)
Definition: token.h:564
@ YIADDR
yiaddr (IPv4 address)
Definition: token.h:567
@ SIADDR
siaddr (IPv4 address)
Definition: token.h:568
@ TRANSID
transaction-id (xid)
Definition: token.h:572
@ MSGTYPE
message type (not really a field, content of option 53)
Definition: token.h:571
void evaluate(Pkt &pkt, ValueStack &values)
Gets a value from the specified packet.
Definition: token.cc:483
TokenPkt4(const FieldType type)
Constructor (does nothing)
Definition: token.h:576
Token that represents fields of DHCPv6 packet.
Definition: token.h:613
TokenPkt6(const FieldType type)
Constructor (does nothing)
Definition: token.h:622
void evaluate(Pkt &pkt, ValueStack &values)
Gets a value of the specified packet.
Definition: token.cc:562
FieldType getType()
Returns field type.
Definition: token.h:640
FieldType
enum value that determines the field.
Definition: token.h:616
@ TRANSID
transaction id (integer but manipulated as a string)
Definition: token.h:618
@ MSGTYPE
msg type
Definition: token.h:617
Token that represents meta data of a DHCP packet.
Definition: token.h:509
MetadataType
enum value that determines the field.
Definition: token.h:513
@ LEN
length (4 octets)
Definition: token.h:517
@ DST
destination (IP address)
Definition: token.h:516
@ IFACE
interface name (string)
Definition: token.h:514
@ SRC
source (IP address)
Definition: token.h:515
MetadataType getType()
Returns metadata type.
Definition: token.h:537
void evaluate(Pkt &pkt, ValueStack &values)
Gets a value from the specified packet.
Definition: token.cc:432
TokenPkt(const MetadataType type)
Constructor (does nothing)
Definition: token.h:521
Represents a sub-option inserted by the DHCPv4 relay.
Definition: token.h:435
virtual OptionPtr getOption(Pkt &pkt)
Attempts to obtain specified sub-option of option 82 from the packet.
Definition: token.cc:385
TokenRelay4Option(const uint16_t option_code, const RepresentationType &rep_type)
Constructor for extracting sub-option from RAI (option 82)
Definition: token.cc:380
Token that represents a value of a field within a DHCPv6 relay encapsulation.
Definition: token.h:664
FieldType type_
field to get
Definition: token.h:714
void evaluate(Pkt &pkt, ValueStack &values)
Extracts the specified field from the requested relay.
Definition: token.cc:602
FieldType
enum value that determines the field.
Definition: token.h:668
@ LINKADDR
Link address field (IPv6 address)
Definition: token.h:670
@ PEERADDR
Peer address field (IPv6 address)
Definition: token.h:669
int8_t nest_level_
Specifies field of the DHCPv6 relay option to get.
Definition: token.h:713
FieldType getType()
Returns field type.
Definition: token.h:707
TokenRelay6Field(const int8_t nest_level, const FieldType type)
Constructor that takes a nesting level and field type as parameters.
Definition: token.h:678
int8_t getNest() const
Returns nest-level.
Definition: token.h:697
Token that represents a value of an option within a DHCPv6 relay encapsulation.
Definition: token.h:467
int8_t nest_level_
nesting level of the relay block to use
Definition: token.h:496
int8_t getNest() const
Returns nest-level.
Definition: token.h:486
virtual OptionPtr getOption(Pkt &pkt)
Attempts to obtain specified option from the specified relay block.
Definition: token.cc:396
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
TokenSplit()
Constructor (does nothing)
Definition: token.h:801
void evaluate(Pkt &pkt, ValueStack &values)
Extract a field from a delimited string.
Definition: token.cc:783
The order where Token subtypes are declared should be:
Definition: token.h:114
std::string value_
Constant value.
Definition: token.h:130
TokenString(const std::string &str)
Value is set during token construction.
Definition: token.h:119
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the constant string on the stack)
Definition: token.cc:39
Token that represents sub-options in DHCPv4 and DHCPv6.
Definition: token.h:1246
virtual void evaluate(Pkt &pkt, ValueStack &values)
This is a method for evaluating a packet.
Definition: token.cc:1276
uint16_t sub_option_code_
Code of the sub-option to be extracted.
Definition: token.h:1294
uint16_t getSubCode() const
Returns sub-option-code.
Definition: token.h:1283
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:1259
virtual OptionPtr getSubOption(const OptionPtr &parent)
Attempts to retrieve a sub-option.
Definition: token.cc:1268
Token that represents the substring operator (returns a portion of the supplied string)
Definition: token.h:746
void evaluate(Pkt &pkt, ValueStack &values)
Extract a substring from a string.
Definition: token.cc:688
TokenSubstring()
Constructor (does nothing)
Definition: token.h:749
Token that converts to hexadecimal string.
Definition: token.h:905
TokenToHexString()
Constructor (does nothing)
Definition: token.h:908
void evaluate(Pkt &pkt, ValueStack &values)
Convert a binary value to its hexadecimal string representation.
Definition: token.cc:922
Token representing a 16 bit unsigned integer as a string.
Definition: token.h:303
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:266
TokenUInt16ToText()
Constructor (does nothing)
Definition: token.h:306
Token representing a 32 bit unsigned integer as a string.
Definition: token.h:321
TokenUInt32ToText()
Constructor (does nothing)
Definition: token.h:324
void evaluate(Pkt &pkt, ValueStack &values)
Token evaluation (puts value of the string on the stack after decoding)
Definition: token.cc:297
Token representing an 8 bit unsigned integer as a string.
Definition: token.h:285
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:237
Token that represents vendor class options in DHCPv4 and DHCPv6.
Definition: token.h:1174
TokenVendorClass(Option::Universe u, uint32_t vendor_id, RepresentationType repr)
This constructor is used to access fields.
Definition: token.cc:1156
uint16_t getDataIndex() const
Returns data index.
Definition: token.cc:1167
uint16_t index_
Data chunk index.
Definition: token.h:1227
void evaluate(Pkt &pkt, ValueStack &values)
This is a method for evaluating a packet.
Definition: token.cc:1171
Token that represents vendor options in DHCPv4 and DHCPv6.
Definition: token.h:1059
FieldType
Specifies a field of the vendor option.
Definition: token.h:1063
@ DATA
data chunk, used in derived vendor-class only
Definition: token.h:1067
@ EXISTS
vendor[123].exists
Definition: token.h:1066
@ ENTERPRISE_ID
enterprise-id field (vendor-info, vendor-class)
Definition: token.h:1065
@ SUBOPTION
If this token fetches a suboption, not a field.
Definition: token.h:1064
Option::Universe universe_
Universe (V4 or V6)
Definition: token.h:1145
uint32_t vendor_id_
Enterprise-id value.
Definition: token.h:1151
FieldType field_
Specifies which field should be accessed.
Definition: token.h:1154
uint32_t getVendorId() const
Returns enterprise-id.
Definition: token.cc:1058
TokenVendor(Option::Universe u, uint32_t vendor_id, FieldType field)
Constructor used for accessing a field.
Definition: token.cc:1050
virtual OptionPtr getOption(Pkt &pkt)
Attempts to get a suboption.
Definition: token.cc:1134
virtual void evaluate(Pkt &pkt, ValueStack &values)
This is a method for evaluating a packet.
Definition: token.cc:1066
FieldType getField() const
Returns field.
Definition: token.cc:1062
Base class for all tokens.
Definition: token.h:63
virtual void evaluate(Pkt &pkt, ValueStack &values)=0
This is a generic method for evaluating a packet.
virtual ~Token()
Virtual destructor.
Definition: token.h:81
static bool toBool(std::string value)
Coverts a (string) value to a boolean.
Definition: token.h:90
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
std::string ClientClass
Defines a single class name.
Definition: classify.h:42
boost::shared_ptr< Token > TokenPtr
Pointer to a single Token.
Definition: token.h:17
boost::shared_ptr< Expression > ExpressionPtr
Definition: token.h:30
std::vector< TokenPtr > Expression
This is a structure that holds an expression converted to RPN.
Definition: token.h:28
boost::shared_ptr< Option > OptionPtr
Definition: option.h:36
std::stack< std::string > ValueStack
Evaluated values are stored as a stack of strings.
Definition: token.h:33
Defines the logger used by the top-level component of kea-lfc.