Browse Source

[4094] Added evaluate function

Francis Dupont 9 years ago
parent
commit
1937ffb986
4 changed files with 81 additions and 0 deletions
  1. 1 0
      src/lib/eval/Makefile.am
  2. 41 0
      src/lib/eval/evaluate.cc
  3. 38 0
      src/lib/eval/evaluate.h
  4. 1 0
      src/lib/eval/token.h

+ 1 - 0
src/lib/eval/Makefile.am

@@ -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

+ 41 - 0
src/lib/eval/evaluate.cc

@@ -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

+ 38 - 0
src/lib/eval/evaluate.h

@@ -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

+ 1 - 0
src/lib/eval/token.h

@@ -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) { };
 };