From 92a2b671af6a7dcb91600dda854d30f15d80d1da Mon Sep 17 00:00:00 2001 From: Tomas Krizek Date: Thu, 11 Nov 2021 15:12:05 +0100 Subject: [PATCH] ede: add KNOT_EDNS_EDE_NREACH_AUTH --- daemon/session.c | 3 +++ daemon/worker.c | 11 +++++++++-- lib/resolve.c | 13 ++----------- lib/resolve.h | 12 ++++++++++++ 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/daemon/session.c b/daemon/session.c index 0ef741349..85fb2ed74 100644 --- a/daemon/session.c +++ b/daemon/session.c @@ -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); } diff --git a/daemon/worker.c b/daemon/worker.c index ed79788d4..5dd994e90 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -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); diff --git a/lib/resolve.c b/lib/resolve.c index 8897afa26..187d7a22a 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -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); diff --git a/lib/resolve.h b/lib/resolve.h index c973318af..d83c083d2 100644 --- a/lib/resolve.h +++ b/lib/resolve.h @@ -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"); +} -- 2.47.2