Pkt4Ptr rsp;
try {
rsp = processPacket(query);
+ if (!rsp) {
+ return;
+ }
} catch (...) {
StatsMgr::instance().addValue("pkt4-processing-failed",
static_cast<int64_t>(1));
static_cast<int64_t>(1));
throw;
}
- if (!rsp) {
- return;
- }
CalloutHandlePtr callout_handle = getCalloutHandle(query);
-
processPacketBufferSend(callout_handle, rsp);
}
// There is no need to log anything here. This function logs by itself.
if (!accept(query)) {
// Increase the statistic of dropped packets.
+ // Specific drop cause stat was increased by accept* methods.
StatsMgr::instance().addValue("pkt4-receive-drop",
static_cast<int64_t>(1));
return (Pkt4Ptr());
return (Pkt4Ptr());
}
+ // The only expected exception is RFCViolation.
bool rfc_violation = false;
try {
try {
.arg(e.what());
// Increase the statistic of dropped packets.
+ // The RFCViolation thrower updated the drop cause statistic.
if (!rfc_violation) {
StatsMgr::instance().addValue("pkt4-processing-failed",
static_cast<int64_t>(1));
.arg(query->getLabel())
.arg(e.what());
} catch (...) {
- LOG_ERROR(packet4_logger, DHCP4_PACKET_PROCESS_EXCEPTION).arg(query->getLabel());
+ LOG_ERROR(packet4_logger, DHCP4_PACKET_PROCESS_EXCEPTION)
+ .arg(query->getLabel());
}
}
}
Pkt4Ptr query = ctx->query_;
Pkt4Ptr rsp;
+ // The only expected exception is RFCViolation.
bool rfc_violation = false;
try {
try {
.arg(e.what());
// Increase the statistic of dropped packets.
+ // The RFCViolation thrower updated the drop cause statistic.
if (!rfc_violation) {
StatsMgr::instance().addValue("pkt4-processing-failed",
static_cast<int64_t>(1));
}
StatsMgr::instance().addValue("pkt4-receive-drop",
static_cast<int64_t>(1));
+ return (Pkt4Ptr());
}
CalloutHandlePtr callout_handle = getCalloutHandle(query);
OptionCustom>(decline->getOption(DHO_DHCP_REQUESTED_ADDRESS));
if (!opt_requested_address) {
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Mandatory 'Requested IP address' option missing"
" in DHCPDECLINE sent from " << decline->getLabel());
}
// The source address must not be zero for the DHCPINFORM message from
// the directly connected client because the server will not know where
// to respond if the ciaddr was not present.
+ bool result = true;
try {
if (pkt->getType() == DHCPINFORM) {
if (pkt->getRemoteAddr().isV4Zero() &&
pkt->getCiaddr().isV4Zero()) {
- return (false);
+ result = false;
}
}
} catch (...) {
// If we got here, it is probably because the message type hasn't
// been set. But, this should not really happen assuming that
// we validate the message type prior to calling this function.
- return (false);
+ result = false;
}
- return (true);
+ if (!result) {
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
+ }
+ return (result);
}
bool
LOG_DEBUG(bad_packet4_logger, DBGLVL_PKT_HANDLING, DHCP4_PACKET_DROP_0004)
.arg(query->getLabel())
.arg(query->getIface());
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
return (false);
}
break;
}
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
return (false);
}
// Unable to convert the option to the option type which encapsulates it.
// We treat this as non-matching server id.
if (!option_custom) {
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
return (false);
}
// The server identifier option should carry exactly one IPv4 address.
// this check is somewhat redundant. On the other hand, if someone
// breaks option it may be better to check that here.
if (option_custom->getDataFieldsNum() != 1) {
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
return (false);
}
// v6, it is wrong.
IOAddress server_id = option_custom->readAddress();
if (!server_id.isV4()) {
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
return (false);
}
OptionCustomPtr opt_server_id = boost::dynamic_pointer_cast<OptionCustom>
(cfg_global_options->get(DHCP4_OPTION_SPACE, DHO_DHCP_SERVER_IDENTIFIER).option_);
- return (opt_server_id && (opt_server_id->readAddress() == server_id));
+ if (opt_server_id && (opt_server_id->readAddress() == server_id)) {
+ return (true);
+ }
+
+ // No matching...
+ StatsMgr::instance().addValue("pkt4-not-for-us", static_cast<int64_t>(1));
+ return (false);
}
void
switch (serverid) {
case FORBIDDEN:
if (server_id) {
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Server-id option was not expected, but"
<< " received in message "
<< query->getName());
case MANDATORY:
if (!server_id) {
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Server-id option was expected, but not"
" received in message "
<< query->getName());
// If there's no client-id (or a useless one is provided, i.e. 0 length)
if (!client_id || client_id->len() == client_id->getHeaderLen()) {
+ StatsMgr::instance().addValue("pkt4-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Missing or useless client-id and no HW address"
" provided in message "
<< query->getName());
EXPECT_THROW_MSG(srv_->processDiscover(pkt), RFCViolation,
"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);
+ EXPECT_EQ(2, stat->getInteger().first);
}
// Verifies that DHCPREQEUSTs are sanity checked correctly.
"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;
+ 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 not throw.
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);
+ EXPECT_EQ(2, stat->getInteger().first);
+
// Now let's add a requested address. This should not throw.
const OptionDefinition& req_addr_def = LibDHCP::DHO_DHCP_REQUESTED_ADDRESS_DEF();
OptionCustomPtr req_addr(new OptionCustom(req_addr_def, Option::V4));
"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;
+ 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 not throw.
std::vector<uint8_t> data = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
HWAddrPtr hwaddr(new HWAddr(data, HTYPE_ETHER));
"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;
+ 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 not throw.
std::vector<uint8_t> data = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
HWAddrPtr hwaddr(new HWAddr(data, HTYPE_ETHER));
pkt->addOption(other_serverid);
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_EQ(1, stat->getInteger().first);
+
// Configure the DHCP Server Identifier to be ignored.
ASSERT_FALSE(CfgMgr::instance().getCurrentCfg()->getIgnoreServerIdentifier());
CfgMgr::instance().getCurrentCfg()->setIgnoreServerIdentifier(true);
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);
+ EXPECT_EQ(3, stat->getInteger().first);
}
} // end of anonymous namespace