From: Francis Dupont Date: Thu, 6 Nov 2025 00:10:47 +0000 (+0100) Subject: [#3140] Addressed or answered comments X-Git-Tag: Kea-3.1.4~59 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b4852fb0156f4376c538ac16a774f295bed10c2e;p=thirdparty%2Fkea.git [#3140] Addressed or answered comments --- diff --git a/changelog_unreleased/3140-add-statistics-counters-for-dropped-packets b/changelog_unreleased/3140-add-statistics-counters-for-dropped-packets index 986b42512c..310de68ae8 100644 --- a/changelog_unreleased/3140-add-statistics-counters-for-dropped-packets +++ b/changelog_unreleased/3140-add-statistics-counters-for-dropped-packets @@ -18,8 +18,8 @@ Added "pkt4-processing-failed" and "pkt6-processing-failed" statistics which are increased when an incoming packet - was dropped because an unexpected exception was thrown - during processing. + was dropped because an unexpected error occurred during + processing. Added "pkt4-limit-exceeded" and "pkt6-limit-exceeded" statistics which are increased when an incoming packet diff --git a/doc/sphinx/arm/dhcp4-srv.rst b/doc/sphinx/arm/dhcp4-srv.rst index 2b3a75d4e6..f4f3de365f 100644 --- a/doc/sphinx/arm/dhcp4-srv.rst +++ b/doc/sphinx/arm/dhcp4-srv.rst @@ -7423,8 +7423,7 @@ The DHCPv4 server supports the following statistics: +----------------------------------------------------+----------------+------------------------------------+ | pkt4-processing-failed | integer | Number of incoming packets that | | | | was dropped because an unexpected | - | | | exception was thrown during | - | | | processing. | + | | | error occurred during processing. | +----------------------------------------------------+----------------+------------------------------------+ | pkt4-limit-exceeded | integer | Number of incoming packets that | | | | were dropped by the ``limits`` | @@ -7843,7 +7842,7 @@ a second counter detailing the drop cause: - ``pkt4-not-for-us`` - to be handled by another server -- ``pkt4-processing-failed`` - git an unexpected exception during processing +- ``pkt4-processing-failed`` - got an unexpected error during processing - ``pkt4-limit-exceeded`` - dropped by the limits (:ref:`hooks-limits`) hook library diff --git a/doc/sphinx/arm/dhcp6-srv.rst b/doc/sphinx/arm/dhcp6-srv.rst index a148d33a65..2dc3caee4c 100644 --- a/doc/sphinx/arm/dhcp6-srv.rst +++ b/doc/sphinx/arm/dhcp6-srv.rst @@ -6986,8 +6986,7 @@ The DHCPv6 server supports the following statistics: +---------------------------------------------------+----------------+------------------------------------+ | pkt6-processing-failed | integer | Number of incoming packets that | | | | was dropped because an unexpected | - | | | exception was thrown during | - | | | processing. | + | | | error occurred during processing. | +---------------------------------------------------+----------------+------------------------------------+ | pkt6-limit-exceeded | integer | Number of incoming packets that | | | | were dropped by the ``limits`` | @@ -7738,7 +7737,7 @@ a second counter detailing the drop cause: - ``pkt6-not-for-us`` - to be handled by another server -- ``pkt6-processing-failed`` - git an unexpected exception during processing +- ``pkt6-processing-failed`` - got an unexpected error during processing - ``pkt6-limit-exceeded`` - dropped by the limits (:ref:`hooks-limits`) hook library diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 643cdd076f..4efbe15e2e 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -1318,6 +1318,10 @@ Dhcpv4Srv::runOne() { this, query)); if (!MultiThreadingMgr::instance().getThreadPool().add(call_back)) { LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_PACKET_QUEUE_FULL); + StatsMgr::instance().addValue("pkt4-queue-full", + static_cast(1)); + StatsMgr::instance().addValue("pkt4-receive-drop", + static_cast(1)); } } else { processPacketAndSendResponseNoThrow(query); diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index 7fbf0de5ce..5fa5636a21 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -65,6 +65,7 @@ using namespace isc::db; using namespace isc::dhcp; using namespace isc::dhcp::test; using namespace isc::process; +using namespace isc::stats; using namespace isc::util; using namespace std; @@ -1067,17 +1068,29 @@ TEST_F(Dhcpv4SrvTest, sanityCheckDiscover) { "Missing or useless client-id and no HW address" " provided in message DHCPDISCOVER"); + // The pkt4-rfc-violation stat should be bumped by one. + StatsMgr& mgr = StatsMgr::instance(); + ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); + ASSERT_TRUE(stat); + EXPECT_EQ(1, stat->getInteger().first); + // Add a hardware address. This should not throw. std::vector data = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe}; HWAddrPtr hwaddr(new HWAddr(data, HTYPE_ETHER)); pkt->setHWAddr(hwaddr); ASSERT_NO_THROW(srv_->processDiscover(pkt)); + // The pkt4-rfc-violation stat should be unchanged. + EXPECT_EQ(1, stat->getInteger().first); + // Now let's make a new pkt with client-id only, it should not throw. pkt.reset(new Pkt4(DHCPDISCOVER, 1234)); pkt->addOption(generateClientId()); ASSERT_NO_THROW(srv_->processDiscover(pkt)); + // The pkt4-rfc-violation stat should be unchanged. + EXPECT_EQ(1, stat->getInteger().first); + // Now let's add a server-id. This should throw. const OptionDefinition& server_id_def = LibDHCP::DHO_DHCP_SERVER_IDENTIFIER_DEF(); @@ -1088,11 +1101,7 @@ TEST_F(Dhcpv4SrvTest, sanityCheckDiscover) { "Server-id option was not expected," " but received in message DHCPDISCOVER"); - // The pkt4-rfc-violation stat should be bumped by one before each throw. - using namespace isc::stats; - StatsMgr& mgr = StatsMgr::instance(); - ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); - ASSERT_TRUE(stat); + // The pkt4-rfc-violation stat should be bumped by one. EXPECT_EQ(2, stat->getInteger().first); } @@ -1108,8 +1117,7 @@ TEST_F(Dhcpv4SrvTest, sanityCheckRequest) { "Missing or useless client-id and no HW address" " provided in message DHCPREQUEST"); - // The pkt4-rfc-violation stat should be bumped by one before each throw. - using namespace isc::stats; + // The pkt4-rfc-violation stat should be bumped by one. StatsMgr& mgr = StatsMgr::instance(); ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); ASSERT_TRUE(stat); @@ -1141,6 +1149,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckRequest) { server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_NO_THROW(srv_->processRequest(pkt)); + + // The pkt4-rfc-violation stat should be unchanged. + EXPECT_EQ(1, stat->getInteger().first); } // Verifies that DHCPDECLINEs are sanity checked correctly. @@ -1155,6 +1166,12 @@ TEST_F(Dhcpv4SrvTest, sanityCheckDecline) { "Missing or useless client-id and no HW address" " provided in message DHCPDECLINE"); + // The pkt4-rfc-violation stat should be bumped by one. + StatsMgr& mgr = StatsMgr::instance(); + ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); + ASSERT_TRUE(stat); + EXPECT_EQ(1, stat->getInteger().first); + // Add a hardware address. Should throw because of missing address. std::vector data = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe}; HWAddrPtr hwaddr(new HWAddr(data, HTYPE_ETHER)); @@ -1163,11 +1180,7 @@ TEST_F(Dhcpv4SrvTest, sanityCheckDecline) { "Mandatory 'Requested IP address' option missing in DHCPDECLINE" " sent from [hwtype=1 00:fe:fe:fe:fe:fe], cid=[no info], tid=0x4d2"); - // The pkt4-rfc-violation stat should be bumped by one before each throw. - using namespace isc::stats; - StatsMgr& mgr = StatsMgr::instance(); - ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); - ASSERT_TRUE(stat); + // The pkt4-rfc-violation stat should be bumped by one. EXPECT_EQ(2, stat->getInteger().first); // Now let's add a requested address. This should not throw. @@ -1190,6 +1203,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckDecline) { server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_NO_THROW(srv_->processDecline(pkt)); + + // The pkt4-rfc-violation stat should be unchanged. + EXPECT_EQ(2, stat->getInteger().first); } // Verifies that DHCPRELEASEs are sanity checked correctly. @@ -1203,8 +1219,7 @@ TEST_F(Dhcpv4SrvTest, sanityCheckRelease) { "Missing or useless client-id and no HW address" " provided in message DHCPRELEASE"); - // The pkt4-rfc-violation stat should be bumped by one before each throw. - using namespace isc::stats; + // The pkt4-rfc-violation stat should be bumped by one. StatsMgr& mgr = StatsMgr::instance(); ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); ASSERT_TRUE(stat); @@ -1228,6 +1243,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckRelease) { server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_NO_THROW(srv_->processRelease(pkt)); + + // The pkt4-rfc-violation stat should be unchanged. + EXPECT_EQ(1, stat->getInteger().first); } // Verifies that DHCPINFORMs are sanity checked correctly. @@ -1242,8 +1260,7 @@ TEST_F(Dhcpv4SrvTest, sanityCheckInform) { "Missing or useless client-id and no HW address" " provided in message DHCPINFORM"); - // The pkt4-rfc-violation stat should be bumped by one before each throw. - using namespace isc::stats; + // The pkt4-rfc-violation stat should be bumped by one. StatsMgr& mgr = StatsMgr::instance(); ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); ASSERT_TRUE(stat); @@ -1275,6 +1292,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckInform) { server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_NO_THROW(srv_->processInform(pkt)); + + // The pkt4-rfc-violation stat should be unchanged. + EXPECT_EQ(1, stat->getInteger().first); } // This test verifies that incoming DISCOVER can be handled properly, that an @@ -2518,7 +2538,6 @@ TEST_F(Dhcpv4SrvTest, acceptServerId) { EXPECT_FALSE(srv_->acceptServerId(pkt)); // The pkt4-not-for-us stat should be bumped up. - using namespace isc::stats; StatsMgr& mgr = StatsMgr::instance(); ObservationPtr stat = mgr.getObservation("pkt4-not-for-us"); ASSERT_TRUE(stat); @@ -2660,26 +2679,34 @@ TEST_F(Dhcpv4SrvTest, sanityCheck) { EXPECT_THROW(NakedDhcpv4Srv::sanityCheck(pkt, Dhcpv4Srv::MANDATORY), RFCViolation); + // The pkt4-rfc-violation stat should be bumped by one. + StatsMgr& mgr = StatsMgr::instance(); + ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); + ASSERT_TRUE(stat); + EXPECT_EQ(1, stat->getInteger().first); + pkt->addOption(srv_->getServerID()); // Server-id is mandatory and present = no exception EXPECT_NO_THROW(NakedDhcpv4Srv::sanityCheck(pkt, Dhcpv4Srv::MANDATORY)); + // The pkt4-rfc-violation stat should be unchanged. + EXPECT_EQ(1, stat->getInteger().first); + // Server-id is forbidden, but present => exception EXPECT_THROW(NakedDhcpv4Srv::sanityCheck(pkt, Dhcpv4Srv::FORBIDDEN), RFCViolation); + // The pkt4-rfc-violation stat should be bumped by one. + EXPECT_EQ(2, stat->getInteger().first); + // There's no client-id and no HWADDR. Server needs something to // identify the client pkt->setHWAddr(generateHWAddr(0)); EXPECT_THROW(NakedDhcpv4Srv::sanityCheck(pkt, Dhcpv4Srv::MANDATORY), RFCViolation); - // The pkt4-rfc-violation stat should be bumped by one before each throw. - using namespace isc::stats; - StatsMgr& mgr = StatsMgr::instance(); - ObservationPtr stat = mgr.getObservation("pkt4-rfc-violation"); - ASSERT_TRUE(stat); + // The pkt4-rfc-violation stat should be bumped by one. EXPECT_EQ(3, stat->getInteger().first); } @@ -4987,7 +5014,6 @@ TEST_F(Dhcpv4SrvTest, statisticsUnknownRcvd) { pretendReceivingPkt(*srv_, CONFIGS[0], 200, "pkt4-unknown-received"); // There should also be pkt4-receive-drop stat bumped up - using namespace isc::stats; StatsMgr& mgr = StatsMgr::instance(); ObservationPtr drop_stat = mgr.getObservation("pkt4-receive-drop"); @@ -5017,7 +5043,6 @@ TEST_F(Dhcpv4SrvTest, receiveServiceDisabledStat) { srv_->run(); // All expected statistics must be present. - using namespace isc::stats; StatsMgr& mgr = StatsMgr::instance(); ObservationPtr pkt4_rcvd = mgr.getObservation("pkt4-received"); ObservationPtr srv_disable = mgr.getObservation("pkt4-service-disabled"); @@ -5052,7 +5077,6 @@ TEST_F(Dhcpv4SrvTest, receiveParseFailedStat) { srv_->run(); // All expected statistics must be present. - using namespace isc::stats; StatsMgr& mgr = StatsMgr::instance(); ObservationPtr pkt4_rcvd = mgr.getObservation("pkt4-received"); ObservationPtr parse_fail = mgr.getObservation("pkt4-parse-failed"); diff --git a/src/bin/dhcp6/dhcp6_hooks.dox b/src/bin/dhcp6/dhcp6_hooks.dox index f11967a6db..58e66f9df9 100644 --- a/src/bin/dhcp6/dhcp6_hooks.dox +++ b/src/bin/dhcp6/dhcp6_hooks.dox @@ -38,7 +38,7 @@ status to specified value. Actions not listed explicitly are not supported. If a callout sets status to unsupported value, this specific value will be ignored and treated as if the status was CONTINUE. If the action is to - drop the incoming query it is the responsibilty of the hook to increase + drop the incoming query it is the responsibilty of the hook to increase statistics. @section dhcpv6HooksHookPoints Hooks in the DHCPv6 Server diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 9077efe51c..08b794e447 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -793,6 +793,10 @@ Dhcpv6Srv::runOne() { this, query)); if (!MultiThreadingMgr::instance().getThreadPool().add(call_back)) { LOG_DEBUG(dhcp6_logger, DBG_DHCP6_BASIC, DHCP6_PACKET_QUEUE_FULL); + StatsMgr::instance().addValue("pkt6-queue-full", + static_cast(1)); + StatsMgr::instance().addValue("pkt6-receive-drop", + static_cast(1)); } } else { processPacketAndSendResponseNoThrow(query); diff --git a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc index 894f452c03..0bb5a64723 100644 --- a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc +++ b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc @@ -66,6 +66,7 @@ using namespace isc::db; using namespace isc::dhcp; using namespace isc::dhcp::test; using namespace isc::process; +using namespace isc::stats; using namespace isc::util; using namespace std; @@ -2477,7 +2478,6 @@ TEST_F(Dhcpv6SrvTest, testServerID) { // Check the pkt6-not-for-us stat was bumped by one. - using namespace isc::stats; StatsMgr& mgr = StatsMgr::instance(); ObservationPtr stat = mgr.getObservation("pkt6-not-for-us"); ASSERT_TRUE(stat); @@ -2521,7 +2521,6 @@ TEST_F(Dhcpv6SrvTest, testUnicast) { } // The pkt6-rfc-violation stat should be bumped by one each time. - using namespace isc::stats; StatsMgr& mgr = StatsMgr::instance(); ObservationPtr stat = mgr.getObservation("pkt6-rfc-violation"); ASSERT_TRUE(stat); @@ -3646,7 +3645,6 @@ TEST_F(Dhcpv6SrvTest, receiveAddrRegInformStat) { // Test checks if reception of a packet when the service is disabled // increases pkt6-service-disabled and pkt6-receive-drop. TEST_F(Dhcpv6SrvTest, receiveServiceDisableddStat) { - using namespace isc::stats; StatsMgr& mgr = StatsMgr::instance(); // Let's get a simple SOLICIT... @@ -3660,6 +3658,7 @@ TEST_F(Dhcpv6SrvTest, receiveServiceDisableddStat) { ObservationPtr pkt6_rcvd = mgr.getObservation("pkt6-received"); ObservationPtr srv_disable = mgr.getObservation("pkt6-service-disabled"); ObservationPtr recv_drop = mgr.getObservation("pkt6-receive-drop"); + // All expected statistics must be present. ASSERT_TRUE(pkt6_rcvd); ASSERT_TRUE(srv_disable); ASSERT_TRUE(recv_drop); @@ -3675,15 +3674,7 @@ TEST_F(Dhcpv6SrvTest, receiveServiceDisableddStat) { // fakeReceive() srv_->run(); - // All expected statistics must be present. - pkt6_rcvd = mgr.getObservation("pkt6-received"); - srv_disable = mgr.getObservation("pkt6-service-disabled"); - recv_drop = mgr.getObservation("pkt6-receive-drop"); - ASSERT_TRUE(pkt6_rcvd); - ASSERT_TRUE(srv_disable); - ASSERT_TRUE(recv_drop); - - // They also must have expected values. + // All statistics should have been dumped by one. EXPECT_EQ(1, pkt6_rcvd->getInteger().first); EXPECT_EQ(1, srv_disable->getInteger().first); EXPECT_EQ(1, recv_drop->getInteger().first); @@ -3692,7 +3683,6 @@ TEST_F(Dhcpv6SrvTest, receiveServiceDisableddStat) { // Test checks if reception of a malformed packet increases pkt6-parse-failed // and pkt6-receive-drop TEST_F(Dhcpv6SrvTest, receiveParseFailedStat) { - using namespace isc::stats; StatsMgr& mgr = StatsMgr::instance(); // Let's get a simple SOLICIT... @@ -3705,6 +3695,7 @@ TEST_F(Dhcpv6SrvTest, receiveParseFailedStat) { ObservationPtr pkt6_rcvd = mgr.getObservation("pkt6-received"); ObservationPtr parse_fail = mgr.getObservation("pkt6-parse-failed"); ObservationPtr recv_drop = mgr.getObservation("pkt6-receive-drop"); + // All expected statistics must be present. ASSERT_TRUE(pkt6_rcvd); ASSERT_TRUE(parse_fail); ASSERT_TRUE(recv_drop); @@ -3720,15 +3711,7 @@ TEST_F(Dhcpv6SrvTest, receiveParseFailedStat) { // fakeReceive() srv_->run(); - // All expected statistics must be present. - pkt6_rcvd = mgr.getObservation("pkt6-received"); - parse_fail = mgr.getObservation("pkt6-parse-failed"); - recv_drop = mgr.getObservation("pkt6-receive-drop"); - ASSERT_TRUE(pkt6_rcvd); - ASSERT_TRUE(parse_fail); - ASSERT_TRUE(recv_drop); - - // They also must have expected values. + // All statistics should have been dumped by one. EXPECT_EQ(1, pkt6_rcvd->getInteger().first); EXPECT_EQ(1, parse_fail->getInteger().first); EXPECT_EQ(1, recv_drop->getInteger().first); diff --git a/src/bin/dhcp6/tests/sarr_unittest.cc b/src/bin/dhcp6/tests/sarr_unittest.cc index f1244d96b1..82b3fbe535 100644 --- a/src/bin/dhcp6/tests/sarr_unittest.cc +++ b/src/bin/dhcp6/tests/sarr_unittest.cc @@ -385,7 +385,7 @@ public: : Dhcpv6SrvTest(), iface_mgr_test_config_(true) { // Let's wipe all existing statistics. - isc::stats::StatsMgr::instance().removeAll(); + StatsMgr::instance().removeAll(); } /// @brief Destructor. @@ -396,7 +396,7 @@ public: CfgMgr::instance().setD2ClientConfig(cfg); // Let's wipe all existing statistics. - isc::stats::StatsMgr::instance().removeAll(); + StatsMgr::instance().removeAll(); } /// @brief Check that server processes correctly a prefix hint sent by the @@ -1054,14 +1054,15 @@ SARRTest::pkt6ReceiveDropStat1() { client.useServerId(bogus_srv_id); client.doRequest(); - // Ok, let's check the statistic. pkt6-receive-drop should be set to 1. - using namespace isc::stats; + // Ok, let's check the statistics. pkt6-receive-drop should be set to 1. StatsMgr& mgr = StatsMgr::instance(); - ObservationPtr pkt6_recv_drop = mgr.getObservation("pkt6-receive-drop"); ASSERT_TRUE(pkt6_recv_drop); - EXPECT_EQ(1, pkt6_recv_drop->getInteger().first); + // and pkt6-not-for-us should be set to 1. + ObservationPtr pkt6_not_for_us = mgr.getObservation("pkt6-not-for-us"); + ASSERT_TRUE(pkt6_not_for_us); + EXPECT_EQ(1, pkt6_not_for_us->getInteger().first); } TEST_F(SARRTest, pkt6ReceiveDropStat1) { @@ -1087,14 +1088,14 @@ SARRTest::pkt6ReceiveDropStat2() { client.setDestAddress(asiolink::IOAddress("2001:db8::1")); // Pretend it's unicast client.doSolicit(); - // Ok, let's check the statistic. pkt6-receive-drop should be set to 1. - using namespace isc::stats; + // Ok, let's check the statistics. pkt6-receive-drop should be set to 1. StatsMgr& mgr = StatsMgr::instance(); - ObservationPtr pkt6_recv_drop = mgr.getObservation("pkt6-receive-drop"); ASSERT_TRUE(pkt6_recv_drop); - EXPECT_EQ(1, pkt6_recv_drop->getInteger().first); + // and pkt6-rfc-violation should be set to 1. + ObservationPtr pkt6_rfc_violation = mgr.getObservation("pkt6-rfc-violation"); + EXPECT_EQ(1, pkt6_rfc_violation->getInteger().first); } TEST_F(SARRTest, pkt6ReceiveDropStat2) { @@ -1123,14 +1124,14 @@ SARRTest::pkt6ReceiveDropStat3() { client.useServerId(client.getClientId()); client.doSolicit(); - // Ok, let's check the statistic. pkt6-receive-drop should be set to 1. - using namespace isc::stats; + // Ok, let's check the statistics. pkt6-receive-drop should be set to 1. StatsMgr& mgr = StatsMgr::instance(); - ObservationPtr pkt6_recv_drop = mgr.getObservation("pkt6-receive-drop"); ASSERT_TRUE(pkt6_recv_drop); - EXPECT_EQ(1, pkt6_recv_drop->getInteger().first); + // and pkt6-rfc-violation should be set to 1. + ObservationPtr pkt6_rfc_violation = mgr.getObservation("pkt6-rfc-violation"); + EXPECT_EQ(1, pkt6_rfc_violation->getInteger().first); } TEST_F(SARRTest, pkt6ReceiveDropStat3) {