.arg(pkt->getLabel())
.arg(duidToString(server_id))
.arg(duidToString(getServerID()));
+ StatsMgr::instance().addValue("pkt6-not-for-us",
+ static_cast<int64_t>(1));
return (false);
}
}
LOG_DEBUG(bad_packet6_logger, DBGLVL_PKT_HANDLING, DHCP6_PACKET_DROP_UNICAST)
.arg(pkt->getLabel())
.arg(pkt->getName());
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
return (false);
}
break;
Pkt6Ptr rsp;
try {
rsp = processPacket(query);
+ if (!rsp) {
+ return;
+ }
} catch (...) {
StatsMgr::instance().addValue("pkt6-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);
if (!testServerID(query)) {
// Increase the statistic of dropped packets.
- StatsMgr::instance().addValue("pkt6-receive-drop", static_cast<int64_t>(1));
+ // The drop cause statistic was increased by testServerID.
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
return (Pkt6Ptr());
}
if (!testUnicast(query)) {
// Increase the statistic of dropped packets.
- StatsMgr::instance().addValue("pkt6-receive-drop", static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
return (Pkt6Ptr());
}
}
// Reject the message if it doesn't pass the sanity check.
+ // Statistics were updated by sanityCheck.
if (!sanityCheck(query)) {
return (Pkt6Ptr());
}
}
Pkt6Ptr 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("pkt6-processing-failed",
static_cast<int64_t>(1));
}
StatsMgr::instance().addValue("pkt6-receive-drop",
static_cast<int64_t>(1));
+ return (Pkt6Ptr());
}
if (!rsp) {
.arg(pkt->getName())
.arg(pkt->getRemoteAddr().toText())
.arg(e.what());
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
}
// Increase the statistic of dropped packets.
const uint32_t no_iaid = 0; /* there's no IAID in the ADDR-REG-INFORM */
// Check if the message is bad and shout be dropped.
+ bool invalid = false;
try {
// Check there is no IA_NA option.
if (addr_reg_inf->getOption(D6O_IA_NA)) {
+ invalid = true;
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "unexpected IA_NA option");
}
// Check there is no IA_TA option.
if (addr_reg_inf->getOption(D6O_IA_TA)) {
+ invalid = true;
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "unexpected IA_TA option");
}
// Check there is no IA_PD option.
if (addr_reg_inf->getOption(D6O_IA_PD)) {
+ invalid = true;
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "unexpected IA_PD option");
}
// There must be one.
OptionCollection addrs = addr_reg_inf->getOptions(D6O_IAADDR);
if (addrs.size() != 1) {
+ invalid = true;
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Exactly 1 IAADDR option expected, but "
<< addrs.size() << " received");
}
iaaddr = boost::dynamic_pointer_cast<Option6IAAddr>(addrs.begin()->second);
if (!iaaddr) {
+ invalid = true;
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(Unexpected, "can't convert the IAADDR option");
}
// Client and IADDR addresses must match.
if (addr != iaaddr->getAddress()) {
+ invalid = true;
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Address mismatch: client at " << addr
<< " wants to register " << iaaddr->getAddress());
}
// Should be in the subnet.
if (!subnet->inRange(addr)) {
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Address " << addr << " is not in subnet "
<< subnet->toText() << " (id " << subnet->getID() << ")");
}
// Address registration can't be mixed with standard allocation.
if (old_lease && (old_lease->state_ != Lease6::STATE_REGISTERED)) {
+ invalid = true;
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Address " << addr << " already in use "
<< *old_lease);
}
// Address must not be reserved.
auto hosts = HostMgr::instance().getAll6(addr);
if (!hosts.empty()) {
+ invalid = true;
+ StatsMgr::instance().addValue("pkt6-rfc-violation",
+ static_cast<int64_t>(1));
isc_throw(RFCViolation, "Address " << addr << " is reserved");
}
} catch (const std::exception &ex) {
LOG_INFO(packet6_logger, DHCP6_ADDR_REG_INFORM_FAIL)
.arg(addr)
.arg(ex.what());
+ if (!invalid) {
+ StatsMgr::instance().addValue("pkt6-processing-failed",
+ static_cast<int64_t>(1));
+ }
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
return (Pkt6Ptr());
}