From: Marek VavruĊĦa Date: Wed, 21 Jan 2015 11:41:45 +0000 (+0100) Subject: lib: find enclosing zcut for each query X-Git-Tag: v1.0.0-beta1~358^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=694da3e32bf12015644c76318ed37466ebb3eec8;p=thirdparty%2Fknot-resolver.git lib: find enclosing zcut for each query --- diff --git a/lib/resolve.c b/lib/resolve.c index e13f10a2a..e50ee4052 100755 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -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, ¶m); - knot_requestor_overlay(&requestor, LAYER_ITERCACHE, ¶m); - knot_requestor_overlay(&requestor, LAYER_ITERATE, ¶m); - knot_requestor_overlay(&requestor, LAYER_STATS, ¶m); - - /* Iteratively solve the query. */ - int ret = KNOT_EOK; - unsigned iter_count = 0; - while((ret == KNOT_EOK) && !kr_rplan_empty(&rplan)) { - ret = iterate(&requestor, ¶m); - 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(¶m, &rplan_pool); + } else { + ret = KNOT_ENOMEM; } - knot_requestor_clear(&requestor); - /* Check flags. */ knot_wire_clear_aa(answer->wire); knot_wire_set_ra(answer->wire); diff --git a/lib/rplan.c b/lib/rplan.c index 56c2c5187..4394c82c9 100644 --- a/lib/rplan.c +++ b/lib/rplan.c @@ -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); diff --git a/lib/utils.c b/lib/utils.c index d42f6d5a7..ba689e6a0 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -1,17 +1,20 @@ #include #include +#include #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; }