]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
layer/iterate: cleanup, use compr hints
authorMarek Vavruša <marek.vavrusa@nic.cz>
Wed, 3 Jun 2015 22:41:01 +0000 (00:41 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Wed, 3 Jun 2015 22:41:01 +0000 (00:41 +0200)
lib/layer/iterate.c
lib/resolve.c

index a7954b798c8f4d503b5b4ff7644f7b41514a67db..f734760a6fe4f21bb88954df7cb06c60ae0cbad3 100644 (file)
@@ -118,21 +118,18 @@ int kr_response_classify(knot_pkt_t *pkt)
 static void follow_cname_chain(const knot_dname_t **cname, const knot_rrset_t *rr,
                                struct kr_query *cur)
 {
-       /* Follow chain from SNAME. */
-       if (knot_dname_is_equal(rr->owner, *cname)) {
-               if (rr->type == KNOT_RRTYPE_CNAME) {
-                       *cname = knot_cname_name(&rr->rrs);
-               } else {
-                       /* Terminate CNAME chain. */
-                       *cname = cur->sname;
-               }
+       if (rr->type == KNOT_RRTYPE_CNAME) {
+               *cname = knot_cname_name(&rr->rrs);
+       } else {
+               /* Terminate CNAME chain. */
+               *cname = cur->sname;
        }
 }
 
-static int update_nsaddr(const knot_rrset_t *rr, struct kr_query *query, uint16_t index)
+static int update_nsaddr(const knot_rrset_t *rr, struct kr_query *query)
 {
        if (rr->type == KNOT_RRTYPE_A || rr->type == KNOT_RRTYPE_AAAA) {
-               const knot_rdata_t *rdata = knot_rdataset_at(&rr->rrs, index);
+               const knot_rdata_t *rdata = knot_rdataset_at(&rr->rrs, 0);
                int ret = kr_zonecut_add(&query->zone_cut, rr->owner, rdata);
                if (ret != 0) {
                        return KNOT_STATE_FAIL;
@@ -142,27 +139,17 @@ static int update_nsaddr(const knot_rrset_t *rr, struct kr_query *query, uint16_
        return KNOT_STATE_CONSUME;
 }
 
-static int update_glue(const knot_rrset_t *rr, unsigned hint, struct kr_request *req)
-{
-       return update_nsaddr(rr, kr_rplan_current(&req->rplan), hint);
-}
-
-static int rr_update_parent(const knot_rrset_t *rr, unsigned hint, struct kr_request *req)
+static int update_parent(const knot_rrset_t *rr, struct kr_request *req)
 {
        struct kr_query *qry = kr_rplan_current(&req->rplan);
-       return update_nsaddr(rr, qry->parent, hint);
+       return update_nsaddr(rr, qry->parent);
 }
 
-static int rr_update_answer(const knot_rrset_t *rr, unsigned hint, struct kr_request *req)
+static int update_answer(const knot_rrset_t *rr, unsigned hint, struct kr_request *req)
 {
        knot_pkt_t *answer = req->answer;
-
-       /* Write copied RR to the result packet. */
-       int ret = knot_pkt_put(answer, KNOT_COMPR_HINT_NONE, rr, hint);
+       int ret = knot_pkt_put(answer, hint, rr, 0);
        if (ret != KNOT_EOK) {
-               if (hint & KNOT_PF_FREE) {
-                       knot_rrset_clear((knot_rrset_t *)rr, &answer->mm);
-               }
                knot_wire_set_tc(answer->wire);
                return KNOT_STATE_DONE;
        }
@@ -170,13 +157,13 @@ static int rr_update_answer(const knot_rrset_t *rr, unsigned hint, struct kr_req
        return KNOT_STATE_DONE;
 }
 
-static void fetch_glue(knot_pkt_t *pkt, const knot_dname_t *ns, struct kr_request *req)
+static void fetch_glue(knot_pkt_t *pkt, const knot_dname_t *ns, struct kr_query *qry)
 {
        const knot_pktsection_t *ar = knot_pkt_section(pkt, KNOT_ADDITIONAL);
        for (unsigned i = 0; i < ar->count; ++i) {
                const knot_rrset_t *rr = knot_pkt_rr(ar, i);
                if (knot_dname_is_equal(ns, rr->owner)) {
-                       (void) update_glue(rr, 0, req);
+                       (void) update_nsaddr(rr, qry);
                }
        }
 }
@@ -224,7 +211,7 @@ static int update_cut(knot_pkt_t *pkt, const knot_rrset_t *rr, struct kr_request
                        continue;
                }
                kr_zonecut_add(cut, ns_name, NULL);
-               fetch_glue(pkt, ns_name, req);
+               fetch_glue(pkt, ns_name, query);
        }
 
        return state;
@@ -275,7 +262,7 @@ static void finalize_answer(knot_pkt_t *pkt, struct kr_query *qry, struct kr_req
                for (unsigned i = 0; i < ns->count; ++i) {
                        const knot_rrset_t *rr = knot_pkt_rr(ns, i);
                        if (knot_dname_in(cut->name, rr->owner)) {
-                               rr_update_answer(rr, 0, req);
+                               update_answer(rr, 0, req);
                        }
                }
        }
@@ -305,9 +292,6 @@ static int process_answer(knot_pkt_t *pkt, struct kr_request *req)
                        DEBUG_MSG("<= lame response: non-auth sent negative response\n");
                        return KNOT_STATE_FAIL;
                }
-       } else {
-               /* Make sure that this is an authoritative naswer (even with AA=0) for other layers */
-               knot_wire_set_aa(pkt->wire);
        }
 
        /* Process answer type */
@@ -315,13 +299,22 @@ static int process_answer(knot_pkt_t *pkt, struct kr_request *req)
        const knot_dname_t *cname = query->sname;
        for (unsigned i = 0; i < an->count; ++i) {
                const knot_rrset_t *rr = knot_pkt_rr(an, i);
-               int state = is_final ?  rr_update_answer(rr, 0, req) : rr_update_parent(rr, 0, req);
+               if (!knot_dname_is_equal(rr->owner, cname)) {
+                       continue;
+               }
+               unsigned hint = 0;
+               if(knot_dname_is_equal(cname, knot_pkt_qname(req->answer))) {
+                       hint = KNOT_COMPR_HINT_QNAME;
+               }
+               int state = is_final ? update_answer(rr, hint, req) : update_parent(rr, req);
                if (state == KNOT_STATE_FAIL) {
                        return state;
                }
                follow_cname_chain(&cname, rr, query);
        }
 
+       /* Make sure that this is an authoritative naswer (even with AA=0) for other layers */
+       knot_wire_set_aa(pkt->wire);
        /* Either way it resolves current query. */
        query->flags |= QUERY_RESOLVED;
        /* Follow canonical name as next SNAME. */
index 3810a9d9f01a71f908f4bdb1f8603cf2a9aa80a4..9adb019ff713cd7f1d9836008d945168ef2af6b3 100644 (file)
@@ -381,7 +381,6 @@ int kr_resolve_produce(struct kr_request *request, struct sockaddr **dst, int *t
 {
        struct kr_rplan *rplan = &request->rplan;
        struct kr_query *qry = kr_rplan_current(rplan);
-       unsigned ns_election_iter = 0;
        
        /* No query left for resolution */
        if (kr_rplan_empty(rplan)) {
@@ -389,6 +388,7 @@ int kr_resolve_produce(struct kr_request *request, struct sockaddr **dst, int *t
        }
 
 #ifndef NDEBUG
+       unsigned ns_election_iter = 0;
        char name_str[KNOT_DNAME_MAXLEN], type_str[16];
        knot_dname_to_str(name_str, qry->sname, sizeof(name_str));
        knot_rrtype_to_string(qry->stype, type_str, sizeof(type_str));