From: Marek VavruĊĦa Date: Wed, 27 Aug 2014 19:51:14 +0000 (+0200) Subject: iterate: hacked cache store/retrieval for auth results X-Git-Tag: v1.0.0-beta1~420 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=409b4e626d6605f800e5206cbe4d9908d01ebe95;p=thirdparty%2Fknot-resolver.git iterate: hacked cache store/retrieval for auth results --- diff --git a/lib/layer/iterate.c b/lib/layer/iterate.c index 7ebc90e6b..8a752c91f 100644 --- a/lib/layer/iterate.c +++ b/lib/layer/iterate.c @@ -171,6 +171,20 @@ static int update_deleg(struct kr_query *qry, struct kr_result *result, const kn return 0; } +static int update_result(struct kr_query *cur, struct kr_result *result, const knot_rrset_t *rr) +{ + int ret = -1; + + /* RR callbacks per query type. */ + switch(cur->flags) { + case RESOLVE_QUERY: ret = update_query(cur, result, rr); break; + case RESOLVE_DELEG: ret = update_deleg(cur, result, rr); break; + default: assert(0); break; + } + + return ret; +} + static int resolve_auth(knot_pkt_t *pkt, struct kr_layer_param *param) { struct kr_context *resolve = param->ctx; @@ -189,18 +203,14 @@ static int resolve_auth(knot_pkt_t *pkt, struct kr_layer_param *param) for (unsigned i = 0; i < an->count; ++i) { /* RR callbacks per query type. */ - int ret = -1; - switch(cur->flags) { - case RESOLVE_QUERY: ret = update_query(cur, result, &an->rr[i]); break; - case RESOLVE_DELEG: ret = update_deleg(cur, result, &an->rr[i]); break; - default: assert(0); break; - } - - /* Check output. */ + int ret = update_result(cur, result, &an->rr[i]); if (ret != 0) { return NS_PROC_FAIL; } + /* Update cache. */ + kr_cache_insert(resolve->cache, &an->rr[i], 0); + /* Check canonical name. */ follow_cname_chain(&cname, &an->rr[i], param); } @@ -255,12 +265,28 @@ static int prepare_query(knot_layer_t *ctx, knot_pkt_t *pkt) { assert(pkt && ctx); struct kr_layer_param *param = ctx->data; - struct kr_context* resolve = param->ctx; + struct kr_context *resolve = param->ctx; + struct kr_result *result = param->result; struct kr_query *next = kr_rplan_next(&resolve->rplan); if (next == NULL) { return -1; } + /* TODO: hacked cache */ + knot_rrset_t cached_reply; + knot_rrset_init(&cached_reply, next->sname, next->stype, next->sclass); + if (kr_cache_query(resolve->cache, &cached_reply, resolve->pool) == 0) { + /* Solve this from cache. */ + update_result(next, result, &cached_reply); + knot_rdataset_clear(&cached_reply.rrs, resolve->pool); + + /* Resolved current SNAME. */ + knot_wire_set_rcode(result->ans->wire, KNOT_RCODE_NOERROR); + resolve->resolved_qry = next; + return NS_PROC_DONE; + } + knot_rdataset_clear(&cached_reply.rrs, resolve->pool); + knot_pkt_clear(pkt); int ret = knot_pkt_put_question(pkt, next->sname, next->sclass, next->stype);