]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add a probe when the response rate limiting drops or slips query
authorOndřej Surý <ondrej@isc.org>
Thu, 27 Apr 2023 11:57:00 +0000 (13:57 +0200)
committerOndřej Surý <ondrej@isc.org>
Mon, 21 Aug 2023 16:39:53 +0000 (18:39 +0200)
Add a trace point that would report when a query gets dropped or slipped
by rate limits. It reports the client IP, the zone, and the RRL result
code.

Co-authored-by: Paul Frieden <pfrieden@yahooinc.com>
lib/dns/probes.d
lib/ns/probes.d
lib/ns/query.c

index d2c87748c0c4ec903ceb404c7a03981e9827f5fb..2d9f2c3d62a68256ae72044b5eff7682c113ead7 100644 (file)
  */
 
 provider libdns {
-       probe xfrin_axfr_finalize_begin(void *);
-       probe xfrin_axfr_finalize_end(void *, int);
-       probe xfrin_connected(void *, int);
-       probe xfrin_done_callback_begin(void *, int);
-       probe xfrin_done_callback_end(void *, int);
-       probe xfrin_journal_destroy_begin(void *, int);
-       probe xfrin_journal_destroy_end(void *, int);
-       probe xfrin_read(void *, int);
-       probe xfrin_recv_answer(void *, void *);
-       probe xfrin_recv_done(void *, int);
-       probe xfrin_recv_parsed(void *, int);
-       probe xfrin_recv_question(void *, void *);
-       probe xfrin_recv_send_request(void *);
-       probe xfrin_recv_start(void *, int);
-       probe xfrin_recv_try_axfr(void *, int);
-       probe xfrin_sent(void *, int);
-       probe xfrin_start(void *);
+       probe xfrin_axfr_finalize_begin(void *, char *);
+       probe xfrin_axfr_finalize_end(void *, char *, int);
+       probe xfrin_connected(void *, char *, int);
+       probe xfrin_done_callback_begin(void *, char *, int);
+       probe xfrin_done_callback_end(void *, char *, int);
+       probe xfrin_journal_destroy_begin(void *, char *, int);
+       probe xfrin_journal_destroy_end(void *, char *, int);
+       probe xfrin_read(void *, char *, int);
+       probe xfrin_recv_answer(void *, char *, void *);
+       probe xfrin_recv_done(void *, char *, int);
+       probe xfrin_recv_parsed(void *, char *, int);
+       probe xfrin_recv_question(void *, char *, void *);
+       probe xfrin_recv_send_request(void *, char *);
+       probe xfrin_recv_start(void *, char *, int);
+       probe xfrin_recv_try_axfr(void *, char *, int);
+       probe xfrin_sent(void *, char *, int);
+       probe xfrin_start(void *, char *);
 };
index 316ca37a1f793246063f422b261361838636af14..fccb6185cbf508851d7e376c3888bf4a863c3ff3 100644 (file)
@@ -12,4 +12,5 @@
  */
 
 provider libns {
+       probe rrl_drop(const char *, const char *, const char *, int);
 };
index e2e00b28c669495686c9e7bd629e4496f8ade920..8edfc9814ceafef3790b162d12d6a7bad8e7753c 100644 (file)
@@ -73,6 +73,8 @@
 #include <ns/stats.h>
 #include <ns/xfrout.h>
 
+#include "probes.h"
+
 #if 0
 /*
  * It has been recommended that DNS64 be changed to return excluded
@@ -7051,6 +7053,25 @@ ns__query_sfcache(query_ctx_t *qctx) {
        return (ISC_R_COMPLETE);
 }
 
+static void
+query_trace_rrldrop(query_ctx_t *qctx,
+                   dns_rrl_result_t rrl_result ISC_ATTR_UNUSED) {
+       if (!LIBNS_RRL_DROP_ENABLED()) {
+               return;
+       }
+
+       char peerbuf[ISC_SOCKADDR_FORMATSIZE];
+       isc_netaddr_t peer;
+       isc_netaddr_fromsockaddr(&peer, &qctx->client->peeraddr);
+       isc_netaddr_format(&peer, peerbuf, sizeof(peerbuf));
+
+       char qnamebuf[DNS_NAME_FORMATSIZE];
+       char fnamebuf[DNS_NAME_FORMATSIZE];
+       dns_name_format(qctx->client->query.qname, qnamebuf, sizeof(qnamebuf));
+       dns_name_format(qctx->fname, fnamebuf, sizeof(fnamebuf));
+       LIBNS_RRL_DROP(peerbuf, qnamebuf, fnamebuf, rrl_result);
+}
+
 /*%
  * Handle response rate limiting (RRL).
  */
@@ -7184,6 +7205,12 @@ query_checkrrl(query_ctx_t *qctx, isc_result_t result) {
                                              DNS_RRL_LOG_DROP, "%s", log_buf);
                        }
 
+                       /*
+                        * If tracing is enabled, format some extra information
+                        * to pass along.
+                        */
+                       query_trace_rrldrop(qctx, rrl_result);
+
                        if (!qctx->view->rrl->log_only) {
                                if (rrl_result == DNS_RRL_RESULT_DROP) {
                                        /*