]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
ede: add KNOT_EDNS_EDE_NREACH_AUTH
authorTomas Krizek <tomas.krizek@nic.cz>
Thu, 11 Nov 2021 14:12:05 +0000 (15:12 +0100)
committerTomas Krizek <tomas.krizek@nic.cz>
Tue, 21 Dec 2021 14:02:08 +0000 (15:02 +0100)
daemon/session.c
daemon/worker.c
lib/resolve.c
lib/resolve.h

index 0ef74134982b80c35da2fcec128b5665a4ab0777..85fb2ed749a56135b14857796bf2ef6660583193 100644 (file)
@@ -458,6 +458,9 @@ int session_tasklist_finalize_expired(struct session *session)
                trie_val_t *v = trie_it_val(it);
                struct qr_task *task = (struct qr_task *)*v;
                if ((now - worker_task_creation_time(task)) >= KR_RESOLVE_TIME_LIMIT) {
+                       struct kr_request *req = worker_task_request(task);
+                       if (!kr_fails_assert(req))
+                               kr_query_inform_timeout(req, req->current_query);
                        queue_push(q, task);
                        worker_task_ref(task);
                }
index ed79788d4518d425db2f13df29ac302353d7d233..5dd994e900bd6336aebec3a624ac981294f4c2b8 100644 (file)
@@ -1617,6 +1617,9 @@ static int qr_task_step(struct qr_task *task,
        /* Close pending I/O requests */
        subreq_finalize(task, packet_source, packet);
        if ((kr_now() - worker_task_creation_time(task)) >= KR_RESOLVE_TIME_LIMIT) {
+               struct kr_request *req = worker_task_request(task);
+               if (!kr_fails_assert(req))
+                       kr_query_inform_timeout(req, req->current_query);
                return qr_task_finalize(task, KR_STATE_FAIL);
        }
 
@@ -1659,10 +1662,14 @@ static int qr_task_step(struct qr_task *task,
                        struct kr_rplan *rplan = &req->rplan;
                        struct kr_query *last = kr_rplan_last(rplan);
                        if (task->iter_count > KR_ITER_LIMIT) {
-                               VERBOSE_MSG(last, "canceling query due to exceeded iteration count limit of %d\n", KR_ITER_LIMIT);
+                               char *msg = "cancelling query due to exceeded iteration count limit";
+                               VERBOSE_MSG(last, "%s of %d\n", msg, KR_ITER_LIMIT);
+                               kr_request_set_extended_error(req, KNOT_EDNS_EDE_OTHER, msg);
                        }
                        if (task->timeouts >= KR_TIMEOUT_LIMIT) {
-                               VERBOSE_MSG(last, "canceling query due to exceeded timeout retries limit of %d\n", KR_TIMEOUT_LIMIT);
+                               char *msg = "cancelling query due to exceeded timeout retries limit";
+                               VERBOSE_MSG(last, "%s of %d\n", msg, KR_TIMEOUT_LIMIT);
+                               kr_request_set_extended_error(req, KNOT_EDNS_EDE_NREACH_AUTH, NULL);
                        }
 
                        return qr_task_finalize(task, KR_STATE_FAIL);
index 8897afa26ad24b4cb95600dc7590fef19cae6967..187d7a22aade347678e09568b09d4ac275e36d8e 100644 (file)
@@ -780,16 +780,6 @@ fail:
        return request->answer = NULL;
 }
 
-static bool resolution_time_exceeded(struct kr_query *qry, uint64_t now)
-{
-       uint64_t resolving_time = now - qry->creation_time_mono;
-       if (resolving_time > KR_RESOLVE_TIME_LIMIT) {
-               VERBOSE_MSG(qry, "query resolution time limit exceeded\n");
-               return true;
-       }
-       return false;
-}
-
 int kr_resolve_consume(struct kr_request *request, struct kr_transport **transport, knot_pkt_t *packet)
 {
        struct kr_rplan *rplan = &request->rplan;
@@ -802,7 +792,8 @@ int kr_resolve_consume(struct kr_request *request, struct kr_transport **transpo
        /* Different processing for network error */
        struct kr_query *qry = array_tail(rplan->pending);
        /* Check overall resolution time */
-       if (resolution_time_exceeded(qry, kr_now())) {
+       if (kr_now() - qry->creation_time_mono >= KR_RESOLVE_TIME_LIMIT) {
+               kr_query_inform_timeout(request, qry);
                return KR_STATE_FAIL;
        }
        bool tried_tcp = (qry->flags.TCP);
index c973318aff6a670a0a3cbe0c412d8f17a353406b..d83c083d2bc249238beff260522161b55d0d52e1 100644 (file)
@@ -389,3 +389,15 @@ knot_mm_t *kr_resolve_pool(struct kr_request *request);
  */
 KR_EXPORT
 int kr_request_set_extended_error(struct kr_request *request, int info_code, const char *extra_text);
+
+static inline void kr_query_inform_timeout(struct kr_request *req, const struct kr_query *qry)
+{
+       kr_request_set_extended_error(req, KNOT_EDNS_EDE_NREACH_AUTH, NULL);
+
+       unsigned ind = 0;
+       for (const struct kr_query *q = qry; q; q = q->parent)
+               ind += 2;
+       const uint32_t qid = qry ? qry->uid : 0;
+
+       kr_log_req(req, qid, ind, WORKER, "internal timeout for resolving the request has expired\n");
+}