]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
iterate: hacked cache store/retrieval for auth results
authorMarek Vavruša <marek.vavrusa@nic.cz>
Wed, 27 Aug 2014 19:51:14 +0000 (21:51 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Wed, 27 Aug 2014 19:51:14 +0000 (21:51 +0200)
lib/layer/iterate.c

index 7ebc90e6bbb3ac4bc5a5d1039009524156b29ed7..8a752c91f6c9eef80257b237672701df42d6924d 100644 (file)
@@ -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);