]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib: find enclosing zcut for each query
authorMarek Vavruša <marek.vavrusa@nic.cz>
Wed, 21 Jan 2015 11:41:45 +0000 (12:41 +0100)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Wed, 21 Jan 2015 11:41:45 +0000 (12:41 +0100)
lib/resolve.c
lib/rplan.c
lib/utils.c

index e13f10a2a0fb5c2dc201956b6cee2b3aec9ad44d..e50ee4052aea5d594272093d782eaf70ecfd2516 100755 (executable)
@@ -88,6 +88,31 @@ static int iterate(struct knot_requestor *requestor, struct kr_layer_param *para
        return ret;
 }
 
+static int resolve_iterative(struct kr_layer_param *param, mm_ctx_t *pool)
+{
+       /* Initialize requestor and overlay. */
+       struct knot_requestor requestor;
+       knot_requestor_init(&requestor, pool);
+       knot_requestor_overlay(&requestor, LAYER_STATIC, param);
+       knot_requestor_overlay(&requestor, LAYER_ITERCACHE, param);
+       knot_requestor_overlay(&requestor, LAYER_ITERATE, param);
+       knot_requestor_overlay(&requestor, LAYER_STATS, param);
+
+       /* Iteratively solve the query. */
+       int ret = KNOT_EOK;
+       unsigned iter_count = 0;
+       while((ret == KNOT_EOK) && !kr_rplan_empty(param->rplan)) {
+               ret = iterate(&requestor, param);
+               if (++iter_count > ITER_LIMIT) {
+                       DEBUG_MSG("iteration limit %d reached => SERVFAIL\n", ITER_LIMIT);
+                       ret = KNOT_ELIMIT;
+               }
+       }
+
+       knot_requestor_clear(&requestor);
+       return ret;
+}
+
 int kr_resolve(struct kr_context* ctx, knot_pkt_t *answer,
                const knot_dname_t *qname, uint16_t qclass, uint16_t qtype)
 {
@@ -96,42 +121,24 @@ int kr_resolve(struct kr_context* ctx, knot_pkt_t *answer,
        }
 
        /* Initialize context. */
+       int ret = KNOT_EOK;
        mm_ctx_t rplan_pool;
        mm_ctx_mempool(&rplan_pool, MM_DEFAULT_BLKSIZE);
        struct kr_rplan rplan;
        kr_rplan_init(&rplan, ctx, &rplan_pool);
-
-       /* Push query to resolve plan and set initial zone cut. */
-       struct kr_query *qry = kr_rplan_push(&rplan, qname, qclass, qtype);
-       namedb_txn_t *txn = kr_rplan_txn_acquire(&rplan, NAMEDB_RDONLY);
-       kr_find_zone_cut(&qry->zone_cut, qname, txn, qry->timestamp.tv_sec);
-
        struct kr_layer_param param;
        param.ctx = ctx;
        param.rplan = &rplan;
        param.answer = answer;
 
-       /* Initialize requestor and overlay. */
-       struct knot_requestor requestor;
-       knot_requestor_init(&requestor, ctx->pool);
-       knot_requestor_overlay(&requestor, LAYER_STATIC, &param);
-       knot_requestor_overlay(&requestor, LAYER_ITERCACHE, &param);
-       knot_requestor_overlay(&requestor, LAYER_ITERATE, &param);
-       knot_requestor_overlay(&requestor, LAYER_STATS, &param);
-
-       /* Iteratively solve the query. */
-       int ret = KNOT_EOK;
-       unsigned iter_count = 0;
-       while((ret == KNOT_EOK) && !kr_rplan_empty(&rplan)) {
-               ret = iterate(&requestor, &param);
-               if (++iter_count > ITER_LIMIT) {
-                       DEBUG_MSG("iteration limit %d reached => SERVFAIL\n", ITER_LIMIT);
-                       ret = KNOT_ELIMIT;
-               }
+       /* Push query to resolution plan. */
+       struct kr_query *qry = kr_rplan_push(&rplan, qname, qclass, qtype);
+       if (qry != NULL) {
+               ret = resolve_iterative(&param, &rplan_pool);
+       } else {
+               ret = KNOT_ENOMEM;
        }
 
-       knot_requestor_clear(&requestor);
-
        /* Check flags. */
        knot_wire_clear_aa(answer->wire);
        knot_wire_set_ra(answer->wire);
index 56c2c5187ec72a3a7f0e4f46bfb33ece444e9c3a..4394c82c996ea2e3bc19a789c29813c15e2c8785 100644 (file)
@@ -95,6 +95,8 @@ struct kr_query *kr_rplan_push(struct kr_rplan *rplan, const knot_dname_t *name,
        qry->stype = type;
        qry->flags = rplan->context->options;
        gettimeofday(&qry->timestamp, NULL);
+       namedb_txn_t *txn = kr_rplan_txn_acquire(rplan, NAMEDB_RDONLY);
+       kr_find_zone_cut(&qry->zone_cut, name, txn, qry->timestamp.tv_sec);
 
        add_tail(&rplan->pending, &qry->node);
 
index d42f6d5a71efccc4880a2f5028a088184d7d4d59..ba689e6a03d8435d914420a26f7a329bc48d7248 100644 (file)
@@ -1,17 +1,20 @@
 #include <libknot/descriptor.h>
 #include <libknot/rrtype/aaaa.h>
+#include <assert.h>
 
 #include "lib/utils.h"
 
 int kr_rrset_to_addr(struct sockaddr_storage *ss, const knot_rrset_t *rr)
 {
+       int ret = KNOT_EOK;
+
        /* Retrieve an address from glue record. */
        switch(rr->type) {
        case KNOT_RRTYPE_A:
-               knot_a_addr(&rr->rrs, 0, (struct sockaddr_in *)ss);
+               ret = knot_a_addr(&rr->rrs, 0, (struct sockaddr_in *)ss);
                break;
        case KNOT_RRTYPE_AAAA:
-               knot_aaaa_addr(&rr->rrs, 0, (struct sockaddr_in6 *)ss);
+               ret = knot_aaaa_addr(&rr->rrs, 0, (struct sockaddr_in6 *)ss);
                break;
        default:
                return KNOT_EINVAL;
@@ -19,5 +22,5 @@ int kr_rrset_to_addr(struct sockaddr_storage *ss, const knot_rrset_t *rr)
 
        sockaddr_port_set(ss, KR_DNS_PORT);
 
-       return KNOT_EOK;
+       return ret;
 }