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
+----------------------------------------------------+----------------+------------------------------------+
| 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`` |
- ``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
+---------------------------------------------------+----------------+------------------------------------+
| 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`` |
- ``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
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<int64_t>(1));
+ StatsMgr::instance().addValue("pkt4-receive-drop",
+ static_cast<int64_t>(1));
}
} else {
processPacketAndSendResponseNoThrow(query);
using namespace isc::dhcp;
using namespace isc::dhcp::test;
using namespace isc::process;
+using namespace isc::stats;
using namespace isc::util;
using namespace std;
"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<uint8_t> 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();
"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);
}
"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);
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.
"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<uint8_t> data = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
HWAddrPtr hwaddr(new HWAddr(data, HTYPE_ETHER));
"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.
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.
"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);
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.
"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);
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
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);
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);
}
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");
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");
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");
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
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<int64_t>(1));
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
}
} else {
processPacketAndSendResponseNoThrow(query);
using namespace isc::dhcp;
using namespace isc::dhcp::test;
using namespace isc::process;
+using namespace isc::stats;
using namespace isc::util;
using namespace std;
// 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);
}
// 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);
// 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...
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);
// 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);
// 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...
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);
// 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);
: Dhcpv6SrvTest(),
iface_mgr_test_config_(true) {
// Let's wipe all existing statistics.
- isc::stats::StatsMgr::instance().removeAll();
+ StatsMgr::instance().removeAll();
}
/// @brief Destructor.
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
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) {
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) {
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) {