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)
{
}
/* 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);
#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;
sockaddr_port_set(ss, KR_DNS_PORT);
- return KNOT_EOK;
+ return ret;
}