setLuaNoSideEffect();
try {
ostringstream ret;
- boost::format fmt("%-3d %-20.20s");
- ret << (fmt % "#" % "Address") << endl;
+ boost::format fmt("%-3d %-20.20s %-15d %-15d %-15d %-15d");
+ ret << (fmt % "#" % "Address" % "Bad Version" % "Invalid Token" % "Errors" % "Valid") << endl;
size_t counter = 0;
for (const auto& ctx : g_doqlocals) {
- ret << (fmt % counter % ctx->d_local.toStringWithPort()) << endl;
+ ret << (fmt % counter % ctx->d_local.toStringWithPort() % ctx->d_doqUnsupportedVersionErrors % ctx->d_doqInvalidTokensReceived % ctx->d_errorResponses % ctx->d_validResponses) << endl;
counter++;
}
g_outputBuffer = ret.str();
static void handleResponse(DOQFrontend& df, Connection& conn, const uint64_t streamID, const PacketBuffer& response)
{
if (response.size() == 0) {
+ ++df.d_errorResponses;
quiche_conn_stream_shutdown(conn.d_conn.get(), streamID, QUICHE_SHUTDOWN_WRITE, static_cast<uint64_t>(DOQ_Error_Codes::DOQ_UNSPECIFIED_ERROR));
return;
}
-
+ ++df.d_validResponses;
uint16_t responseSize = static_cast<uint16_t>(response.size());
const std::array<uint8_t, 2> sizeBytes = {static_cast<uint8_t>(responseSize / 256), static_cast<uint8_t>(responseSize % 256)};
size_t pos = 0;
DEBUGLOG("Connection not found");
if (!quiche_version_is_supported(version)) {
DEBUGLOG("Unsupported version");
+ ++frontend->d_doqUnsupportedVersionErrors;
handleVersionNegociation(sock, clientConnID, serverConnID, client);
continue;
}
PacketBuffer tokenBuf(token.begin(), token.begin() + token_len);
auto originalDestinationID = validateToken(tokenBuf, serverConnID, client);
if (!originalDestinationID) {
+ ++frontend->d_doqInvalidTokensReceived;
DEBUGLOG("Discarding invalid token");
continue;
}
uint64_t d_idleTimeout{5};
uint64_t d_maxInFlight{65535};
std::string d_ccAlgo{"reno"};
+
+ pdns::stat_t d_doqUnsupportedVersionErrors{0}; // Unsupported protocol version errors
+ pdns::stat_t d_doqInvalidTokensReceived{0}; // Discarded received tokens
+ pdns::stat_t d_validResponses{0}; // Valid responses sent
+ pdns::stat_t d_errorResponses{0}; // Empty responses (no backend, drops, invalid queries, etc.)
+
static std::map<const string, int> s_available_cc_algorithms;
};