| | | the most common reasons may be |
| | | that an unacceptable packet type |
| | | was received, direct responses are |
- | | | forbidden, or the server ID sent |
- | | | by the client does not match the |
- | | | server's server ID. |
+ | | | forbidden, the server ID sent by |
+ | | | the client does not match the |
+ | | | server's server ID, or an |
+ | | | unexpected error occurred during |
+ | | | processing. |
+----------------------------------------------------+----------------+------------------------------------+
| subnet[id].total-addresses | integer | Total number of addresses |
| | | available for DHCPv4 management |
| | | received, direct responses are |
| | | forbidden, the server ID sent by |
| | | the client does not match the |
- | | | server's server ID, or the packet |
- | | | is malformed. |
+ | | | server's server ID, the packet |
+ | | | is malformed, or an unexpected |
+ | | | error occurred during processing. |
+---------------------------------------------------+----------------+------------------------------------+
| pkt6-solicit-received | integer | Number of SOLICIT packets |
| | | received. This statistic is |
LOG_ERROR(packet4_logger, DHCP4_PACKET_PROCESS_STD_EXCEPTION)
.arg(query->getLabel())
.arg(e.what());
+ StatsMgr::instance().addValue("pkt4-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt4-receive-drop",
+ static_cast<int64_t>(1));
} catch (...) {
LOG_ERROR(packet4_logger, DHCP4_PACKET_PROCESS_EXCEPTION)
.arg(query->getLabel());
+ StatsMgr::instance().addValue("pkt4-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt4-receive-drop",
+ static_cast<int64_t>(1));
}
}
void
Dhcpv4Srv::processPacketAndSendResponse(Pkt4Ptr query) {
- Pkt4Ptr rsp;
- try {
- rsp = processPacket(query);
- if (!rsp) {
- return;
- }
- } catch (...) {
- StatsMgr::instance().addValue("pkt4-processing-failed",
- static_cast<int64_t>(1));
- StatsMgr::instance().addValue("pkt4-receive-drop",
- static_cast<int64_t>(1));
- throw;
+ Pkt4Ptr rsp = processPacket(query);
+ if (!rsp) {
+ return;
}
CalloutHandlePtr callout_handle = getCalloutHandle(query);
+
processPacketBufferSend(callout_handle, rsp);
}
Dhcpv4Srv::processDhcp4QueryAndSendResponse(Pkt4Ptr query,
bool allow_answer_park) {
try {
- Pkt4Ptr rsp;
- try {
- rsp = processDhcp4Query(query, allow_answer_park);
- if (!rsp) {
- return;
- }
- } catch (...) {
- StatsMgr::instance().addValue("pkt4-processing-failed",
- static_cast<int64_t>(1));
- StatsMgr::instance().addValue("pkt4-receive-drop",
- static_cast<int64_t>(1));
- throw;
+ Pkt4Ptr rsp = processDhcp4Query(query, allow_answer_park);
+ if (!rsp) {
+ return;
}
CalloutHandlePtr callout_handle = getCalloutHandle(query);
LOG_ERROR(packet4_logger, DHCP4_PACKET_PROCESS_STD_EXCEPTION)
.arg(query->getLabel())
.arg(e.what());
+ StatsMgr::instance().addValue("pkt4-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt4-receive-drop",
+ static_cast<int64_t>(1));
} catch (...) {
LOG_ERROR(packet4_logger, DHCP4_PACKET_PROCESS_EXCEPTION)
.arg(query->getLabel());
+ StatsMgr::instance().addValue("pkt4-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt4-receive-drop",
+ static_cast<int64_t>(1));
}
}
AllocEngine::ClientContext4Ptr& ctx,
bool allow_answer_park) {
try {
- Pkt4Ptr rsp;
- try {
- rsp = processLocalizedQuery4(ctx, allow_answer_park);
- if (!rsp) {
- return;
- }
- } catch (...) {
- StatsMgr::instance().addValue("pkt4-processing-failed",
- static_cast<int64_t>(1));
- StatsMgr::instance().addValue("pkt4-receive-drop",
- static_cast<int64_t>(1));
- throw;
+ Pkt4Ptr rsp = processLocalizedQuery4(ctx, allow_answer_park);
+ if (!rsp) {
+ return;
}
CalloutHandlePtr callout_handle = getCalloutHandle(query);
LOG_ERROR(packet4_logger, DHCP4_PACKET_PROCESS_STD_EXCEPTION)
.arg(query->getLabel())
.arg(e.what());
+ StatsMgr::instance().addValue("pkt4-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt4-receive-drop",
+ static_cast<int64_t>(1));
} catch (...) {
LOG_ERROR(packet4_logger, DHCP4_PACKET_PROCESS_EXCEPTION)
.arg(query->getLabel());
+ StatsMgr::instance().addValue("pkt4-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt4-receive-drop",
+ static_cast<int64_t>(1));
}
}
LOG_ERROR(packet6_logger, DHCP6_PACKET_PROCESS_STD_EXCEPTION)
.arg(query->getLabel())
.arg(e.what());
+ StatsMgr::instance().addValue("pkt6-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
} catch (...) {
LOG_ERROR(packet6_logger, DHCP6_PACKET_PROCESS_EXCEPTION)
.arg(query->getLabel());
+ StatsMgr::instance().addValue("pkt6-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
}
}
void
Dhcpv6Srv::processPacketAndSendResponse(Pkt6Ptr query) {
- Pkt6Ptr rsp;
- try {
- rsp = processPacket(query);
- if (!rsp) {
- return;
- }
- } catch (...) {
- StatsMgr::instance().addValue("pkt6-processing-failed",
- static_cast<int64_t>(1));
- StatsMgr::instance().addValue("pkt6-receive-drop",
- static_cast<int64_t>(1));
- throw;
+ Pkt6Ptr rsp = processPacket(query);
+ if (!rsp) {
+ return;
}
CalloutHandlePtr callout_handle = getCalloutHandle(query);
void
Dhcpv6Srv::processDhcp6QueryAndSendResponse(Pkt6Ptr query) {
try {
- Pkt6Ptr rsp;
- try {
- rsp = processDhcp6Query(query);
- if (!rsp) {
- return;
- }
- } catch (...) {
- StatsMgr::instance().addValue("pkt6-processing-failed",
- static_cast<int64_t>(1));
- StatsMgr::instance().addValue("pkt6-receive-drop",
- static_cast<int64_t>(1));
- throw;
+ Pkt6Ptr rsp = processDhcp6Query(query);
+ if (!rsp) {
+ return;
}
CalloutHandlePtr callout_handle = getCalloutHandle(query);
LOG_ERROR(packet6_logger, DHCP6_PACKET_PROCESS_STD_EXCEPTION)
.arg(query->getLabel())
.arg(e.what());
+ StatsMgr::instance().addValue("pkt6-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
} catch (...) {
LOG_ERROR(packet6_logger, DHCP6_PACKET_PROCESS_EXCEPTION)
.arg(query->getLabel());
+ StatsMgr::instance().addValue("pkt6-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
}
}
Dhcpv6Srv::processLocalizedQuery6AndSendResponse(Pkt6Ptr query,
AllocEngine::ClientContext6& ctx) {
try {
- Pkt6Ptr rsp;
- try {
- rsp = processLocalizedQuery6(ctx);
- if (!rsp) {
- return;
- }
- } catch (...) {
- StatsMgr::instance().addValue("pkt6-processing-failed",
- static_cast<int64_t>(1));
- StatsMgr::instance().addValue("pkt6-receive-drop",
- static_cast<int64_t>(1));
- throw;
+ Pkt6Ptr rsp = processLocalizedQuery6(ctx);
+ if (!rsp) {
+ return;
}
CalloutHandlePtr callout_handle = getCalloutHandle(query);
LOG_ERROR(packet6_logger, DHCP6_PACKET_PROCESS_STD_EXCEPTION)
.arg(query->getLabel())
.arg(e.what());
+ StatsMgr::instance().addValue("pkt6-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
} catch (...) {
LOG_ERROR(packet6_logger, DHCP6_PACKET_PROCESS_EXCEPTION)
.arg(query->getLabel());
+ StatsMgr::instance().addValue("pkt6-processing-failed",
+ static_cast<int64_t>(1));
+ StatsMgr::instance().addValue("pkt6-receive-drop",
+ static_cast<int64_t>(1));
}
}
StatsMgr::instance().addValue("pkt4-lease-query-received", static_cast<int64_t>(1));
bool invalid = false;
- bool sending = false;
try {
- LeaseQueryImplFactory::getImpl().processQuery(query, invalid, sending);
+ LeaseQueryImplFactory::getImpl().processQuery(query, invalid);
} catch (const std::exception& ex) {
// Failed to parse the packet.
LOG_DEBUG(lease_query_logger, DBGLVL_TRACE_BASIC,
.arg(ex.what());
handle.setStatus(CalloutHandle::NEXT_STEP_DROP);
- if (sending) {
- return (0);
- }
if (!invalid) {
StatsMgr::instance().addValue("pkt4-processing-failed",
static_cast<int64_t>(1));
StatsMgr::instance().addValue("pkt6-lease-query-received", static_cast<int64_t>(1));
bool invalid = false;
- bool sending = false;
try {
- LeaseQueryImplFactory::getImpl().processQuery(query, invalid, sending);
+ LeaseQueryImplFactory::getImpl().processQuery(query, invalid);
} catch (const std::exception& ex) {
// Log that we failed to process the packet.
LOG_DEBUG(lease_query_logger, DBGLVL_TRACE_BASIC,
.arg(ex.what());
handle.setStatus(CalloutHandle::NEXT_STEP_DROP);
- if (sending) {
- return (0);
- }
if (!invalid) {
StatsMgr::instance().addValue("pkt6-processing-failed",
static_cast<int64_t>(1));
/// must use dynamic_casting).
/// @param invalid Reference to a flag set to true when the query
/// is invalid (used to detect unexpected exceptions).
- /// @param sending Reference to a flag set to true when the query was
- /// processed and response will be built and sent.
virtual void processQuery(isc::dhcp::PktPtr base_query,
- bool& invalid, bool& sending) const = 0;
+ bool& invalid) const = 0;
/// @brief Keywords for Lease Query configuration.
static const isc::data::SimpleKeywords LEASE_QUERY_KEYWORDS;
};
void
-LeaseQueryImpl4::processQuery(PktPtr base_query, bool& invalid,
- bool& sending) const {
+LeaseQueryImpl4::processQuery(PktPtr base_query, bool& invalid) const {
Pkt4Ptr query = boost::dynamic_pointer_cast<Pkt4>(base_query);
if (!query) {
// Shouldn't happen.
<< "]");
}
- sending = true;
Pkt4Ptr response = buildResponse(response_type, query, leases);
/// Send the response if we have one
if (response) {
/// @param base_query DHCPv4 lease query to process.
/// @param invalid Reference to a flag set to true when the query
/// is invalid (used to detect unexpected exceptions).
- /// @param sending Reference to a flag set to true when the query was
- /// processed and response will be built and sent.
virtual void processQuery(isc::dhcp::PktPtr base_query,
- bool& invalid, bool& sending) const;
+ bool& invalid) const;
/// @brief Queries for an active lease matching an ip address
///
}
void
-LeaseQueryImpl6::processQuery(PktPtr base_query, bool& invalid,
- bool& sending) const {
+LeaseQueryImpl6::processQuery(PktPtr base_query, bool& invalid) const {
Pkt6Ptr query = boost::dynamic_pointer_cast<Pkt6>(base_query);
if (!query) {
// Shouldn't happen.
}
// Construct the reply.
- sending = true;
Pkt6Ptr reply = buildReply(status_opt, query, leases);
if (reply) {
sendResponse(reply);
/// @param base_query DHCPv6 lease query to process.
/// @param invalid Reference to a flag set to true when the query
/// is invalid (used to detect unexpected exceptions).
- /// @param sending Reference to a flag set to true when the query was
- /// processed and response will be built and sent.
/// @throw BadValue if the query is invalid for a number reasons,
/// including if it comes from an unauthorized requester.
virtual void processQuery(isc::dhcp::PktPtr base_query,
- bool& invalid, bool& sending) const;
+ bool& invalid) const;
/// @brief Queries for an active lease matching an ip address.
///
// A v6 packet should get tossed.
Pkt6Ptr pkt6(new Pkt6(DHCPV6_LEASEQUERY, 0));
bool invalid = false;
- bool sending = false;
- ASSERT_THROW_MSG(impl->processQuery(pkt6, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(pkt6, invalid), BadValue,
"LeaseQueryImpl4 query is not DHCPv4 packet");
EXPECT_FALSE(invalid);
- EXPECT_FALSE(sending);
// Set the pkt4-rfc-violation stat to 0.
StatsMgr::instance().setValue("pkt4-rfc-violation", static_cast<int64_t>(0));
// An empty giaddr should fail.
Pkt4Ptr lq(new Pkt4(DHCPLEASEQUERY, 123));
invalid = false;
- sending = false;
- ASSERT_THROW_MSG(impl->processQuery(lq, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(lq, invalid), BadValue,
"giaddr cannot be 0.0.0.0");
EXPECT_TRUE(invalid);
- EXPECT_FALSE(sending);
// Check the pkt4-rfc-violation stat which was bumped by one.
ObservationPtr stat_rv =
// An unknown giaddr should fail.
lq->setGiaddr(IOAddress("192.0.2.2"));
invalid = false;
- sending = false;
- ASSERT_THROW_MSG(impl->processQuery(lq, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(lq, invalid), BadValue,
"rejecting query from unauthorized requester: 192.0.2.2");
EXPECT_TRUE(invalid);
- EXPECT_FALSE(sending);
// Check the pkt4-admin-filtered stat which was bumped by one.
ObservationPtr stat_af =
}
invalid = false;
- sending = false;
- ASSERT_THROW_MSG(impl->processQuery(lq, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(lq, invalid), BadValue,
scenario.exp_message_);
EXPECT_TRUE(invalid);
- EXPECT_FALSE(sending);
}
}
// A v4 packet should get tossed.
Pkt4Ptr pkt4(new Pkt4(DHCPLEASEQUERY, 0));
bool invalid = false;
- bool sending = false;
- ASSERT_THROW_MSG(impl->processQuery(pkt4, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(pkt4, invalid), BadValue,
"LeaseQueryImpl6 query is not DHCPv6 packet");
EXPECT_FALSE(invalid);
- EXPECT_FALSE(sending);
// Set the pkt6-rfc-violation stat to 0.
StatsMgr::instance().setValue("pkt6-rfc-violation", static_cast<int64_t>(0));
// No client-id option should fail.
Pkt6Ptr lq(new Pkt6(DHCPV6_LEASEQUERY_REPLY, 123));
invalid = false;
- sending = false;
- ASSERT_THROW_MSG(impl->processQuery(lq, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(lq, invalid), BadValue,
"DHCPV6_LEASEQUERY must supply a D6O_CLIENTID");
EXPECT_TRUE(invalid);
- EXPECT_FALSE(sending);
// Check the pkt6-rfc-violation stat which was bumped by one.
ObservationPtr stat_rv = StatsMgr::instance().getObservation("pkt6-rfc-violation");
// Add an a non-matching server id.
lq->addOption(makeServerIdOption(std::vector<uint8_t>{ 10, 11, 12, 13, 14, 15, 16 }));
invalid = false;
- sending = false;
- ASSERT_THROW_MSG(impl->processQuery(lq, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(lq, invalid), BadValue,
"rejecting DHCPV6_LEASEQUERY from: ::,"
" unknown server-id: type=00002, len=00007: 0a:0b:0c:0d:0e:0f:10");
EXPECT_TRUE(invalid);
- EXPECT_FALSE(sending);
// Check the pkt6-not-for-us stat which was bumped by one.
ObservationPtr stat_nfu = StatsMgr::instance().getObservation("pkt6-not-for-us");
// Source address cannot be ::.
invalid = false;
- sending = false;
- ASSERT_THROW_MSG(impl->processQuery(lq, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(lq, invalid), BadValue,
"DHCPV6_LEASEQUERY source address cannot be ::");
EXPECT_TRUE(invalid);
- EXPECT_FALSE(sending);
// Set the pkt6-admin-filtered stat to 0.
StatsMgr::instance().setValue("pkt6-admin-filtered", static_cast<int64_t>(0));
// An unknown requester should fail.
invalid = false;
- sending = false;
- ASSERT_THROW_MSG(impl->processQuery(lq, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(lq, invalid), BadValue,
"rejecting DHCPV6_LEASEQUERY from unauthorized requester: de:ad:be:ef::");
EXPECT_TRUE(invalid);
- EXPECT_FALSE(sending);
// Check the pkt6-admin-filtered stat which was bumped by one.
ObservationPtr stat_af = StatsMgr::instance().getObservation("pkt6-admin-filtered");
// A query without a D6O_LQ_QUERY option should fail.
invalid = false;
- sending = false;
- ASSERT_THROW_MSG(impl->processQuery(lq, invalid, sending), BadValue,
+ ASSERT_THROW_MSG(impl->processQuery(lq, invalid), BadValue,
"DHCPV6_LEASEQUERY must supply a D6O_LQ_QUERY option");
EXPECT_TRUE(invalid);
- EXPECT_FALSE(sending);
}
// Verifies the operation of LeaseQueryImpl6::initReply().
scenario.qry_cid_);
// Process the query.
bool invalid = false;
- bool sending = false;
- ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid, sending));
+ ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid));
EXPECT_FALSE(invalid);
- EXPECT_TRUE(sending);
// We should have generated a LEASE_QUERY_REPLY with a
// status option containing the expected status.
// Process the query.
bool invalid = false;
- bool sending = false;
- ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid, sending));
+ ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid));
EXPECT_FALSE(invalid);
- EXPECT_TRUE(sending);
// We should have generated a DHCPV6_LEASEQUERY_REPLY with a
// status option containing the expected status.
// Process the query.
bool invalid = false;
- bool sending = false;
- ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid, sending));
+ ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid));
EXPECT_FALSE(invalid);
- EXPECT_TRUE(sending);
// We should have generated a DHCPV6_LEASEQUERY_REPLY with a
// status option containing the successful status.
// Process the query.
bool invalid = false;
- bool sending = false;
- ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid, sending));
+ ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid));
EXPECT_FALSE(invalid);
- EXPECT_TRUE(sending);
// We should have generated a LEASE_QUERY_REPLY with a
// status option containing the expected status.
// Process the query.
bool invalid = false;
- bool sending = false;
- ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid, sending));
+ ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid));
EXPECT_FALSE(invalid);
- EXPECT_TRUE(sending);
// We should have generated a LEASE_QUERY_REPLY with a
// status option containing the expected status.
// Process the query.
bool invalid = false;
- bool sending = false;
- ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid, sending));
+ ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid));
EXPECT_FALSE(invalid);
- EXPECT_TRUE(sending);
// We should have generated a LEASE_QUERY_REPLY with a
// status option containing the expected status.
// Process the query.
bool invalid = false;
- bool sending = false;
- ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid, sending));
+ ASSERT_NO_THROW_LOG(impl->processQuery(lq, invalid));
EXPECT_FALSE(invalid);
- EXPECT_TRUE(sending);
// We should have generated a LEASE_QUERY_REPLY with a
// status option containing the expected status.