]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[4094] Added evaluate function
authorFrancis Dupont <fdupont@isc.org>
Wed, 4 Nov 2015 01:07:32 +0000 (02:07 +0100)
committerFrancis Dupont <fdupont@isc.org>
Wed, 4 Nov 2015 01:07:32 +0000 (02:07 +0100)
src/lib/eval/Makefile.am
src/lib/eval/evaluate.cc [new file with mode: 0644]
src/lib/eval/evaluate.h [new file with mode: 0644]
src/lib/eval/token.h

index 05c4902e08ddf306d7945b7b4624fcb3e7387cf3..3c41c6aaa279e38ee5acee2ac614da0091a708e4 100644 (file)
@@ -13,6 +13,7 @@ AM_CXXFLAGS += $(WARNING_NO_MISSING_FIELD_INITIALIZERS_CFLAG)
 lib_LTLIBRARIES = libkea-eval.la
 libkea_eval_la_SOURCES  =
 libkea_eval_la_SOURCES += eval_log.cc eval_log.h
+libkea_eval_la_SOURCES += evaluate.cc evaluate.h
 libkea_eval_la_SOURCES += token.cc token.h
 
 nodist_libkea_eval_la_SOURCES = eval_messages.h eval_messages.cc
diff --git a/src/lib/eval/evaluate.cc b/src/lib/eval/evaluate.cc
new file mode 100644 (file)
index 0000000..593a8c9
--- /dev/null
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+#include <eval/evaluate.h>
+
+namespace isc {
+namespace dhcp {
+
+bool evaluate(const Expression& expr, const Pkt& pkt) {
+    ValueStack values;
+    for (Expression::const_iterator it = expr.begin();
+         it != expr.end(); ++it) {
+        (*it)->evaluate(pkt, values);
+    }
+    if (values.size() != 1) {
+        isc_throw(EvalBadStack, "Incorrect stack order. Expected exactly "
+                  "1 value at the end of evaluatuion, got " << values.size());
+    }
+    if (values.top() == "false") {
+        return (false);
+    } else if (values.top() == "true") {
+        return (true);
+    } else {
+        isc_throw(EvalNotBoolError, "Incorrect evaluation type. Expected "
+                  "\"false\" or \"true\", got \"" << values.top() << "\"");
+    }
+}
+
+}; // end of isc::dhcp namespace
+}; // end of isc namespace
diff --git a/src/lib/eval/evaluate.h b/src/lib/eval/evaluate.h
new file mode 100644 (file)
index 0000000..6c6f4e5
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+#ifndef EVALUATE_H
+#define EVALUATE_H
+
+#include <eval/token.h>
+
+namespace isc {
+namespace dhcp {
+
+/// @brief Evaluate a RPN expression for a v4 or v6 packet and return
+///        a true or false decision
+///
+/// @param expr the RPN expression, i.e., a vector (stack) of parsed tokens
+/// @param pkt  The v4 or v6 packet (can be ignored)
+/// @return the boolean decision
+/// @throw EvalStackError if there is not exactly one element on the value
+///        stack at the end of the evaluation
+/// @throw EvalNotBoolError if the value at the top of the stack at the
+///        end of the evaluation is not "false" or "true"
+bool evaluate(const Expression& expr, const Pkt& pkt);
+
+}; // end of isc::dhcp namespace
+}; // end of isc namespace
+
+#endif
index 0cc52d58916fd54eb1924187964e77dbc2a21a93..561d9db84caf0a8dbc2b69b6d347353ad7bec538 100644 (file)
@@ -49,6 +49,7 @@ public:
 /// @brief EvalNotBoolError is thrown when a boolean (i.e., "false" or
 ///        "true") was required but is not.
 class EvalNotBoolError : public Exception {
+public:
     EvalNotBoolError(const char* file, size_t line, const char* what) :
         isc::Exception(file, line, what) { };
 };