]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
doq: add valid/error responses counter and two doq protocol related error counters
authorCharles-Henri Bruyand <charles-henri.bruyand@open-xchange.com>
Tue, 26 Sep 2023 09:21:49 +0000 (11:21 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 9 Oct 2023 11:38:03 +0000 (13:38 +0200)
pdns/dnsdist-lua.cc
pdns/dnsdistdist/doq.cc
pdns/dnsdistdist/doq.hh

index 0edf61947b0516c6e0a95b4dc387229ef2de3b99..22debccbaec9fc4c0d13477690c14a0d5668809f 100644 (file)
@@ -2561,11 +2561,11 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck)
     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();
index 06a432a9dabbb27b6d93f87c5a3f8c4645fa4d18..8786c55d0f4d0bbdb011c5cff3537db593492f0b 100644 (file)
@@ -276,10 +276,11 @@ enum class DOQ_Error_Codes : uint64_t
 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;
@@ -826,6 +827,7 @@ void doqThread(ClientState* clientState)
           DEBUGLOG("Connection not found");
           if (!quiche_version_is_supported(version)) {
             DEBUGLOG("Unsupported version");
+            ++frontend->d_doqUnsupportedVersionErrors;
             handleVersionNegociation(sock, clientConnID, serverConnID, client);
             continue;
           }
@@ -840,6 +842,7 @@ void doqThread(ClientState* clientState)
           PacketBuffer tokenBuf(token.begin(), token.begin() + token_len);
           auto originalDestinationID = validateToken(tokenBuf, serverConnID, client);
           if (!originalDestinationID) {
+            ++frontend->d_doqInvalidTokensReceived;
             DEBUGLOG("Discarding invalid token");
             continue;
           }
index 70c69d324f6740e4468db2e88c5c8c17cc82c10a..064838a7bced42e252f6c1c0bd9c1e603f0b5af7 100644 (file)
@@ -62,6 +62,12 @@ struct DOQFrontend
   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;
 };