Browse Source

[4483] Added pkt4.msgtype and pkt4.transid

Tomek Mrugalski 8 years ago
parent
commit
9659cf0b0f
4 changed files with 39 additions and 1 deletions
  1. 8 0
      src/lib/eval/parser.yy
  2. 20 0
      src/lib/eval/tests/token_unittest.cc
  3. 8 0
      src/lib/eval/token.cc
  4. 3 1
      src/lib/eval/token.h

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

@@ -469,6 +469,14 @@ pkt4_field : CHADDR
                 {
                     $$ = TokenPkt4::SIADDR;
                 }
+           | MSGTYPE
+                 {
+                    $$ = TokenPkt4::MSGTYPE;
+                 }
+           | TRANSID
+                 {
+                    $$ = TokenPkt4::TRANSID;
+                 }
            ;
 
 pkt6_field : MSGTYPE

+ 20 - 0
src/lib/eval/tests/token_unittest.cc

@@ -1347,6 +1347,24 @@ TEST_F(TokenTest, pkt4Fields) {
     ASSERT_EQ(4, values_.top().size());
     EXPECT_EQ(0, memcmp(expected_addr, &values_.top()[0], 4));
 
+    // Check msgtype.
+    clearStack();
+    ASSERT_NO_THROW(t_.reset(new TokenPkt4(TokenPkt4::MSGTYPE)));
+    EXPECT_NO_THROW(t_->evaluate(*pkt4_, values_));
+    ASSERT_EQ(1, values_.size());
+    ASSERT_EQ(4, values_.top().size());
+    string exp_msgtype = encode(DHCPDISCOVER);
+    EXPECT_EQ(0, memcmp(&exp_msgtype[0], &values_.top()[0], 4));
+
+    // Check transaction-id
+    clearStack();
+    ASSERT_NO_THROW(t_.reset(new TokenPkt4(TokenPkt4::TRANSID)));
+    EXPECT_NO_THROW(t_->evaluate(*pkt4_, values_));
+    ASSERT_EQ(1, values_.size());
+    ASSERT_EQ(4, values_.top().size());
+    string exp_transid = encode(12345);
+    EXPECT_EQ(0, memcmp(&exp_transid[0], &values_.top()[0], 4));
+
     // Check a DHCPv6 packet throws.
     clearStack();
     ASSERT_NO_THROW(t_.reset(new TokenPkt4(TokenPkt4::HLEN)));
@@ -1367,6 +1385,8 @@ TEST_F(TokenTest, pkt4Fields) {
     addString("EVAL_DEBUG_PKT4 Pushing PKT4 field ciaddr with value 0xC0000202");
     addString("EVAL_DEBUG_PKT4 Pushing PKT4 field yiaddr with value 0xC0000203");
     addString("EVAL_DEBUG_PKT4 Pushing PKT4 field siaddr with value 0xC0000204");
+    addString("EVAL_DEBUG_PKT4 Pushing PKT4 field msgtype with value 0x00000001");
+    addString("EVAL_DEBUG_PKT4 Pushing PKT4 field transid with value 0x00003039");
     EXPECT_TRUE(checkFile());
 }
 

+ 8 - 0
src/lib/eval/token.cc

@@ -303,6 +303,14 @@ TokenPkt4::evaluate(Pkt& pkt, ValueStack& values) {
             value = EvalContext::fromUint32(pkt4.getHtype());
             type_str = "htype";
             break;
+        case MSGTYPE:
+            value = EvalContext::fromUint32(pkt4.getType());
+            type_str = "msgtype";
+            break;
+        case TRANSID:
+            value = EvalContext::fromUint32(pkt4.getTransid());
+            type_str = "transid";
+            break;
 
         default:
             isc_throw(EvalTypeError, "Bad field specified: "

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

@@ -442,7 +442,9 @@ public:
         YIADDR, ///< yiaddr (IPv4 address)
         SIADDR, ///< siaddr (IPv4 address)
         HLEN,   ///< hlen (hardware address length)
-        HTYPE   ///< htype (hardware address type)
+        HTYPE,  ///< htype (hardware address type)
+        MSGTYPE, ///< message type (not really a field, content of option 53)
+        TRANSID, ///< transaction-id (xid)
     };
 
     /// @brief Constructor (does nothing)