Parcourir la source

[4093] Support for option[123].hex operator.

Marcin Siodelski il y a 9 ans
Parent
commit
00effa23d3

+ 6 - 0
src/lib/eval/parser.yy

@@ -123,6 +123,12 @@ string_expr : STRING
                       TokenPtr opt(new TokenOption(numeric_code, TokenOption::TEXTUAL));
                       TokenPtr opt(new TokenOption(numeric_code, TokenOption::TEXTUAL));
                       ctx.expression.push_back(opt);
                       ctx.expression.push_back(opt);
                   }
                   }
+            | OPTION "[" INTEGER "]" DOTHEX
+                  {
+                      uint16_t numeric_code = convert_option_code($3, @3, ctx);
+                      TokenPtr opt(new TokenOption(numeric_code, TokenOption::HEXADECIMAL));
+                      ctx.expression.push_back(opt);
+                  }
             | SUBSTRING "(" string_expr "," start_expr "," length_expr ")"
             | SUBSTRING "(" string_expr "," start_expr "," length_expr ")"
                   {
                   {
                       TokenPtr sub(new TokenSubstring());
                       TokenPtr sub(new TokenSubstring());

+ 10 - 0
src/lib/eval/tests/context_unittest.cc

@@ -209,6 +209,16 @@ TEST_F(EvalContextTest, option) {
     checkTokenOption(eval.expression.at(0), 123);
     checkTokenOption(eval.expression.at(0), 123);
 }
 }
 
 
+// Test parsing of an option represented as hexadecimal string.
+TEST_F(EvalContextTest, optionHex) {
+    EvalContext eval;
+
+    EXPECT_NO_THROW(parsed_ = eval.parseString("option[123].hex == 0x666F6F"));
+    EXPECT_TRUE(parsed_);
+    ASSERT_EQ(3, eval.expression.size());
+    checkTokenOption(eval.expression.at(0), 123);
+}
+
 // Test the parsing of a substring expression
 // Test the parsing of a substring expression
 TEST_F(EvalContextTest, substring) {
 TEST_F(EvalContextTest, substring) {
     EvalContext eval;
     EvalContext eval;

+ 19 - 0
src/lib/eval/tests/evaluate_unittest.cc

@@ -209,6 +209,25 @@ TEST_F(EvaluateTest, packet) {
     EXPECT_FALSE(result_);
     EXPECT_FALSE(result_);
 }
 }
 
 
+// A test which compares option value represented in hexadecimal format.
+TEST_F(EvaluateTest, optionHex) {
+    TokenPtr toption;
+    TokenPtr tstring;
+    TokenPtr tequal;
+
+    ASSERT_NO_THROW(toption.reset(new TokenOption(100, TokenOption::HEXADECIMAL)));
+    e_.push_back(toption);
+    ASSERT_NO_THROW(tstring.reset(new TokenString("0x68756E6472656434")));
+    e_.push_back(tstring);
+    ASSERT_NO_THROW(tequal.reset(new TokenEqual()));
+    e_.push_back(tequal);
+
+    ASSERT_NO_THROW(result_ = evaluate(e_, *pkt4_));
+    EXPECT_TRUE(result_);
+    ASSERT_NO_THROW(result_ = evaluate(e_, *pkt6_));
+    EXPECT_FALSE(result_);
+}
+
 // A test using substring on an option.
 // A test using substring on an option.
 TEST_F(EvaluateTest, complex) {
 TEST_F(EvaluateTest, complex) {
     TokenPtr toption;
     TokenPtr toption;